{
  "contractName": "OwnTheGridBoardV5",
  "version": 5,
  "compiler": "0.8.24+commit.e11b9ed9.Emscripten.clang",
  "testOnly": false,
  "termSeconds": 2592000,
  "standardInput": {
    "language": "Solidity",
    "sources": {
      "OwnTheGridBoardV5.sol": {
        "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\ninterface IERC20BoardV5 {\n    function transfer(address to, uint256 value) external returns (bool);\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract OwnTheGridBoardV5 {\n    uint16 public constant SLOT_COUNT = 400;\n    uint16 public constant MAX_BATCH = 40;\n    uint256 public constant SLOT_LOCK = 250_000 ether;\n    uint256 public constant MAX_BOARD_LOCK = 100_000_000 ether;\n    uint64 public constant DEFAULT_TERM = 30 days;\n\n    struct TileData {\n        string name;\n        string url;\n        string message;\n        uint24 backgroundColor;\n        uint24 accentColor;\n        uint24 textColor;\n    }\n\n    struct Slot {\n        address owner;\n        uint72 colors;\n        bool hidden;\n        uint16 priceRank;\n        uint128 lockedAmount;\n        uint64 expiresAt;\n        uint64 reservedAtBlock;\n        uint64 updatedAtBlock;\n        string name;\n        string url;\n        string message;\n    }\n\n    IERC20BoardV5 public immutable token;\n    address public owner;\n    address public moderator;\n    uint16 public occupiedCount;\n    uint256 public totalLocked;\n    mapping(uint16 => Slot) private slotRecords;\n    mapping(address => uint256) public pendingWithdrawals;\n    bool private entered;\n\n    event SlotReserved(uint16 indexed slotId, address indexed account, uint256 lockedAmount, uint64 expiresAt);\n    event SlotBatchReserved(address indexed account, uint16 count, uint256 totalLockedAmount);\n    event SlotMetadataUpdated(uint16 indexed slotId, address indexed account);\n    event SlotReleased(uint16 indexed slotId, address indexed account, uint256 unlockedAmount);\n    event SlotBatchReleased(address indexed account, uint16 count, uint256 unlockedAmount);\n    event SlotHidden(uint16 indexed slotId, bool hidden, bytes32 reasonHash);\n    event ModeratorUpdated(address indexed moderator);\n    event OwnershipTransferred(address indexed previousOwner, address indexed nextOwner);\n\n    modifier onlyOwner() {\n        require(msg.sender == owner, \"not owner\");\n        _;\n    }\n\n    modifier nonReentrant() {\n        require(!entered, \"reentrant\");\n        entered = true;\n        _;\n        entered = false;\n    }\n\n    constructor(address acceptedToken, address initialModerator) {\n        require(acceptedToken.code.length > 0, \"token required\");\n        token = IERC20BoardV5(acceptedToken);\n        owner = msg.sender;\n        moderator = initialModerator == address(0) ? msg.sender : initialModerator;\n        emit OwnershipTransferred(address(0), msg.sender);\n        emit ModeratorUpdated(moderator);\n    }\n\n    function version() external pure returns (uint256) { return 5; }\n\n    function getSlot(uint16 slotId) external view returns (Slot memory) {\n        require(slotId < SLOT_COUNT, \"bad slot\");\n        return slotRecords[slotId];\n    }\n\n    function getSlots(uint16 start, uint16 count) external view returns (Slot[] memory result) {\n        require(count > 0 && count <= MAX_BATCH && uint256(start) + count <= SLOT_COUNT, \"bad page\");\n        result = new Slot[](count);\n        for (uint16 i = 0; i < count; i++) result[i] = slotRecords[start + i];\n    }\n\n    // Kept for backwards-compatible integrations; every valid slot has the same price in V5.\n    function requiredLockForRank(uint256 rank) public pure returns (uint256) {\n        require(rank > 0 && rank <= SLOT_COUNT, \"bad rank\");\n        return SLOT_LOCK;\n    }\n\n    function nextRequiredLock() external view returns (uint256) {\n        if (occupiedCount < SLOT_COUNT) return SLOT_LOCK;\n        for (uint16 slotId = 0; slotId < SLOT_COUNT; slotId++) {\n            if (block.timestamp >= slotRecords[slotId].expiresAt) return SLOT_LOCK;\n        }\n        return 0;\n    }\n\n    function isAvailable(uint16 slotId) public view returns (bool) {\n        require(slotId < SLOT_COUNT, \"bad slot\");\n        return slotRecords[slotId].owner == address(0) || block.timestamp >= slotRecords[slotId].expiresAt;\n    }\n\n    function quoteReserve(uint16[] calldata slotIds) external view returns (uint256[] memory amounts, uint256 totalAmount) {\n        _validateSlotIds(slotIds);\n        amounts = new uint256[](slotIds.length);\n        for (uint256 i = 0; i < slotIds.length; i++) {\n            require(isAvailable(slotIds[i]), \"slot taken\");\n            amounts[i] = SLOT_LOCK;\n        }\n        totalAmount = SLOT_LOCK * slotIds.length;\n    }\n\n    function reserve(uint16 slotId, TileData calldata data, uint256 maxAmount) external nonReentrant {\n        require(slotId < SLOT_COUNT, \"bad slot\");\n        _validateData(data);\n        _clearExpired(slotId);\n        require(slotRecords[slotId].owner == address(0), \"slot taken\");\n        require(SLOT_LOCK <= maxAmount, \"price changed\");\n        _checkCap(SLOT_LOCK);\n        _collect(SLOT_LOCK);\n        _writeSlot(slotId, data);\n        occupiedCount++;\n        totalLocked += SLOT_LOCK;\n    }\n\n    function reserveBatch(uint16[] calldata slotIds, TileData[] calldata data, uint256 maxAmount) external nonReentrant {\n        _validateSlotIds(slotIds);\n        require(data.length == slotIds.length, \"length mismatch\");\n        for (uint256 i = 0; i < slotIds.length; i++) {\n            _validateData(data[i]);\n            _clearExpired(slotIds[i]);\n            require(slotRecords[slotIds[i]].owner == address(0), \"slot taken\");\n        }\n        uint256 totalAmount = SLOT_LOCK * slotIds.length;\n        require(totalAmount <= maxAmount, \"price changed\");\n        _checkCap(totalAmount);\n        _collect(totalAmount);\n        for (uint256 i = 0; i < slotIds.length; i++) _writeSlot(slotIds[i], data[i]);\n        occupiedCount += uint16(slotIds.length);\n        totalLocked += totalAmount;\n        emit SlotBatchReserved(msg.sender, uint16(slotIds.length), totalAmount);\n    }\n\n    function updateMetadata(uint16 slotId, TileData calldata data) external {\n        require(slotId < SLOT_COUNT, \"bad slot\");\n        _validateData(data);\n        Slot storage slot = slotRecords[slotId];\n        require(slot.owner == msg.sender, \"not slot owner\");\n        require(block.timestamp < slot.expiresAt, \"expired\");\n        _writeData(slot, data);\n        slot.updatedAtBlock = _chainBlockNumber();\n        emit SlotMetadataUpdated(slotId, msg.sender);\n    }\n\n    function release(uint16 slotId) external nonReentrant {\n        require(slotId < SLOT_COUNT, \"bad slot\");\n        Slot memory slot = slotRecords[slotId];\n        require(slot.owner == msg.sender, \"not slot owner\");\n        _deleteSlot(slotId, slot.owner, slot.lockedAmount);\n        require(token.transfer(slot.owner, slot.lockedAmount), \"transfer failed\");\n    }\n\n    function releaseBatch(uint16[] calldata slotIds) external nonReentrant {\n        _validateSlotIds(slotIds);\n        uint256 amount;\n        for (uint256 i = 0; i < slotIds.length; i++) {\n            Slot storage slot = slotRecords[slotIds[i]];\n            require(slot.owner == msg.sender, \"not slot owner\");\n            uint256 deposit = slot.lockedAmount;\n            amount += deposit;\n            _deleteSlot(slotIds[i], msg.sender, deposit);\n        }\n        require(token.transfer(msg.sender, amount), \"transfer failed\");\n        emit SlotBatchReleased(msg.sender, uint16(slotIds.length), amount);\n    }\n\n    function withdraw() external nonReentrant {\n        uint256 amount = pendingWithdrawals[msg.sender];\n        require(amount > 0, \"nothing to withdraw\");\n        pendingWithdrawals[msg.sender] = 0;\n        require(token.transfer(msg.sender, amount), \"transfer failed\");\n    }\n\n    function clearExpiredBatch(uint16[] calldata slotIds) external nonReentrant {\n        _validateSlotIds(slotIds);\n        for (uint256 i = 0; i < slotIds.length; i++) _clearExpired(slotIds[i]);\n    }\n\n    function hideSlot(uint16 slotId, bool hidden, bytes32 reasonHash) external {\n        require(msg.sender == owner || msg.sender == moderator, \"not moderator\");\n        require(slotId < SLOT_COUNT && slotRecords[slotId].owner != address(0), \"empty slot\");\n        slotRecords[slotId].hidden = hidden;\n        emit SlotHidden(slotId, hidden, reasonHash);\n    }\n\n    function setModerator(address nextModerator) external onlyOwner {\n        moderator = nextModerator == address(0) ? owner : nextModerator;\n        emit ModeratorUpdated(moderator);\n    }\n\n    function transferOwnership(address nextOwner) external onlyOwner {\n        require(nextOwner != address(0), \"owner required\");\n        emit OwnershipTransferred(owner, nextOwner);\n        owner = nextOwner;\n    }\n\n    function _validateSlotIds(uint16[] calldata slotIds) private pure {\n        require(slotIds.length > 0 && slotIds.length <= MAX_BATCH, \"bad batch\");\n        for (uint256 i = 0; i < slotIds.length; i++) {\n            require(slotIds[i] < SLOT_COUNT, \"bad slot\");\n            for (uint256 j = 0; j < i; j++) require(slotIds[j] != slotIds[i], \"duplicate slot\");\n        }\n    }\n\n    function _validateData(TileData calldata data) private pure {\n        bytes calldata name = bytes(data.name);\n        require(name.length > 0 && name.length <= 96, \"bad name\");\n        bool visible;\n        for (uint256 i = 0; i < name.length; i++) if (uint8(name[i]) > 32) visible = true;\n        require(visible, \"bad name\");\n        bytes calldata url = bytes(data.url);\n        require(url.length > 0 && url.length <= 256, \"bad url\");\n        bool http = url.length >= 7 && url[0] == \"h\" && url[1] == \"t\" && url[2] == \"t\" && url[3] == \"p\" &&\n            ((url[4] == \":\" && url[5] == \"/\" && url[6] == \"/\") ||\n            (url.length >= 8 && url[4] == \"s\" && url[5] == \":\" && url[6] == \"/\" && url[7] == \"/\"));\n        require(http, \"bad url\");\n        require(bytes(data.message).length <= 336, \"message too long\");\n    }\n\n    function _checkCap(uint256 amount) private view {\n        require(totalLocked + amount <= MAX_BOARD_LOCK, \"board cap\");\n    }\n\n    function _chainBlockNumber() private view returns (uint64) {\n        (bool ok, bytes memory result) = address(0x64).staticcall{gas: 10000}(abi.encodeWithSignature(\"arbBlockNumber()\"));\n        return uint64(ok && result.length == 32 ? abi.decode(result, (uint256)) : block.number);\n    }\n\n    function _collect(uint256 amount) private {\n        uint256 beforeBalance = token.balanceOf(address(this));\n        require(token.transferFrom(msg.sender, address(this), amount), \"transfer failed\");\n        require(token.balanceOf(address(this)) == beforeBalance + amount, \"unsupported transfer fee\");\n    }\n\n    function _writeSlot(uint16 slotId, TileData calldata data) private {\n        Slot storage slot = slotRecords[slotId];\n        slot.owner = msg.sender;\n        slot.hidden = false;\n        slot.priceRank = 0;\n        slot.lockedAmount = uint128(SLOT_LOCK);\n        slot.expiresAt = uint64(block.timestamp + DEFAULT_TERM);\n        slot.reservedAtBlock = _chainBlockNumber();\n        slot.updatedAtBlock = _chainBlockNumber();\n        _writeData(slot, data);\n        emit SlotReserved(slotId, msg.sender, SLOT_LOCK, slot.expiresAt);\n    }\n\n    function _writeData(Slot storage slot, TileData calldata data) private {\n        slot.name = data.name;\n        slot.url = data.url;\n        slot.message = data.message;\n        slot.colors = uint72(data.backgroundColor) << 48 | uint72(data.accentColor) << 24 | uint72(data.textColor);\n    }\n\n    function _clearExpired(uint16 slotId) private {\n        Slot storage slot = slotRecords[slotId];\n        if (slot.owner != address(0) && block.timestamp >= slot.expiresAt) {\n            address account = slot.owner;\n            uint256 amount = slot.lockedAmount;\n            pendingWithdrawals[account] += amount;\n            _deleteSlot(slotId, account, amount);\n        }\n    }\n\n    function _deleteSlot(uint16 slotId, address account, uint256 amount) private {\n        delete slotRecords[slotId];\n        occupiedCount--;\n        totalLocked -= amount;\n        emit SlotReleased(slotId, account, amount);\n    }\n}\n"
      }
    },
    "settings": {
      "optimizer": {
        "enabled": true,
        "runs": 200
      },
      "evmVersion": "paris",
      "outputSelection": {
        "*": {
          "*": [
            "abi",
            "evm.bytecode.object",
            "evm.deployedBytecode.object",
            "evm.deployedBytecode.immutableReferences"
          ]
        }
      }
    }
  },
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "acceptedToken",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "initialModerator",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "moderator",
          "type": "address"
        }
      ],
      "name": "ModeratorUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "nextOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint16",
          "name": "count",
          "type": "uint16"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "unlockedAmount",
          "type": "uint256"
        }
      ],
      "name": "SlotBatchReleased",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint16",
          "name": "count",
          "type": "uint16"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "totalLockedAmount",
          "type": "uint256"
        }
      ],
      "name": "SlotBatchReserved",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint16",
          "name": "slotId",
          "type": "uint16"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "hidden",
          "type": "bool"
        },
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "reasonHash",
          "type": "bytes32"
        }
      ],
      "name": "SlotHidden",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint16",
          "name": "slotId",
          "type": "uint16"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "SlotMetadataUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint16",
          "name": "slotId",
          "type": "uint16"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "unlockedAmount",
          "type": "uint256"
        }
      ],
      "name": "SlotReleased",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint16",
          "name": "slotId",
          "type": "uint16"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "lockedAmount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint64",
          "name": "expiresAt",
          "type": "uint64"
        }
      ],
      "name": "SlotReserved",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "DEFAULT_TERM",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "MAX_BATCH",
      "outputs": [
        {
          "internalType": "uint16",
          "name": "",
          "type": "uint16"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "MAX_BOARD_LOCK",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "SLOT_COUNT",
      "outputs": [
        {
          "internalType": "uint16",
          "name": "",
          "type": "uint16"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "SLOT_LOCK",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16[]",
          "name": "slotIds",
          "type": "uint16[]"
        }
      ],
      "name": "clearExpiredBatch",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "slotId",
          "type": "uint16"
        }
      ],
      "name": "getSlot",
      "outputs": [
        {
          "components": [
            {
              "internalType": "address",
              "name": "owner",
              "type": "address"
            },
            {
              "internalType": "uint72",
              "name": "colors",
              "type": "uint72"
            },
            {
              "internalType": "bool",
              "name": "hidden",
              "type": "bool"
            },
            {
              "internalType": "uint16",
              "name": "priceRank",
              "type": "uint16"
            },
            {
              "internalType": "uint128",
              "name": "lockedAmount",
              "type": "uint128"
            },
            {
              "internalType": "uint64",
              "name": "expiresAt",
              "type": "uint64"
            },
            {
              "internalType": "uint64",
              "name": "reservedAtBlock",
              "type": "uint64"
            },
            {
              "internalType": "uint64",
              "name": "updatedAtBlock",
              "type": "uint64"
            },
            {
              "internalType": "string",
              "name": "name",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "url",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "message",
              "type": "string"
            }
          ],
          "internalType": "struct OwnTheGridBoardV5.Slot",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "start",
          "type": "uint16"
        },
        {
          "internalType": "uint16",
          "name": "count",
          "type": "uint16"
        }
      ],
      "name": "getSlots",
      "outputs": [
        {
          "components": [
            {
              "internalType": "address",
              "name": "owner",
              "type": "address"
            },
            {
              "internalType": "uint72",
              "name": "colors",
              "type": "uint72"
            },
            {
              "internalType": "bool",
              "name": "hidden",
              "type": "bool"
            },
            {
              "internalType": "uint16",
              "name": "priceRank",
              "type": "uint16"
            },
            {
              "internalType": "uint128",
              "name": "lockedAmount",
              "type": "uint128"
            },
            {
              "internalType": "uint64",
              "name": "expiresAt",
              "type": "uint64"
            },
            {
              "internalType": "uint64",
              "name": "reservedAtBlock",
              "type": "uint64"
            },
            {
              "internalType": "uint64",
              "name": "updatedAtBlock",
              "type": "uint64"
            },
            {
              "internalType": "string",
              "name": "name",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "url",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "message",
              "type": "string"
            }
          ],
          "internalType": "struct OwnTheGridBoardV5.Slot[]",
          "name": "result",
          "type": "tuple[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "slotId",
          "type": "uint16"
        },
        {
          "internalType": "bool",
          "name": "hidden",
          "type": "bool"
        },
        {
          "internalType": "bytes32",
          "name": "reasonHash",
          "type": "bytes32"
        }
      ],
      "name": "hideSlot",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "slotId",
          "type": "uint16"
        }
      ],
      "name": "isAvailable",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "moderator",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "nextRequiredLock",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "occupiedCount",
      "outputs": [
        {
          "internalType": "uint16",
          "name": "",
          "type": "uint16"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "pendingWithdrawals",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16[]",
          "name": "slotIds",
          "type": "uint16[]"
        }
      ],
      "name": "quoteReserve",
      "outputs": [
        {
          "internalType": "uint256[]",
          "name": "amounts",
          "type": "uint256[]"
        },
        {
          "internalType": "uint256",
          "name": "totalAmount",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "slotId",
          "type": "uint16"
        }
      ],
      "name": "release",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16[]",
          "name": "slotIds",
          "type": "uint16[]"
        }
      ],
      "name": "releaseBatch",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "rank",
          "type": "uint256"
        }
      ],
      "name": "requiredLockForRank",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "slotId",
          "type": "uint16"
        },
        {
          "components": [
            {
              "internalType": "string",
              "name": "name",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "url",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "message",
              "type": "string"
            },
            {
              "internalType": "uint24",
              "name": "backgroundColor",
              "type": "uint24"
            },
            {
              "internalType": "uint24",
              "name": "accentColor",
              "type": "uint24"
            },
            {
              "internalType": "uint24",
              "name": "textColor",
              "type": "uint24"
            }
          ],
          "internalType": "struct OwnTheGridBoardV5.TileData",
          "name": "data",
          "type": "tuple"
        },
        {
          "internalType": "uint256",
          "name": "maxAmount",
          "type": "uint256"
        }
      ],
      "name": "reserve",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16[]",
          "name": "slotIds",
          "type": "uint16[]"
        },
        {
          "components": [
            {
              "internalType": "string",
              "name": "name",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "url",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "message",
              "type": "string"
            },
            {
              "internalType": "uint24",
              "name": "backgroundColor",
              "type": "uint24"
            },
            {
              "internalType": "uint24",
              "name": "accentColor",
              "type": "uint24"
            },
            {
              "internalType": "uint24",
              "name": "textColor",
              "type": "uint24"
            }
          ],
          "internalType": "struct OwnTheGridBoardV5.TileData[]",
          "name": "data",
          "type": "tuple[]"
        },
        {
          "internalType": "uint256",
          "name": "maxAmount",
          "type": "uint256"
        }
      ],
      "name": "reserveBatch",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "nextModerator",
          "type": "address"
        }
      ],
      "name": "setModerator",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "token",
      "outputs": [
        {
          "internalType": "contract IERC20BoardV5",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalLocked",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "nextOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "slotId",
          "type": "uint16"
        },
        {
          "components": [
            {
              "internalType": "string",
              "name": "name",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "url",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "message",
              "type": "string"
            },
            {
              "internalType": "uint24",
              "name": "backgroundColor",
              "type": "uint24"
            },
            {
              "internalType": "uint24",
              "name": "accentColor",
              "type": "uint24"
            },
            {
              "internalType": "uint24",
              "name": "textColor",
              "type": "uint24"
            }
          ],
          "internalType": "struct OwnTheGridBoardV5.TileData",
          "name": "data",
          "type": "tuple"
        }
      ],
      "name": "updateMetadata",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "version",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "withdraw",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "bytecode": "0x60a06040523480156200001157600080fd5b506040516200344a3803806200344a83398101604081905262000034916200015f565b6000826001600160a01b03163b11620000845760405162461bcd60e51b815260206004820152600e60248201526d1d1bdad95b881c995c5d5a5c995960921b604482015260640160405180910390fd5b6001600160a01b03808316608052600080546001600160a01b03191633179055811615620000b35780620000b5565b335b600180546001600160a01b0319166001600160a01b039290921691909117905560405133906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36001546040516001600160a01b03909116907f74ad00f42c7567187f818b7401d2b03eae8dc59f390e590b0bbdf9048c53d25490600090a2505062000197565b80516001600160a01b03811681146200015a57600080fd5b919050565b600080604083850312156200017357600080fd5b6200017e8362000142565b91506200018e6020840162000142565b90509250929050565b60805161326d620001dd600039600081816104210152818161083e01528181610c0c01528181611bf101528181612327015281816123bf015261246f015261326d6000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806371a9b459116100f957806398aae25411610097578063f313967d11610071578063f313967d146103d6578063f3f43703146103e9578063fbe6ae6314610409578063fc0c546a1461041c57600080fd5b806398aae254146103a8578063b8c4db2b146103b0578063f2fde38b146103c357600080fd5b8063862b35f0116100d3578063862b35f01461034b5780638da5cb5b1461036b5780639334ce541461037e578063950bff9f146103a057600080fd5b806371a9b4591461030657806375bba1891461031757806382a8b13a1461032a57600080fd5b80634e37070b1161016657806354fd4d501161014057806354fd4d50146102c457806356891412146102cb578063697586aa146102d45780636ef2953e146102e657600080fd5b80634e37070b146102805780634eef27071461029c57806350611f62146102b157600080fd5b80633ccfd60b116101a25780633ccfd60b146102215780633d85c5b114610229578063440a6d2b1461024a57806348b691fa1461026d57600080fd5b806327986b4e146101c957806335d38908146101de57806338743904146101f1575b600080fd5b6101dc6101d73660046129f9565b610443565b005b6101dc6101ec366004612a6c565b610710565b600154610204906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101dc610781565b61023c610237366004612aad565b6108d4565b604051908152602001610218565b61025d610258366004612add565b61092f565b6040519015158152602001610218565b6101dc61027b366004612b0d565b6109ab565b61028961019081565b60405161ffff9091168152602001610218565b60015461028990600160a01b900461ffff1681565b6101dc6102bf366004612a6c565b610ae7565b600561023c565b61023c60025481565b61023c6a52b7d2dcc80cd2e400000081565b6102f96102f4366004612b4c565b610ceb565b6040516102189190612ce5565b61023c6934f086f3b33b6840000081565b6101dc610325366004612d49565b611071565b61033d610338366004612a6c565b611124565b604051610218929190612d72565b61035e610359366004612add565b611215565b6040516102189190612dbf565b600054610204906001600160a01b031681565b61038862278d0081565b6040516001600160401b039091168152602001610218565b610289602881565b61023c6114b5565b6101dc6103be366004612dea565b61153e565b6101dc6103d1366004612d49565b6116bf565b6101dc6103e4366004612e40565b6117a7565b61023c6103f7366004612d49565b60046020526000908152604090205481565b6101dc610417366004612add565b6118c9565b6102047f000000000000000000000000000000000000000000000000000000000000000081565b60055460ff161561046f5760405162461bcd60e51b815260040161046690612e8d565b60405180910390fd5b6005805460ff191660011790556104868585611cae565b8184146104c75760405162461bcd60e51b815260206004820152600f60248201526e0d8cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610466565b60005b8481101561059c576104fe8484838181106104e7576104e7612eb0565b90506020028101906104f99190612ec6565b611e01565b61052d86868381811061051357610513612eb0565b90506020020160208101906105289190612add565b61221f565b600060038188888581811061054457610544612eb0565b90506020020160208101906105599190612add565b61ffff1681526020810191909152604001600020546001600160a01b0316146105945760405162461bcd60e51b815260040161046690612ee6565b6001016104ca565b5060006105b3856934f086f3b33b68400000612f20565b9050818111156105f55760405162461bcd60e51b815260206004820152600d60248201526c1c1c9a58d94818da185b99d959609a1b6044820152606401610466565b6105fe816122b8565b6106078161230f565b60005b8581101561066d5761066587878381811061062757610627612eb0565b905060200201602081019061063c9190612add565b86868481811061064e5761064e612eb0565b90506020028101906106609190612ec6565b61252f565b60010161060a565b506001805486919060149061068e908490600160a01b900461ffff16612f37565b92506101000a81548161ffff021916908361ffff16021790555080600260008282546106ba9190612f52565b90915550506040805161ffff871681526020810183905233917febaef8c9e3ba75c4e43a37324731cf2c1a54ffc33b6043dd959a6d45eb487795910160405180910390a250506005805460ff1916905550505050565b60055460ff16156107335760405162461bcd60e51b815260040161046690612e8d565b6005805460ff1916600117905561074a8282611cae565b60005b818110156107725761076a83838381811061051357610513612eb0565b60010161074d565b50506005805460ff1916905550565b60055460ff16156107a45760405162461bcd60e51b815260040161046690612e8d565b6005805460ff1916600117905533600090815260046020526040902054806108045760405162461bcd60e51b81526020600482015260136024820152726e6f7468696e6720746f20776974686472617760681b6044820152606401610466565b33600081815260046020819052604080832092909255905163a9059cbb60e01b815290810191909152602481018290526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af1158015610887573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ab9190612f65565b6108c75760405162461bcd60e51b815260040161046690612f82565b506005805460ff19169055565b600080821180156108e757506101908211155b61091e5760405162461bcd60e51b81526020600482015260086024820152676261642072616e6b60c01b6044820152606401610466565b506934f086f3b33b68400000919050565b600061019061ffff8316106109565760405162461bcd60e51b815260040161046690612fab565b61ffff82166000908152600360205260409020546001600160a01b031615806109a5575061ffff8216600090815260036020526040902060010154600160801b90046001600160401b03164210155b92915050565b6000546001600160a01b03163314806109ce57506001546001600160a01b031633145b610a0a5760405162461bcd60e51b815260206004820152600d60248201526c3737ba1036b7b232b930ba37b960991b6044820152606401610466565b61019061ffff8416108015610a3a575061ffff83166000908152600360205260409020546001600160a01b031615155b610a735760405162461bcd60e51b815260206004820152600a602482015269195b5c1d1e481cdb1bdd60b21b6044820152606401610466565b61ffff8316600081815260036020526040908190208054851515600160e81b0260ff60e81b19909116179055517fea8cf15425ae681272f6ed8197465e04a6eab8f1b3d19f1f4db16f6560da9f6c90610ada90859085909115158252602082015260400190565b60405180910390a2505050565b60055460ff1615610b0a5760405162461bcd60e51b815260040161046690612e8d565b6005805460ff19166001179055610b218282611cae565b6000805b82811015610bef57600060036000868685818110610b4557610b45612eb0565b9050602002016020810190610b5a9190612add565b61ffff168152602081019190915260400160002080549091506001600160a01b03163314610b9a5760405162461bcd60e51b815260040161046690612fcd565b60018101546001600160801b0316610bb28185612f52565b9350610be5868685818110610bc957610bc9612eb0565b9050602002016020810190610bde9190612add565b3383612687565b5050600101610b25565b5060405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015610c5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c819190612f65565b610c9d5760405162461bcd60e51b815260040161046690612f82565b6040805161ffff841681526020810183905233917fa39c8515af2e6d80e332881f1f536a102c7cd47532d22f1a5ab196d1b41cfff3910160405180910390a250506005805460ff1916905550565b606060008261ffff16118015610d065750602861ffff831611155b8015610d245750610190610d2161ffff848116908616612f52565b11155b610d5b5760405162461bcd60e51b8152602060048201526008602482015267626164207061676560c01b6044820152606401610466565b8161ffff166001600160401b03811115610d7757610d77612ff5565b604051908082528060200260200182016040528015610db057816020015b610d9d612902565b815260200190600190039081610d955790505b50905060005b8261ffff168161ffff16101561106a5760036000610dd48387612f37565b61ffff9081168252602080830193909352604091820160002082516101608101845281546001600160a01b038116825268ffffffffffffffffff600160a01b8204169582019590955260ff600160e81b860416151593810193909352600160f01b90930416606082015260018201546001600160801b03811660808301526001600160401b03600160801b8204811660a0840152600160c01b909104811660c083015260028301541660e082015260038201805491929161010084019190610e9b9061300b565b80601f0160208091040260200160405190810160405280929190818152602001828054610ec79061300b565b8015610f145780601f10610ee957610100808354040283529160200191610f14565b820191906000526020600020905b815481529060010190602001808311610ef757829003601f168201915b50505050508152602001600482018054610f2d9061300b565b80601f0160208091040260200160405190810160405280929190818152602001828054610f599061300b565b8015610fa65780601f10610f7b57610100808354040283529160200191610fa6565b820191906000526020600020905b815481529060010190602001808311610f8957829003601f168201915b50505050508152602001600582018054610fbf9061300b565b80601f0160208091040260200160405190810160405280929190818152602001828054610feb9061300b565b80156110385780601f1061100d57610100808354040283529160200191611038565b820191906000526020600020905b81548152906001019060200180831161101b57829003601f168201915b505050505081525050828261ffff168151811061105757611057612eb0565b6020908102919091010152600101610db6565b5092915050565b6000546001600160a01b031633146110b75760405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b6044820152606401610466565b6001600160a01b038116156110cc57806110d9565b6000546001600160a01b03165b600180546001600160a01b0319166001600160a01b039290921691821790556040517f74ad00f42c7567187f818b7401d2b03eae8dc59f390e590b0bbdf9048c53d25490600090a250565b606060006111328484611cae565b826001600160401b0381111561114a5761114a612ff5565b604051908082528060200260200182016040528015611173578160200160208202803683370190505b50915060005b838110156111f7576111ab85858381811061119657611196612eb0565b90506020020160208101906102589190612add565b6111c75760405162461bcd60e51b815260040161046690612ee6565b6934f086f3b33b684000008382815181106111e4576111e4612eb0565b6020908102919091010152600101611179565b5061120c836934f086f3b33b68400000612f20565b90509250929050565b61121d612902565b61019061ffff8316106112425760405162461bcd60e51b815260040161046690612fab565b61ffff80831660009081526003602081815260409283902083516101608101855281546001600160a01b038116825268ffffffffffffffffff600160a01b8204169382019390935260ff600160e81b840416151594810194909452600160f01b909104909316606083015260018301546001600160801b03811660808401526001600160401b03600160801b8204811660a0850152600160c01b909104811660c084015260028401541660e083015282018054919291610100840191906113089061300b565b80601f01602080910402602001604051908101604052809291908181526020018280546113349061300b565b80156113815780601f1061135657610100808354040283529160200191611381565b820191906000526020600020905b81548152906001019060200180831161136457829003601f168201915b5050505050815260200160048201805461139a9061300b565b80601f01602080910402602001604051908101604052809291908181526020018280546113c69061300b565b80156114135780601f106113e857610100808354040283529160200191611413565b820191906000526020600020905b8154815290600101906020018083116113f657829003601f168201915b5050505050815260200160058201805461142c9061300b565b80601f01602080910402602001604051908101604052809291908181526020018280546114589061300b565b80156114a55780601f1061147a576101008083540402835291602001916114a5565b820191906000526020600020905b81548152906001019060200180831161148857829003601f168201915b5050505050815250509050919050565b600154600090610190600160a01b90910461ffff1610156114df57506934f086f3b33b6840000090565b60005b61019061ffff821610156115365761ffff8116600090815260036020526040902060010154600160801b90046001600160401b0316421061152e576934f086f3b33b6840000091505090565b6001016114e2565b506000905090565b60055460ff16156115615760405162461bcd60e51b815260040161046690612e8d565b6005805460ff1916600117905561019061ffff8416106115935760405162461bcd60e51b815260040161046690612fab565b61159c82611e01565b6115a58361221f565b61ffff83166000908152600360205260409020546001600160a01b0316156115df5760405162461bcd60e51b815260040161046690612ee6565b806934f086f3b33b6840000011156116295760405162461bcd60e51b815260206004820152600d60248201526c1c1c9a58d94818da185b99d959609a1b6044820152606401610466565b61163c6934f086f3b33b684000006122b8565b61164f6934f086f3b33b6840000061230f565b611659838361252f565b60018054600160a01b900461ffff169060146116748361303f565b91906101000a81548161ffff021916908361ffff160217905550506934f086f3b33b68400000600260008282546116ab9190612f52565b90915550506005805460ff19169055505050565b6000546001600160a01b031633146117055760405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b6044820152606401610466565b6001600160a01b03811661174c5760405162461bcd60e51b815260206004820152600e60248201526d1bdddb995c881c995c5d5a5c995960921b6044820152606401610466565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b61019061ffff8316106117cc5760405162461bcd60e51b815260040161046690612fab565b6117d581611e01565b61ffff8216600090815260036020526040902080546001600160a01b031633146118115760405162461bcd60e51b815260040161046690612fcd565b6001810154600160801b90046001600160401b0316421061185e5760405162461bcd60e51b8152602060048201526007602482015266195e1c1a5c995960ca1b6044820152606401610466565b6118688183612773565b611870612848565b60028201805467ffffffffffffffff19166001600160401b0392909216919091179055604051339061ffff8516907f28db8e6c98352b3150d654574a340aabc9045e8158537e4ae709a5e3f040ae7b90600090a3505050565b60055460ff16156118ec5760405162461bcd60e51b815260040161046690612e8d565b6005805460ff1916600117905561019061ffff82161061191e5760405162461bcd60e51b815260040161046690612fab565b61ffff808216600090815260036020818152604080842081516101608101835281546001600160a01b038116825268ffffffffffffffffff600160a01b8204169482019490945260ff600160e81b850416151592810192909252600160f01b909204909416606085015260018101546001600160801b03811660808601526001600160401b03600160801b8204811660a0870152600160c01b909104811660c086015260028201541660e08501529081018054929392610100840191906119e49061300b565b80601f0160208091040260200160405190810160405280929190818152602001828054611a109061300b565b8015611a5d5780601f10611a3257610100808354040283529160200191611a5d565b820191906000526020600020905b815481529060010190602001808311611a4057829003601f168201915b50505050508152602001600482018054611a769061300b565b80601f0160208091040260200160405190810160405280929190818152602001828054611aa29061300b565b8015611aef5780601f10611ac457610100808354040283529160200191611aef565b820191906000526020600020905b815481529060010190602001808311611ad257829003601f168201915b50505050508152602001600582018054611b089061300b565b80601f0160208091040260200160405190810160405280929190818152602001828054611b349061300b565b8015611b815780601f10611b5657610100808354040283529160200191611b81565b820191906000526020600020905b815481529060010190602001808311611b6457829003601f168201915b5050509190925250508151919250506001600160a01b03163314611bb75760405162461bcd60e51b815260040161046690612fcd565b611bd382826000015183608001516001600160801b0316612687565b8051608082015160405163a9059cbb60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263a9059cbb92611c41926004016001600160a01b039290921682526001600160801b0316602082015260400190565b6020604051808303816000875af1158015611c60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c849190612f65565b611ca05760405162461bcd60e51b815260040161046690612f82565b50506005805460ff19169055565b8015801590611cbe575060288111155b611cf65760405162461bcd60e51b81526020600482015260096024820152680c4c2c840c4c2e8c6d60bb1b6044820152606401610466565b60005b81811015611dfc57610190838383818110611d1657611d16612eb0565b9050602002016020810190611d2b9190612add565b61ffff1610611d4c5760405162461bcd60e51b815260040161046690612fab565b60005b81811015611df357838383818110611d6957611d69612eb0565b9050602002016020810190611d7e9190612add565b61ffff16848483818110611d9457611d94612eb0565b9050602002016020810190611da99190612add565b61ffff1603611deb5760405162461bcd60e51b815260206004820152600e60248201526d191d5c1b1a58d85d19481cdb1bdd60921b6044820152606401610466565b600101611d4f565b50600101611cf9565b505050565b366000611e0e8380613060565b90925090508015801590611e23575060608111155b611e5a5760405162461bcd60e51b8152602060048201526008602482015267626164206e616d6560c01b6044820152606401610466565b6000805b82811015611e9d576020848483818110611e7a57611e7a612eb0565b9050013560f81c60f81b60f81c60ff161115611e9557600191505b600101611e5e565b5080611ed65760405162461bcd60e51b8152602060048201526008602482015267626164206e616d6560c01b6044820152606401610466565b366000611ee66020870187613060565b90925090508015801590611efc57506101008111155b611f325760405162461bcd60e51b8152602060048201526007602482015266189859081d5c9b60ca1b6044820152606401610466565b600060078210801590611f6e575082826000818110611f5357611f53612eb0565b9050013560f81c60f81b6001600160f81b031916600d60fb1b145b8015611fa3575082826001818110611f8857611f88612eb0565b9050013560f81c60f81b6001600160f81b031916601d60fa1b145b8015611fd8575082826002818110611fbd57611fbd612eb0565b9050013560f81c60f81b6001600160f81b031916601d60fa1b145b801561200d575082826003818110611ff257611ff2612eb0565b9050013560f81c60f81b6001600160f81b031916600760fc1b145b801561218a57508282600481811061202757612027612eb0565b9050013560f81c60f81b6001600160f81b031916601d60f91b14801561207657508282600581811061205b5761205b612eb0565b9050013560f81c60f81b6001600160f81b031916602f60f81b145b80156120ab57508282600681811061209057612090612eb0565b9050013560f81c60f81b6001600160f81b031916602f60f81b145b8061218a5750600882108015906120eb5750828260048181106120d0576120d0612eb0565b9050013560f81c60f81b6001600160f81b031916607360f81b145b801561212057508282600581811061210557612105612eb0565b9050013560f81c60f81b6001600160f81b031916601d60f91b145b801561215557508282600681811061213a5761213a612eb0565b9050013560f81c60f81b6001600160f81b031916602f60f81b145b801561218a57508282600781811061216f5761216f612eb0565b9050013560f81c60f81b6001600160f81b031916602f60f81b145b9050806121c35760405162461bcd60e51b8152602060048201526007602482015266189859081d5c9b60ca1b6044820152606401610466565b6101506121d36040890189613060565b905011156122165760405162461bcd60e51b815260206004820152601060248201526f6d65737361676520746f6f206c6f6e6760801b6044820152606401610466565b50505050505050565b61ffff8116600090815260036020526040902080546001600160a01b03161580159061225f57506001810154600160801b90046001600160401b03164210155b156122b457805460018201546001600160a01b039091166000818152600460205260408120805492936001600160801b0316928392906122a0908490612f52565b909155506122b19050848383612687565b50505b5050565b6a52b7d2dcc80cd2e4000000816002546122d29190612f52565b111561230c5760405162461bcd60e51b81526020600482015260096024820152680626f617264206361760bc1b6044820152606401610466565b50565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015612376573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061239a91906130a6565b6040516323b872dd60e01b8152336004820152306024820152604481018490529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303816000875af1158015612410573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124349190612f65565b6124505760405162461bcd60e51b815260040161046690612f82565b61245a8282612f52565b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156124be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124e291906130a6565b146122b45760405162461bcd60e51b815260206004820152601860248201527f756e737570706f72746564207472616e736665722066656500000000000000006044820152606401610466565b61ffff8216600090815260036020526040902080546001600160e81b03331668ffffffffffffffffff60a01b9091161781556001810180546fffffffffffffffffffffffffffffffff19166934f086f3b33b6840000017905561259562278d0042612f52565b8160010160106101000a8154816001600160401b0302191690836001600160401b031602179055506125c5612848565b8160010160186101000a8154816001600160401b0302191690836001600160401b031602179055506125f5612848565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556126228183612773565b6001810154604080516934f086f3b33b684000008152600160801b9092046001600160401b03166020830152339161ffff8616917f996dc7dea540e13628337096337f8d9cdc0802a647e25801cb4c2bfc52c979b991015b60405180910390a3505050565b61ffff8316600090815260036020819052604082208281556001810183905560028101805467ffffffffffffffff1916905591906126c790830182612960565b6126d5600483016000612960565b6126e3600583016000612960565b505060018054600160a01b900461ffff16906014612700836130bf565b91906101000a81548161ffff021916908361ffff16021790555050806002600082825461272d91906130dd565b90915550506040518181526001600160a01b0383169061ffff8516907f4bf7bd7a3c7a3b7fb528fb7b8d7ead8fa2244a2e8a10a1f2e2c328889352af869060200161267a565b61277d8180613060565b600384019161278d919083613140565b5061279b6020820182613060565b60048401916127ab919083613140565b506127b96040820182613060565b60058401916127c9919083613140565b506127da60c0820160a08301613200565b62ffffff1660186127f160a0840160808501613200565b62ffffff16901b603061280a6080850160608601613200565b855462ffffff9190911690911b919091179190911768ffffffffffffffffff16600160a01b0268ffffffffffffffffff60a01b199091161790915550565b60408051600481526024810182526020810180516001600160e01b031663a3b1b31d60e01b1790529051600091829182916064916127109161288991613225565b6000604051808303818686fa925050503d80600081146128c5576040519150601f19603f3d011682016040523d82523d6000602084013e6128ca565b606091505b50915091508180156128dd575080516020145b6128e757436128fb565b808060200190518101906128fb91906130a6565b9250505090565b604080516101608101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e08201929092526101008101829052610120810182905261014081019190915290565b50805461296c9061300b565b6000825580601f1061297c575050565b601f01602090049060005260206000209081019061230c91905b808211156129aa5760008155600101612996565b5090565b60008083601f8401126129c057600080fd5b5081356001600160401b038111156129d757600080fd5b6020830191508360208260051b85010111156129f257600080fd5b9250929050565b600080600080600060608688031215612a1157600080fd5b85356001600160401b0380821115612a2857600080fd5b612a3489838a016129ae565b90975095506020880135915080821115612a4d57600080fd5b50612a5a888289016129ae565b96999598509660400135949350505050565b60008060208385031215612a7f57600080fd5b82356001600160401b03811115612a9557600080fd5b612aa1858286016129ae565b90969095509350505050565b600060208284031215612abf57600080fd5b5035919050565b803561ffff81168114612ad857600080fd5b919050565b600060208284031215612aef57600080fd5b612af882612ac6565b9392505050565b801515811461230c57600080fd5b600080600060608486031215612b2257600080fd5b612b2b84612ac6565b92506020840135612b3b81612aff565b929592945050506040919091013590565b60008060408385031215612b5f57600080fd5b612b6883612ac6565b915061120c60208401612ac6565b60005b83811015612b91578181015183820152602001612b79565b50506000910152565b60008151808452612bb2816020860160208601612b76565b601f01601f19169290920160200192915050565b80516001600160a01b0316825260006101606020830151612bf4602086018268ffffffffffffffffff169052565b506040830151612c08604086018215159052565b506060830151612c1e606086018261ffff169052565b506080830151612c3960808601826001600160801b03169052565b5060a0830151612c5460a08601826001600160401b03169052565b5060c0830151612c6f60c08601826001600160401b03169052565b5060e0830151612c8a60e08601826001600160401b03169052565b50610100808401518282870152612ca383870182612b9a565b925050506101208084015185830382870152612cbf8382612b9a565b925050506101408084015185830382870152612cdb8382612b9a565b9695505050505050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015612d3c57603f19888603018452612d2a858351612bc6565b94509285019290850190600101612d0e565b5092979650505050505050565b600060208284031215612d5b57600080fd5b81356001600160a01b0381168114612af857600080fd5b604080825283519082018190526000906020906060840190828701845b82811015612dab57815184529284019290840190600101612d8f565b505050602093909301939093525092915050565b602081526000612af86020830184612bc6565b600060c08284031215612de457600080fd5b50919050565b600080600060608486031215612dff57600080fd5b612e0884612ac6565b925060208401356001600160401b03811115612e2357600080fd5b612e2f86828701612dd2565b925050604084013590509250925092565b60008060408385031215612e5357600080fd5b612e5c83612ac6565b915060208301356001600160401b03811115612e7757600080fd5b612e8385828601612dd2565b9150509250929050565b6020808252600990820152681c99595b9d1c985b9d60ba1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b6000823560be19833603018112612edc57600080fd5b9190910192915050565b6020808252600a908201526939b637ba103a30b5b2b760b11b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176109a5576109a5612f0a565b61ffff81811683821601908082111561106a5761106a612f0a565b808201808211156109a5576109a5612f0a565b600060208284031215612f7757600080fd5b8151612af881612aff565b6020808252600f908201526e1d1c985b9cd9995c8819985a5b1959608a1b604082015260600190565b602080825260089082015267189859081cdb1bdd60c21b604082015260600190565b6020808252600e908201526d3737ba1039b637ba1037bbb732b960911b604082015260600190565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168061301f57607f821691505b602082108103612de457634e487b7160e01b600052602260045260246000fd5b600061ffff80831681810361305657613056612f0a565b6001019392505050565b6000808335601e1984360301811261307757600080fd5b8301803591506001600160401b0382111561309157600080fd5b6020019150368190038213156129f257600080fd5b6000602082840312156130b857600080fd5b5051919050565b600061ffff8216806130d3576130d3612f0a565b6000190192915050565b818103818111156109a5576109a5612f0a565b601f821115611dfc576000816000526020600020601f850160051c810160208610156131195750805b601f850160051c820191505b8181101561313857828155600101613125565b505050505050565b6001600160401b0383111561315757613157612ff5565b61316b83613165835461300b565b836130f0565b6000601f84116001811461319f57600085156131875750838201355b600019600387901b1c1916600186901b1783556131f9565b600083815260209020601f19861690835b828110156131d057868501358255602094850194600190920191016131b0565b50868210156131ed5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b60006020828403121561321257600080fd5b813562ffffff81168114612af857600080fd5b60008251612edc818460208701612b7656fea2646970667358221220497071156a1c0b245611c110cef8fd5fe3b4fda3d3dadbe53220a712e23ed8e364736f6c63430008180033",
  "runtimeBytecode": "0x608060405234801561001057600080fd5b50600436106101c45760003560e01c806371a9b459116100f957806398aae25411610097578063f313967d11610071578063f313967d146103d6578063f3f43703146103e9578063fbe6ae6314610409578063fc0c546a1461041c57600080fd5b806398aae254146103a8578063b8c4db2b146103b0578063f2fde38b146103c357600080fd5b8063862b35f0116100d3578063862b35f01461034b5780638da5cb5b1461036b5780639334ce541461037e578063950bff9f146103a057600080fd5b806371a9b4591461030657806375bba1891461031757806382a8b13a1461032a57600080fd5b80634e37070b1161016657806354fd4d501161014057806354fd4d50146102c457806356891412146102cb578063697586aa146102d45780636ef2953e146102e657600080fd5b80634e37070b146102805780634eef27071461029c57806350611f62146102b157600080fd5b80633ccfd60b116101a25780633ccfd60b146102215780633d85c5b114610229578063440a6d2b1461024a57806348b691fa1461026d57600080fd5b806327986b4e146101c957806335d38908146101de57806338743904146101f1575b600080fd5b6101dc6101d73660046129f9565b610443565b005b6101dc6101ec366004612a6c565b610710565b600154610204906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101dc610781565b61023c610237366004612aad565b6108d4565b604051908152602001610218565b61025d610258366004612add565b61092f565b6040519015158152602001610218565b6101dc61027b366004612b0d565b6109ab565b61028961019081565b60405161ffff9091168152602001610218565b60015461028990600160a01b900461ffff1681565b6101dc6102bf366004612a6c565b610ae7565b600561023c565b61023c60025481565b61023c6a52b7d2dcc80cd2e400000081565b6102f96102f4366004612b4c565b610ceb565b6040516102189190612ce5565b61023c6934f086f3b33b6840000081565b6101dc610325366004612d49565b611071565b61033d610338366004612a6c565b611124565b604051610218929190612d72565b61035e610359366004612add565b611215565b6040516102189190612dbf565b600054610204906001600160a01b031681565b61038862278d0081565b6040516001600160401b039091168152602001610218565b610289602881565b61023c6114b5565b6101dc6103be366004612dea565b61153e565b6101dc6103d1366004612d49565b6116bf565b6101dc6103e4366004612e40565b6117a7565b61023c6103f7366004612d49565b60046020526000908152604090205481565b6101dc610417366004612add565b6118c9565b6102047f000000000000000000000000000000000000000000000000000000000000000081565b60055460ff161561046f5760405162461bcd60e51b815260040161046690612e8d565b60405180910390fd5b6005805460ff191660011790556104868585611cae565b8184146104c75760405162461bcd60e51b815260206004820152600f60248201526e0d8cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610466565b60005b8481101561059c576104fe8484838181106104e7576104e7612eb0565b90506020028101906104f99190612ec6565b611e01565b61052d86868381811061051357610513612eb0565b90506020020160208101906105289190612add565b61221f565b600060038188888581811061054457610544612eb0565b90506020020160208101906105599190612add565b61ffff1681526020810191909152604001600020546001600160a01b0316146105945760405162461bcd60e51b815260040161046690612ee6565b6001016104ca565b5060006105b3856934f086f3b33b68400000612f20565b9050818111156105f55760405162461bcd60e51b815260206004820152600d60248201526c1c1c9a58d94818da185b99d959609a1b6044820152606401610466565b6105fe816122b8565b6106078161230f565b60005b8581101561066d5761066587878381811061062757610627612eb0565b905060200201602081019061063c9190612add565b86868481811061064e5761064e612eb0565b90506020028101906106609190612ec6565b61252f565b60010161060a565b506001805486919060149061068e908490600160a01b900461ffff16612f37565b92506101000a81548161ffff021916908361ffff16021790555080600260008282546106ba9190612f52565b90915550506040805161ffff871681526020810183905233917febaef8c9e3ba75c4e43a37324731cf2c1a54ffc33b6043dd959a6d45eb487795910160405180910390a250506005805460ff1916905550505050565b60055460ff16156107335760405162461bcd60e51b815260040161046690612e8d565b6005805460ff1916600117905561074a8282611cae565b60005b818110156107725761076a83838381811061051357610513612eb0565b60010161074d565b50506005805460ff1916905550565b60055460ff16156107a45760405162461bcd60e51b815260040161046690612e8d565b6005805460ff1916600117905533600090815260046020526040902054806108045760405162461bcd60e51b81526020600482015260136024820152726e6f7468696e6720746f20776974686472617760681b6044820152606401610466565b33600081815260046020819052604080832092909255905163a9059cbb60e01b815290810191909152602481018290526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af1158015610887573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ab9190612f65565b6108c75760405162461bcd60e51b815260040161046690612f82565b506005805460ff19169055565b600080821180156108e757506101908211155b61091e5760405162461bcd60e51b81526020600482015260086024820152676261642072616e6b60c01b6044820152606401610466565b506934f086f3b33b68400000919050565b600061019061ffff8316106109565760405162461bcd60e51b815260040161046690612fab565b61ffff82166000908152600360205260409020546001600160a01b031615806109a5575061ffff8216600090815260036020526040902060010154600160801b90046001600160401b03164210155b92915050565b6000546001600160a01b03163314806109ce57506001546001600160a01b031633145b610a0a5760405162461bcd60e51b815260206004820152600d60248201526c3737ba1036b7b232b930ba37b960991b6044820152606401610466565b61019061ffff8416108015610a3a575061ffff83166000908152600360205260409020546001600160a01b031615155b610a735760405162461bcd60e51b815260206004820152600a602482015269195b5c1d1e481cdb1bdd60b21b6044820152606401610466565b61ffff8316600081815260036020526040908190208054851515600160e81b0260ff60e81b19909116179055517fea8cf15425ae681272f6ed8197465e04a6eab8f1b3d19f1f4db16f6560da9f6c90610ada90859085909115158252602082015260400190565b60405180910390a2505050565b60055460ff1615610b0a5760405162461bcd60e51b815260040161046690612e8d565b6005805460ff19166001179055610b218282611cae565b6000805b82811015610bef57600060036000868685818110610b4557610b45612eb0565b9050602002016020810190610b5a9190612add565b61ffff168152602081019190915260400160002080549091506001600160a01b03163314610b9a5760405162461bcd60e51b815260040161046690612fcd565b60018101546001600160801b0316610bb28185612f52565b9350610be5868685818110610bc957610bc9612eb0565b9050602002016020810190610bde9190612add565b3383612687565b5050600101610b25565b5060405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015610c5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c819190612f65565b610c9d5760405162461bcd60e51b815260040161046690612f82565b6040805161ffff841681526020810183905233917fa39c8515af2e6d80e332881f1f536a102c7cd47532d22f1a5ab196d1b41cfff3910160405180910390a250506005805460ff1916905550565b606060008261ffff16118015610d065750602861ffff831611155b8015610d245750610190610d2161ffff848116908616612f52565b11155b610d5b5760405162461bcd60e51b8152602060048201526008602482015267626164207061676560c01b6044820152606401610466565b8161ffff166001600160401b03811115610d7757610d77612ff5565b604051908082528060200260200182016040528015610db057816020015b610d9d612902565b815260200190600190039081610d955790505b50905060005b8261ffff168161ffff16101561106a5760036000610dd48387612f37565b61ffff9081168252602080830193909352604091820160002082516101608101845281546001600160a01b038116825268ffffffffffffffffff600160a01b8204169582019590955260ff600160e81b860416151593810193909352600160f01b90930416606082015260018201546001600160801b03811660808301526001600160401b03600160801b8204811660a0840152600160c01b909104811660c083015260028301541660e082015260038201805491929161010084019190610e9b9061300b565b80601f0160208091040260200160405190810160405280929190818152602001828054610ec79061300b565b8015610f145780601f10610ee957610100808354040283529160200191610f14565b820191906000526020600020905b815481529060010190602001808311610ef757829003601f168201915b50505050508152602001600482018054610f2d9061300b565b80601f0160208091040260200160405190810160405280929190818152602001828054610f599061300b565b8015610fa65780601f10610f7b57610100808354040283529160200191610fa6565b820191906000526020600020905b815481529060010190602001808311610f8957829003601f168201915b50505050508152602001600582018054610fbf9061300b565b80601f0160208091040260200160405190810160405280929190818152602001828054610feb9061300b565b80156110385780601f1061100d57610100808354040283529160200191611038565b820191906000526020600020905b81548152906001019060200180831161101b57829003601f168201915b505050505081525050828261ffff168151811061105757611057612eb0565b6020908102919091010152600101610db6565b5092915050565b6000546001600160a01b031633146110b75760405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b6044820152606401610466565b6001600160a01b038116156110cc57806110d9565b6000546001600160a01b03165b600180546001600160a01b0319166001600160a01b039290921691821790556040517f74ad00f42c7567187f818b7401d2b03eae8dc59f390e590b0bbdf9048c53d25490600090a250565b606060006111328484611cae565b826001600160401b0381111561114a5761114a612ff5565b604051908082528060200260200182016040528015611173578160200160208202803683370190505b50915060005b838110156111f7576111ab85858381811061119657611196612eb0565b90506020020160208101906102589190612add565b6111c75760405162461bcd60e51b815260040161046690612ee6565b6934f086f3b33b684000008382815181106111e4576111e4612eb0565b6020908102919091010152600101611179565b5061120c836934f086f3b33b68400000612f20565b90509250929050565b61121d612902565b61019061ffff8316106112425760405162461bcd60e51b815260040161046690612fab565b61ffff80831660009081526003602081815260409283902083516101608101855281546001600160a01b038116825268ffffffffffffffffff600160a01b8204169382019390935260ff600160e81b840416151594810194909452600160f01b909104909316606083015260018301546001600160801b03811660808401526001600160401b03600160801b8204811660a0850152600160c01b909104811660c084015260028401541660e083015282018054919291610100840191906113089061300b565b80601f01602080910402602001604051908101604052809291908181526020018280546113349061300b565b80156113815780601f1061135657610100808354040283529160200191611381565b820191906000526020600020905b81548152906001019060200180831161136457829003601f168201915b5050505050815260200160048201805461139a9061300b565b80601f01602080910402602001604051908101604052809291908181526020018280546113c69061300b565b80156114135780601f106113e857610100808354040283529160200191611413565b820191906000526020600020905b8154815290600101906020018083116113f657829003601f168201915b5050505050815260200160058201805461142c9061300b565b80601f01602080910402602001604051908101604052809291908181526020018280546114589061300b565b80156114a55780601f1061147a576101008083540402835291602001916114a5565b820191906000526020600020905b81548152906001019060200180831161148857829003601f168201915b5050505050815250509050919050565b600154600090610190600160a01b90910461ffff1610156114df57506934f086f3b33b6840000090565b60005b61019061ffff821610156115365761ffff8116600090815260036020526040902060010154600160801b90046001600160401b0316421061152e576934f086f3b33b6840000091505090565b6001016114e2565b506000905090565b60055460ff16156115615760405162461bcd60e51b815260040161046690612e8d565b6005805460ff1916600117905561019061ffff8416106115935760405162461bcd60e51b815260040161046690612fab565b61159c82611e01565b6115a58361221f565b61ffff83166000908152600360205260409020546001600160a01b0316156115df5760405162461bcd60e51b815260040161046690612ee6565b806934f086f3b33b6840000011156116295760405162461bcd60e51b815260206004820152600d60248201526c1c1c9a58d94818da185b99d959609a1b6044820152606401610466565b61163c6934f086f3b33b684000006122b8565b61164f6934f086f3b33b6840000061230f565b611659838361252f565b60018054600160a01b900461ffff169060146116748361303f565b91906101000a81548161ffff021916908361ffff160217905550506934f086f3b33b68400000600260008282546116ab9190612f52565b90915550506005805460ff19169055505050565b6000546001600160a01b031633146117055760405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b6044820152606401610466565b6001600160a01b03811661174c5760405162461bcd60e51b815260206004820152600e60248201526d1bdddb995c881c995c5d5a5c995960921b6044820152606401610466565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b61019061ffff8316106117cc5760405162461bcd60e51b815260040161046690612fab565b6117d581611e01565b61ffff8216600090815260036020526040902080546001600160a01b031633146118115760405162461bcd60e51b815260040161046690612fcd565b6001810154600160801b90046001600160401b0316421061185e5760405162461bcd60e51b8152602060048201526007602482015266195e1c1a5c995960ca1b6044820152606401610466565b6118688183612773565b611870612848565b60028201805467ffffffffffffffff19166001600160401b0392909216919091179055604051339061ffff8516907f28db8e6c98352b3150d654574a340aabc9045e8158537e4ae709a5e3f040ae7b90600090a3505050565b60055460ff16156118ec5760405162461bcd60e51b815260040161046690612e8d565b6005805460ff1916600117905561019061ffff82161061191e5760405162461bcd60e51b815260040161046690612fab565b61ffff808216600090815260036020818152604080842081516101608101835281546001600160a01b038116825268ffffffffffffffffff600160a01b8204169482019490945260ff600160e81b850416151592810192909252600160f01b909204909416606085015260018101546001600160801b03811660808601526001600160401b03600160801b8204811660a0870152600160c01b909104811660c086015260028201541660e08501529081018054929392610100840191906119e49061300b565b80601f0160208091040260200160405190810160405280929190818152602001828054611a109061300b565b8015611a5d5780601f10611a3257610100808354040283529160200191611a5d565b820191906000526020600020905b815481529060010190602001808311611a4057829003601f168201915b50505050508152602001600482018054611a769061300b565b80601f0160208091040260200160405190810160405280929190818152602001828054611aa29061300b565b8015611aef5780601f10611ac457610100808354040283529160200191611aef565b820191906000526020600020905b815481529060010190602001808311611ad257829003601f168201915b50505050508152602001600582018054611b089061300b565b80601f0160208091040260200160405190810160405280929190818152602001828054611b349061300b565b8015611b815780601f10611b5657610100808354040283529160200191611b81565b820191906000526020600020905b815481529060010190602001808311611b6457829003601f168201915b5050509190925250508151919250506001600160a01b03163314611bb75760405162461bcd60e51b815260040161046690612fcd565b611bd382826000015183608001516001600160801b0316612687565b8051608082015160405163a9059cbb60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263a9059cbb92611c41926004016001600160a01b039290921682526001600160801b0316602082015260400190565b6020604051808303816000875af1158015611c60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c849190612f65565b611ca05760405162461bcd60e51b815260040161046690612f82565b50506005805460ff19169055565b8015801590611cbe575060288111155b611cf65760405162461bcd60e51b81526020600482015260096024820152680c4c2c840c4c2e8c6d60bb1b6044820152606401610466565b60005b81811015611dfc57610190838383818110611d1657611d16612eb0565b9050602002016020810190611d2b9190612add565b61ffff1610611d4c5760405162461bcd60e51b815260040161046690612fab565b60005b81811015611df357838383818110611d6957611d69612eb0565b9050602002016020810190611d7e9190612add565b61ffff16848483818110611d9457611d94612eb0565b9050602002016020810190611da99190612add565b61ffff1603611deb5760405162461bcd60e51b815260206004820152600e60248201526d191d5c1b1a58d85d19481cdb1bdd60921b6044820152606401610466565b600101611d4f565b50600101611cf9565b505050565b366000611e0e8380613060565b90925090508015801590611e23575060608111155b611e5a5760405162461bcd60e51b8152602060048201526008602482015267626164206e616d6560c01b6044820152606401610466565b6000805b82811015611e9d576020848483818110611e7a57611e7a612eb0565b9050013560f81c60f81b60f81c60ff161115611e9557600191505b600101611e5e565b5080611ed65760405162461bcd60e51b8152602060048201526008602482015267626164206e616d6560c01b6044820152606401610466565b366000611ee66020870187613060565b90925090508015801590611efc57506101008111155b611f325760405162461bcd60e51b8152602060048201526007602482015266189859081d5c9b60ca1b6044820152606401610466565b600060078210801590611f6e575082826000818110611f5357611f53612eb0565b9050013560f81c60f81b6001600160f81b031916600d60fb1b145b8015611fa3575082826001818110611f8857611f88612eb0565b9050013560f81c60f81b6001600160f81b031916601d60fa1b145b8015611fd8575082826002818110611fbd57611fbd612eb0565b9050013560f81c60f81b6001600160f81b031916601d60fa1b145b801561200d575082826003818110611ff257611ff2612eb0565b9050013560f81c60f81b6001600160f81b031916600760fc1b145b801561218a57508282600481811061202757612027612eb0565b9050013560f81c60f81b6001600160f81b031916601d60f91b14801561207657508282600581811061205b5761205b612eb0565b9050013560f81c60f81b6001600160f81b031916602f60f81b145b80156120ab57508282600681811061209057612090612eb0565b9050013560f81c60f81b6001600160f81b031916602f60f81b145b8061218a5750600882108015906120eb5750828260048181106120d0576120d0612eb0565b9050013560f81c60f81b6001600160f81b031916607360f81b145b801561212057508282600581811061210557612105612eb0565b9050013560f81c60f81b6001600160f81b031916601d60f91b145b801561215557508282600681811061213a5761213a612eb0565b9050013560f81c60f81b6001600160f81b031916602f60f81b145b801561218a57508282600781811061216f5761216f612eb0565b9050013560f81c60f81b6001600160f81b031916602f60f81b145b9050806121c35760405162461bcd60e51b8152602060048201526007602482015266189859081d5c9b60ca1b6044820152606401610466565b6101506121d36040890189613060565b905011156122165760405162461bcd60e51b815260206004820152601060248201526f6d65737361676520746f6f206c6f6e6760801b6044820152606401610466565b50505050505050565b61ffff8116600090815260036020526040902080546001600160a01b03161580159061225f57506001810154600160801b90046001600160401b03164210155b156122b457805460018201546001600160a01b039091166000818152600460205260408120805492936001600160801b0316928392906122a0908490612f52565b909155506122b19050848383612687565b50505b5050565b6a52b7d2dcc80cd2e4000000816002546122d29190612f52565b111561230c5760405162461bcd60e51b81526020600482015260096024820152680626f617264206361760bc1b6044820152606401610466565b50565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015612376573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061239a91906130a6565b6040516323b872dd60e01b8152336004820152306024820152604481018490529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303816000875af1158015612410573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124349190612f65565b6124505760405162461bcd60e51b815260040161046690612f82565b61245a8282612f52565b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156124be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124e291906130a6565b146122b45760405162461bcd60e51b815260206004820152601860248201527f756e737570706f72746564207472616e736665722066656500000000000000006044820152606401610466565b61ffff8216600090815260036020526040902080546001600160e81b03331668ffffffffffffffffff60a01b9091161781556001810180546fffffffffffffffffffffffffffffffff19166934f086f3b33b6840000017905561259562278d0042612f52565b8160010160106101000a8154816001600160401b0302191690836001600160401b031602179055506125c5612848565b8160010160186101000a8154816001600160401b0302191690836001600160401b031602179055506125f5612848565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556126228183612773565b6001810154604080516934f086f3b33b684000008152600160801b9092046001600160401b03166020830152339161ffff8616917f996dc7dea540e13628337096337f8d9cdc0802a647e25801cb4c2bfc52c979b991015b60405180910390a3505050565b61ffff8316600090815260036020819052604082208281556001810183905560028101805467ffffffffffffffff1916905591906126c790830182612960565b6126d5600483016000612960565b6126e3600583016000612960565b505060018054600160a01b900461ffff16906014612700836130bf565b91906101000a81548161ffff021916908361ffff16021790555050806002600082825461272d91906130dd565b90915550506040518181526001600160a01b0383169061ffff8516907f4bf7bd7a3c7a3b7fb528fb7b8d7ead8fa2244a2e8a10a1f2e2c328889352af869060200161267a565b61277d8180613060565b600384019161278d919083613140565b5061279b6020820182613060565b60048401916127ab919083613140565b506127b96040820182613060565b60058401916127c9919083613140565b506127da60c0820160a08301613200565b62ffffff1660186127f160a0840160808501613200565b62ffffff16901b603061280a6080850160608601613200565b855462ffffff9190911690911b919091179190911768ffffffffffffffffff16600160a01b0268ffffffffffffffffff60a01b199091161790915550565b60408051600481526024810182526020810180516001600160e01b031663a3b1b31d60e01b1790529051600091829182916064916127109161288991613225565b6000604051808303818686fa925050503d80600081146128c5576040519150601f19603f3d011682016040523d82523d6000602084013e6128ca565b606091505b50915091508180156128dd575080516020145b6128e757436128fb565b808060200190518101906128fb91906130a6565b9250505090565b604080516101608101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e08201929092526101008101829052610120810182905261014081019190915290565b50805461296c9061300b565b6000825580601f1061297c575050565b601f01602090049060005260206000209081019061230c91905b808211156129aa5760008155600101612996565b5090565b60008083601f8401126129c057600080fd5b5081356001600160401b038111156129d757600080fd5b6020830191508360208260051b85010111156129f257600080fd5b9250929050565b600080600080600060608688031215612a1157600080fd5b85356001600160401b0380821115612a2857600080fd5b612a3489838a016129ae565b90975095506020880135915080821115612a4d57600080fd5b50612a5a888289016129ae565b96999598509660400135949350505050565b60008060208385031215612a7f57600080fd5b82356001600160401b03811115612a9557600080fd5b612aa1858286016129ae565b90969095509350505050565b600060208284031215612abf57600080fd5b5035919050565b803561ffff81168114612ad857600080fd5b919050565b600060208284031215612aef57600080fd5b612af882612ac6565b9392505050565b801515811461230c57600080fd5b600080600060608486031215612b2257600080fd5b612b2b84612ac6565b92506020840135612b3b81612aff565b929592945050506040919091013590565b60008060408385031215612b5f57600080fd5b612b6883612ac6565b915061120c60208401612ac6565b60005b83811015612b91578181015183820152602001612b79565b50506000910152565b60008151808452612bb2816020860160208601612b76565b601f01601f19169290920160200192915050565b80516001600160a01b0316825260006101606020830151612bf4602086018268ffffffffffffffffff169052565b506040830151612c08604086018215159052565b506060830151612c1e606086018261ffff169052565b506080830151612c3960808601826001600160801b03169052565b5060a0830151612c5460a08601826001600160401b03169052565b5060c0830151612c6f60c08601826001600160401b03169052565b5060e0830151612c8a60e08601826001600160401b03169052565b50610100808401518282870152612ca383870182612b9a565b925050506101208084015185830382870152612cbf8382612b9a565b925050506101408084015185830382870152612cdb8382612b9a565b9695505050505050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015612d3c57603f19888603018452612d2a858351612bc6565b94509285019290850190600101612d0e565b5092979650505050505050565b600060208284031215612d5b57600080fd5b81356001600160a01b0381168114612af857600080fd5b604080825283519082018190526000906020906060840190828701845b82811015612dab57815184529284019290840190600101612d8f565b505050602093909301939093525092915050565b602081526000612af86020830184612bc6565b600060c08284031215612de457600080fd5b50919050565b600080600060608486031215612dff57600080fd5b612e0884612ac6565b925060208401356001600160401b03811115612e2357600080fd5b612e2f86828701612dd2565b925050604084013590509250925092565b60008060408385031215612e5357600080fd5b612e5c83612ac6565b915060208301356001600160401b03811115612e7757600080fd5b612e8385828601612dd2565b9150509250929050565b6020808252600990820152681c99595b9d1c985b9d60ba1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b6000823560be19833603018112612edc57600080fd5b9190910192915050565b6020808252600a908201526939b637ba103a30b5b2b760b11b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176109a5576109a5612f0a565b61ffff81811683821601908082111561106a5761106a612f0a565b808201808211156109a5576109a5612f0a565b600060208284031215612f7757600080fd5b8151612af881612aff565b6020808252600f908201526e1d1c985b9cd9995c8819985a5b1959608a1b604082015260600190565b602080825260089082015267189859081cdb1bdd60c21b604082015260600190565b6020808252600e908201526d3737ba1039b637ba1037bbb732b960911b604082015260600190565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168061301f57607f821691505b602082108103612de457634e487b7160e01b600052602260045260246000fd5b600061ffff80831681810361305657613056612f0a565b6001019392505050565b6000808335601e1984360301811261307757600080fd5b8301803591506001600160401b0382111561309157600080fd5b6020019150368190038213156129f257600080fd5b6000602082840312156130b857600080fd5b5051919050565b600061ffff8216806130d3576130d3612f0a565b6000190192915050565b818103818111156109a5576109a5612f0a565b601f821115611dfc576000816000526020600020601f850160051c810160208610156131195750805b601f850160051c820191505b8181101561313857828155600101613125565b505050505050565b6001600160401b0383111561315757613157612ff5565b61316b83613165835461300b565b836130f0565b6000601f84116001811461319f57600085156131875750838201355b600019600387901b1c1916600186901b1783556131f9565b600083815260209020601f19861690835b828110156131d057868501358255602094850194600190920191016131b0565b50868210156131ed5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b60006020828403121561321257600080fd5b813562ffffff81168114612af857600080fd5b60008251612edc818460208701612b7656fea2646970667358221220497071156a1c0b245611c110cef8fd5fe3b4fda3d3dadbe53220a712e23ed8e364736f6c63430008180033",
  "immutableReferences": {
    "83": [
      {
        "length": 32,
        "start": 1057
      },
      {
        "length": 32,
        "start": 2110
      },
      {
        "length": 32,
        "start": 3084
      },
      {
        "length": 32,
        "start": 7153
      },
      {
        "length": 32,
        "start": 8999
      },
      {
        "length": 32,
        "start": 9151
      },
      {
        "length": 32,
        "start": 9327
      }
    ]
  },
  "selectors": {
    "DEFAULT_TERM": "0x9334ce54",
    "MAX_BATCH": "0x950bff9f",
    "MAX_BOARD_LOCK": "0x697586aa",
    "SLOT_COUNT": "0x4e37070b",
    "SLOT_LOCK": "0x71a9b459",
    "clearExpiredBatch": "0x35d38908",
    "getSlot": "0x862b35f0",
    "getSlots": "0x6ef2953e",
    "hideSlot": "0x48b691fa",
    "isAvailable": "0x440a6d2b",
    "moderator": "0x38743904",
    "nextRequiredLock": "0x98aae254",
    "occupiedCount": "0x4eef2707",
    "owner": "0x8da5cb5b",
    "pendingWithdrawals": "0xf3f43703",
    "quoteReserve": "0x82a8b13a",
    "release": "0xfbe6ae63",
    "releaseBatch": "0x50611f62",
    "requiredLockForRank": "0x3d85c5b1",
    "reserve": "0xb8c4db2b",
    "reserveBatch": "0x27986b4e",
    "setModerator": "0x75bba189",
    "token": "0xfc0c546a",
    "totalLocked": "0x56891412",
    "transferOwnership": "0xf2fde38b",
    "updateMetadata": "0xf313967d",
    "version": "0x54fd4d50",
    "withdraw": "0x3ccfd60b"
  },
  "eventTopics": {
    "ModeratorUpdated": "0x74ad00f42c7567187f818b7401d2b03eae8dc59f390e590b0bbdf9048c53d254",
    "OwnershipTransferred": "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0",
    "SlotBatchReleased": "0xa39c8515af2e6d80e332881f1f536a102c7cd47532d22f1a5ab196d1b41cfff3",
    "SlotBatchReserved": "0xebaef8c9e3ba75c4e43a37324731cf2c1a54ffc33b6043dd959a6d45eb487795",
    "SlotHidden": "0xea8cf15425ae681272f6ed8197465e04a6eab8f1b3d19f1f4db16f6560da9f6c",
    "SlotMetadataUpdated": "0x28db8e6c98352b3150d654574a340aabc9045e8158537e4ae709a5e3f040ae7b",
    "SlotReleased": "0x4bf7bd7a3c7a3b7fb528fb7b8d7ead8fa2244a2e8a10a1f2e2c328889352af86",
    "SlotReserved": "0x996dc7dea540e13628337096337f8d9cdc0802a647e25801cb4c2bfc52c979b9"
  }
}
