ETH Price: $3,281.14 (-0.15%)

Contract

0x00000d4Ce915f65F2F47B73a0C9032b2EF5A38A6
 

Overview

ETH Balance

0.000203513004484688 ETH

ETH Value

$0.67 (@ $3,281.14/ETH)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Upvote Contract53233942024-06-27 2:50:03206 days ago1719456603IN
0x00000d4C...2EF5A38A6
0.0001 ETH0.000001260.02670419
Vote53229102024-06-27 2:33:55206 days ago1719455635IN
0x00000d4C...2EF5A38A6
0 ETH0.000002230.02354463
Create Poll53228982024-06-27 2:33:31206 days ago1719455611IN
0x00000d4C...2EF5A38A6
0.0001 ETH0.000009820.02349244
Set Auto Yield A...53214542024-06-27 1:45:23206 days ago1719452723IN
0x00000d4C...2EF5A38A6
0 ETH0.00000390.02330493

Latest 1 internal transaction

Parent Transaction Hash Block From To
53210572024-06-27 1:32:09206 days ago1719451929  Contract Creation0 ETH

Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
OpenVotes

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
Yes with 9999999 runs

Other Settings:
cancun EvmVersion
File 1 of 5 : OpenVotes.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
import "./interfaces/IBlast.sol";
import "./interfaces/IERC20.sol";

// Errors
error notEOA();
error InsufficientFunds();
error PollDoesNotExist();
error OnlyManagerCanManageOptions();
error OptionHasVotes();
error PollNotActive();
error NotInAllowList();
error InsufficientFundsToVote();
error PollOptionDoesNotExist();
error OnlyOneVoteAllowed();
error PollIsActive();
error PollHasNoBalance();
error NoFeesToClaim();
error InvalidFeesPercentage();
error PollMaxEntriesExceeded();

contract OpenVotes is Ownable {

    // Events
    event PollCreated(uint256 pollId, uint256 startDate, uint256 endDate, uint256 voteCost, uint256 maxEntries, bool allowManyVotes, string title, string description, string[] options);
    event PollOptionsAdded(uint256 pollId, string[] names);
    event PollOptionDeleted(uint256 pollId, uint256 optionId);
    event Vote(uint256 pollId, uint256 optionId, address voter);
    event PollFundsWithdrawn(uint256 pollId, uint256 amount);
    event ContractUpVote(address contractAddress, address voter);
    event ContractDownVote(address contractAddress, address voter);
    event AssetUpVote(address contractAddress, string tokenId, address voter);
    event AssetDownVote(address contractAddress, string tokenId, address voter);

    // Contract Owner variables
    uint256 public pollPrice = 100000000000000; // 0.0001 ETH
    uint256 public assetVoteCost = 100000000000000; // 0.0001 ETH
    uint256 public feesBps = 100; // 1%
    uint256 private pollsLedger;

    // Poll variables
    uint256 public pollIdCounter = 1;

    struct Poll {
        uint256 id;
        address manager;
        uint256 startDate;
        uint256 endDate;
        uint256 voteCost;
        uint256 maxEntries;
        uint256 balance;
        bool allowManyVotes;
        address[] allowList;
        string title;
        string description;
        PollOption[] options;
    }

    struct PollOption {
        uint256 id;
        bool isSet;
        string name;
        address[] votes;
    }

    struct Votes {
        uint256 up;
        uint256 down;
    }

    struct Asset {
        mapping (string => Votes) tokens;
    }


    // Mappings
    mapping (uint256 => Poll) private polls;
    mapping (address => Votes) private contracts;
    mapping (address => Asset) private assets;

    // BLAST
    IBlast public constant BLAST = IBlast(0x4300000000000000000000000000000000000002);
    // BlastPoints Testnet address: 0x2fc95838c71e76ec69ff817983BFf17c710F34E0
    // BlastPoints Mainnet address: 0x2536FE9ab3F511540F2f9e2eC2A805005C3Dd800
    IBlastPoints public constant BLAST_POINTS = IBlastPoints(0x2536FE9ab3F511540F2f9e2eC2A805005C3Dd800);
    YieldMode public yieldMode = YieldMode.AUTOMATIC;
    GasMode public gasMode = GasMode.CLAIMABLE;

    constructor(address initialOwner) Ownable(initialOwner) {

        // ==============
        //  BLAST Points Configuration
        // ==============
        BLAST_POINTS.configurePointsOperator(initialOwner);
        
       
    }

    function name() public pure returns (string memory) {
        return "OpenVotes";
    }

    // Create a new poll
    function createPoll(uint256 _startDate, uint256 _endDate, uint256 _voteCost, uint256 _maxEntries, bool _allowManyVotes, string calldata _title, string calldata _description, string[] calldata _options) payable external {

        // Verify correct amount of ETH sent
        if (msg.value < pollPrice) {
            revert InsufficientFunds();
        }

        // Create the poll
        polls[pollIdCounter].id = pollIdCounter;
        polls[pollIdCounter].manager = msg.sender;
        polls[pollIdCounter].startDate = _startDate;
        polls[pollIdCounter].endDate = _endDate;
        polls[pollIdCounter].voteCost = _voteCost;
        polls[pollIdCounter].maxEntries = _maxEntries;
        polls[pollIdCounter].balance = 0;
        polls[pollIdCounter].allowManyVotes = _allowManyVotes;
        polls[pollIdCounter].title = _title;
        polls[pollIdCounter].description = _description;

        // Add the options
        for (uint256 i = 0; i < _options.length; i++) {
            polls[pollIdCounter].options.push(PollOption({
                id: i,
                isSet: true,
                name: _options[i],
                votes: new address[](0)
            }));
        }

        // Emit the poll created event
        emit PollCreated(pollIdCounter, _startDate, _endDate, _voteCost, _maxEntries, _allowManyVotes, _title, _description, _options);           

        // Increment the poll counter
        pollIdCounter++;

    }

    // Add a new option to a poll
    function addPollOptions(uint256 _pollId, string[] calldata _names) external {

        // Verify that the sender is the poll manager
        if (polls[_pollId].manager != msg.sender) {
            revert OnlyManagerCanManageOptions();
        }

        // Verify that the poll hasn't started
        if (block.timestamp >= polls[_pollId].startDate) {
            revert PollIsActive();
        }

        // Add the new options
        for (uint256 i = 0; i < _names.length; i++) {
            polls[_pollId].options.push(PollOption({
                id: polls[_pollId].options.length,
                isSet: true,
                name: _names[i],
                votes: new address[](0)
            }));
        }

        // Emit the option added event
        emit PollOptionsAdded(_pollId, _names);

    }

    // Update the allowList of a poll
    function setPollAllowList(uint256 _pollId, address[] calldata _allowList) external {

        // Verify that the sender is the poll manager
        if (polls[_pollId].manager != msg.sender) {
            revert OnlyManagerCanManageOptions();
        }

        // Verify that the poll hasn't started
        if (block.timestamp >= polls[_pollId].startDate) {
            revert PollIsActive();
        }

        // Verify that the poll hasn't started
        if (block.timestamp >= polls[_pollId].startDate) {
            revert PollIsActive();
        }

        // Update the allowList
        delete polls[_pollId].allowList;
        for (uint256 i = 0; i < _allowList.length; i++) {
            polls[_pollId].allowList.push(_allowList[i]);
        }

    }

    // Add to the allowList of a poll
    function addToPollAllowList(uint256 _pollId, address _address) external {

        // Verify that the sender is the poll manager
        if (polls[_pollId].manager != msg.sender) {
            revert OnlyManagerCanManageOptions();
        }

        // Verify that the poll hasn't started
        if (block.timestamp >= polls[_pollId].startDate) {
            revert PollIsActive();
        }

        // Add the address to the allowList
        polls[_pollId].allowList.push(_address);

    }

    // Remove from the allowList of a poll
    function removeFromPollAllowList(uint256 _pollId, address _address) external {

        // Verify that the sender is the poll manager
        if (polls[_pollId].manager != msg.sender) {
            revert OnlyManagerCanManageOptions();
        }

        // Verify that the poll hasn't started
        if (block.timestamp >= polls[_pollId].startDate) {
            revert PollIsActive();
        }

        // Remove the address from the allowList
        for (uint256 i = 0; i < polls[_pollId].allowList.length; i++) {
            if (polls[_pollId].allowList[i] == _address) {
                delete polls[_pollId].allowList[i];
            }
        }

    }

    // Vote for an option in a poll
    function vote(uint256 _pollId, uint256 _optionId) payable external {

        // Verify that the poll exists
        if (polls[_pollId].manager == address(0)) {
            revert PollDoesNotExist();
        }

        // Verify that the poll is active
        if (block.timestamp < polls[_pollId].startDate || block.timestamp > polls[_pollId].endDate) {
            revert PollNotActive();
        }

        // Verify that the sender sent enough funds
        if (msg.value != polls[_pollId].voteCost) {
            revert InsufficientFundsToVote();
        }

        // Verify that the sender is in the allowList
        if (polls[_pollId].allowList.length > 0) {
            bool found = false;
            for (uint256 i = 0; i < polls[_pollId].allowList.length; i++) {
                if (polls[_pollId].allowList[i] == msg.sender) {
                    found = true;
                    break;
                }
            }
            if (!found) {
                revert NotInAllowList();
            }
        }

        // Verify that the option exists
        if (!polls[_pollId].options[_optionId].isSet) {
            revert PollOptionDoesNotExist();
        }

        // Check if the sender can vote multiple times
        if (!polls[_pollId].allowManyVotes) {
            for (uint256 i = 0; i < polls[_pollId].options.length; i++) {
                for (uint256 j = 0; j < polls[_pollId].options[i].votes.length; j++) {
                    if (polls[_pollId].options[i].votes[j] == msg.sender) {
                        revert OnlyOneVoteAllowed();
                    }
                }
            }
        }
        
        // Verify that max entries are not exceeded
        if (polls[_pollId].maxEntries > 0) {
            if (polls[_pollId].options[_optionId].votes.length >= polls[_pollId].maxEntries) {
                revert PollMaxEntriesExceeded();
            }
        }

        // Add the vote
        polls[_pollId].options[_optionId].votes.push(msg.sender);

        // Calculate the balance to add to the poll by subtracting the owner fees
        uint256 feeAmount = polls[_pollId].voteCost * (feesBps) / 10000;
        uint256 balanceToAdd = polls[_pollId].voteCost - feeAmount;

        // Add to the poll balance
        polls[_pollId].balance += balanceToAdd;

        // Add to the global polls ledger
        pollsLedger += balanceToAdd;

        // Emit the vote event
        emit Vote(_pollId, _optionId, msg.sender);

    }

    // Upvote Any contract on the blockchain
    function upvoteContract(address _contractAddress) payable external {

        // Verify that the sender sent enough funds
        if (msg.value != assetVoteCost) {
            revert InsufficientFundsToVote();
        }

        // Add the vote
        contracts[_contractAddress].up += 1;

        // Emit the vote event
        emit ContractUpVote(_contractAddress, msg.sender);

    }

    // Downvote Any contract on the blockchain
    function downvoteContract(address _contractAddress) payable external {

        // Verify that the sender sent enough funds
        if (msg.value != assetVoteCost) {
            revert InsufficientFundsToVote();
        }

        // Add the vote
        contracts[_contractAddress].down += 1;

        // Emit the vote event
        emit ContractDownVote(_contractAddress, msg.sender);

    }

    // Upvote Any asset on the blockchain
    function upvoteAsset(address _contractAddress, string memory _tokenId) payable external {

        // Verify that the sender sent enough funds
        if (msg.value != assetVoteCost) {
            revert InsufficientFundsToVote();
        }

        // Add the vote
        assets[_contractAddress].tokens[_tokenId].up += 1;

        // Emit the vote event
        emit AssetUpVote(_contractAddress, _tokenId, msg.sender);

    }

    // Downvote Any asset on the blockchain
    function downvoteAsset(address _contractAddress, string memory _tokenId) payable external {

        // Verify that the sender sent enough funds
        if (msg.value != assetVoteCost) {
            revert InsufficientFundsToVote();
        }

        // Add the vote
        assets[_contractAddress].tokens[_tokenId].down += 1;

        // Emit the vote event
        emit AssetDownVote(_contractAddress, _tokenId, msg.sender);

    }

    // Withdraw the poll funds
    function withdrawPollFunds(uint256 _pollId) external {

        // Verify that the sender is the poll manager
        if (polls[_pollId].manager != msg.sender) {
            revert OnlyManagerCanManageOptions();
        }

        // Verify that the poll has ended
        if (block.timestamp < polls[_pollId].endDate) {
            revert PollIsActive();
        }

        // Verify that the poll has a balance
        if (polls[_pollId].balance == 0) {
            revert PollHasNoBalance();
        }

        // Capture and Reset the poll balance
        uint256 pollBalance = polls[_pollId].balance;
        polls[_pollId].balance = 0;

        // Subtract from the global polls ledger
        pollsLedger -= pollBalance;

        // Transfer the funds to the manager
        payable(msg.sender).transfer(pollBalance);

        // Emit the funds withdrawn event
        emit PollFundsWithdrawn(_pollId, pollBalance);

    }

    /***********************************
    *         Getter Functions
    ***********************************/

    // Get the poll details
    function getPoll(uint256 _pollId) external view returns (Poll memory) {
        return polls[_pollId];
    }

    // Get manager's active polls
    function getManagersActivePolls(address _manager) external view returns (Poll[] memory) {
        Poll[] memory managersPolls = new Poll[](pollIdCounter);
        uint256 counter = 0;
        for (uint256 i = 1; i < pollIdCounter; i++) {
            if (polls[i].manager == _manager && block.timestamp >= polls[i].startDate && block.timestamp <= polls[i].endDate) {
                managersPolls[counter] = polls[i];
                counter++;
            }
        }
        return managersPolls;
    }

    // Get manager's ended polls
    function getManagersEndedPolls(address _manager) external view returns (Poll[] memory) {
        Poll[] memory managersPolls = new Poll[](pollIdCounter);
        uint256 counter = 0;
        for (uint256 i = 1; i < pollIdCounter; i++) {
            if (polls[i].manager == _manager && block.timestamp > polls[i].endDate) {
                managersPolls[counter] = polls[i];
                counter++;
            }
        }
        return managersPolls;
    }

    // Get Contract Votes
    function getContractVotes(address _contractAddress) external view returns (Votes memory) {
        return contracts[_contractAddress];
    }

    // Get Asset Votes
    function getAssetVotes(address _contractAddress, string memory _tokenId) external view returns (Votes memory) {
        return assets[_contractAddress].tokens[_tokenId];
    }

    
    /***********************************
    *         Owner Functions
    ***********************************/
    
    // Withdraw the fees
    function withdrawFees() external onlyOwner {

        // Verify that there are fees to claim
        if (address(this).balance <= pollsLedger) {
            revert NoFeesToClaim();
        }

        // Transfer the fees to the owner
        payable(owner()).transfer(address(this).balance - pollsLedger);

    }

    // Set the poll price
    function setPollPrice(uint256 _pollPrice) external onlyOwner {
        pollPrice = _pollPrice;
    }

    // Set the asset vote cost
    function setAssetVoteCost(uint256 _assetVoteCost) external onlyOwner {
        assetVoteCost = _assetVoteCost;
    }

    // Set the fees bps
    function setFees(uint256 _feesBps) external onlyOwner {

        // Verify that the fees percentage is between 0 and 10%
        if (_feesBps < 0 || _feesBps > 1000) {
            revert InvalidFeesPercentage();
        }

        feesBps = _feesBps;

    }

    /***********************************
    *   BLAST ONLY OWNER FUNCTIONS
    ***********************************/

     // Set points operator
    function setPointsOperator(address _operator) external onlyOwner {
        BLAST_POINTS.configurePointsOperator(_operator);
    }
    // Set points operator on behalf
    function setPointsOperatorOnBehalf(address _operator, address _contract) external onlyOwner {
        BLAST_POINTS.configurePointsOperatorOnBehalf(_contract, _operator);
    }
    // Claim matured fees
    function claimMaturedGasFees() external onlyOwner {
        BLAST.claimMaxGas(address(this), msg.sender);
    }
    // Claim gas fees
    function claimAllGasFees() external onlyOwner {
        BLAST.claimAllGas(address(this), msg.sender);
    }
    // Configure yield
    function configureYield(YieldMode _yield, GasMode _gasMode) external onlyOwner {
        yieldMode = _yield;
        gasMode = _gasMode;
        BLAST.configure(_yield, _gasMode, msg.sender);
    }
    // Set auto yield and gas
    function setAutoYieldAndGas() external onlyOwner {
        BLAST.configureAutomaticYield();
        BLAST.configureClaimableGas();
    }
    // Configure yield on behalf
    function configureYieldOnBehalf(address _contract, YieldMode _yield, GasMode _gasMode) external onlyOwner {
        BLAST.configureContract(_contract, _yield, _gasMode, msg.sender);
    }

}

File 2 of 5 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;

import {Context} from "../utils/Context.sol";

/**
 * @dev 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.
 *
 * The initial owner is set to the address provided by the deployer. 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.
 */
abstract contract Ownable is Context {
    address private _owner;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 3 of 5 : IBlast.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.26;

enum YieldMode {
    AUTOMATIC,
    VOID,
    CLAIMABLE
}

enum GasMode {
    VOID,
    CLAIMABLE
}

interface IBlast{
    // configure
    function configureContract(address contractAddress, YieldMode _yield, GasMode gasMode, address governor) external;
    function configure(YieldMode _yield, GasMode gasMode, address governor) external;

    // base configuration options
    function configureClaimableYield() external;
    function configureClaimableYieldOnBehalf(address contractAddress) external;
    function configureAutomaticYield() external;
    function configureAutomaticYieldOnBehalf(address contractAddress) external;
    function configureVoidYield() external;
    function configureVoidYieldOnBehalf(address contractAddress) external;
    function configureClaimableGas() external;
    function configureClaimableGasOnBehalf(address contractAddress) external;
    function configureVoidGas() external;
    function configureVoidGasOnBehalf(address contractAddress) external;
    function configureGovernor(address _governor) external;
    function configureGovernorOnBehalf(address _newGovernor, address contractAddress) external;

    // claim yield
    function claimYield(address contractAddress, address recipientOfYield, uint256 amount) external returns (uint256);
    function claimAllYield(address contractAddress, address recipientOfYield) external returns (uint256);

    // claim gas
    function claimAllGas(address contractAddress, address recipientOfGas) external returns (uint256);
    function claimGasAtMinClaimRate(address contractAddress, address recipientOfGas, uint256 minClaimRateBips) external returns (uint256);
    function claimMaxGas(address contractAddress, address recipientOfGas) external returns (uint256);
    function claimGas(address contractAddress, address recipientOfGas, uint256 gasToClaim, uint256 gasSecondsToConsume) external returns (uint256);

    // read functions
    function readClaimableYield(address contractAddress) external view returns (uint256);
    function readYieldConfiguration(address contractAddress) external view returns (uint8);
    function readGasParams(address contractAddress) external view returns (uint256 etherSeconds, uint256 etherBalance, uint256 lastUpdated, GasMode);
}

interface IBlastPoints {
  function configurePointsOperator(address operator) external;
  function configurePointsOperatorOnBehalf(address contractAddress, address operator) external;
}

File 4 of 5 : IERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.26;

interface IERC20 {
    /**
        * @dev Returns the amount of tokens owned by `account`.
        */
    function balanceOf(address account) external view returns (uint256);

    /**
        * @dev Moves `amount` tokens from the caller's account to `to`.
        *
        * Returns a boolean value indicating whether the operation succeeded.
        *
        * Emits a {Transfer} event.
        */
    function transfer(address to, uint256 amount) external returns (bool);
}

File 5 of 5 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

Settings
{
  "remappings": [
    "forge-std/=lib/forge-std/src/",
    "@openzeppelin/=lib/openzeppelin-contracts/",
    "@chainlink/=lib/chainlink-brownie-contracts/",
    "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
    "chainlink-brownie-contracts/=lib/chainlink-brownie-contracts/contracts/src/v0.6/vendor/@arbitrum/nitro-contracts/src/",
    "ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/",
    "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 9999999
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "cancun",
  "viaIR": false,
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"initialOwner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InsufficientFunds","type":"error"},{"inputs":[],"name":"InsufficientFundsToVote","type":"error"},{"inputs":[],"name":"InvalidFeesPercentage","type":"error"},{"inputs":[],"name":"NoFeesToClaim","type":"error"},{"inputs":[],"name":"NotInAllowList","type":"error"},{"inputs":[],"name":"OnlyManagerCanManageOptions","type":"error"},{"inputs":[],"name":"OnlyOneVoteAllowed","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"PollDoesNotExist","type":"error"},{"inputs":[],"name":"PollHasNoBalance","type":"error"},{"inputs":[],"name":"PollIsActive","type":"error"},{"inputs":[],"name":"PollMaxEntriesExceeded","type":"error"},{"inputs":[],"name":"PollNotActive","type":"error"},{"inputs":[],"name":"PollOptionDoesNotExist","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":false,"internalType":"string","name":"tokenId","type":"string"},{"indexed":false,"internalType":"address","name":"voter","type":"address"}],"name":"AssetDownVote","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":false,"internalType":"string","name":"tokenId","type":"string"},{"indexed":false,"internalType":"address","name":"voter","type":"address"}],"name":"AssetUpVote","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":false,"internalType":"address","name":"voter","type":"address"}],"name":"ContractDownVote","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":false,"internalType":"address","name":"voter","type":"address"}],"name":"ContractUpVote","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":false,"internalType":"uint256","name":"pollId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startDate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endDate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"voteCost","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxEntries","type":"uint256"},{"indexed":false,"internalType":"bool","name":"allowManyVotes","type":"bool"},{"indexed":false,"internalType":"string","name":"title","type":"string"},{"indexed":false,"internalType":"string","name":"description","type":"string"},{"indexed":false,"internalType":"string[]","name":"options","type":"string[]"}],"name":"PollCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pollId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PollFundsWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pollId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"optionId","type":"uint256"}],"name":"PollOptionDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pollId","type":"uint256"},{"indexed":false,"internalType":"string[]","name":"names","type":"string[]"}],"name":"PollOptionsAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pollId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"optionId","type":"uint256"},{"indexed":false,"internalType":"address","name":"voter","type":"address"}],"name":"Vote","type":"event"},{"inputs":[],"name":"BLAST","outputs":[{"internalType":"contract IBlast","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLAST_POINTS","outputs":[{"internalType":"contract IBlastPoints","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pollId","type":"uint256"},{"internalType":"string[]","name":"_names","type":"string[]"}],"name":"addPollOptions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pollId","type":"uint256"},{"internalType":"address","name":"_address","type":"address"}],"name":"addToPollAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"assetVoteCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimAllGasFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimMaturedGasFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum YieldMode","name":"_yield","type":"uint8"},{"internalType":"enum GasMode","name":"_gasMode","type":"uint8"}],"name":"configureYield","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"enum YieldMode","name":"_yield","type":"uint8"},{"internalType":"enum GasMode","name":"_gasMode","type":"uint8"}],"name":"configureYieldOnBehalf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startDate","type":"uint256"},{"internalType":"uint256","name":"_endDate","type":"uint256"},{"internalType":"uint256","name":"_voteCost","type":"uint256"},{"internalType":"uint256","name":"_maxEntries","type":"uint256"},{"internalType":"bool","name":"_allowManyVotes","type":"bool"},{"internalType":"string","name":"_title","type":"string"},{"internalType":"string","name":"_description","type":"string"},{"internalType":"string[]","name":"_options","type":"string[]"}],"name":"createPoll","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"string","name":"_tokenId","type":"string"}],"name":"downvoteAsset","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"}],"name":"downvoteContract","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"feesBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gasMode","outputs":[{"internalType":"enum GasMode","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"string","name":"_tokenId","type":"string"}],"name":"getAssetVotes","outputs":[{"components":[{"internalType":"uint256","name":"up","type":"uint256"},{"internalType":"uint256","name":"down","type":"uint256"}],"internalType":"struct OpenVotes.Votes","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"}],"name":"getContractVotes","outputs":[{"components":[{"internalType":"uint256","name":"up","type":"uint256"},{"internalType":"uint256","name":"down","type":"uint256"}],"internalType":"struct OpenVotes.Votes","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"name":"getManagersActivePolls","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"manager","type":"address"},{"internalType":"uint256","name":"startDate","type":"uint256"},{"internalType":"uint256","name":"endDate","type":"uint256"},{"internalType":"uint256","name":"voteCost","type":"uint256"},{"internalType":"uint256","name":"maxEntries","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"bool","name":"allowManyVotes","type":"bool"},{"internalType":"address[]","name":"allowList","type":"address[]"},{"internalType":"string","name":"title","type":"string"},{"internalType":"string","name":"description","type":"string"},{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bool","name":"isSet","type":"bool"},{"internalType":"string","name":"name","type":"string"},{"internalType":"address[]","name":"votes","type":"address[]"}],"internalType":"struct OpenVotes.PollOption[]","name":"options","type":"tuple[]"}],"internalType":"struct OpenVotes.Poll[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"name":"getManagersEndedPolls","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"manager","type":"address"},{"internalType":"uint256","name":"startDate","type":"uint256"},{"internalType":"uint256","name":"endDate","type":"uint256"},{"internalType":"uint256","name":"voteCost","type":"uint256"},{"internalType":"uint256","name":"maxEntries","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"bool","name":"allowManyVotes","type":"bool"},{"internalType":"address[]","name":"allowList","type":"address[]"},{"internalType":"string","name":"title","type":"string"},{"internalType":"string","name":"description","type":"string"},{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bool","name":"isSet","type":"bool"},{"internalType":"string","name":"name","type":"string"},{"internalType":"address[]","name":"votes","type":"address[]"}],"internalType":"struct OpenVotes.PollOption[]","name":"options","type":"tuple[]"}],"internalType":"struct OpenVotes.Poll[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pollId","type":"uint256"}],"name":"getPoll","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"manager","type":"address"},{"internalType":"uint256","name":"startDate","type":"uint256"},{"internalType":"uint256","name":"endDate","type":"uint256"},{"internalType":"uint256","name":"voteCost","type":"uint256"},{"internalType":"uint256","name":"maxEntries","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"bool","name":"allowManyVotes","type":"bool"},{"internalType":"address[]","name":"allowList","type":"address[]"},{"internalType":"string","name":"title","type":"string"},{"internalType":"string","name":"description","type":"string"},{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bool","name":"isSet","type":"bool"},{"internalType":"string","name":"name","type":"string"},{"internalType":"address[]","name":"votes","type":"address[]"}],"internalType":"struct OpenVotes.PollOption[]","name":"options","type":"tuple[]"}],"internalType":"struct OpenVotes.Poll","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pollIdCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pollPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pollId","type":"uint256"},{"internalType":"address","name":"_address","type":"address"}],"name":"removeFromPollAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_assetVoteCost","type":"uint256"}],"name":"setAssetVoteCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setAutoYieldAndGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feesBps","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"setPointsOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"address","name":"_contract","type":"address"}],"name":"setPointsOperatorOnBehalf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pollId","type":"uint256"},{"internalType":"address[]","name":"_allowList","type":"address[]"}],"name":"setPollAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pollPrice","type":"uint256"}],"name":"setPollPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"string","name":"_tokenId","type":"string"}],"name":"upvoteAsset","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"}],"name":"upvoteContract","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pollId","type":"uint256"},{"internalType":"uint256","name":"_optionId","type":"uint256"}],"name":"vote","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdrawFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pollId","type":"uint256"}],"name":"withdrawPollFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"yieldMode","outputs":[{"internalType":"enum YieldMode","name":"","type":"uint8"}],"stateMutability":"view","type":"function"}]

6080604052655af3107a4000600181815560029190915560646003556005556009805461ffff1916610100179055348015610038575f80fd5b506040516140953803806140958339810160408190526100579161014c565b806001600160a01b03811661008557604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b61008e816100fd565b506040516336b91f2b60e01b81526001600160a01b0382166004820152732536fe9ab3f511540f2f9e2ec2a805005c3dd800906336b91f2b906024015f604051808303815f87803b1580156100e1575f80fd5b505af11580156100f3573d5f803e3d5ffd5b5050505050610179565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6020828403121561015c575f80fd5b81516001600160a01b0381168114610172575f80fd5b9392505050565b613f0f806101865f395ff3fe608060405260043610610291575f3560e01c80636c738aef11610165578063b63a4d89116100c6578063d928209e1161007c578063e931dc2811610062578063e931dc2814610722578063eff42bbc14610735578063f2fde38b146107a1575f80fd5b8063d928209e146106e4578063e5fedb0214610703575f80fd5b8063c073a688116100ac578063c073a68814610691578063cafe0f2d146106b0578063ce2c2df1146106cf575f80fd5b8063b63a4d8914610653578063bccc533714610672575f80fd5b806397ec152d1161011b5780639ad30294116101015780639ad3029414610617578063a02215351461062b578063b384abef14610640575f80fd5b806397ec152d146105f057806399807a3014610603575f80fd5b80638da5cb5b1161014b5780638da5cb5b1461057457806396e39cda1461059d57806397d75776146105c9575f80fd5b80636c738aef1461054d578063715018a614610560575f80fd5b806347f6997b1161020f5780634e188d38116101c557806365d4ecaf116101ab57806365d4ecaf14610512578063690080a7146105255780636913c5eb14610538575f80fd5b80634e188d38146104cd5780635328ae01146104ec575f80fd5b80634bdc43b4116101f55780634bdc43b4146104705780634c1e74bb1461048f5780634d5aa7cf146104ae575f80fd5b806347f6997b146103f95780634b8f902514610424575f80fd5b80631a8cbcaa116102645780633d18678e1161024a5780633d18678e146103a757806344048e3d146103c6578063476343ee146103e5575f80fd5b80631a8cbcaa146103585780632eec7c5114610384575f80fd5b806306fdde03146102955780630db6d6ea146102e95780630f78e8a314610323578063143bf6bb14610339575b5f80fd5b3480156102a0575f80fd5b50604080518082018252600981527f4f70656e566f7465730000000000000000000000000000000000000000000000602082015290516102e091906130bf565b60405180910390f35b3480156102f4575f80fd5b5061030861030336600461312d565b6107c0565b604080518251815260209283015192810192909252016102e0565b34801561032e575f80fd5b50610337610835565b005b348015610344575f80fd5b5061033761035336600461322e565b61091d565b348015610363575f80fd5b50610377610372366004613258565b610aa0565b6040516102e09190613460565b34801561038f575f80fd5b5061039960025481565b6040519081526020016102e0565b3480156103b2575f80fd5b506103376103c1366004613258565b610e98565b3480156103d1575f80fd5b506103376103e0366004613472565b610ee1565b3480156103f0575f80fd5b50610337610f7a565b348015610404575f80fd5b5060095461041790610100900460ff1681565b6040516102e091906134cc565b34801561042f575f80fd5b5061044b732536fe9ab3f511540f2f9e2ec2a805005c3dd80081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102e0565b34801561047b575f80fd5b5061033761048a366004613258565b611024565b34801561049a575f80fd5b506103376104a9366004613522565b611031565b3480156104b9575f80fd5b506103376104c836600461356a565b61124b565b3480156104d8575f80fd5b506103376104e73660046135ae565b6112ee565b3480156104f7575f80fd5b506009546105059060ff1681565b6040516102e091906135e6565b610337610520366004613641565b6113cf565b610337610533366004613472565b61169a565b348015610543575f80fd5b5061039960015481565b61033761055b36600461312d565b611761565b34801561056b575f80fd5b50610337611836565b34801561057f575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff1661044b565b3480156105a8575f80fd5b506105bc6105b7366004613472565b611849565b6040516102e09190613718565b3480156105d4575f80fd5b5061044b73430000000000000000000000000000000000000281565b6103376105fe36600461312d565b611d41565b34801561060e575f80fd5b50610337611e0b565b348015610622575f80fd5b50610337611ea5565b348015610636575f80fd5b5061039960055481565b61033761064e366004613799565b611f03565b34801561065e575f80fd5b506105bc61066d366004613472565b612428565b34801561067d575f80fd5b5061033761068c36600461322e565b6128fa565b34801561069c575f80fd5b506103376106ab3660046137b9565b612a08565b3480156106bb575f80fd5b506103376106ca366004613258565b612a98565b3480156106da575f80fd5b5061039960035481565b3480156106ef575f80fd5b506103376106fe366004613258565b612c19565b34801561070e575f80fd5b5061033761071d366004613522565b612c26565b610337610730366004613472565b612dd0565b348015610740575f80fd5b5061030861074f366004613472565b604080518082019091525f80825260208201525073ffffffffffffffffffffffffffffffffffffffff165f90815260076020908152604091829020825180840190935280548352600101549082015290565b3480156107ac575f80fd5b506103376107bb366004613472565b612e95565b604080518082019091525f808252602082015273ffffffffffffffffffffffffffffffffffffffff83165f908152600860205260409081902090516108069084906137f9565b908152604080519182900360209081018320838301909252815483526001909101549082015290505b92915050565b61083d612efa565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff16637114177a6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610896575f80fd5b505af11580156108a8573d5f803e3d5ffd5b5050505073430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff16634e606c476040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610905575f80fd5b505af1158015610917573d5f803e3d5ffd5b50505050565b5f8281526006602052604090206001015473ffffffffffffffffffffffffffffffffffffffff16331461097c576040517fc2d7553200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8281526006602052604090206002015442106109c5576040517f94845dae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b5f83815260066020526040902060080154811015610a9b575f838152600660205260409020600801805473ffffffffffffffffffffffffffffffffffffffff8416919083908110610a1a57610a1a61380f565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff1603610a93575f838152600660205260409020600801805482908110610a6257610a6261380f565b5f91825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b6001016109c7565b505050565b610b146040518061018001604052805f81526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f15158152602001606081526020016060815260200160608152602001606081525090565b5f8281526006602081815260409283902083516101808101855281548152600182015473ffffffffffffffffffffffffffffffffffffffff16818401526002820154818601526003820154606082015260048201546080820152600582015460a08201529281015460c0840152600781015460ff16151560e084015260088101805485518185028101850190965280865293949193610100860193830182828015610bf357602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610bc8575b50505050508152602001600982018054610c0c9061383c565b80601f0160208091040260200160405190810160405280929190818152602001828054610c389061383c565b8015610c835780601f10610c5a57610100808354040283529160200191610c83565b820191905f5260205f20905b815481529060010190602001808311610c6657829003601f168201915b50505050508152602001600a82018054610c9c9061383c565b80601f0160208091040260200160405190810160405280929190818152602001828054610cc89061383c565b8015610d135780601f10610cea57610100808354040283529160200191610d13565b820191905f5260205f20905b815481529060010190602001808311610cf657829003601f168201915b50505050508152602001600b8201805480602002602001604051908101604052809291908181526020015f905b82821015610e8a575f848152602090819020604080516080810182526004860290920180548352600181015460ff1615159383019390935260028301805492939291840191610d8e9061383c565b80601f0160208091040260200160405190810160405280929190818152602001828054610dba9061383c565b8015610e055780601f10610ddc57610100808354040283529160200191610e05565b820191905f5260205f20905b815481529060010190602001808311610de857829003601f168201915b5050505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015610e7257602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610e47575b50505050508152505081526020019060010190610d40565b505050915250909392505050565b610ea0612efa565b6103e8811115610edc576040517f711d82e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600355565b610ee9612efa565b6040517f36b91f2b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152732536fe9ab3f511540f2f9e2ec2a805005c3dd800906336b91f2b906024015f604051808303815f87803b158015610f61575f80fd5b505af1158015610f73573d5f803e3d5ffd5b5050505050565b610f82612efa565b6004544711610fbd576040517f846d8c5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc60045447610ffc91906138ba565b6040518115909202915f818181858888f19350505050158015611021573d5f803e3d5ffd5b50565b61102c612efa565b600155565b5f8381526006602052604090206001015473ffffffffffffffffffffffffffffffffffffffff163314611090576040517fc2d7553200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8381526006602052604090206002015442106110d9576040517f94845dae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8181101561120a575f848152600660209081526040918290208251608081018452600b90910180548252600192820192909252909181018585858181106111245761112461380f565b905060200281019061113691906138cd565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92018290525093855250506040805183815260208082018352948501528554600180820188559684529284902085516004909402019283559284015194820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001695151595909517909455908201519192509060028201906111e39082613972565b50606082015180516111ff916003840191602090910190612fc0565b5050506001016110db565b507fa0f42bd967f71cd5c8a71c0d9d20794eff4b2d5a26d8343d3d54e43a9c9ab23f83838360405161123e93929190613b94565b60405180910390a1505050565b611253612efa565b6040517fb30080ac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808316600483015283166024820152732536fe9ab3f511540f2f9e2ec2a805005c3dd8009063b30080ac906044015b5f604051808303815f87803b1580156112d4575f80fd5b505af11580156112e6573d5f803e3d5ffd5b505050505050565b6112f6612efa565b600980548391907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660018360028111156113335761133361348b565b0217905550600980548291907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101008360018111156113765761137661348b565b02179055506040517fc8992e610000000000000000000000000000000000000000000000000000000081527343000000000000000000000000000000000000029063c8992e61906112bd90859085903390600401613bad565b60015434101561140b576040517f356680b700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600580545f818152600660208190526040808320938455600190930180547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055835482528282206002018f9055835482528282206003018e9055835482528282206004018d90558354825282822084018c905583548252828220018190558254815281812060070180548b15157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009091161790559154825290206009016114d7868883613bec565b506005545f908152600660205260409020600a016114f6848683613bec565b505f5b818110156116295760065f60055481526020019081526020015f20600b0160405180608001604052808381526020016001151581526020018585858181106115435761154361380f565b905060200281019061155591906138cd565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92018290525093855250506040805183815260208082018352948501528554600180820188559684529284902085516004909402019283559284015194820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001695151595909517909455908201519192509060028201906116029082613972565b506060820151805161161e916003840191602090910190612fc0565b5050506001016114f9565b507f0f64b09ff3c931b17c579e0a4d11a3e434ab2db10da3156623af07f4de68d9f56005548c8c8c8c8c8c8c8c8c8c8c6040516116719c9b9a99989796959493929190613d02565b60405180910390a160058054905f61168883613d79565b91905055505050505050505050505050565b60025434146116d5576040517f2abe34ae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81165f90815260076020526040812080546001929061170a908490613db0565b90915550506040805173ffffffffffffffffffffffffffffffffffffffff831681523360208201527f802d8aae6ea3cac65e9a6ef68452f2d0b14a9d4013b807b82098967aa66a13ad91015b60405180910390a150565b600254341461179c576040517f2abe34ae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82165f90815260086020526040908190209051600191906117d39084906137f9565b90815260200160405180910390205f015f8282546117f19190613db0565b90915550506040517fd9230a4e85d67c91a24329598f83c7a89b0df3e1a25a02b8cc7378ab17fc27aa9061182a90849084903390613dc3565b60405180910390a15050565b61183e612efa565b6118475f612f4c565b565b60605f60055467ffffffffffffffff81111561186757611867613100565b60405190808252806020026020018201604052801561190c57816020015b6118f96040518061018001604052805f81526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f15158152602001606081526020016060815260200160608152602001606081525090565b8152602001906001900390816118855790505b5090505f60015b600554811015611d38575f8181526006602052604090206001015473ffffffffffffffffffffffffffffffffffffffff868116911614801561196557505f818152600660205260409020600201544210155b801561198157505f818152600660205260409020600301544211155b15611d30575f8181526006602081815260409283902083516101808101855281548152600182015473ffffffffffffffffffffffffffffffffffffffff16818401526002820154818601526003820154606082015260048201546080820152600582015460a08201529281015460c0840152600781015460ff16151560e084015260088101805485518185028101850190965280865293949193610100860193830182828015611a6557602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611a3a575b50505050508152602001600982018054611a7e9061383c565b80601f0160208091040260200160405190810160405280929190818152602001828054611aaa9061383c565b8015611af55780601f10611acc57610100808354040283529160200191611af5565b820191905f5260205f20905b815481529060010190602001808311611ad857829003601f168201915b50505050508152602001600a82018054611b0e9061383c565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3a9061383c565b8015611b855780601f10611b5c57610100808354040283529160200191611b85565b820191905f5260205f20905b815481529060010190602001808311611b6857829003601f168201915b50505050508152602001600b8201805480602002602001604051908101604052809291908181526020015f905b82821015611cfc575f848152602090819020604080516080810182526004860290920180548352600181015460ff1615159383019390935260028301805492939291840191611c009061383c565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2c9061383c565b8015611c775780601f10611c4e57610100808354040283529160200191611c77565b820191905f5260205f20905b815481529060010190602001808311611c5a57829003601f168201915b5050505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015611ce457602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611cb9575b50505050508152505081526020019060010190611bb2565b5050505081525050838381518110611d1657611d1661380f565b60200260200101819052508180611d2c90613d79565b9250505b600101611913565b50909392505050565b6002543414611d7c576040517f2abe34ae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82165f9081526008602052604090819020905160019190611db39084906137f9565b90815260200160405180910390206001015f828254611dd29190613db0565b90915550506040517fd9e050bf72498cf7ffcb1e5940e641a5a88da9cf60156cd4014d3a7b01c852579061182a90849084903390613dc3565b611e13612efa565b6040517f662aa11d0000000000000000000000000000000000000000000000000000000081523060048201523360248201527343000000000000000000000000000000000000029063662aa11d906044015b6020604051808303815f875af1158015611e81573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110219190613e17565b611ead612efa565b6040517f954fa5ee0000000000000000000000000000000000000000000000000000000081523060048201523360248201527343000000000000000000000000000000000000029063954fa5ee90604401611e65565b5f8281526006602052604090206001015473ffffffffffffffffffffffffffffffffffffffff16611f60576040517f8acdc76500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f82815260066020526040902060020154421080611f8d57505f8281526006602052604090206003015442115b15611fc4576040517f4ffa1dda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f82815260066020526040902060040154341461200d576040517f2abe34ae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f82815260066020526040902060080154156120d4575f805b5f8481526006602052604090206008015481101561209a575f8481526006602052604090206008018054339190839081106120635761206361380f565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff1603612092576001915061209a565b600101612026565b50806120d2576040517fe0e6520900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b5f828152600660205260409020600b018054829081106120f6576120f661380f565b5f91825260209091206001600490920201015460ff16612142576040517f5c240edf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8281526006602052604090206007015460ff16612262575f5b5f838152600660205260409020600b0154811015612260575f5b5f848152600660205260409020600b018054839081106121985761219861380f565b905f5260205f20906004020160030180549050811015612257575f848152600660205260409020600b018054339190849081106121d7576121d761380f565b905f5260205f20906004020160030182815481106121f7576121f761380f565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff160361224f576040517f659d04f400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600101612176565b5060010161215c565b505b5f82815260066020526040902060050154156122eb575f8281526006602052604090206005810154600b9091018054839081106122a1576122a161380f565b905f5260205f20906004020160030180549050106122eb576040517f03c16f6000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f828152600660205260409020600b0180548290811061230d5761230d61380f565b5f918252602080832060036004938402909101810180546001810182559085528285200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000163317905554858452600690915260408320909101546127109161237791613e2e565b6123819190613e45565b5f84815260066020526040812060040154919250906123a19083906138ba565b90508060065f8681526020019081526020015f206006015f8282546123c69190613db0565b925050819055508060045f8282546123de9190613db0565b90915550506040805185815260208101859052338183015290517f7c2f48a4bf2e759e77b1e77a8bf1034cdf16e9034dad596d3655bb8b315f85eb9181900360600190a150505050565b60605f60055467ffffffffffffffff81111561244657612446613100565b6040519080825280602002602001820160405280156124eb57816020015b6124d86040518061018001604052805f81526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f15158152602001606081526020016060815260200160608152602001606081525090565b8152602001906001900390816124645790505b5090505f60015b600554811015611d38575f8181526006602052604090206001015473ffffffffffffffffffffffffffffffffffffffff868116911614801561254357505f8181526006602052604090206003015442115b156128f2575f8181526006602081815260409283902083516101808101855281548152600182015473ffffffffffffffffffffffffffffffffffffffff16818401526002820154818601526003820154606082015260048201546080820152600582015460a08201529281015460c0840152600781015460ff16151560e08401526008810180548551818502810185019096528086529394919361010086019383018282801561262757602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116125fc575b505050505081526020016009820180546126409061383c565b80601f016020809104026020016040519081016040528092919081815260200182805461266c9061383c565b80156126b75780601f1061268e576101008083540402835291602001916126b7565b820191905f5260205f20905b81548152906001019060200180831161269a57829003601f168201915b50505050508152602001600a820180546126d09061383c565b80601f01602080910402602001604051908101604052809291908181526020018280546126fc9061383c565b80156127475780601f1061271e57610100808354040283529160200191612747565b820191905f5260205f20905b81548152906001019060200180831161272a57829003601f168201915b50505050508152602001600b8201805480602002602001604051908101604052809291908181526020015f905b828210156128be575f848152602090819020604080516080810182526004860290920180548352600181015460ff16151593830193909352600283018054929392918401916127c29061383c565b80601f01602080910402602001604051908101604052809291908181526020018280546127ee9061383c565b80156128395780601f1061281057610100808354040283529160200191612839565b820191905f5260205f20905b81548152906001019060200180831161281c57829003601f168201915b50505050508152602001600382018054806020026020016040519081016040528092919081815260200182805480156128a657602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161287b575b50505050508152505081526020019060010190612774565b50505050815250508383815181106128d8576128d861380f565b602002602001018190525081806128ee90613d79565b9250505b6001016124f2565b5f8281526006602052604090206001015473ffffffffffffffffffffffffffffffffffffffff163314612959576040517fc2d7553200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8281526006602052604090206002015442106129a2576040517f94845dae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f91825260066020908152604083206008018054600181018255908452922090910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055565b612a10612efa565b6040517f4c802f3800000000000000000000000000000000000000000000000000000000815273430000000000000000000000000000000000000290634c802f3890612a66908690869086903390600401613e7d565b5f604051808303815f87803b158015612a7d575f80fd5b505af1158015612a8f573d5f803e3d5ffd5b50505050505050565b5f8181526006602052604090206001015473ffffffffffffffffffffffffffffffffffffffff163314612af7576040517fc2d7553200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f81815260066020526040902060030154421015612b41576040517f94845dae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f818152600660208190526040822001549003612b8a576040517f0175181900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8181526006602081905260408220018054908290556004805491928392612bb39084906138ba565b9091555050604051339082156108fc029083905f818181858888f19350505050158015612be2573d5f803e3d5ffd5b5060408051838152602081018390527fd9c31584070e180ed2715c3910f653aded00fa2eb44874f203fe82d94e5d5007910161182a565b612c21612efa565b600255565b5f8381526006602052604090206001015473ffffffffffffffffffffffffffffffffffffffff163314612c85576040517fc2d7553200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f838152600660205260409020600201544210612cce576040517f94845dae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f838152600660205260409020600201544210612d17576040517f94845dae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f838152600660205260408120612d3391600890910190613048565b5f5b81811015610917575f848152600660205260409020600801838383818110612d5f57612d5f61380f565b9050602002016020810190612d749190613472565b8154600180820184555f93845260209093200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905501612d35565b6002543414612e0b576040517f2abe34ae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81165f9081526007602052604081206001908101805491929091612e45908490613db0565b90915550506040805173ffffffffffffffffffffffffffffffffffffffff831681523360208201527fa99f0216603ae2d75019e517770e7014653a612b3ef1199c33a7bc64cf76d0509101611756565b612e9d612efa565b73ffffffffffffffffffffffffffffffffffffffff8116612ef1576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b61102181612f4c565b5f5473ffffffffffffffffffffffffffffffffffffffff163314611847576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401612ee8565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054828255905f5260205f20908101928215613038579160200282015b8281111561303857825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190612fde565b5061304492915061305f565b5090565b5080545f8255905f5260205f209081019061102191905b5b80821115613044575f8155600101613060565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f6130d16020830184613073565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146130fb575f80fd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f806040838503121561313e575f80fd5b613147836130d8565b9150602083013567ffffffffffffffff811115613162575f80fd5b8301601f81018513613172575f80fd5b803567ffffffffffffffff81111561318c5761318c613100565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff821117156131f8576131f8613100565b60405281815282820160200187101561320f575f80fd5b816020840160208301375f602083830101528093505050509250929050565b5f806040838503121561323f575f80fd5b8235915061324f602084016130d8565b90509250929050565b5f60208284031215613268575f80fd5b5035919050565b5f8151808452602084019350602083015f5b828110156132b557815173ffffffffffffffffffffffffffffffffffffffff16865260209586019590910190600101613281565b5093949350505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015613368577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08584030188528151805184526020810151151560208501526040810151608060408601526133356080860182613073565b9050606082015191508481036060860152613350818361326f565b60209a8b019a909550939093019250506001016132db565b50909695505050505050565b805182525f60208201516133a0602085018273ffffffffffffffffffffffffffffffffffffffff169052565b5060408201516040840152606082015160608401526080820151608084015260a082015160a084015260c082015160c084015260e08201516133e660e085018215159052565b5061010082015161018061010085015261340461018085018261326f565b905061012083015184820361012086015261341f8282613073565b91505061014083015184820361014086015261343b8282613073565b91505061016083015184820361016086015261345782826132bf565b95945050505050565b602081525f6130d16020830184613374565b5f60208284031215613482575f80fd5b6130d1826130d8565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600281106134c8576134c861348b565b9052565b6020810161082f82846134b8565b5f8083601f8401126134ea575f80fd5b50813567ffffffffffffffff811115613501575f80fd5b6020830191508360208260051b850101111561351b575f80fd5b9250929050565b5f805f60408486031215613534575f80fd5b83359250602084013567ffffffffffffffff811115613551575f80fd5b61355d868287016134da565b9497909650939450505050565b5f806040838503121561357b575f80fd5b613584836130d8565b915061324f602084016130d8565b8035600381106130fb575f80fd5b8035600281106130fb575f80fd5b5f80604083850312156135bf575f80fd5b6135c883613592565b915061324f602084016135a0565b600381106134c8576134c861348b565b6020810161082f82846135d6565b803580151581146130fb575f80fd5b5f8083601f840112613613575f80fd5b50813567ffffffffffffffff81111561362a575f80fd5b60208301915083602082850101111561351b575f80fd5b5f805f805f805f805f805f6101008c8e03121561365c575f80fd5b8b359a5060208c0135995060408c0135985060608c0135975061368160808d016135f4565b965060a08c013567ffffffffffffffff81111561369c575f80fd5b6136a88e828f01613603565b90975095505060c08c013567ffffffffffffffff8111156136c7575f80fd5b6136d38e828f01613603565b90955093505060e08c013567ffffffffffffffff8111156136f2575f80fd5b6136fe8e828f016134da565b915080935050809150509295989b509295989b9093969950565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b8281101561378d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0878603018452613778858351613374565b9450602093840193919091019060010161373e565b50929695505050505050565b5f80604083850312156137aa575f80fd5b50508035926020909101359150565b5f805f606084860312156137cb575f80fd5b6137d4846130d8565b92506137e260208501613592565b91506137f0604085016135a0565b90509250925092565b5f82518060208501845e5f920191825250919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b600181811c9082168061385057607f821691505b602082108103613887577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8181038181111561082f5761082f61388d565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613900575f80fd5b83018035915067ffffffffffffffff82111561391a575f80fd5b60200191503681900382131561351b575f80fd5b601f821115610a9b57805f5260205f20601f840160051c810160208510156139535750805b601f840160051c820191505b81811015610f73575f815560010161395f565b815167ffffffffffffffff81111561398c5761398c613100565b6139a08161399a845461383c565b8461392e565b6020601f8211600181146139f1575f83156139bb5750848201515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600385901b1c1916600184901b178455610f73565b5f848152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08516915b82811015613a3e5787850151825560209485019460019092019101613a1e565b5084821015613a7a57868401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b60f8161c191681555b50505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f8383855260208501945060208460051b820101835f5b86811015613368577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe084840301885281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1873603018112613b47575f80fd5b860160208101903567ffffffffffffffff811115613b63575f80fd5b803603821315613b71575f80fd5b613b7c858284613a89565b60209a8b019a90955093909301925050600101613ae7565b838152604060208201525f613457604083018486613ad0565b60608101613bbb82866135d6565b613bc860208301856134b8565b73ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff831115613c0457613c04613100565b613c1883613c12835461383c565b8361392e565b5f601f841160018114613c68575f8515613c325750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610f73565b5f838152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08716915b82811015613cb55786850135825560209485019460019092019101613c95565b5086821015613cf0577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b8c81528b60208201528a604082015289606082015288608082015287151560a082015261012060c08201525f613d3d6101208301888a613a89565b82810360e0840152613d50818789613a89565b9050828103610100840152613d66818587613ad0565b9f9e505050505050505050505050505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613da957613da961388d565b5060010190565b8082018082111561082f5761082f61388d565b73ffffffffffffffffffffffffffffffffffffffff84168152606060208201525f613df16060830185613073565b905073ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b5f60208284031215613e27575f80fd5b5051919050565b808202811582820484141761082f5761082f61388d565b5f82613e78577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b73ffffffffffffffffffffffffffffffffffffffff8516815260808101613ea760208301866135d6565b613eb460408301856134b8565b73ffffffffffffffffffffffffffffffffffffffff831660608301529594505050505056fea2646970667358221220703aa281bc8811edac4291d6f9e3629c8040032f69f6de6b142861ca7056670664736f6c634300081a003300000000000000000000000081e3a6fe6db27fa0f8f29c13b3ea2bc692117e59

Deployed Bytecode

0x608060405260043610610291575f3560e01c80636c738aef11610165578063b63a4d89116100c6578063d928209e1161007c578063e931dc2811610062578063e931dc2814610722578063eff42bbc14610735578063f2fde38b146107a1575f80fd5b8063d928209e146106e4578063e5fedb0214610703575f80fd5b8063c073a688116100ac578063c073a68814610691578063cafe0f2d146106b0578063ce2c2df1146106cf575f80fd5b8063b63a4d8914610653578063bccc533714610672575f80fd5b806397ec152d1161011b5780639ad30294116101015780639ad3029414610617578063a02215351461062b578063b384abef14610640575f80fd5b806397ec152d146105f057806399807a3014610603575f80fd5b80638da5cb5b1161014b5780638da5cb5b1461057457806396e39cda1461059d57806397d75776146105c9575f80fd5b80636c738aef1461054d578063715018a614610560575f80fd5b806347f6997b1161020f5780634e188d38116101c557806365d4ecaf116101ab57806365d4ecaf14610512578063690080a7146105255780636913c5eb14610538575f80fd5b80634e188d38146104cd5780635328ae01146104ec575f80fd5b80634bdc43b4116101f55780634bdc43b4146104705780634c1e74bb1461048f5780634d5aa7cf146104ae575f80fd5b806347f6997b146103f95780634b8f902514610424575f80fd5b80631a8cbcaa116102645780633d18678e1161024a5780633d18678e146103a757806344048e3d146103c6578063476343ee146103e5575f80fd5b80631a8cbcaa146103585780632eec7c5114610384575f80fd5b806306fdde03146102955780630db6d6ea146102e95780630f78e8a314610323578063143bf6bb14610339575b5f80fd5b3480156102a0575f80fd5b50604080518082018252600981527f4f70656e566f7465730000000000000000000000000000000000000000000000602082015290516102e091906130bf565b60405180910390f35b3480156102f4575f80fd5b5061030861030336600461312d565b6107c0565b604080518251815260209283015192810192909252016102e0565b34801561032e575f80fd5b50610337610835565b005b348015610344575f80fd5b5061033761035336600461322e565b61091d565b348015610363575f80fd5b50610377610372366004613258565b610aa0565b6040516102e09190613460565b34801561038f575f80fd5b5061039960025481565b6040519081526020016102e0565b3480156103b2575f80fd5b506103376103c1366004613258565b610e98565b3480156103d1575f80fd5b506103376103e0366004613472565b610ee1565b3480156103f0575f80fd5b50610337610f7a565b348015610404575f80fd5b5060095461041790610100900460ff1681565b6040516102e091906134cc565b34801561042f575f80fd5b5061044b732536fe9ab3f511540f2f9e2ec2a805005c3dd80081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102e0565b34801561047b575f80fd5b5061033761048a366004613258565b611024565b34801561049a575f80fd5b506103376104a9366004613522565b611031565b3480156104b9575f80fd5b506103376104c836600461356a565b61124b565b3480156104d8575f80fd5b506103376104e73660046135ae565b6112ee565b3480156104f7575f80fd5b506009546105059060ff1681565b6040516102e091906135e6565b610337610520366004613641565b6113cf565b610337610533366004613472565b61169a565b348015610543575f80fd5b5061039960015481565b61033761055b36600461312d565b611761565b34801561056b575f80fd5b50610337611836565b34801561057f575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff1661044b565b3480156105a8575f80fd5b506105bc6105b7366004613472565b611849565b6040516102e09190613718565b3480156105d4575f80fd5b5061044b73430000000000000000000000000000000000000281565b6103376105fe36600461312d565b611d41565b34801561060e575f80fd5b50610337611e0b565b348015610622575f80fd5b50610337611ea5565b348015610636575f80fd5b5061039960055481565b61033761064e366004613799565b611f03565b34801561065e575f80fd5b506105bc61066d366004613472565b612428565b34801561067d575f80fd5b5061033761068c36600461322e565b6128fa565b34801561069c575f80fd5b506103376106ab3660046137b9565b612a08565b3480156106bb575f80fd5b506103376106ca366004613258565b612a98565b3480156106da575f80fd5b5061039960035481565b3480156106ef575f80fd5b506103376106fe366004613258565b612c19565b34801561070e575f80fd5b5061033761071d366004613522565b612c26565b610337610730366004613472565b612dd0565b348015610740575f80fd5b5061030861074f366004613472565b604080518082019091525f80825260208201525073ffffffffffffffffffffffffffffffffffffffff165f90815260076020908152604091829020825180840190935280548352600101549082015290565b3480156107ac575f80fd5b506103376107bb366004613472565b612e95565b604080518082019091525f808252602082015273ffffffffffffffffffffffffffffffffffffffff83165f908152600860205260409081902090516108069084906137f9565b908152604080519182900360209081018320838301909252815483526001909101549082015290505b92915050565b61083d612efa565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff16637114177a6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610896575f80fd5b505af11580156108a8573d5f803e3d5ffd5b5050505073430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff16634e606c476040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610905575f80fd5b505af1158015610917573d5f803e3d5ffd5b50505050565b5f8281526006602052604090206001015473ffffffffffffffffffffffffffffffffffffffff16331461097c576040517fc2d7553200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8281526006602052604090206002015442106109c5576040517f94845dae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b5f83815260066020526040902060080154811015610a9b575f838152600660205260409020600801805473ffffffffffffffffffffffffffffffffffffffff8416919083908110610a1a57610a1a61380f565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff1603610a93575f838152600660205260409020600801805482908110610a6257610a6261380f565b5f91825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b6001016109c7565b505050565b610b146040518061018001604052805f81526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f15158152602001606081526020016060815260200160608152602001606081525090565b5f8281526006602081815260409283902083516101808101855281548152600182015473ffffffffffffffffffffffffffffffffffffffff16818401526002820154818601526003820154606082015260048201546080820152600582015460a08201529281015460c0840152600781015460ff16151560e084015260088101805485518185028101850190965280865293949193610100860193830182828015610bf357602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610bc8575b50505050508152602001600982018054610c0c9061383c565b80601f0160208091040260200160405190810160405280929190818152602001828054610c389061383c565b8015610c835780601f10610c5a57610100808354040283529160200191610c83565b820191905f5260205f20905b815481529060010190602001808311610c6657829003601f168201915b50505050508152602001600a82018054610c9c9061383c565b80601f0160208091040260200160405190810160405280929190818152602001828054610cc89061383c565b8015610d135780601f10610cea57610100808354040283529160200191610d13565b820191905f5260205f20905b815481529060010190602001808311610cf657829003601f168201915b50505050508152602001600b8201805480602002602001604051908101604052809291908181526020015f905b82821015610e8a575f848152602090819020604080516080810182526004860290920180548352600181015460ff1615159383019390935260028301805492939291840191610d8e9061383c565b80601f0160208091040260200160405190810160405280929190818152602001828054610dba9061383c565b8015610e055780601f10610ddc57610100808354040283529160200191610e05565b820191905f5260205f20905b815481529060010190602001808311610de857829003601f168201915b5050505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015610e7257602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610e47575b50505050508152505081526020019060010190610d40565b505050915250909392505050565b610ea0612efa565b6103e8811115610edc576040517f711d82e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600355565b610ee9612efa565b6040517f36b91f2b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152732536fe9ab3f511540f2f9e2ec2a805005c3dd800906336b91f2b906024015f604051808303815f87803b158015610f61575f80fd5b505af1158015610f73573d5f803e3d5ffd5b5050505050565b610f82612efa565b6004544711610fbd576040517f846d8c5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc60045447610ffc91906138ba565b6040518115909202915f818181858888f19350505050158015611021573d5f803e3d5ffd5b50565b61102c612efa565b600155565b5f8381526006602052604090206001015473ffffffffffffffffffffffffffffffffffffffff163314611090576040517fc2d7553200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8381526006602052604090206002015442106110d9576040517f94845dae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8181101561120a575f848152600660209081526040918290208251608081018452600b90910180548252600192820192909252909181018585858181106111245761112461380f565b905060200281019061113691906138cd565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92018290525093855250506040805183815260208082018352948501528554600180820188559684529284902085516004909402019283559284015194820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001695151595909517909455908201519192509060028201906111e39082613972565b50606082015180516111ff916003840191602090910190612fc0565b5050506001016110db565b507fa0f42bd967f71cd5c8a71c0d9d20794eff4b2d5a26d8343d3d54e43a9c9ab23f83838360405161123e93929190613b94565b60405180910390a1505050565b611253612efa565b6040517fb30080ac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808316600483015283166024820152732536fe9ab3f511540f2f9e2ec2a805005c3dd8009063b30080ac906044015b5f604051808303815f87803b1580156112d4575f80fd5b505af11580156112e6573d5f803e3d5ffd5b505050505050565b6112f6612efa565b600980548391907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660018360028111156113335761133361348b565b0217905550600980548291907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101008360018111156113765761137661348b565b02179055506040517fc8992e610000000000000000000000000000000000000000000000000000000081527343000000000000000000000000000000000000029063c8992e61906112bd90859085903390600401613bad565b60015434101561140b576040517f356680b700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600580545f818152600660208190526040808320938455600190930180547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055835482528282206002018f9055835482528282206003018e9055835482528282206004018d90558354825282822084018c905583548252828220018190558254815281812060070180548b15157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009091161790559154825290206009016114d7868883613bec565b506005545f908152600660205260409020600a016114f6848683613bec565b505f5b818110156116295760065f60055481526020019081526020015f20600b0160405180608001604052808381526020016001151581526020018585858181106115435761154361380f565b905060200281019061155591906138cd565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92018290525093855250506040805183815260208082018352948501528554600180820188559684529284902085516004909402019283559284015194820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001695151595909517909455908201519192509060028201906116029082613972565b506060820151805161161e916003840191602090910190612fc0565b5050506001016114f9565b507f0f64b09ff3c931b17c579e0a4d11a3e434ab2db10da3156623af07f4de68d9f56005548c8c8c8c8c8c8c8c8c8c8c6040516116719c9b9a99989796959493929190613d02565b60405180910390a160058054905f61168883613d79565b91905055505050505050505050505050565b60025434146116d5576040517f2abe34ae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81165f90815260076020526040812080546001929061170a908490613db0565b90915550506040805173ffffffffffffffffffffffffffffffffffffffff831681523360208201527f802d8aae6ea3cac65e9a6ef68452f2d0b14a9d4013b807b82098967aa66a13ad91015b60405180910390a150565b600254341461179c576040517f2abe34ae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82165f90815260086020526040908190209051600191906117d39084906137f9565b90815260200160405180910390205f015f8282546117f19190613db0565b90915550506040517fd9230a4e85d67c91a24329598f83c7a89b0df3e1a25a02b8cc7378ab17fc27aa9061182a90849084903390613dc3565b60405180910390a15050565b61183e612efa565b6118475f612f4c565b565b60605f60055467ffffffffffffffff81111561186757611867613100565b60405190808252806020026020018201604052801561190c57816020015b6118f96040518061018001604052805f81526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f15158152602001606081526020016060815260200160608152602001606081525090565b8152602001906001900390816118855790505b5090505f60015b600554811015611d38575f8181526006602052604090206001015473ffffffffffffffffffffffffffffffffffffffff868116911614801561196557505f818152600660205260409020600201544210155b801561198157505f818152600660205260409020600301544211155b15611d30575f8181526006602081815260409283902083516101808101855281548152600182015473ffffffffffffffffffffffffffffffffffffffff16818401526002820154818601526003820154606082015260048201546080820152600582015460a08201529281015460c0840152600781015460ff16151560e084015260088101805485518185028101850190965280865293949193610100860193830182828015611a6557602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611a3a575b50505050508152602001600982018054611a7e9061383c565b80601f0160208091040260200160405190810160405280929190818152602001828054611aaa9061383c565b8015611af55780601f10611acc57610100808354040283529160200191611af5565b820191905f5260205f20905b815481529060010190602001808311611ad857829003601f168201915b50505050508152602001600a82018054611b0e9061383c565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3a9061383c565b8015611b855780601f10611b5c57610100808354040283529160200191611b85565b820191905f5260205f20905b815481529060010190602001808311611b6857829003601f168201915b50505050508152602001600b8201805480602002602001604051908101604052809291908181526020015f905b82821015611cfc575f848152602090819020604080516080810182526004860290920180548352600181015460ff1615159383019390935260028301805492939291840191611c009061383c565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2c9061383c565b8015611c775780601f10611c4e57610100808354040283529160200191611c77565b820191905f5260205f20905b815481529060010190602001808311611c5a57829003601f168201915b5050505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015611ce457602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611cb9575b50505050508152505081526020019060010190611bb2565b5050505081525050838381518110611d1657611d1661380f565b60200260200101819052508180611d2c90613d79565b9250505b600101611913565b50909392505050565b6002543414611d7c576040517f2abe34ae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82165f9081526008602052604090819020905160019190611db39084906137f9565b90815260200160405180910390206001015f828254611dd29190613db0565b90915550506040517fd9e050bf72498cf7ffcb1e5940e641a5a88da9cf60156cd4014d3a7b01c852579061182a90849084903390613dc3565b611e13612efa565b6040517f662aa11d0000000000000000000000000000000000000000000000000000000081523060048201523360248201527343000000000000000000000000000000000000029063662aa11d906044015b6020604051808303815f875af1158015611e81573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110219190613e17565b611ead612efa565b6040517f954fa5ee0000000000000000000000000000000000000000000000000000000081523060048201523360248201527343000000000000000000000000000000000000029063954fa5ee90604401611e65565b5f8281526006602052604090206001015473ffffffffffffffffffffffffffffffffffffffff16611f60576040517f8acdc76500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f82815260066020526040902060020154421080611f8d57505f8281526006602052604090206003015442115b15611fc4576040517f4ffa1dda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f82815260066020526040902060040154341461200d576040517f2abe34ae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f82815260066020526040902060080154156120d4575f805b5f8481526006602052604090206008015481101561209a575f8481526006602052604090206008018054339190839081106120635761206361380f565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff1603612092576001915061209a565b600101612026565b50806120d2576040517fe0e6520900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b5f828152600660205260409020600b018054829081106120f6576120f661380f565b5f91825260209091206001600490920201015460ff16612142576040517f5c240edf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8281526006602052604090206007015460ff16612262575f5b5f838152600660205260409020600b0154811015612260575f5b5f848152600660205260409020600b018054839081106121985761219861380f565b905f5260205f20906004020160030180549050811015612257575f848152600660205260409020600b018054339190849081106121d7576121d761380f565b905f5260205f20906004020160030182815481106121f7576121f761380f565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff160361224f576040517f659d04f400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600101612176565b5060010161215c565b505b5f82815260066020526040902060050154156122eb575f8281526006602052604090206005810154600b9091018054839081106122a1576122a161380f565b905f5260205f20906004020160030180549050106122eb576040517f03c16f6000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f828152600660205260409020600b0180548290811061230d5761230d61380f565b5f918252602080832060036004938402909101810180546001810182559085528285200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000163317905554858452600690915260408320909101546127109161237791613e2e565b6123819190613e45565b5f84815260066020526040812060040154919250906123a19083906138ba565b90508060065f8681526020019081526020015f206006015f8282546123c69190613db0565b925050819055508060045f8282546123de9190613db0565b90915550506040805185815260208101859052338183015290517f7c2f48a4bf2e759e77b1e77a8bf1034cdf16e9034dad596d3655bb8b315f85eb9181900360600190a150505050565b60605f60055467ffffffffffffffff81111561244657612446613100565b6040519080825280602002602001820160405280156124eb57816020015b6124d86040518061018001604052805f81526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f15158152602001606081526020016060815260200160608152602001606081525090565b8152602001906001900390816124645790505b5090505f60015b600554811015611d38575f8181526006602052604090206001015473ffffffffffffffffffffffffffffffffffffffff868116911614801561254357505f8181526006602052604090206003015442115b156128f2575f8181526006602081815260409283902083516101808101855281548152600182015473ffffffffffffffffffffffffffffffffffffffff16818401526002820154818601526003820154606082015260048201546080820152600582015460a08201529281015460c0840152600781015460ff16151560e08401526008810180548551818502810185019096528086529394919361010086019383018282801561262757602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116125fc575b505050505081526020016009820180546126409061383c565b80601f016020809104026020016040519081016040528092919081815260200182805461266c9061383c565b80156126b75780601f1061268e576101008083540402835291602001916126b7565b820191905f5260205f20905b81548152906001019060200180831161269a57829003601f168201915b50505050508152602001600a820180546126d09061383c565b80601f01602080910402602001604051908101604052809291908181526020018280546126fc9061383c565b80156127475780601f1061271e57610100808354040283529160200191612747565b820191905f5260205f20905b81548152906001019060200180831161272a57829003601f168201915b50505050508152602001600b8201805480602002602001604051908101604052809291908181526020015f905b828210156128be575f848152602090819020604080516080810182526004860290920180548352600181015460ff16151593830193909352600283018054929392918401916127c29061383c565b80601f01602080910402602001604051908101604052809291908181526020018280546127ee9061383c565b80156128395780601f1061281057610100808354040283529160200191612839565b820191905f5260205f20905b81548152906001019060200180831161281c57829003601f168201915b50505050508152602001600382018054806020026020016040519081016040528092919081815260200182805480156128a657602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161287b575b50505050508152505081526020019060010190612774565b50505050815250508383815181106128d8576128d861380f565b602002602001018190525081806128ee90613d79565b9250505b6001016124f2565b5f8281526006602052604090206001015473ffffffffffffffffffffffffffffffffffffffff163314612959576040517fc2d7553200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8281526006602052604090206002015442106129a2576040517f94845dae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f91825260066020908152604083206008018054600181018255908452922090910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055565b612a10612efa565b6040517f4c802f3800000000000000000000000000000000000000000000000000000000815273430000000000000000000000000000000000000290634c802f3890612a66908690869086903390600401613e7d565b5f604051808303815f87803b158015612a7d575f80fd5b505af1158015612a8f573d5f803e3d5ffd5b50505050505050565b5f8181526006602052604090206001015473ffffffffffffffffffffffffffffffffffffffff163314612af7576040517fc2d7553200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f81815260066020526040902060030154421015612b41576040517f94845dae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f818152600660208190526040822001549003612b8a576040517f0175181900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8181526006602081905260408220018054908290556004805491928392612bb39084906138ba565b9091555050604051339082156108fc029083905f818181858888f19350505050158015612be2573d5f803e3d5ffd5b5060408051838152602081018390527fd9c31584070e180ed2715c3910f653aded00fa2eb44874f203fe82d94e5d5007910161182a565b612c21612efa565b600255565b5f8381526006602052604090206001015473ffffffffffffffffffffffffffffffffffffffff163314612c85576040517fc2d7553200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f838152600660205260409020600201544210612cce576040517f94845dae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f838152600660205260409020600201544210612d17576040517f94845dae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f838152600660205260408120612d3391600890910190613048565b5f5b81811015610917575f848152600660205260409020600801838383818110612d5f57612d5f61380f565b9050602002016020810190612d749190613472565b8154600180820184555f93845260209093200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905501612d35565b6002543414612e0b576040517f2abe34ae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81165f9081526007602052604081206001908101805491929091612e45908490613db0565b90915550506040805173ffffffffffffffffffffffffffffffffffffffff831681523360208201527fa99f0216603ae2d75019e517770e7014653a612b3ef1199c33a7bc64cf76d0509101611756565b612e9d612efa565b73ffffffffffffffffffffffffffffffffffffffff8116612ef1576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b61102181612f4c565b5f5473ffffffffffffffffffffffffffffffffffffffff163314611847576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401612ee8565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054828255905f5260205f20908101928215613038579160200282015b8281111561303857825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190612fde565b5061304492915061305f565b5090565b5080545f8255905f5260205f209081019061102191905b5b80821115613044575f8155600101613060565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f6130d16020830184613073565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146130fb575f80fd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f806040838503121561313e575f80fd5b613147836130d8565b9150602083013567ffffffffffffffff811115613162575f80fd5b8301601f81018513613172575f80fd5b803567ffffffffffffffff81111561318c5761318c613100565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff821117156131f8576131f8613100565b60405281815282820160200187101561320f575f80fd5b816020840160208301375f602083830101528093505050509250929050565b5f806040838503121561323f575f80fd5b8235915061324f602084016130d8565b90509250929050565b5f60208284031215613268575f80fd5b5035919050565b5f8151808452602084019350602083015f5b828110156132b557815173ffffffffffffffffffffffffffffffffffffffff16865260209586019590910190600101613281565b5093949350505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015613368577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08584030188528151805184526020810151151560208501526040810151608060408601526133356080860182613073565b9050606082015191508481036060860152613350818361326f565b60209a8b019a909550939093019250506001016132db565b50909695505050505050565b805182525f60208201516133a0602085018273ffffffffffffffffffffffffffffffffffffffff169052565b5060408201516040840152606082015160608401526080820151608084015260a082015160a084015260c082015160c084015260e08201516133e660e085018215159052565b5061010082015161018061010085015261340461018085018261326f565b905061012083015184820361012086015261341f8282613073565b91505061014083015184820361014086015261343b8282613073565b91505061016083015184820361016086015261345782826132bf565b95945050505050565b602081525f6130d16020830184613374565b5f60208284031215613482575f80fd5b6130d1826130d8565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600281106134c8576134c861348b565b9052565b6020810161082f82846134b8565b5f8083601f8401126134ea575f80fd5b50813567ffffffffffffffff811115613501575f80fd5b6020830191508360208260051b850101111561351b575f80fd5b9250929050565b5f805f60408486031215613534575f80fd5b83359250602084013567ffffffffffffffff811115613551575f80fd5b61355d868287016134da565b9497909650939450505050565b5f806040838503121561357b575f80fd5b613584836130d8565b915061324f602084016130d8565b8035600381106130fb575f80fd5b8035600281106130fb575f80fd5b5f80604083850312156135bf575f80fd5b6135c883613592565b915061324f602084016135a0565b600381106134c8576134c861348b565b6020810161082f82846135d6565b803580151581146130fb575f80fd5b5f8083601f840112613613575f80fd5b50813567ffffffffffffffff81111561362a575f80fd5b60208301915083602082850101111561351b575f80fd5b5f805f805f805f805f805f6101008c8e03121561365c575f80fd5b8b359a5060208c0135995060408c0135985060608c0135975061368160808d016135f4565b965060a08c013567ffffffffffffffff81111561369c575f80fd5b6136a88e828f01613603565b90975095505060c08c013567ffffffffffffffff8111156136c7575f80fd5b6136d38e828f01613603565b90955093505060e08c013567ffffffffffffffff8111156136f2575f80fd5b6136fe8e828f016134da565b915080935050809150509295989b509295989b9093969950565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b8281101561378d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0878603018452613778858351613374565b9450602093840193919091019060010161373e565b50929695505050505050565b5f80604083850312156137aa575f80fd5b50508035926020909101359150565b5f805f606084860312156137cb575f80fd5b6137d4846130d8565b92506137e260208501613592565b91506137f0604085016135a0565b90509250925092565b5f82518060208501845e5f920191825250919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b600181811c9082168061385057607f821691505b602082108103613887577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8181038181111561082f5761082f61388d565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613900575f80fd5b83018035915067ffffffffffffffff82111561391a575f80fd5b60200191503681900382131561351b575f80fd5b601f821115610a9b57805f5260205f20601f840160051c810160208510156139535750805b601f840160051c820191505b81811015610f73575f815560010161395f565b815167ffffffffffffffff81111561398c5761398c613100565b6139a08161399a845461383c565b8461392e565b6020601f8211600181146139f1575f83156139bb5750848201515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600385901b1c1916600184901b178455610f73565b5f848152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08516915b82811015613a3e5787850151825560209485019460019092019101613a1e565b5084821015613a7a57868401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b60f8161c191681555b50505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f8383855260208501945060208460051b820101835f5b86811015613368577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe084840301885281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1873603018112613b47575f80fd5b860160208101903567ffffffffffffffff811115613b63575f80fd5b803603821315613b71575f80fd5b613b7c858284613a89565b60209a8b019a90955093909301925050600101613ae7565b838152604060208201525f613457604083018486613ad0565b60608101613bbb82866135d6565b613bc860208301856134b8565b73ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff831115613c0457613c04613100565b613c1883613c12835461383c565b8361392e565b5f601f841160018114613c68575f8515613c325750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610f73565b5f838152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08716915b82811015613cb55786850135825560209485019460019092019101613c95565b5086821015613cf0577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b8c81528b60208201528a604082015289606082015288608082015287151560a082015261012060c08201525f613d3d6101208301888a613a89565b82810360e0840152613d50818789613a89565b9050828103610100840152613d66818587613ad0565b9f9e505050505050505050505050505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613da957613da961388d565b5060010190565b8082018082111561082f5761082f61388d565b73ffffffffffffffffffffffffffffffffffffffff84168152606060208201525f613df16060830185613073565b905073ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b5f60208284031215613e27575f80fd5b5051919050565b808202811582820484141761082f5761082f61388d565b5f82613e78577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b73ffffffffffffffffffffffffffffffffffffffff8516815260808101613ea760208301866135d6565b613eb460408301856134b8565b73ffffffffffffffffffffffffffffffffffffffff831660608301529594505050505056fea2646970667358221220703aa281bc8811edac4291d6f9e3629c8040032f69f6de6b142861ca7056670664736f6c634300081a0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000081e3a6fe6db27fa0f8f29c13b3ea2bc692117e59

-----Decoded View---------------
Arg [0] : initialOwner (address): 0x81e3A6fe6Db27Fa0F8F29C13B3eA2bC692117E59

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000081e3a6fe6db27fa0f8f29c13b3ea2bc692117e59


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.