MON Price: $0.021468 (+14.22%)

Contract

0x7171590Fb0beb71B839507F810E1D2Bc576aAA55

Overview

MON Balance

Monad Chain LogoMonad Chain LogoMonad Chain Logo3,644.229272227605406223 MON

MON Value

$78.24 (@ $0.02/MON)

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Buy Miner515177332026-01-27 19:45:2429 mins ago1769543124IN
0x7171590F...c576aAA55
0 MON0.20646207204
Buy Miner515176902026-01-27 19:45:0730 mins ago1769543107IN
0x7171590F...c576aAA55
0 MON0.20991972202.25
Upgrade Field515174822026-01-27 19:43:4431 mins ago1769543024IN
0x7171590F...c576aAA55
0 MON0.07577502203
Buy Miner515169382026-01-27 19:40:0635 mins ago1769542806IN
0x7171590F...c576aAA55
0 MON0.20443793202
Buy Miner515168922026-01-27 19:39:4835 mins ago1769542788IN
0x7171590F...c576aAA55
0 MON0.17589664169.47
Upgrade Field515168252026-01-27 19:39:2135 mins ago1769542761IN
0x7171590F...c576aAA55
0 MON0.05692459152.5
Claim Rewards515167682026-01-27 19:38:5836 mins ago1769542738IN
0x7171590F...c576aAA55
103 MON0.0906988202
Buy Miner515163962026-01-27 19:36:2938 mins ago1769542589IN
0x7171590F...c576aAA55
0 MON0.21354655211
Buy Miner515163412026-01-27 19:36:0739 mins ago1769542567IN
0x7171590F...c576aAA55
0 MON0.20966024202
Upgrade Field515162492026-01-27 19:35:3039 mins ago1769542530IN
0x7171590F...c576aAA55
0 MON0.07540175202
Claim Rewards515161412026-01-27 19:34:4740 mins ago1769542487IN
0x7171590F...c576aAA55
120 MON0.0906988202
Claim Rewards515156642026-01-27 19:31:3443 mins ago1769542294IN
0x7171590F...c576aAA55
699.06738016 MON0.0906988202
Claim Rewards515136832026-01-27 19:18:2256 mins ago1769541502IN
0x7171590F...c576aAA55
751.84257628 MON0.0906988202
Buy Miner515134132026-01-27 19:16:3358 mins ago1769541393IN
0x7171590F...c576aAA55
0 MON0.20342586201
Buy Miner515133332026-01-27 19:16:021 hr ago1769541362IN
0x7171590F...c576aAA55
0 MON0.15724518151.5
Upgrade Field515132452026-01-27 19:15:261 hr ago1769541326IN
0x7171590F...c576aAA55
0 MON0.07552643202.3340234
Claim Rewards515132172026-01-27 19:15:151 hr ago1769541315IN
0x7171590F...c576aAA55
756.00374551 MON0.0906988202
Claim Rewards515116682026-01-27 19:04:561 hr ago1769540696IN
0x7171590F...c576aAA55
894.90463475 MON0.2424202
Claim Rewards515073492026-01-27 18:36:061 hr ago1769538966IN
0x7171590F...c576aAA55
696.93416857 MON0.09251276202
Claim Rewards515071942026-01-27 18:35:041 hr ago1769538904IN
0x7171590F...c576aAA55
187.63825464 MON0.09253216202
Claim Rewards515068742026-01-27 18:32:571 hr ago1769538777IN
0x7171590F...c576aAA55
26.64132793 MON0.122328101.94
Get Free Starter...515005862026-01-27 17:50:562 hrs ago1769536256IN
0x7171590F...c576aAA55
0 MON0.07712362102
Buy Miner514904152026-01-27 16:43:093 hrs ago1769532189IN
0x7171590F...c576aAA55
0 MON0.13295904127.5
Claim Rewards514896982026-01-27 16:38:223 hrs ago1769531902IN
0x7171590F...c576aAA55
26.02805456 MON0.09253216202
Claim Rewards514895882026-01-27 16:37:383 hrs ago1769531858IN
0x7171590F...c576aAA55
22.93855595 MON0.1248104
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
515167682026-01-27 19:38:5836 mins ago1769542738
0x7171590F...c576aAA55
51.26517834 MON
515167682026-01-27 19:38:5836 mins ago1769542738
0x7171590F...c576aAA55
51.26517834 MON
515161412026-01-27 19:34:4740 mins ago1769542487
0x7171590F...c576aAA55
58.90045607 MON
515161412026-01-27 19:34:4740 mins ago1769542487
0x7171590F...c576aAA55
58.90045607 MON
515156642026-01-27 19:31:3443 mins ago1769542294
0x7171590F...c576aAA55
55.93077736 MON
515156642026-01-27 19:31:3443 mins ago1769542294
0x7171590F...c576aAA55
55.93077736 MON
515136832026-01-27 19:18:2256 mins ago1769541502
0x7171590F...c576aAA55
60.15306147 MON
515136832026-01-27 19:18:2256 mins ago1769541502
0x7171590F...c576aAA55
60.15306147 MON
515132172026-01-27 19:15:151 hr ago1769541315
0x7171590F...c576aAA55
60.48288758 MON
515132172026-01-27 19:15:151 hr ago1769541315
0x7171590F...c576aAA55
60.48288758 MON
515116682026-01-27 19:04:561 hr ago1769540696
0x7171590F...c576aAA55
71.60166598 MON
515116682026-01-27 19:04:561 hr ago1769540696
0x7171590F...c576aAA55
71.60166598 MON
515073492026-01-27 18:36:061 hr ago1769538966
0x7171590F...c576aAA55
55.53346872 MON
515073492026-01-27 18:36:061 hr ago1769538966
0x7171590F...c576aAA55
55.53346872 MON
515071942026-01-27 18:35:041 hr ago1769538904
0x7171590F...c576aAA55
15.01767845 MON
515071942026-01-27 18:35:041 hr ago1769538904
0x7171590F...c576aAA55
15.01767845 MON
515068742026-01-27 18:32:571 hr ago1769538777
0x7171590F...c576aAA55
2.13267473 MON
515068742026-01-27 18:32:571 hr ago1769538777
0x7171590F...c576aAA55
2.13267473 MON
514896982026-01-27 16:38:223 hrs ago1769531902
0x7171590F...c576aAA55
2.08361127 MON
514896982026-01-27 16:38:223 hrs ago1769531902
0x7171590F...c576aAA55
2.08361127 MON
514895882026-01-27 16:37:383 hrs ago1769531858
0x7171590F...c576aAA55
1.83609362 MON
514895882026-01-27 16:37:383 hrs ago1769531858
0x7171590F...c576aAA55
1.83609362 MON
514858902026-01-27 16:12:574 hrs ago1769530377
0x7171590F...c576aAA55
21.87212554 MON
514858902026-01-27 16:12:574 hrs ago1769530377
0x7171590F...c576aAA55
21.87212554 MON
514836712026-01-27 15:58:104 hrs ago1769529490
0x7171590F...c576aAA55
2,147.7591614 MON
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PetroGame

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at monadscan.com on 2026-01-13
*/

// File: artifacts/contract/contract (1)/contract/PetroGame/utils/Context.sol


pragma solidity ^0.8.20;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}
// File: artifacts/contract/contract (1)/contract/PetroGame/utils/Ownable.sol


pragma solidity ^0.8.20;


abstract contract Ownable is Context {
    address private _owner;
    error OwnableUnauthorizedAccount(address account);
    error OwnableInvalidOwner(address owner);
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
// File: artifacts/contract/contract (1)/contract/PetroGame/utils/EnumerableSetLib.sol


pragma solidity ^0.8.4;

library EnumerableSetLib {
    error IndexOutOfBounds();
    error ValueIsZeroSentinel();
    error ExceedsCapacity();

    uint256 private constant _ZERO_SENTINEL = 0xfbb67fda52d4bfb8bf;
    uint256 private constant _ENUMERABLE_ADDRESS_SET_SLOT_SEED = 0x978aab92;
    uint256 private constant _ENUMERABLE_WORD_SET_SLOT_SEED = 0x18fb5864;

    struct AddressSet { uint256 _spacer; }
    struct Bytes32Set { uint256 _spacer; }
    struct Uint256Set { uint256 _spacer; }
    struct Int256Set { uint256 _spacer; }
    struct Uint8Set { uint256 data; }

    function length(Uint256Set storage set) internal view returns (uint256 result) {
        result = length(_toBytes32Set(set));
    }

    function contains(Uint256Set storage set, uint256 value) internal view returns (bool result) {
        result = contains(_toBytes32Set(set), bytes32(value));
    }

    function add(Uint256Set storage set, uint256 value) internal returns (bool result) {
        result = add(_toBytes32Set(set), bytes32(value));
    }

    function remove(Uint256Set storage set, uint256 value) internal returns (bool result) {
        result = remove(_toBytes32Set(set), bytes32(value));
    }

    function at(Uint256Set storage set, uint256 i) internal view returns (uint256 result) {
        result = uint256(at(_toBytes32Set(set), i));
    }

    // --- Private Helpers to reduce size (Using Bytes32 logic for Uint256) ---
    function length(Bytes32Set storage set) internal view returns (uint256 result) {
        bytes32 rootSlot = _rootSlot(set);
        assembly {
            let n := sload(not(rootSlot))
            result := shr(1, n)
        }
    }

    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool result) {
        bytes32 rootSlot = _rootSlot(set);
        assembly {
            if eq(value, _ZERO_SENTINEL) { mstore(0x00, 0xf5a267f1) revert(0x1c, 0x04) }
            if iszero(value) { value := _ZERO_SENTINEL }
            mstore(0x20, rootSlot)
            mstore(0x00, value)
            result := iszero(iszero(sload(keccak256(0x00, 0x40))))
        }
    }

    function add(Bytes32Set storage set, bytes32 value) internal returns (bool result) {
        bytes32 rootSlot = _rootSlot(set);
        assembly {
            if eq(value, _ZERO_SENTINEL) { mstore(0x00, 0xf5a267f1) revert(0x1c, 0x04) }
            if iszero(value) { value := _ZERO_SENTINEL }
            mstore(0x20, rootSlot)
            mstore(0x00, value)
            let p := keccak256(0x00, 0x40)
            if iszero(sload(p)) {
                let n := sload(not(rootSlot))
                mstore(0x00, n) // Use scratch space
                sstore(add(rootSlot, shr(1, n)), value)
                sstore(p, add(1, shr(1, n)))
                sstore(not(rootSlot), add(n, 2)) 
                result := 1
            }
        }
    }

    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool result) {
        bytes32 rootSlot = _rootSlot(set);
        assembly {
            if eq(value, _ZERO_SENTINEL) { mstore(0x00, 0xf5a267f1) revert(0x1c, 0x04) }
            if iszero(value) { value := _ZERO_SENTINEL }
            mstore(0x20, rootSlot)
            mstore(0x00, value)
            let p := keccak256(0x00, 0x40)
            let position := sload(p)
            if position {
                let n := shr(1, sload(not(rootSlot)))
                let lastValue := sload(add(rootSlot, sub(n, 1)))
                if iszero(eq(value, lastValue)) {
                    sstore(add(rootSlot, sub(position, 1)), lastValue)
                    mstore(0x00, lastValue)
                    sstore(keccak256(0x00, 0x40), position)
                }
                sstore(not(rootSlot), sub(shl(1, n), 2))
                sstore(p, 0)
                result := 1
            }
        }
    }

    function at(Bytes32Set storage set, uint256 i) internal view returns (bytes32 result) {
        bytes32 rootSlot = _rootSlot(set);
        assembly {
             if iszero(lt(i, shr(1, sload(not(rootSlot))))) {
                mstore(0x00, 0x4e23d035) // IndexOutOfBounds()
                revert(0x1c, 0x04)
            }
            result := sload(add(rootSlot, i))
            result := mul(result, iszero(eq(result, _ZERO_SENTINEL)))
        }
    }

    function _rootSlot(Bytes32Set storage s) private pure returns (bytes32 r) {
        assembly {
            mstore(0x04, _ENUMERABLE_WORD_SET_SLOT_SEED)
            mstore(0x00, s.slot)
            r := keccak256(0x00, 0x24)
        }
    }

    function _toBytes32Set(Uint256Set storage s) private pure returns (Bytes32Set storage c) {
        assembly { c.slot := s.slot }
    }
}
// File: artifacts/contract/contract (1)/contract/PetroGame/utils/FixedPointMathLib.sol


pragma solidity ^0.8.4;

library FixedPointMathLib {
    uint256 internal constant WAD = 1e18;

    function mulWad(uint256 x, uint256 y) internal pure returns (uint256 z) {
        assembly {
            if mul(y, gt(x, div(not(0), y))) {
                mstore(0x00, 0xbac65e5b) 
                revert(0x1c, 0x04)
            }
            z := div(mul(x, y), WAD)
        }
    }

    function mulDiv(uint256 x, uint256 y, uint256 d) internal pure returns (uint256 z) {
        assembly {
            if iszero(mul(or(iszero(x), eq(div(mul(x, y), x), y)), d)) {
                mstore(0x00, 0xad251c27) 
                revert(0x1c, 0x04)
            }
            z := div(mul(x, y), d)
        }
    }
}
// File: artifacts/contract/contract (1)/contract/PetroGame/interfaces/IPetro.sol

//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.19;

interface IPetro {
    function mint(address to, uint256 amt) external;
    function burn(uint256 value) external;
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 value) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}
// File: artifacts/contract/contract (1)/contract/PetroGame/types/Rig.sol


pragma solidity ^0.8.19;

struct Rig {
    uint256 rigIndex; 
    uint256 id;
    uint256 x;
    uint256 y;
    uint256 hashrate;
    uint256 powerConsumption;
    uint256 cost;
    bool inProduction;
}
// File: artifacts/contract/contract (1)/contract/PetroGame/types/Field.sol


pragma solidity ^0.8.19;

struct Field {
    uint256 fieldIndex; 
    uint256 maxRigs;    
    uint256 currRigs;   
    uint256 totalPowerOutput;
    uint256 currPowerOutput;
    uint256 x;
    uint256 y;
}
// File: artifacts/contract/contract (1)/contract/PetroGame/types/NewField.sol


pragma solidity ^0.8.19;

struct NewField {
    uint256 maxRigs; 
    uint256 totalPowerOutput;
    uint256 cost;
    bool inProduction;
    uint256 x;
    uint256 y;
}
// File: artifacts/contract/contract (1)/contract/PetroGame/libraries/Errors.sol


pragma solidity ^0.8.19;

library Errors {
    error IncorrectValue();
    error AlreadyPurchasedInitialField();
    error StarterRigAlreadyAcquired();
    error FieldAtMaxCapacity();
    error FieldInadequatePowerOutput();
    error PlayerDoesNotOwnRig();
    error GreatDepression();
    error RigNotInProduction();
    error TooPoor();
    error NewFieldNotInProduction();
    error CannotDowngradeAField();
    error NoRewardsPending();
    error CannotDecreaseBelowZero();
    error InvalidRigCoordinates();
    error FieldDimensionsInvalid();
    error NeedToInitializeField();
    error InvalidReferrer();
    error NonExistentRig();
    error CantModifyStarterRig();
    error NonExistentField();
    error CantModifyStarterField();
    error AlreadyAtMaxField();
    error CantBuyNewFieldYet();
    error InvalidRigIndex();
    error InvalidFieldIndex();
    error InvalidFee();
    error InvalidPowerOutput();
    error MiningHasntStarted();
    error WithdrawFailed();
}
// File: artifacts/contract/contract (1)/contract/PetroGame/libraries/Events.sol


pragma solidity ^0.8.19;

library Events {
    event MiningStarted(uint256 startBlock);
    event NewRigAdded(uint256 indexed rigIndex, uint256 hashRate, uint256 powerConsumption, uint256 cost, bool inProduction);
    event RigProductionToggled(uint256 indexed rigIndex, bool inProduction);
    event FieldProductionToggled(uint256 indexed fieldIndex, bool inProduction);
    event NewFieldAdded(uint256 indexed fieldIndex, uint256 totalPowerOutput, uint256 cost, bool inProduction, uint256 x, uint256 y);
    event RigSecondaryMarketAdded(uint256 indexed rigIndex, uint256 price);
    event InitialFieldPurchased(address indexed player);
    event FreeRigRedeemed(address indexed player);
    event RigSold(address indexed player, uint256 indexed rigIndex, uint256 secondHandPrice, uint256 rigId, uint256 x, uint256 y);
    event RigBought(address indexed payer, address indexed player, uint256 indexed rigIndex, uint256 cost, uint256 rigId, uint256 x, uint256 y);
    event FieldBought(address indexed player, uint256 indexed fieldIndex, uint256 cost);
    event PlayerHashrateIncreased(address indexed player, uint256 playerHashrate, uint256 playerPendingRewards);
    event PlayerHashrateDecreased(address indexed player, uint256 playerHashrate, uint256 playerPendingRewards);
    event RewardsClaimed(address indexed player, uint256 rewards);
    event RigCostChanged(uint256 indexed rigIndex, uint256 newCost);
    event FieldCostChanged(uint256 indexed fieldIndex, uint256 newCost);
}
// File: artifacts/contract/contract (1)/contract/PetroGame/PetroGame.sol


pragma solidity ^0.8.19;





// --- ORACLE ---
interface IUniswapV2Pair {
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function token0() external view returns (address);
}






contract PetroGame is Ownable {
    using EnumerableSetLib for EnumerableSetLib.Uint256Set;

    address public petroToken;
    address public devWallet; 
    address public marketingWallet; 

    // ORACLE settings
    address public liquidityPair; 
    bool public useOracle = false; 
    uint256 public manualPetroPrice = 0.0001 ether; 

    
    uint256 public startTime; 
    bool public miningHasStarted;
    
    
    // 360,000 * 1e18 / 86,400 = 4.166666666666666666 PETRO
    uint256 public constant INITIAL_PETRO_PER_SECOND = 4166666666666666666; 
    
    
    uint256 public constant HALVING_PERIOD = 6 days; 
    uint256 public constant REWARDS_PRECISION = 1e18;

    uint256 universalRigId;
    uint256 public uniqueRigCount;
    uint256 public fieldCount;
    uint256 public totalPlayers;      
    uint256 public totalPetroMined;   
    uint256 public lastRewardTime; 
    uint256 public totalHashrate;
    uint256 public cumulativePetroPerHash;
    
    // COOLDOWN 
    uint256 public cooldown = 86400; 
    
    mapping(address => uint256) public lastUpgradeTime; 
    mapping(address => uint256) public lastClaimTime; 

    mapping(address => uint256) public playerHashrate;
    mapping(address => uint256) public playerPendingRewards;
    mapping(address => uint256) public playerPetroDebt;
    
    mapping(uint256 => Rig) public rigs;
    mapping(uint256 => NewField) public fields;
    
    mapping(address => EnumerableSetLib.Uint256Set) public playerRigsOwned;
    mapping(uint256 => Rig) public playerRigsId;
    mapping(address => Field) public ownerToField;
    
    mapping(address => bool) public initializedStarterField;
    mapping(address => bool) public acquiredStarterRig;
    
    mapping(address => mapping(uint256 => mapping(uint256 => bool))) public playerOccupiedCoords;
    mapping(address => mapping(uint256 => mapping(uint256 => uint256))) public gridRigIndex; 
    
    mapping(address => address) public referrals;
    mapping(address => address[]) public referredUsers;
    
    mapping(address => uint256) public referralPetroBalance; 
    mapping(address => uint256) public totalMonCommission;   
    
    uint8 public currentPhase = 0; 
    
    
    uint256 public initialFieldPrice = 1500 ether;      
    uint256 public constant PHASE1_PRICE = 1 ether; 

    uint256 public constant PHASE2_WL_PRICE = 500 ether;    
    uint256 public constant PHASE2_PUBLIC_PRICE = 1000 ether; 
    
    mapping(address => bool) public whitelistPhase1;
    mapping(address => bool) public whitelistPhase2;

    uint256 public immutable STARTER_RIG_INDEX;
    uint256 public immutable STARTER_FIELD_INDEX;

    event FieldUpgraded(address indexed player, uint256 newLevel, uint256 newMaxRigs, uint256 newPower);
    event ReferralRewardClaimed(address indexed user, uint256 amount);
    event ClaimFeePaid(address indexed user, uint256 totalFee, uint256 devShare, uint256 marketingShare);
    event PhaseChanged(uint8 newPhase);
    event OracleUpdated(address pair, bool status);
    
    
    event UsersMigrated(uint256 count);
    event NewRigAdded(uint256 rigIndex, uint256 hashrate, uint256 cost);
    event NewFieldAdded(uint256 fieldIndex, uint256 cost, uint256 maxRigs);

    constructor() Ownable(msg.sender) {
        devWallet = msg.sender;
        marketingWallet = msg.sender;

        
        _addRigInternal(100, 1, 0); STARTER_RIG_INDEX = 1;
        _addRigInternal(180, 6, 21 * 1e18); 
        _addRigInternal(420, 8, 36 * 1e18); 
        _addRigInternal(720, 10, 54 * 1e18); _addRigInternal(1000, 10, 60 * 1e18); 
        _addRigInternal(5000, 30, 180 * 1e18); _addRigInternal(15000, 50, 375 * 1e18); 
        _addRigInternal(20000, 90, 600 * 1e18); _addRigInternal(60000, 200, 1200 * 1e18); 
        _addRigInternal(200000, 600, 3600 * 1e18); _addRigInternal(1120000, 3200, 8000 * 1e18); 
        _addRigInternal(800000, 2000, 9000 * 1e18); _addRigInternal(1336000, 3000, 12000 * 1e18); 
        _addRigInternal(2508000, 5000, 18000 * 1e18); _addRigInternal(3484000, 4500, 28000 * 1e18); 

        
        fields[++fieldCount] = NewField(4, 28, 0, false, 2, 2); STARTER_FIELD_INDEX = fieldCount;
        fields[++fieldCount] = NewField(8, 168, 210 * 1e18, false, 2, 4);
        fields[++fieldCount] = NewField(12, 420, 1125 * 1e18, false, 3, 4);
        fields[++fieldCount] = NewField(16, 1120, 888 * 1e18, false, 4, 4);
        fields[++fieldCount] = NewField(20, 7000, 1065 * 1e18, false, 4, 5);
        fields[++fieldCount] = NewField(20, 13125, 1275 * 1e18, false, 4, 5);
        fields[++fieldCount] = NewField(20, 19685, 2550 * 1e18, false, 4, 5);
    }

    
    function addNewRig(uint256 hashrate, uint256 power, uint256 cost) external onlyOwner {
        _addRigInternal(hashrate, power, cost);
        emit NewRigAdded(uniqueRigCount, hashrate, cost);
    }

    function addNewField(uint256 maxRigs, uint256 totalPowerOutput, uint256 cost, uint256 x, uint256 y) external onlyOwner {
        fields[++fieldCount] = NewField(maxRigs, totalPowerOutput, cost, false, x, y);
        emit NewFieldAdded(fieldCount, cost, maxRigs);
    }

    function _addRigInternal(uint256 hashrate, uint256 power, uint256 cost) internal {
        uniqueRigCount++;
        rigs[uniqueRigCount] = Rig(uniqueRigCount, type(uint256).max, type(uint256).max, type(uint256).max, hashrate, power, cost, false);
    }

    function migrateUsers(address[] calldata _users) external onlyOwner {
    NewField memory starterData = fields[STARTER_FIELD_INDEX];
    for(uint i=0; i<_users.length; i++) {
        address user = _users[i];
        if (!initializedStarterField[user]) {
            initializedStarterField[user] = true;
            totalPlayers++;
            playerPetroDebt[user] = cumulativePetroPerHash;
            lastClaimTime[user] = block.timestamp;
                
                Field storage field = ownerToField[user];
                field.fieldIndex = STARTER_FIELD_INDEX;
                field.maxRigs = starterData.maxRigs;
                field.totalPowerOutput = starterData.totalPowerOutput;
                field.currPowerOutput = 0;
                field.x = starterData.x;
                field.y = starterData.y;
            }
        }
        emit UsersMigrated(_users.length);
    }

    

    function getCurrentRewardPerSecond() public view returns (uint256) {
        if (!miningHasStarted) return 0;
        
        uint256 timePassed = block.timestamp - startTime;
        uint256 halvings = timePassed / HALVING_PERIOD; 
        
        if (halvings > 64) return 0;
        return INITIAL_PETRO_PER_SECOND >> halvings;
    }

    function getPendingReward(address _user) public view returns (uint256) {
        uint256 _accPetroPerHash = cumulativePetroPerHash;
        
        if (block.timestamp > lastRewardTime && totalHashrate != 0) {
            uint256 timeDelta = block.timestamp - lastRewardTime;
            uint256 currentReward = getCurrentRewardPerSecond();
            uint256 rewards = timeDelta * currentReward;
            _accPetroPerHash += (rewards * REWARDS_PRECISION) / totalHashrate;
        }
        return playerPendingRewards[_user] + (playerHashrate[_user] * (_accPetroPerHash - playerPetroDebt[_user])) / REWARDS_PRECISION;
    }

    function _updateCumulativeRewards() internal {
        if (block.timestamp <= lastRewardTime) return;
        if (totalHashrate == 0) {
            lastRewardTime = block.timestamp;
            return;
        }
        
        uint256 timeDelta = block.timestamp - lastRewardTime;
        uint256 currentReward = getCurrentRewardPerSecond();
        uint256 rewards = timeDelta * currentReward;
        
        cumulativePetroPerHash += (rewards * REWARDS_PRECISION) / totalHashrate;
        lastRewardTime = block.timestamp;
    }

    

    function purchaseInitialField(address referrer) external payable {
        if (initializedStarterField[msg.sender]) revert Errors.AlreadyPurchasedInitialField();
        require(currentPhase > 0, "Sales not started");

        uint256 priceToPay;
        
        if (currentPhase == 1) {
            require(whitelistPhase1[msg.sender], "Not Whitelisted for Phase 1");
            priceToPay = PHASE1_PRICE;
        } 
        else if (currentPhase == 2) {
            
            if (whitelistPhase2[msg.sender]) {
                priceToPay = PHASE2_WL_PRICE; // 500 MON
            } else {
                priceToPay = PHASE2_PUBLIC_PRICE; // 1000 MON
            }
        } 
        else {
            
            priceToPay = initialFieldPrice; 
            if (referrer != address(0) && referrer != msg.sender) {
                priceToPay = (initialFieldPrice * 90) / 100; 
            }
        }

        if (msg.value < priceToPay) revert Errors.IncorrectValue();

        
        bool isValidRef = (referrer != address(0) && referrer != msg.sender && currentPhase == 3);
        
        if (isValidRef) {
            uint256 refShare = (initialFieldPrice * 10) / 100;
            uint256 remainingShare = msg.value - refShare;

            payable(referrer).transfer(refShare);
            totalMonCommission[referrer] += refShare;
            referrals[msg.sender] = referrer;
            referredUsers[referrer].push(msg.sender);

            if (marketingWallet != address(0) && marketingWallet != devWallet) {
                uint256 splitAmount = remainingShare / 2; 
                payable(devWallet).transfer(splitAmount);
                payable(marketingWallet).transfer(remainingShare - splitAmount);
            } else {
                payable(devWallet).transfer(remainingShare); 
            }
        } else {
            
            if (marketingWallet != address(0) && marketingWallet != devWallet) {
                uint256 splitAmount = msg.value / 2;
                payable(devWallet).transfer(splitAmount);
                payable(marketingWallet).transfer(msg.value - splitAmount);
            } else {
                payable(devWallet).transfer(msg.value);
            }
        }

        initializedStarterField[msg.sender] = true;
        totalPlayers++;
        lastClaimTime[msg.sender] = block.timestamp; 

        NewField memory newField = fields[STARTER_FIELD_INDEX];
        Field storage field = ownerToField[msg.sender];
        field.fieldIndex = STARTER_FIELD_INDEX;
        field.maxRigs = newField.maxRigs;
        field.totalPowerOutput = newField.totalPowerOutput;
        field.currPowerOutput = 0;
        field.x = newField.x;
        field.y = newField.y;
        emit Events.InitialFieldPurchased(msg.sender);
    }

    

    function _increaseHashrate(address player, uint256 hashrate) internal {
        if (!miningHasStarted) {
            miningHasStarted = true;
            startTime = block.timestamp;     
            lastRewardTime = block.timestamp;
            emit Events.MiningStarted(block.number);
        }
        _updateRewards(player);
        totalHashrate += hashrate;
        playerHashrate[player] += hashrate;
        emit Events.PlayerHashrateIncreased(player, playerHashrate[player], playerPendingRewards[player]);
    }
    
    function claimRewards() external payable {
        if (!miningHasStarted) revert Errors.MiningHasntStarted();
        _updateRewards(msg.sender);
        
        uint256 totalReward = playerPendingRewards[msg.sender];
        if (totalReward > 0) {
            uint256 timeDiff = block.timestamp - lastClaimTime[msg.sender];
            uint256 hoursPassed = timeDiff / 3600; 
            
            uint256 burnPercent = 0;
            uint256 startFee = 30; 

            if (hoursPassed >= startFee) {
                burnPercent = 0; 
            } else {
                burnPercent = startFee - hoursPassed; 
            }

            uint256 currentPetroPrice = getPetroPrice(); 
            uint256 claimValueInMon = (totalReward * currentPetroPrice) / 1e18;
            uint256 requiredFee = (claimValueInMon * 10) / 100; 
            require(msg.value >= requiredFee, "Insufficient Pay-to-Claim Fee");

            uint256 devShare = requiredFee / 2;
            uint256 marketingShare = requiredFee - devShare;
            payable(devWallet).transfer(devShare);
            payable(marketingWallet).transfer(marketingShare);
            emit ClaimFeePaid(msg.sender, requiredFee, devShare, marketingShare);

            playerPendingRewards[msg.sender] = 0; 
            lastClaimTime[msg.sender] = block.timestamp; 

            uint256 burnAmount = (totalReward * burnPercent) / 100;
            uint256 netReward = totalReward - burnAmount;

            uint256 contractShare = (totalReward * 75) / 1000; 
            uint256 refShare = (totalReward * 25) / 1000; 

            IPetro(petroToken).mint(msg.sender, netReward);

            address referrer = referrals[msg.sender];
            if (referrer != address(0)) {
                IPetro(petroToken).mint(address(this), contractShare);
                referralPetroBalance[referrer] += refShare;
            } else {
                IPetro(petroToken).mint(address(this), contractShare + refShare);
            }
            emit Events.RewardsClaimed(msg.sender, netReward);
        }
    }

    function _updateRewards(address player) internal {
        _updateCumulativeRewards();
        playerPendingRewards[player] += (playerHashrate[player] * (cumulativePetroPerHash - playerPetroDebt[player])) / REWARDS_PRECISION;
        playerPetroDebt[player] = cumulativePetroPerHash;
    }

    function setLiquidityPair(address _pair, bool _enabled) external onlyOwner {
        liquidityPair = _pair;
        useOracle = _enabled;
        emit OracleUpdated(_pair, _enabled);
    }

    function setManualPetroPrice(uint256 _priceInWei) external onlyOwner {
        manualPetroPrice = _priceInWei;
    }

    function getPetroPrice() public view returns (uint256) {
        if (!useOracle || liquidityPair == address(0)) {
            return manualPetroPrice;
        }
        (uint112 reserve0, uint112 reserve1, ) = IUniswapV2Pair(liquidityPair).getReserves();
        address token0 = IUniswapV2Pair(liquidityPair).token0();
        if (reserve0 == 0 || reserve1 == 0) return manualPetroPrice;
        uint256 reserveMON;
        uint256 reservePETRO;
        if (token0 == petroToken) {
            reservePETRO = reserve0;
            reserveMON = reserve1;
        } else {
            reserveMON = reserve0;
            reservePETRO = reserve1;
        }
        return (reserveMON * 1e18) / reservePETRO;
    }
    
    function setMarketingWallet(address _wallet) external onlyOwner {
        marketingWallet = _wallet;
    }
    
    function setPhase(uint8 _phase) external onlyOwner {
        currentPhase = _phase;
        emit PhaseChanged(_phase);
    }

    function addWhitelistPhase1(address[] calldata _users) external onlyOwner {
        for(uint i=0; i<_users.length; i++) {
            whitelistPhase1[_users[i]] = true;
        }
    }

    function addWhitelistPhase2(address[] calldata _users) external onlyOwner {
        for(uint i=0; i<_users.length; i++) {
            whitelistPhase2[_users[i]] = true;
        }
    }

    function upgradeField() external {
        require(currentPhase == 3, "Game has not started yet (Upgrades Locked)");
        if (!initializedStarterField[msg.sender]) revert Errors.NeedToInitializeField();
        require(block.timestamp >= lastUpgradeTime[msg.sender] + cooldown, "Cooldown active: Please wait.");
        Field storage userField = ownerToField[msg.sender];
        uint256 nextLevelIndex = userField.fieldIndex + 1;
        if (nextLevelIndex > fieldCount) revert Errors.AlreadyAtMaxField();
        NewField memory nextFieldData = fields[nextLevelIndex];
        bool success = IPetro(petroToken).transferFrom(msg.sender, address(this), nextFieldData.cost);
        require(success, "Token transfer failed");
        if (nextFieldData.cost > 0) IPetro(petroToken).burn(nextFieldData.cost);
        userField.fieldIndex = nextLevelIndex;
        userField.maxRigs = nextFieldData.maxRigs;
        userField.totalPowerOutput = nextFieldData.totalPowerOutput;
        userField.x = nextFieldData.x; 
        userField.y = nextFieldData.y; 
        lastUpgradeTime[msg.sender] = block.timestamp;
        emit FieldUpgraded(msg.sender, nextLevelIndex, nextFieldData.maxRigs, nextFieldData.totalPowerOutput);
    }

    function buyMiner(uint256 minerIndex, uint256 x, uint256 y) external {
        require(currentPhase == 3, "Game has not started yet (Drilling Locked)");
        if (!initializedStarterField[msg.sender]) revert Errors.NeedToInitializeField();
        Rig memory rig = rigs[minerIndex];
        if (rig.rigIndex == 0) revert Errors.NonExistentRig(); 
        bool success = IPetro(petroToken).transferFrom(msg.sender, address(this), rig.cost);
        require(success, "Token transfer failed");
        if (rig.cost > 0) IPetro(petroToken).burn(rig.cost);
        _mintRig(msg.sender, minerIndex, x, y, rig.cost);
    }

    function claimReferralEarnings() external {
        uint256 amount = referralPetroBalance[msg.sender];
        require(amount > 0, "No referral earnings");
        referralPetroBalance[msg.sender] = 0;
        IPetro(petroToken).mint(msg.sender, amount); 
        emit ReferralRewardClaimed(msg.sender, amount);
    }

    function getReferralStats(address user) external view returns (uint256 userCount, uint256 totalMon, uint256 pendingPetro) {
        return (referredUsers[user].length, totalMonCommission[user], referralPetroBalance[user]);
    }

    function withdrawPetro() external onlyOwner {
        uint256 balance = IPetro(petroToken).balanceOf(address(this));
        require(balance > 0, "No PETRO");
        IPetro(petroToken).transfer(devWallet, balance);
    }

    function withdrawMON() external onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > 0, "No MON");
        payable(devWallet).transfer(balance);
    }

    function getFreeStarterRig(uint256 x, uint256 y) external {
        require(currentPhase == 3, "Game has not started yet (Drilling Locked)");
        if (acquiredStarterRig[msg.sender]) revert Errors.StarterRigAlreadyAcquired();
        if (!initializedStarterField[msg.sender]) revert Errors.NeedToInitializeField();
        acquiredStarterRig[msg.sender] = true;
        _mintRig(msg.sender, STARTER_RIG_INDEX, x, y, 0); 
    }
    
    function removeRig(uint256 x, uint256 y) external {
        if (!playerOccupiedCoords[msg.sender][x][y]) revert Errors.RigNotInProduction();
        Field storage field = ownerToField[msg.sender];
        uint256 rIndex = gridRigIndex[msg.sender][x][y];
        Rig memory rigInfo = rigs[rIndex];
        _updateRewards(msg.sender);
        
        if (totalHashrate >= rigInfo.hashrate) {
            totalHashrate -= rigInfo.hashrate;
        } else {
            totalHashrate = 0;
        }
        if (playerHashrate[msg.sender] >= rigInfo.hashrate) {
            playerHashrate[msg.sender] -= rigInfo.hashrate;
        } else {
            playerHashrate[msg.sender] = 0;
        }
        if (field.currPowerOutput >= rigInfo.powerConsumption) {
            field.currPowerOutput -= rigInfo.powerConsumption;
        } else {
            field.currPowerOutput = 0;
        }

        playerOccupiedCoords[msg.sender][x][y] = false;
        gridRigIndex[msg.sender][x][y] = 0;
        if (field.currRigs > 0) field.currRigs--;
        emit Events.PlayerHashrateDecreased(msg.sender, playerHashrate[msg.sender], playerPendingRewards[msg.sender]);
    }

    function _mintRig(address player, uint256 rigIndex, uint256 x, uint256 y, uint256 cost) internal {
        Rig memory rig = rigs[rigIndex];
        Field storage field = ownerToField[player];
        if (_isInvalidCoordinates(player, x, y, field.x, field.y)) revert Errors.InvalidRigCoordinates();
        if (field.currRigs >= field.maxRigs) revert Errors.FieldAtMaxCapacity();

        if (field.currPowerOutput + rig.powerConsumption > field.totalPowerOutput) revert Errors.FieldInadequatePowerOutput();
        field.currPowerOutput += rig.powerConsumption;
        universalRigId++;
        rig.x = x;
        rig.y = y;
        rig.id = universalRigId;
        playerOccupiedCoords[player][x][y] = true;
        gridRigIndex[player][x][y] = rigIndex;
        playerRigsOwned[player].add(universalRigId);
        playerRigsId[universalRigId] = rig;
        field.currRigs++;
        _increaseHashrate(player, rig.hashrate);
        emit Events.RigBought(player, player, rigIndex, cost, universalRigId, x, y);
    }

    function _isInvalidCoordinates(address player, uint256 desiredX, uint256 desiredY, uint256 fieldX, uint256 fieldY) internal view returns (bool) {
        if (desiredX >= fieldX || desiredY >= fieldY) return true;
        return playerOccupiedCoords[player][desiredX][desiredY];
    }

    function setPetro(address _petro) external onlyOwner {
        petroToken = _petro;
    }

    function getNextFieldInfo(uint256 currentLevel) external view returns (uint256 cost, uint256 newMaxRigs, uint256 newPower) {
        if (currentLevel >= fieldCount) return (0,0,0);
        NewField memory next = fields[currentLevel + 1];
        return (next.cost, next.maxRigs, next.totalPowerOutput);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyAtMaxField","type":"error"},{"inputs":[],"name":"AlreadyPurchasedInitialField","type":"error"},{"inputs":[],"name":"FieldAtMaxCapacity","type":"error"},{"inputs":[],"name":"FieldInadequatePowerOutput","type":"error"},{"inputs":[],"name":"IncorrectValue","type":"error"},{"inputs":[],"name":"InvalidRigCoordinates","type":"error"},{"inputs":[],"name":"MiningHasntStarted","type":"error"},{"inputs":[],"name":"NeedToInitializeField","type":"error"},{"inputs":[],"name":"NonExistentRig","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":"RigNotInProduction","type":"error"},{"inputs":[],"name":"StarterRigAlreadyAcquired","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"devShare","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"marketingShare","type":"uint256"}],"name":"ClaimFeePaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"newLevel","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newMaxRigs","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPower","type":"uint256"}],"name":"FieldUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"}],"name":"InitialFieldPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"startBlock","type":"uint256"}],"name":"MiningStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fieldIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cost","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxRigs","type":"uint256"}],"name":"NewFieldAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rigIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"hashrate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cost","type":"uint256"}],"name":"NewRigAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"OracleUpdated","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":"uint8","name":"newPhase","type":"uint8"}],"name":"PhaseChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"playerHashrate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"playerPendingRewards","type":"uint256"}],"name":"PlayerHashrateDecreased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"playerHashrate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"playerPendingRewards","type":"uint256"}],"name":"PlayerHashrateIncreased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ReferralRewardClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"rewards","type":"uint256"}],"name":"RewardsClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"payer","type":"address"},{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":true,"internalType":"uint256","name":"rigIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cost","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rigId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"x","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"y","type":"uint256"}],"name":"RigBought","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"count","type":"uint256"}],"name":"UsersMigrated","type":"event"},{"inputs":[],"name":"HALVING_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INITIAL_PETRO_PER_SECOND","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PHASE1_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PHASE2_PUBLIC_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PHASE2_WL_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARDS_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STARTER_FIELD_INDEX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STARTER_RIG_INDEX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"acquiredStarterRig","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxRigs","type":"uint256"},{"internalType":"uint256","name":"totalPowerOutput","type":"uint256"},{"internalType":"uint256","name":"cost","type":"uint256"},{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"addNewField","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"hashrate","type":"uint256"},{"internalType":"uint256","name":"power","type":"uint256"},{"internalType":"uint256","name":"cost","type":"uint256"}],"name":"addNewRig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"addWhitelistPhase1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"addWhitelistPhase2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minerIndex","type":"uint256"},{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"buyMiner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimReferralEarnings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimRewards","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"cooldown","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cumulativePetroPerHash","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentPhase","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fieldCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"fields","outputs":[{"internalType":"uint256","name":"maxRigs","type":"uint256"},{"internalType":"uint256","name":"totalPowerOutput","type":"uint256"},{"internalType":"uint256","name":"cost","type":"uint256"},{"internalType":"bool","name":"inProduction","type":"bool"},{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentRewardPerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"getFreeStarterRig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"currentLevel","type":"uint256"}],"name":"getNextFieldInfo","outputs":[{"internalType":"uint256","name":"cost","type":"uint256"},{"internalType":"uint256","name":"newMaxRigs","type":"uint256"},{"internalType":"uint256","name":"newPower","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getPendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPetroPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getReferralStats","outputs":[{"internalType":"uint256","name":"userCount","type":"uint256"},{"internalType":"uint256","name":"totalMon","type":"uint256"},{"internalType":"uint256","name":"pendingPetro","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"gridRigIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialFieldPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"initializedStarterField","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastClaimTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRewardTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastUpgradeTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualPetroPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"migrateUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"miningHasStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ownerToField","outputs":[{"internalType":"uint256","name":"fieldIndex","type":"uint256"},{"internalType":"uint256","name":"maxRigs","type":"uint256"},{"internalType":"uint256","name":"currRigs","type":"uint256"},{"internalType":"uint256","name":"totalPowerOutput","type":"uint256"},{"internalType":"uint256","name":"currPowerOutput","type":"uint256"},{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"petroToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"playerHashrate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"playerOccupiedCoords","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"playerPendingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"playerPetroDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"playerRigsId","outputs":[{"internalType":"uint256","name":"rigIndex","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"},{"internalType":"uint256","name":"hashrate","type":"uint256"},{"internalType":"uint256","name":"powerConsumption","type":"uint256"},{"internalType":"uint256","name":"cost","type":"uint256"},{"internalType":"bool","name":"inProduction","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"playerRigsOwned","outputs":[{"internalType":"uint256","name":"_spacer","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"referrer","type":"address"}],"name":"purchaseInitialField","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referralPetroBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referrals","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"referredUsers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"removeRig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rigs","outputs":[{"internalType":"uint256","name":"rigIndex","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"},{"internalType":"uint256","name":"hashrate","type":"uint256"},{"internalType":"uint256","name":"powerConsumption","type":"uint256"},{"internalType":"uint256","name":"cost","type":"uint256"},{"internalType":"bool","name":"inProduction","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_pair","type":"address"},{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setLiquidityPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_priceInWei","type":"uint256"}],"name":"setManualPetroPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_petro","type":"address"}],"name":"setPetro","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_phase","type":"uint8"}],"name":"setPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalHashrate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalMonCommission","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPetroMined","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPlayers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniqueRigCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"upgradeField","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"useOracle","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistPhase1","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistPhase2","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawMON","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawPetro","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c06040526004805460ff60a01b19169055655af3107a4000600555620151806010556023805460ff19169055685150ae84a8cdf0000060245534801562000045575f80fd5b5033806200006c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b620000778162000709565b5060028054336001600160a01b03199182168117909255600380549091169091179055620000a9606460015f62000758565b6001608052620000c660b460066801236efcbcbb34000062000758565b620000df6101a460086801f399b1438a10000062000758565b620000f86102d0600a6802ed6689e54f18000062000758565b620001116103e8600a680340aad21b3b70000062000758565b6200012a611388601e6809c2007651b250000062000758565b62000143613a9860326814542ba12a337c000062000758565b6200015c614e20605a682086ac35105260000062000758565b6200017561ea6060c868410d586a20a4c0000062000758565b6200019062030d4061025868c328093e61ee40000062000758565b620001ac62111700610c806901b1ae4d6e2ef500000062000758565b620001c8620c35006107d06901e7e4171bf4d3a0000062000758565b620001e4621462c0610bb869028a857425466f80000062000758565b62000200622644e06113886903cfc82e37e9a740000062000758565b6200021c623529606111946905ede20f01a45980000062000758565b6040518060c0016040528060048152602001601c81526020015f81526020015f1515815260200160028152602001600281525060175f600a5f8154620002629062000802565b91905081905581526020019081526020015f205f820151815f015560208201518160010155604082015181600201556060820151816003015f6101000a81548160ff0219169083151502179055506080820151816004015560a08201518160050155905050600a5460a081815250506040518060c001604052806008815260200160a88152602001680b6255df5f5008000081526020015f1515815260200160028152602001600481525060175f600a5f8154620003209062000802565b91905081905581526020019081526020015f205f820151815f015560208201518160010155604082015181600201556060820151816003015f6101000a81548160ff0219169083151502179055506080820151816004015560a082015181600501559050506040518060c00160405280600c81526020016101a48152602001683cfc82e37e9a74000081526020015f1515815260200160038152602001600481525060175f600a5f8154620003d59062000802565b91905081905581526020019081526020015f205f820151815f015560208201518160010155604082015181600201556060820151816003015f6101000a81548160ff0219169083151502179055506080820151816004015560a082015181600501559050506040518060c0016040528060108152602001610460815260200168302379bf2ca2e0000081526020015f1515815260200160048152602001600481525060175f600a5f81546200048a9062000802565b91905081905581526020019081526020015f205f820151815f015560208201518160010155604082015181600201556060820151816003015f6101000a81548160ff0219169083151502179055506080820151816004015560a082015181600501559050506040518060c0016040528060148152602001611b5881526020016839bbd811635f04000081526020015f1515815260200160048152602001600581525060175f600a5f81546200053f9062000802565b91905081905581526020019081526020015f205f820151815f015560208201518160010155604082015181600201556060820151816003015f6101000a81548160ff0219169083151502179055506080820151816004015560a082015181600501559050506040518060c0016040528060148152602001613345815260200168451e2df0c2af0c000081526020015f1515815260200160048152602001600581525060175f600a5f8154620005f49062000802565b91905081905581526020019081526020015f205f820151815f015560208201518160010155604082015181600201556060820151816003015f6101000a81548160ff0219169083151502179055506080820151816004015560a082015181600501559050506040518060c0016040528060148152602001614ce58152602001688a3c5be1855e18000081526020015f1515815260200160048152602001600581525060175f600a5f8154620006a99062000802565b9182905550815260208082019290925260409081015f20835181559183015160018301558201516002820155606082015160038201805460ff19169115159190911790556080820151600482015560a09091015160059091015562000827565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60098054905f620007698362000802565b909155505060408051610100810182526009548082525f1960208084018281528486018381526060860193845260808601998a5260a0860198895260c086019788525f60e087018181529581526016909352959091209351845551600184015592516002830155915160038201559351600485015591516005840155516006830155516007909101805460ff1916911515919091179055565b5f600182016200082057634e487b7160e01b5f52601160045260245ffd5b5060010190565b60805160a05161383c620008655f395f81816108e201528181611e9001528181612b4d0152612c7f01525f8181610b63015261227a015261383c5ff3fe608060405260043610610416575f3560e01c8063787a08a611610220578063bb485bbd11610129578063e2b15d8c116100b3578063f37785a211610078578063f37785a214610e48578063f537967114610e5c578063f60cdcf614610e7b578063f6934a9f14610e90578063f86f25ee14610ebb575f80fd5b8063e2b15d8c14610d9b578063e92820e614610dda578063efc5119414610df9578063f2fde38b14610e15578063f322b65f14610e34575f80fd5b8063c7fda104116100f9578063c7fda10414610cdb578063cc53b27614610d3a578063d013eb0a14610d68578063d09d4abd14610a66578063dff657c314610d87575f80fd5b8063bb485bbd14610c5a578063bbb1239214610c6f578063c03afb5914610c8e578063c2df398214610cad575f80fd5b80639231cf74116101aa578063a9bc82491161017a578063a9bc824914610b3d578063ad154c6814610b52578063b3c0d5e414610b85578063b55de1a814610ba4578063b77cf9c614610c2f575f80fd5b80639231cf7414610abc57806394fc19e414610ad15780639ca423b314610aea578063a269435d14610b1e575f80fd5b806384caff83116101f057806384caff8314610a3257806384db13d214610a4757806386b3cd2614610a665780638da5cb5b14610a815780638ea5220f14610a9d575f80fd5b8063787a08a6146109d557806378e97925146109ea578063808a5457146109ff57806384ae48b514610a1e575f80fd5b8063372500ab116103225780634fe6f7a9116102ac5780635f7f44e11161027c5780635f7f44e11461094b5780636a8fa04114610979578063715018a61461098d57806375ddec4b146109a157806375f0a874146109b6575f80fd5b80634fe6f7a9146108d157806356fbab7a146109045780635a5ccef0146109175780635d098b381461092c575f80fd5b806341f09ea6116102f257806341f09ea61461082d578063426222d5146108485780634487872414610873578063476e2e66146108935780634df9d6ba146108b2575f80fd5b8063372500ab146107b95780633adde9c1146107c15780633d5e1f1e146107d757806340f5da9e14610802575f80fd5b80631c52ef27116103a3578063234f3f1b11610373578063234f3f1b14610710578063238760641461073b5780632aabc69e1461075a5780633041a5201461077957806333437f64146107a4575f80fd5b80631c52ef27146106915780631dbd6bc8146106a65780631ea4bab7146106ba57806321bade13146106d6575f80fd5b806307604998116103e9578063076049981461053e57806312544abc14610588578063136d5072146105a757806316ccbed2146105d25780631913785614610610575f80fd5b80630504023b1461041a57806305244d771461043b578063055ad42e146104dc57806306bbf22814610507575b5f80fd5b348015610425575f80fd5b50610439610434366004613470565b610eda565b005b348015610446575f80fd5b5061049a61045536600461348b565b60166020525f90815260409020805460018201546002830154600384015460048501546005860154600687015460079097015495969495939492939192909160ff1688565b604080519889526020890197909752958701949094526060860192909252608085015260a084015260c0830152151560e0820152610100015b60405180910390f35b3480156104e7575f80fd5b506023546104f59060ff1681565b60405160ff90911681526020016104d3565b348015610512575f80fd5b50600154610526906001600160a01b031681565b6040516001600160a01b0390911681526020016104d3565b348015610549575f80fd5b5061057a6105583660046134a2565b601e60209081525f938452604080852082529284528284209052825290205481565b6040519081526020016104d3565b348015610593575f80fd5b506104396105a23660046134d4565b610f04565b3480156105b2575f80fd5b5061057a6105c1366004613470565b60186020525f908152604090205481565b3480156105dd575f80fd5b506106006105ec366004613470565b601b6020525f908152604090205460ff1681565b60405190151581526020016104d3565b34801561061b575f80fd5b5061066261062a36600461348b565b60176020525f908152604090208054600182015460028301546003840154600485015460059095015493949293919260ff9091169186565b6040805196875260208701959095529385019290925215156060840152608083015260a082015260c0016104d3565b34801561069c575f80fd5b5061057a600f5481565b3480156106b1575f80fd5b5061057a610f80565b3480156106c5575f80fd5b5061057a683635c9adc5dea0000081565b3480156106e1575f80fd5b506106f56106f0366004613470565b61112a565b604080519384526020840192909252908201526060016104d3565b34801561071b575f80fd5b5061057a61072a366004613470565b60136020525f908152604090205481565b348015610746575f80fd5b50610439610755366004613550565b61115b565b348015610765575f80fd5b506106f561077436600461348b565b6111cf565b348015610784575f80fd5b5061057a610793366004613470565b60216020525f908152604090205481565b3480156107af575f80fd5b5061057a60095481565b61043961125f565b3480156107cc575f80fd5b5061057a6207e90081565b3480156107e2575f80fd5b5061057a6107f1366004613470565b60116020525f908152604090205481565b34801561080d575f80fd5b5061057a61081c366004613470565b60146020525f908152604090205481565b348015610838575f80fd5b5061057a6739d2f941e420aaaa81565b348015610853575f80fd5b5061057a610862366004613470565b60156020525f908152604090205481565b34801561087e575f80fd5b5060045461060090600160a01b900460ff1681565b34801561089e575f80fd5b506104396108ad366004613587565b611694565b3480156108bd575f80fd5b5061057a6108cc366004613470565b6118bf565b3480156108dc575f80fd5b5061057a7f000000000000000000000000000000000000000000000000000000000000000081565b610439610912366004613470565b6119b6565b348015610922575f80fd5b5061057a600e5481565b348015610937575f80fd5b50610439610946366004613470565b611f68565b348015610956575f80fd5b50610600610965366004613470565b601c6020525f908152604090205460ff1681565b348015610984575f80fd5b50610439611f92565b348015610998575f80fd5b506104396120ba565b3480156109ac575f80fd5b5061057a60245481565b3480156109c1575f80fd5b50600354610526906001600160a01b031681565b3480156109e0575f80fd5b5061057a60105481565b3480156109f5575f80fd5b5061057a60065481565b348015610a0a575f80fd5b50600454610526906001600160a01b031681565b348015610a29575f80fd5b506104396120cd565b348015610a3d575f80fd5b5061057a60055481565b348015610a52575f80fd5b50610439610a6136600461348b565b6121c9565b348015610a71575f80fd5b5061057a670de0b6b3a764000081565b348015610a8c575f80fd5b505f546001600160a01b0316610526565b348015610aa8575f80fd5b50600254610526906001600160a01b031681565b348015610ac7575f80fd5b5061057a600d5481565b348015610adc575f80fd5b506007546106009060ff1681565b348015610af5575f80fd5b50610526610b04366004613470565b601f6020525f90815260409020546001600160a01b031681565b348015610b29575f80fd5b50610439610b383660046135b0565b6121d6565b348015610b48575f80fd5b5061057a600c5481565b348015610b5d575f80fd5b5061057a7f000000000000000000000000000000000000000000000000000000000000000081565b348015610b90575f80fd5b50610439610b9f3660046134d4565b6122a3565b348015610baf575f80fd5b50610bfa610bbe366004613470565b601a6020525f90815260409020805460018201546002830154600384015460048501546005860154600690960154949593949293919290919087565b604080519788526020880196909652948601939093526060850191909152608084015260a083015260c082015260e0016104d3565b348015610c3a575f80fd5b5061057a610c49366004613470565b60126020525f908152604090205481565b348015610c65575f80fd5b5061057a600a5481565b348015610c7a575f80fd5b50610439610c893660046135d0565b61231a565b348015610c99575f80fd5b50610439610ca8366004613607565b612403565b348015610cb8575f80fd5b50610600610cc7366004613470565b60256020525f908152604090205460ff1681565b348015610ce6575f80fd5b5061049a610cf536600461348b565b60196020525f90815260409020805460018201546002830154600384015460048501546005860154600687015460079097015495969495939492939192909160ff1688565b348015610d45575f80fd5b50610600610d54366004613470565b60266020525f908152604090205460ff1681565b348015610d73575f80fd5b50610439610d823660046135b0565b612453565b348015610d92575f80fd5b5061057a6126b6565b348015610da6575f80fd5b50610600610db53660046134a2565b601d60209081525f938452604080852082529284528284209052825290205460ff1681565b348015610de5575f80fd5b50610526610df4366004613627565b61270a565b348015610e04575f80fd5b5061057a681b1ae4d6e2ef50000081565b348015610e20575f80fd5b50610439610e2f366004613470565b61273d565b348015610e3f575f80fd5b50610439612777565b348015610e53575f80fd5b506104396127ed565b348015610e67575f80fd5b50610439610e763660046134d4565b612b43565b348015610e86575f80fd5b5061057a600b5481565b348015610e9b575f80fd5b5061057a610eaa366004613470565b60226020525f908152604090205481565b348015610ec6575f80fd5b50610439610ed5366004613587565b612d18565b610ee2612d6b565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b610f0c612d6b565b5f5b81811015610f7b57600160265f858585818110610f2d57610f2d613651565b9050602002016020810190610f429190613470565b6001600160a01b0316815260208101919091526040015f20805460ff191691151591909117905580610f7381613679565b915050610f0e565b505050565b6004545f90600160a01b900460ff161580610fa457506004546001600160a01b0316155b15610fb0575060055490565b6004805460408051630240bc6b60e21b815290515f9384936001600160a01b031692630902f1ac92818301926060928290030181865afa158015610ff6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061101a91906136ac565b50915091505f60045f9054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015611070573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061109491906136f8565b90506001600160701b03831615806110b357506001600160701b038216155b156110c357600554935050505090565b6001545f9081906001600160a01b03908116908416036110f25750506001600160701b03828116908416611103565b50506001600160701b038084169083165b8061111683670de0b6b3a7640000613713565b6111209190613730565b9550505050505090565b6001600160a01b0381165f9081526020808052604080832054602283528184205460219093529220545b9193909250565b611163612d6b565b600480546001600160a01b0384166001600160a81b03199091168117600160a01b841515908102919091179092556040805191825260208201929092527f94c9cbe1d9aa7af08484f82ab0179d6db973a391236668c34192d954ff32c06c910160405180910390a15050565b5f805f600a5484106111e857505f915081905080611154565b5f6017816111f787600161374f565b815260208082019290925260409081015f20815160c081018352815480825260018301549482018590526002830154938201849052600383015460ff16151560608301526004830154608083015260059092015460a090910152909790965090945092505050565b60075460ff1661128257604051633017f16560e11b815260040160405180910390fd5b61128b33612d97565b335f90815260146020526040902054801561169157335f908152601260205260408120546112b99042613762565b90505f6112c8610e1083613730565b90505f601e8083106112dc575f91506112e9565b6112e68382613762565b91505b5f6112f2610f80565b90505f670de0b6b3a76400006113088389613713565b6113129190613730565b90505f606461132283600a613713565b61132c9190613730565b9050803410156113835760405162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e74205061792d746f2d436c61696d2046656500000060448201526064015b60405180910390fd5b5f61138f600283613730565b90505f61139c8284613762565b6002546040519192506001600160a01b03169083156108fc029084905f818181858888f193505050501580156113d4573d5f803e3d5ffd5b506003546040516001600160a01b039091169082156108fc029083905f818181858888f1935050505015801561140c573d5f803e3d5ffd5b50604080518481526020810184905290810182905233907fb3aa4172b89ad35b55207df3917001046668de5f42c54b312c9e0b02e2968c8b9060600160405180910390a2335f90815260146020908152604080832083905560129091528120429055606461147a898d613713565b6114849190613730565b90505f611491828d613762565b90505f6103e86114a28e604b613713565b6114ac9190613730565b90505f6103e86114bd8f6019613713565b6114c79190613730565b6001546040516340c10f1960e01b8152336004820152602481018690529192506001600160a01b0316906340c10f19906044015f604051808303815f87803b158015611511575f80fd5b505af1158015611523573d5f803e3d5ffd5b5050335f908152601f60205260409020546001600160a01b031691505080156115d7576001546040516340c10f1960e01b8152306004820152602481018590526001600160a01b03909116906340c10f19906044015f604051808303815f87803b15801561158f575f80fd5b505af11580156115a1573d5f803e3d5ffd5b505050506001600160a01b0381165f90815260216020526040812080548492906115cc90849061374f565b9091555061164d9050565b6001546001600160a01b03166340c10f19306115f3858761374f565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015611636575f80fd5b505af1158015611648573d5f803e3d5ffd5b505050505b60405184815233907ffc30cddea38e2bf4d6ea7d3f9ed3b6ad7f176419f4963bd81318067a4aee73fe9060200160405180910390a250505050505050505050505050505b50565b60235460ff166003146116b95760405162461bcd60e51b815260040161137a90613775565b335f908152601b602052604090205460ff166116e85760405163350ac7f360e01b815260040160405180910390fd5b5f83815260166020908152604080832081516101008101835281548082526001830154948201949094526002820154928101929092526003810154606083015260048101546080830152600581015460a0830152600681015460c08301526007015460ff16151560e082015291036117735760405163990e7a0b60e01b815260040160405180910390fd5b60015460c08201516040516323b872dd60e01b815233600482015230602482015260448101919091525f916001600160a01b0316906323b872dd906064016020604051808303815f875af11580156117cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117f191906137bf565b9050806118385760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b604482015260640161137a565b60c0820151156118a75760015460c0830151604051630852cd8d60e31b81526001600160a01b03909216916342966c68916118799160040190815260200190565b5f604051808303815f87803b158015611890575f80fd5b505af11580156118a2573d5f803e3d5ffd5b505050505b6118b8338686868660c00151612e43565b5050505050565b600f54600d545f9190421180156118d75750600e5415155b15611935575f600d54426118eb9190613762565b90505f6118f66126b6565b90505f6119038284613713565b600e5490915061191b670de0b6b3a764000083613713565b6119259190613730565b61192f908561374f565b93505050505b6001600160a01b0383165f90815260156020526040902054670de0b6b3a7640000906119619083613762565b6001600160a01b0385165f908152601360205260409020546119839190613713565b61198d9190613730565b6001600160a01b0384165f908152601460205260409020546119af919061374f565b9392505050565b335f908152601b602052604090205460ff16156119e65760405163120d9bd960e11b815260040160405180910390fd5b60235460ff16611a2c5760405162461bcd60e51b815260206004820152601160248201527014d85b195cc81b9bdd081cdd185c9d1959607a1b604482015260640161137a565b6023545f9060ff16600103611aa857335f9081526025602052604090205460ff16611a995760405162461bcd60e51b815260206004820152601b60248201527f4e6f742057686974656c697374656420666f7220506861736520310000000000604482015260640161137a565b50670de0b6b3a7640000611b34565b60235460ff16600203611aec57335f9081526026602052604090205460ff1615611adc5750681b1ae4d6e2ef500000611b34565b50683635c9adc5dea00000611b34565b506024546001600160a01b03821615801590611b1157506001600160a01b0382163314155b15611b34576064602454605a611b279190613713565b611b319190613730565b90505b80341015611b5557604051636956f2ab60e11b815260040160405180910390fd5b5f6001600160a01b03831615801590611b7757506001600160a01b0383163314155b8015611b88575060235460ff166003145b90508015611d63575f6064602454600a611ba29190613713565b611bac9190613730565b90505f611bb98234613762565b6040519091506001600160a01b0386169083156108fc029084905f818181858888f19350505050158015611bef573d5f803e3d5ffd5b506001600160a01b0385165f9081526022602052604081208054849290611c1790849061374f565b9091555050335f818152601f6020908152604080832080546001600160a01b03808c166001600160a01b0319928316811790935591855283805291842080546001810182559085529290932090910180549091169092179091556003541615801590611c9457506002546003546001600160a01b03908116911614155b15611d23575f611ca5600283613730565b6002546040519192506001600160a01b03169082156108fc029083905f818181858888f19350505050158015611cdd573d5f803e3d5ffd5b506003546001600160a01b03166108fc611cf78385613762565b6040518115909202915f818181858888f19350505050158015611d1c573d5f803e3d5ffd5b5050611d5c565b6002546040516001600160a01b039091169082156108fc029083905f818181858888f19350505050158015611d5a573d5f803e3d5ffd5b505b5050611e4e565b6003546001600160a01b031615801590611d8e57506002546003546001600160a01b03908116911614155b15611e16575f611d9f600234613730565b6002546040519192506001600160a01b03169082156108fc029083905f818181858888f19350505050158015611dd7573d5f803e3d5ffd5b506003546001600160a01b03166108fc611df18334613762565b6040518115909202915f818181858888f19350505050158015611d5c573d5f803e3d5ffd5b6002546040516001600160a01b03909116903480156108fc02915f818181858888f19350505050158015611e4c573d5f803e3d5ffd5b505b335f908152601b60205260408120805460ff19166001179055600b805491611e7583613679565b9091555050335f8181526012602090815260408083204290557f000000000000000000000000000000000000000000000000000000000000000080845260178352818420825160c0810184528154815260018083015482870190815260028401548387015260038085015460ff16151560608501526004808601546080860190815260059687015460a087019081528c8c52601a909a52888b20978855855194880194909455915190860155840187905551918301919091559251600682015590519193909290917febe01df6d96920585e2744874d810e5560bc050e9ff947aa34f10422a33cbc279190a25050505050565b611f70612d6b565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b611f9a612d6b565b6001546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015611fe0573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061200491906137da565b90505f81116120405760405162461bcd60e51b81526020600482015260086024820152674e6f20504554524f60c01b604482015260640161137a565b60015460025460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810184905291169063a9059cbb906044016020604051808303815f875af1158015612092573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120b691906137bf565b5050565b6120c2612d6b565b6120cb5f6130fb565b565b335f90815260216020526040902054806121205760405162461bcd60e51b81526020600482015260146024820152734e6f20726566657272616c206561726e696e677360601b604482015260640161137a565b335f818152602160205260408082209190915560015490516340c10f1960e01b81526004810192909252602482018390526001600160a01b0316906340c10f19906044015f604051808303815f87803b15801561217b575f80fd5b505af115801561218d573d5f803e3d5ffd5b50506040518381523392507f5be4d22009fea85381595ed91090bc5c0bc92a93fe07ed7472c5888eb1993f83915060200160405180910390a250565b6121d1612d6b565b600555565b60235460ff166003146121fb5760405162461bcd60e51b815260040161137a90613775565b335f908152601c602052604090205460ff161561222b57604051639d38dc2760e01b815260040160405180910390fd5b335f908152601b602052604090205460ff1661225a5760405163350ac7f360e01b815260040160405180910390fd5b335f818152601c60205260408120805460ff191660011790556120b691907f00000000000000000000000000000000000000000000000000000000000000009085908590612e43565b6122ab612d6b565b5f5b81811015610f7b57600160255f8585858181106122cc576122cc613651565b90506020020160208101906122e19190613470565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790558061231281613679565b9150506122ad565b612322612d6b565b6040518060c001604052808681526020018581526020018481526020015f151581526020018381526020018281525060175f600a5f815461236290613679565b9182905550815260208082019290925260409081015f208351815583830151600182015583820151600282015560608085015160038301805460ff19169115159190911790556080850151600483015560a090940151600590910155600a54815190815291820186905281018790527f47d717b6b55d68dba6b9044d2f7a4eac7b376a5ce11ed5de835b8c83c829f354910160405180910390a15050505050565b61240b612d6b565b6023805460ff191660ff83169081179091556040519081527fa6dcc92f45df25789d5639b7a0c97ba1edf3bb1c0b5dd3376fd96a0db87c46429060200160405180910390a150565b335f908152601d60209081526040808320858452825280832084845290915290205460ff1661249557604051635522b5a360e01b815260040160405180910390fd5b335f818152601a60209081526040808320601e835281842087855283528184208685528352818420548085526016845293829020825161010081018452815481526001820154948101949094526002810154928401929092526003820154606084015260048201546080840152600582015460a0840152600682015460c084015260079091015460ff16151560e08301529261253090612d97565b8060800151600e541061255d578060800151600e5f8282546125529190613762565b909155506125629050565b5f600e555b6080810151335f90815260136020526040902054106125a9576080810151335f908152601360205260408120805490919061259e908490613762565b909155506125b99050565b335f908152601360205260408120555b8060a001518360040154106125ea578060a00151836004015f8282546125df9190613762565b909155506125f19050565b5f60048401555b335f818152601d6020908152604080832089845282528083208884528252808320805460ff19169055928252601e8152828220888352815282822087835290529081205560028301541561265657600283018054905f612650836137f1565b91905055505b335f818152601360209081526040808320546014909252918290205491517fe331ada0d0e61e9a4196bf4994f2519193d70a601daff346c4276d591664da9a926126a7928252602082015260400190565b60405180910390a25050505050565b6007545f9060ff166126c757505f90565b5f600654426126d69190613762565b90505f6126e66207e90083613730565b905060408111156126f9575f9250505090565b6739d2f941e420aaaa901c92915050565b60208052815f5260405f208181548110612722575f80fd5b5f918252602090912001546001600160a01b03169150829050565b612745612d6b565b6001600160a01b03811661276e57604051631e4fbdf760e01b81525f600482015260240161137a565b611691816130fb565b61277f612d6b565b47806127b65760405162461bcd60e51b815260206004820152600660248201526527379026a7a760d11b604482015260640161137a565b6002546040516001600160a01b039091169082156108fc029083905f818181858888f193505050501580156120b6573d5f803e3d5ffd5b60235460ff166003146128555760405162461bcd60e51b815260206004820152602a60248201527f47616d6520686173206e6f7420737461727465642079657420285570677261646044820152696573204c6f636b65642960b01b606482015260840161137a565b335f908152601b602052604090205460ff166128845760405163350ac7f360e01b815260040160405180910390fd5b601054335f908152601160205260409020546128a0919061374f565b4210156128ef5760405162461bcd60e51b815260206004820152601d60248201527f436f6f6c646f776e206163746976653a20506c6561736520776169742e000000604482015260640161137a565b335f908152601a60205260408120805490919061290d90600161374f565b9050600a5481111561293257604051633196792f60e11b815260040160405180910390fd5b5f818152601760209081526040808320815160c08101835281548152600180830154948201949094526002820154818401819052600383015460ff1615156060830152600480840154608084015260059093015460a0830152935492516323b872dd60e01b8152339281019290925230602483015260448201939093529192916001600160a01b03909116906323b872dd906064016020604051808303815f875af11580156129e3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a0791906137bf565b905080612a4e5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b604482015260640161137a565b604082015115612abd576001546040808401519051630852cd8d60e31b81526001600160a01b03909216916342966c6891612a8f9160040190815260200190565b5f604051808303815f87803b158015612aa6575f80fd5b505af1158015612ab8573d5f803e3d5ffd5b505050505b828455815160018501556020808301805160038701556080840151600587015560a08401516006870155335f8181526011845260409081902042905585519251815188815294850193909352830191909152907f1957c3ddde972a0f75f4e54bddd65ada5f0810c35dee609b075fc2d92ec399a99060600160405180910390a250505050565b612b4b612d6b565b7f00000000000000000000000000000000000000000000000000000000000000005f908152601760209081526040808320815160c08101835281548152600182015493810193909352600281015491830191909152600381015460ff1615156060830152600481015460808301526005015460a0820152905b82811015612cde575f848483818110612bdf57612bdf613651565b9050602002016020810190612bf49190613470565b6001600160a01b0381165f908152601b602052604090205490915060ff16612ccb576001600160a01b0381165f908152601b60205260408120805460ff19166001179055600b805491612c4683613679565b9091555050600f546001600160a01b0382165f9081526015602090815260408083209390935560128152828220429055601a81529181207f000000000000000000000000000000000000000000000000000000000000000081558551600182015591850151600383015560048201556080840151600582015560a08401516006909101555b5080612cd681613679565b915050612bc4565b506040518281527fcc3ea4ccc3876221c238f6e5d8f2ae37a892fdafcf77b9889ebe193958128efd906020015b60405180910390a1505050565b612d20612d6b565b612d2b83838361314a565b600954604080519182526020820185905281018290527f87c2af2747de4bc7935697bdac2c724ce1a28877f21caba0bee6acf1f141643290606001612d0b565b5f546001600160a01b031633146120cb5760405163118cdaa760e01b815233600482015260240161137a565b612d9f6131f2565b6001600160a01b0381165f90815260156020526040902054600f54670de0b6b3a764000091612dcd91613762565b6001600160a01b0383165f90815260136020526040902054612def9190613713565b612df99190613730565b6001600160a01b0382165f9081526014602052604081208054909190612e2090849061374f565b9091555050600f546001600160a01b039091165f90815260156020526040902055565b5f84815260166020908152604080832081516101008101835281548152600182015481850152600282015481840152600382015460608201526004820154608082015260058083015460a083015260068084015460c084015260079093015460ff16151560e08301526001600160a01b038b168652601a9094529190932091820154928201549092612edb9189918891889190613273565b15612ef957604051631f9aa14f60e11b815260040160405180910390fd5b8060010154816002015410612f2157604051636d6cfd7d60e11b815260040160405180910390fd5b80600301548260a001518260040154612f3a919061374f565b1115612f5957604051630f576a4f60e41b815260040160405180910390fd5b8160a00151816004015f828254612f70919061374f565b909155505060088054905f612f8483613679565b9091555050604080830186905260608301859052600880546020808601919091526001600160a01b038a165f818152601d83528481208a825283528481208982528352848120805460ff19166001179055818152601e83528481208a8252835284812089825283528481208b905592549083526018909152919020613008916132c9565b506008545f90815260196020908152604080832085518155918501516001830155840151600280830191909155606085015160038301556080850151600483015560a0850151600583015560c0850151600683015560e08501516007909201805460ff191692151592909217909155820180549161308583613679565b91905055506130988783608001516132d4565b60085460408051858152602081019290925281018690526060810185905286906001600160a01b0389169081907fbb355279b9cc8558bd03d4b1dbb0007f6e6dc26a512f267d829ada5da913cee79060800160405180910390a450505050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60098054905f61315983613679565b909155505060408051610100810182526009548082525f1960208084018281528486018381526060860193845260808601998a5260a0860198895260c086019788525f60e087018181529581526016909352959091209351845551600184015592516002830155915160038201559351600485015591516005840155516006830155516007909101805460ff1916911515919091179055565b600d5442116131fd57565b600e545f0361320c5742600d55565b5f600d544261321b9190613762565b90505f6132266126b6565b90505f6132338284613713565b600e5490915061324b670de0b6b3a764000083613713565b6132559190613730565b600f5f828254613265919061374f565b909155505042600d55505050565b5f82851015806132835750818410155b15613290575060016132c0565b506001600160a01b0385165f908152601d60209081526040808320878452825280832086845290915290205460ff165b95945050505050565b5f6119af83836133e0565b60075460ff1661332f576007805460ff19166001179055426006819055600d556040517fdaae9aa758637a0d349f036f099afd70aa88d8ac63fce096321de512ffebc16c906133269043815260200190565b60405180910390a15b61333882612d97565b80600e5f828254613349919061374f565b90915550506001600160a01b0382165f908152601360205260408120805483929061337590849061374f565b90915550506001600160a01b0382165f818152601360209081526040808320546014909252918290205491517fa051d58ced8df58040b29d2c939da70a826ae40290f77c9a66b38b8b85315f65926133d4928252602082015260400190565b60405180910390a25050565b6318fb58646004525f8281526024812068fbb67fda52d4bfb8bf830361340d5763f5a267f15f526004601cfd5b8261341f5768fbb67fda52d4bfb8bf92505b80602052825f5260405f20805461345457811954805f52848160011c8401558060011c60010182556002810183195550600192505b505092915050565b6001600160a01b0381168114611691575f80fd5b5f60208284031215613480575f80fd5b81356119af8161345c565b5f6020828403121561349b575f80fd5b5035919050565b5f805f606084860312156134b4575f80fd5b83356134bf8161345c565b95602085013595506040909401359392505050565b5f80602083850312156134e5575f80fd5b823567ffffffffffffffff808211156134fc575f80fd5b818501915085601f83011261350f575f80fd5b81358181111561351d575f80fd5b8660208260051b8501011115613531575f80fd5b60209290920196919550909350505050565b8015158114611691575f80fd5b5f8060408385031215613561575f80fd5b823561356c8161345c565b9150602083013561357c81613543565b809150509250929050565b5f805f60608486031215613599575f80fd5b505081359360208301359350604090920135919050565b5f80604083850312156135c1575f80fd5b50508035926020909101359150565b5f805f805f60a086880312156135e4575f80fd5b505083359560208501359550604085013594606081013594506080013592509050565b5f60208284031215613617575f80fd5b813560ff811681146119af575f80fd5b5f8060408385031215613638575f80fd5b82356136438161345c565b946020939093013593505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f6001820161368a5761368a613665565b5060010190565b80516001600160701b03811681146136a7575f80fd5b919050565b5f805f606084860312156136be575f80fd5b6136c784613691565b92506136d560208501613691565b9150604084015163ffffffff811681146136ed575f80fd5b809150509250925092565b5f60208284031215613708575f80fd5b81516119af8161345c565b808202811582820484141761372a5761372a613665565b92915050565b5f8261374a57634e487b7160e01b5f52601260045260245ffd5b500490565b8082018082111561372a5761372a613665565b8181038181111561372a5761372a613665565b6020808252602a908201527f47616d6520686173206e6f7420737461727465642079657420284472696c6c696040820152696e67204c6f636b65642960b01b606082015260800190565b5f602082840312156137cf575f80fd5b81516119af81613543565b5f602082840312156137ea575f80fd5b5051919050565b5f816137ff576137ff613665565b505f19019056fea26469706673582212206d951f7ac4f0d052329a23db1492f6fb45a120ca79422b48a36a82b67b932ee664736f6c63430008140033

Deployed Bytecode

0x608060405260043610610416575f3560e01c8063787a08a611610220578063bb485bbd11610129578063e2b15d8c116100b3578063f37785a211610078578063f37785a214610e48578063f537967114610e5c578063f60cdcf614610e7b578063f6934a9f14610e90578063f86f25ee14610ebb575f80fd5b8063e2b15d8c14610d9b578063e92820e614610dda578063efc5119414610df9578063f2fde38b14610e15578063f322b65f14610e34575f80fd5b8063c7fda104116100f9578063c7fda10414610cdb578063cc53b27614610d3a578063d013eb0a14610d68578063d09d4abd14610a66578063dff657c314610d87575f80fd5b8063bb485bbd14610c5a578063bbb1239214610c6f578063c03afb5914610c8e578063c2df398214610cad575f80fd5b80639231cf74116101aa578063a9bc82491161017a578063a9bc824914610b3d578063ad154c6814610b52578063b3c0d5e414610b85578063b55de1a814610ba4578063b77cf9c614610c2f575f80fd5b80639231cf7414610abc57806394fc19e414610ad15780639ca423b314610aea578063a269435d14610b1e575f80fd5b806384caff83116101f057806384caff8314610a3257806384db13d214610a4757806386b3cd2614610a665780638da5cb5b14610a815780638ea5220f14610a9d575f80fd5b8063787a08a6146109d557806378e97925146109ea578063808a5457146109ff57806384ae48b514610a1e575f80fd5b8063372500ab116103225780634fe6f7a9116102ac5780635f7f44e11161027c5780635f7f44e11461094b5780636a8fa04114610979578063715018a61461098d57806375ddec4b146109a157806375f0a874146109b6575f80fd5b80634fe6f7a9146108d157806356fbab7a146109045780635a5ccef0146109175780635d098b381461092c575f80fd5b806341f09ea6116102f257806341f09ea61461082d578063426222d5146108485780634487872414610873578063476e2e66146108935780634df9d6ba146108b2575f80fd5b8063372500ab146107b95780633adde9c1146107c15780633d5e1f1e146107d757806340f5da9e14610802575f80fd5b80631c52ef27116103a3578063234f3f1b11610373578063234f3f1b14610710578063238760641461073b5780632aabc69e1461075a5780633041a5201461077957806333437f64146107a4575f80fd5b80631c52ef27146106915780631dbd6bc8146106a65780631ea4bab7146106ba57806321bade13146106d6575f80fd5b806307604998116103e9578063076049981461053e57806312544abc14610588578063136d5072146105a757806316ccbed2146105d25780631913785614610610575f80fd5b80630504023b1461041a57806305244d771461043b578063055ad42e146104dc57806306bbf22814610507575b5f80fd5b348015610425575f80fd5b50610439610434366004613470565b610eda565b005b348015610446575f80fd5b5061049a61045536600461348b565b60166020525f90815260409020805460018201546002830154600384015460048501546005860154600687015460079097015495969495939492939192909160ff1688565b604080519889526020890197909752958701949094526060860192909252608085015260a084015260c0830152151560e0820152610100015b60405180910390f35b3480156104e7575f80fd5b506023546104f59060ff1681565b60405160ff90911681526020016104d3565b348015610512575f80fd5b50600154610526906001600160a01b031681565b6040516001600160a01b0390911681526020016104d3565b348015610549575f80fd5b5061057a6105583660046134a2565b601e60209081525f938452604080852082529284528284209052825290205481565b6040519081526020016104d3565b348015610593575f80fd5b506104396105a23660046134d4565b610f04565b3480156105b2575f80fd5b5061057a6105c1366004613470565b60186020525f908152604090205481565b3480156105dd575f80fd5b506106006105ec366004613470565b601b6020525f908152604090205460ff1681565b60405190151581526020016104d3565b34801561061b575f80fd5b5061066261062a36600461348b565b60176020525f908152604090208054600182015460028301546003840154600485015460059095015493949293919260ff9091169186565b6040805196875260208701959095529385019290925215156060840152608083015260a082015260c0016104d3565b34801561069c575f80fd5b5061057a600f5481565b3480156106b1575f80fd5b5061057a610f80565b3480156106c5575f80fd5b5061057a683635c9adc5dea0000081565b3480156106e1575f80fd5b506106f56106f0366004613470565b61112a565b604080519384526020840192909252908201526060016104d3565b34801561071b575f80fd5b5061057a61072a366004613470565b60136020525f908152604090205481565b348015610746575f80fd5b50610439610755366004613550565b61115b565b348015610765575f80fd5b506106f561077436600461348b565b6111cf565b348015610784575f80fd5b5061057a610793366004613470565b60216020525f908152604090205481565b3480156107af575f80fd5b5061057a60095481565b61043961125f565b3480156107cc575f80fd5b5061057a6207e90081565b3480156107e2575f80fd5b5061057a6107f1366004613470565b60116020525f908152604090205481565b34801561080d575f80fd5b5061057a61081c366004613470565b60146020525f908152604090205481565b348015610838575f80fd5b5061057a6739d2f941e420aaaa81565b348015610853575f80fd5b5061057a610862366004613470565b60156020525f908152604090205481565b34801561087e575f80fd5b5060045461060090600160a01b900460ff1681565b34801561089e575f80fd5b506104396108ad366004613587565b611694565b3480156108bd575f80fd5b5061057a6108cc366004613470565b6118bf565b3480156108dc575f80fd5b5061057a7f000000000000000000000000000000000000000000000000000000000000000181565b610439610912366004613470565b6119b6565b348015610922575f80fd5b5061057a600e5481565b348015610937575f80fd5b50610439610946366004613470565b611f68565b348015610956575f80fd5b50610600610965366004613470565b601c6020525f908152604090205460ff1681565b348015610984575f80fd5b50610439611f92565b348015610998575f80fd5b506104396120ba565b3480156109ac575f80fd5b5061057a60245481565b3480156109c1575f80fd5b50600354610526906001600160a01b031681565b3480156109e0575f80fd5b5061057a60105481565b3480156109f5575f80fd5b5061057a60065481565b348015610a0a575f80fd5b50600454610526906001600160a01b031681565b348015610a29575f80fd5b506104396120cd565b348015610a3d575f80fd5b5061057a60055481565b348015610a52575f80fd5b50610439610a6136600461348b565b6121c9565b348015610a71575f80fd5b5061057a670de0b6b3a764000081565b348015610a8c575f80fd5b505f546001600160a01b0316610526565b348015610aa8575f80fd5b50600254610526906001600160a01b031681565b348015610ac7575f80fd5b5061057a600d5481565b348015610adc575f80fd5b506007546106009060ff1681565b348015610af5575f80fd5b50610526610b04366004613470565b601f6020525f90815260409020546001600160a01b031681565b348015610b29575f80fd5b50610439610b383660046135b0565b6121d6565b348015610b48575f80fd5b5061057a600c5481565b348015610b5d575f80fd5b5061057a7f000000000000000000000000000000000000000000000000000000000000000181565b348015610b90575f80fd5b50610439610b9f3660046134d4565b6122a3565b348015610baf575f80fd5b50610bfa610bbe366004613470565b601a6020525f90815260409020805460018201546002830154600384015460048501546005860154600690960154949593949293919290919087565b604080519788526020880196909652948601939093526060850191909152608084015260a083015260c082015260e0016104d3565b348015610c3a575f80fd5b5061057a610c49366004613470565b60126020525f908152604090205481565b348015610c65575f80fd5b5061057a600a5481565b348015610c7a575f80fd5b50610439610c893660046135d0565b61231a565b348015610c99575f80fd5b50610439610ca8366004613607565b612403565b348015610cb8575f80fd5b50610600610cc7366004613470565b60256020525f908152604090205460ff1681565b348015610ce6575f80fd5b5061049a610cf536600461348b565b60196020525f90815260409020805460018201546002830154600384015460048501546005860154600687015460079097015495969495939492939192909160ff1688565b348015610d45575f80fd5b50610600610d54366004613470565b60266020525f908152604090205460ff1681565b348015610d73575f80fd5b50610439610d823660046135b0565b612453565b348015610d92575f80fd5b5061057a6126b6565b348015610da6575f80fd5b50610600610db53660046134a2565b601d60209081525f938452604080852082529284528284209052825290205460ff1681565b348015610de5575f80fd5b50610526610df4366004613627565b61270a565b348015610e04575f80fd5b5061057a681b1ae4d6e2ef50000081565b348015610e20575f80fd5b50610439610e2f366004613470565b61273d565b348015610e3f575f80fd5b50610439612777565b348015610e53575f80fd5b506104396127ed565b348015610e67575f80fd5b50610439610e763660046134d4565b612b43565b348015610e86575f80fd5b5061057a600b5481565b348015610e9b575f80fd5b5061057a610eaa366004613470565b60226020525f908152604090205481565b348015610ec6575f80fd5b50610439610ed5366004613587565b612d18565b610ee2612d6b565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b610f0c612d6b565b5f5b81811015610f7b57600160265f858585818110610f2d57610f2d613651565b9050602002016020810190610f429190613470565b6001600160a01b0316815260208101919091526040015f20805460ff191691151591909117905580610f7381613679565b915050610f0e565b505050565b6004545f90600160a01b900460ff161580610fa457506004546001600160a01b0316155b15610fb0575060055490565b6004805460408051630240bc6b60e21b815290515f9384936001600160a01b031692630902f1ac92818301926060928290030181865afa158015610ff6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061101a91906136ac565b50915091505f60045f9054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015611070573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061109491906136f8565b90506001600160701b03831615806110b357506001600160701b038216155b156110c357600554935050505090565b6001545f9081906001600160a01b03908116908416036110f25750506001600160701b03828116908416611103565b50506001600160701b038084169083165b8061111683670de0b6b3a7640000613713565b6111209190613730565b9550505050505090565b6001600160a01b0381165f9081526020808052604080832054602283528184205460219093529220545b9193909250565b611163612d6b565b600480546001600160a01b0384166001600160a81b03199091168117600160a01b841515908102919091179092556040805191825260208201929092527f94c9cbe1d9aa7af08484f82ab0179d6db973a391236668c34192d954ff32c06c910160405180910390a15050565b5f805f600a5484106111e857505f915081905080611154565b5f6017816111f787600161374f565b815260208082019290925260409081015f20815160c081018352815480825260018301549482018590526002830154938201849052600383015460ff16151560608301526004830154608083015260059092015460a090910152909790965090945092505050565b60075460ff1661128257604051633017f16560e11b815260040160405180910390fd5b61128b33612d97565b335f90815260146020526040902054801561169157335f908152601260205260408120546112b99042613762565b90505f6112c8610e1083613730565b90505f601e8083106112dc575f91506112e9565b6112e68382613762565b91505b5f6112f2610f80565b90505f670de0b6b3a76400006113088389613713565b6113129190613730565b90505f606461132283600a613713565b61132c9190613730565b9050803410156113835760405162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e74205061792d746f2d436c61696d2046656500000060448201526064015b60405180910390fd5b5f61138f600283613730565b90505f61139c8284613762565b6002546040519192506001600160a01b03169083156108fc029084905f818181858888f193505050501580156113d4573d5f803e3d5ffd5b506003546040516001600160a01b039091169082156108fc029083905f818181858888f1935050505015801561140c573d5f803e3d5ffd5b50604080518481526020810184905290810182905233907fb3aa4172b89ad35b55207df3917001046668de5f42c54b312c9e0b02e2968c8b9060600160405180910390a2335f90815260146020908152604080832083905560129091528120429055606461147a898d613713565b6114849190613730565b90505f611491828d613762565b90505f6103e86114a28e604b613713565b6114ac9190613730565b90505f6103e86114bd8f6019613713565b6114c79190613730565b6001546040516340c10f1960e01b8152336004820152602481018690529192506001600160a01b0316906340c10f19906044015f604051808303815f87803b158015611511575f80fd5b505af1158015611523573d5f803e3d5ffd5b5050335f908152601f60205260409020546001600160a01b031691505080156115d7576001546040516340c10f1960e01b8152306004820152602481018590526001600160a01b03909116906340c10f19906044015f604051808303815f87803b15801561158f575f80fd5b505af11580156115a1573d5f803e3d5ffd5b505050506001600160a01b0381165f90815260216020526040812080548492906115cc90849061374f565b9091555061164d9050565b6001546001600160a01b03166340c10f19306115f3858761374f565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015611636575f80fd5b505af1158015611648573d5f803e3d5ffd5b505050505b60405184815233907ffc30cddea38e2bf4d6ea7d3f9ed3b6ad7f176419f4963bd81318067a4aee73fe9060200160405180910390a250505050505050505050505050505b50565b60235460ff166003146116b95760405162461bcd60e51b815260040161137a90613775565b335f908152601b602052604090205460ff166116e85760405163350ac7f360e01b815260040160405180910390fd5b5f83815260166020908152604080832081516101008101835281548082526001830154948201949094526002820154928101929092526003810154606083015260048101546080830152600581015460a0830152600681015460c08301526007015460ff16151560e082015291036117735760405163990e7a0b60e01b815260040160405180910390fd5b60015460c08201516040516323b872dd60e01b815233600482015230602482015260448101919091525f916001600160a01b0316906323b872dd906064016020604051808303815f875af11580156117cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117f191906137bf565b9050806118385760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b604482015260640161137a565b60c0820151156118a75760015460c0830151604051630852cd8d60e31b81526001600160a01b03909216916342966c68916118799160040190815260200190565b5f604051808303815f87803b158015611890575f80fd5b505af11580156118a2573d5f803e3d5ffd5b505050505b6118b8338686868660c00151612e43565b5050505050565b600f54600d545f9190421180156118d75750600e5415155b15611935575f600d54426118eb9190613762565b90505f6118f66126b6565b90505f6119038284613713565b600e5490915061191b670de0b6b3a764000083613713565b6119259190613730565b61192f908561374f565b93505050505b6001600160a01b0383165f90815260156020526040902054670de0b6b3a7640000906119619083613762565b6001600160a01b0385165f908152601360205260409020546119839190613713565b61198d9190613730565b6001600160a01b0384165f908152601460205260409020546119af919061374f565b9392505050565b335f908152601b602052604090205460ff16156119e65760405163120d9bd960e11b815260040160405180910390fd5b60235460ff16611a2c5760405162461bcd60e51b815260206004820152601160248201527014d85b195cc81b9bdd081cdd185c9d1959607a1b604482015260640161137a565b6023545f9060ff16600103611aa857335f9081526025602052604090205460ff16611a995760405162461bcd60e51b815260206004820152601b60248201527f4e6f742057686974656c697374656420666f7220506861736520310000000000604482015260640161137a565b50670de0b6b3a7640000611b34565b60235460ff16600203611aec57335f9081526026602052604090205460ff1615611adc5750681b1ae4d6e2ef500000611b34565b50683635c9adc5dea00000611b34565b506024546001600160a01b03821615801590611b1157506001600160a01b0382163314155b15611b34576064602454605a611b279190613713565b611b319190613730565b90505b80341015611b5557604051636956f2ab60e11b815260040160405180910390fd5b5f6001600160a01b03831615801590611b7757506001600160a01b0383163314155b8015611b88575060235460ff166003145b90508015611d63575f6064602454600a611ba29190613713565b611bac9190613730565b90505f611bb98234613762565b6040519091506001600160a01b0386169083156108fc029084905f818181858888f19350505050158015611bef573d5f803e3d5ffd5b506001600160a01b0385165f9081526022602052604081208054849290611c1790849061374f565b9091555050335f818152601f6020908152604080832080546001600160a01b03808c166001600160a01b0319928316811790935591855283805291842080546001810182559085529290932090910180549091169092179091556003541615801590611c9457506002546003546001600160a01b03908116911614155b15611d23575f611ca5600283613730565b6002546040519192506001600160a01b03169082156108fc029083905f818181858888f19350505050158015611cdd573d5f803e3d5ffd5b506003546001600160a01b03166108fc611cf78385613762565b6040518115909202915f818181858888f19350505050158015611d1c573d5f803e3d5ffd5b5050611d5c565b6002546040516001600160a01b039091169082156108fc029083905f818181858888f19350505050158015611d5a573d5f803e3d5ffd5b505b5050611e4e565b6003546001600160a01b031615801590611d8e57506002546003546001600160a01b03908116911614155b15611e16575f611d9f600234613730565b6002546040519192506001600160a01b03169082156108fc029083905f818181858888f19350505050158015611dd7573d5f803e3d5ffd5b506003546001600160a01b03166108fc611df18334613762565b6040518115909202915f818181858888f19350505050158015611d5c573d5f803e3d5ffd5b6002546040516001600160a01b03909116903480156108fc02915f818181858888f19350505050158015611e4c573d5f803e3d5ffd5b505b335f908152601b60205260408120805460ff19166001179055600b805491611e7583613679565b9091555050335f8181526012602090815260408083204290557f000000000000000000000000000000000000000000000000000000000000000180845260178352818420825160c0810184528154815260018083015482870190815260028401548387015260038085015460ff16151560608501526004808601546080860190815260059687015460a087019081528c8c52601a909a52888b20978855855194880194909455915190860155840187905551918301919091559251600682015590519193909290917febe01df6d96920585e2744874d810e5560bc050e9ff947aa34f10422a33cbc279190a25050505050565b611f70612d6b565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b611f9a612d6b565b6001546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015611fe0573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061200491906137da565b90505f81116120405760405162461bcd60e51b81526020600482015260086024820152674e6f20504554524f60c01b604482015260640161137a565b60015460025460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810184905291169063a9059cbb906044016020604051808303815f875af1158015612092573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120b691906137bf565b5050565b6120c2612d6b565b6120cb5f6130fb565b565b335f90815260216020526040902054806121205760405162461bcd60e51b81526020600482015260146024820152734e6f20726566657272616c206561726e696e677360601b604482015260640161137a565b335f818152602160205260408082209190915560015490516340c10f1960e01b81526004810192909252602482018390526001600160a01b0316906340c10f19906044015f604051808303815f87803b15801561217b575f80fd5b505af115801561218d573d5f803e3d5ffd5b50506040518381523392507f5be4d22009fea85381595ed91090bc5c0bc92a93fe07ed7472c5888eb1993f83915060200160405180910390a250565b6121d1612d6b565b600555565b60235460ff166003146121fb5760405162461bcd60e51b815260040161137a90613775565b335f908152601c602052604090205460ff161561222b57604051639d38dc2760e01b815260040160405180910390fd5b335f908152601b602052604090205460ff1661225a5760405163350ac7f360e01b815260040160405180910390fd5b335f818152601c60205260408120805460ff191660011790556120b691907f00000000000000000000000000000000000000000000000000000000000000019085908590612e43565b6122ab612d6b565b5f5b81811015610f7b57600160255f8585858181106122cc576122cc613651565b90506020020160208101906122e19190613470565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790558061231281613679565b9150506122ad565b612322612d6b565b6040518060c001604052808681526020018581526020018481526020015f151581526020018381526020018281525060175f600a5f815461236290613679565b9182905550815260208082019290925260409081015f208351815583830151600182015583820151600282015560608085015160038301805460ff19169115159190911790556080850151600483015560a090940151600590910155600a54815190815291820186905281018790527f47d717b6b55d68dba6b9044d2f7a4eac7b376a5ce11ed5de835b8c83c829f354910160405180910390a15050505050565b61240b612d6b565b6023805460ff191660ff83169081179091556040519081527fa6dcc92f45df25789d5639b7a0c97ba1edf3bb1c0b5dd3376fd96a0db87c46429060200160405180910390a150565b335f908152601d60209081526040808320858452825280832084845290915290205460ff1661249557604051635522b5a360e01b815260040160405180910390fd5b335f818152601a60209081526040808320601e835281842087855283528184208685528352818420548085526016845293829020825161010081018452815481526001820154948101949094526002810154928401929092526003820154606084015260048201546080840152600582015460a0840152600682015460c084015260079091015460ff16151560e08301529261253090612d97565b8060800151600e541061255d578060800151600e5f8282546125529190613762565b909155506125629050565b5f600e555b6080810151335f90815260136020526040902054106125a9576080810151335f908152601360205260408120805490919061259e908490613762565b909155506125b99050565b335f908152601360205260408120555b8060a001518360040154106125ea578060a00151836004015f8282546125df9190613762565b909155506125f19050565b5f60048401555b335f818152601d6020908152604080832089845282528083208884528252808320805460ff19169055928252601e8152828220888352815282822087835290529081205560028301541561265657600283018054905f612650836137f1565b91905055505b335f818152601360209081526040808320546014909252918290205491517fe331ada0d0e61e9a4196bf4994f2519193d70a601daff346c4276d591664da9a926126a7928252602082015260400190565b60405180910390a25050505050565b6007545f9060ff166126c757505f90565b5f600654426126d69190613762565b90505f6126e66207e90083613730565b905060408111156126f9575f9250505090565b6739d2f941e420aaaa901c92915050565b60208052815f5260405f208181548110612722575f80fd5b5f918252602090912001546001600160a01b03169150829050565b612745612d6b565b6001600160a01b03811661276e57604051631e4fbdf760e01b81525f600482015260240161137a565b611691816130fb565b61277f612d6b565b47806127b65760405162461bcd60e51b815260206004820152600660248201526527379026a7a760d11b604482015260640161137a565b6002546040516001600160a01b039091169082156108fc029083905f818181858888f193505050501580156120b6573d5f803e3d5ffd5b60235460ff166003146128555760405162461bcd60e51b815260206004820152602a60248201527f47616d6520686173206e6f7420737461727465642079657420285570677261646044820152696573204c6f636b65642960b01b606482015260840161137a565b335f908152601b602052604090205460ff166128845760405163350ac7f360e01b815260040160405180910390fd5b601054335f908152601160205260409020546128a0919061374f565b4210156128ef5760405162461bcd60e51b815260206004820152601d60248201527f436f6f6c646f776e206163746976653a20506c6561736520776169742e000000604482015260640161137a565b335f908152601a60205260408120805490919061290d90600161374f565b9050600a5481111561293257604051633196792f60e11b815260040160405180910390fd5b5f818152601760209081526040808320815160c08101835281548152600180830154948201949094526002820154818401819052600383015460ff1615156060830152600480840154608084015260059093015460a0830152935492516323b872dd60e01b8152339281019290925230602483015260448201939093529192916001600160a01b03909116906323b872dd906064016020604051808303815f875af11580156129e3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a0791906137bf565b905080612a4e5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b604482015260640161137a565b604082015115612abd576001546040808401519051630852cd8d60e31b81526001600160a01b03909216916342966c6891612a8f9160040190815260200190565b5f604051808303815f87803b158015612aa6575f80fd5b505af1158015612ab8573d5f803e3d5ffd5b505050505b828455815160018501556020808301805160038701556080840151600587015560a08401516006870155335f8181526011845260409081902042905585519251815188815294850193909352830191909152907f1957c3ddde972a0f75f4e54bddd65ada5f0810c35dee609b075fc2d92ec399a99060600160405180910390a250505050565b612b4b612d6b565b7f00000000000000000000000000000000000000000000000000000000000000015f908152601760209081526040808320815160c08101835281548152600182015493810193909352600281015491830191909152600381015460ff1615156060830152600481015460808301526005015460a0820152905b82811015612cde575f848483818110612bdf57612bdf613651565b9050602002016020810190612bf49190613470565b6001600160a01b0381165f908152601b602052604090205490915060ff16612ccb576001600160a01b0381165f908152601b60205260408120805460ff19166001179055600b805491612c4683613679565b9091555050600f546001600160a01b0382165f9081526015602090815260408083209390935560128152828220429055601a81529181207f000000000000000000000000000000000000000000000000000000000000000181558551600182015591850151600383015560048201556080840151600582015560a08401516006909101555b5080612cd681613679565b915050612bc4565b506040518281527fcc3ea4ccc3876221c238f6e5d8f2ae37a892fdafcf77b9889ebe193958128efd906020015b60405180910390a1505050565b612d20612d6b565b612d2b83838361314a565b600954604080519182526020820185905281018290527f87c2af2747de4bc7935697bdac2c724ce1a28877f21caba0bee6acf1f141643290606001612d0b565b5f546001600160a01b031633146120cb5760405163118cdaa760e01b815233600482015260240161137a565b612d9f6131f2565b6001600160a01b0381165f90815260156020526040902054600f54670de0b6b3a764000091612dcd91613762565b6001600160a01b0383165f90815260136020526040902054612def9190613713565b612df99190613730565b6001600160a01b0382165f9081526014602052604081208054909190612e2090849061374f565b9091555050600f546001600160a01b039091165f90815260156020526040902055565b5f84815260166020908152604080832081516101008101835281548152600182015481850152600282015481840152600382015460608201526004820154608082015260058083015460a083015260068084015460c084015260079093015460ff16151560e08301526001600160a01b038b168652601a9094529190932091820154928201549092612edb9189918891889190613273565b15612ef957604051631f9aa14f60e11b815260040160405180910390fd5b8060010154816002015410612f2157604051636d6cfd7d60e11b815260040160405180910390fd5b80600301548260a001518260040154612f3a919061374f565b1115612f5957604051630f576a4f60e41b815260040160405180910390fd5b8160a00151816004015f828254612f70919061374f565b909155505060088054905f612f8483613679565b9091555050604080830186905260608301859052600880546020808601919091526001600160a01b038a165f818152601d83528481208a825283528481208982528352848120805460ff19166001179055818152601e83528481208a8252835284812089825283528481208b905592549083526018909152919020613008916132c9565b506008545f90815260196020908152604080832085518155918501516001830155840151600280830191909155606085015160038301556080850151600483015560a0850151600583015560c0850151600683015560e08501516007909201805460ff191692151592909217909155820180549161308583613679565b91905055506130988783608001516132d4565b60085460408051858152602081019290925281018690526060810185905286906001600160a01b0389169081907fbb355279b9cc8558bd03d4b1dbb0007f6e6dc26a512f267d829ada5da913cee79060800160405180910390a450505050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60098054905f61315983613679565b909155505060408051610100810182526009548082525f1960208084018281528486018381526060860193845260808601998a5260a0860198895260c086019788525f60e087018181529581526016909352959091209351845551600184015592516002830155915160038201559351600485015591516005840155516006830155516007909101805460ff1916911515919091179055565b600d5442116131fd57565b600e545f0361320c5742600d55565b5f600d544261321b9190613762565b90505f6132266126b6565b90505f6132338284613713565b600e5490915061324b670de0b6b3a764000083613713565b6132559190613730565b600f5f828254613265919061374f565b909155505042600d55505050565b5f82851015806132835750818410155b15613290575060016132c0565b506001600160a01b0385165f908152601d60209081526040808320878452825280832086845290915290205460ff165b95945050505050565b5f6119af83836133e0565b60075460ff1661332f576007805460ff19166001179055426006819055600d556040517fdaae9aa758637a0d349f036f099afd70aa88d8ac63fce096321de512ffebc16c906133269043815260200190565b60405180910390a15b61333882612d97565b80600e5f828254613349919061374f565b90915550506001600160a01b0382165f908152601360205260408120805483929061337590849061374f565b90915550506001600160a01b0382165f818152601360209081526040808320546014909252918290205491517fa051d58ced8df58040b29d2c939da70a826ae40290f77c9a66b38b8b85315f65926133d4928252602082015260400190565b60405180910390a25050565b6318fb58646004525f8281526024812068fbb67fda52d4bfb8bf830361340d5763f5a267f15f526004601cfd5b8261341f5768fbb67fda52d4bfb8bf92505b80602052825f5260405f20805461345457811954805f52848160011c8401558060011c60010182556002810183195550600192505b505092915050565b6001600160a01b0381168114611691575f80fd5b5f60208284031215613480575f80fd5b81356119af8161345c565b5f6020828403121561349b575f80fd5b5035919050565b5f805f606084860312156134b4575f80fd5b83356134bf8161345c565b95602085013595506040909401359392505050565b5f80602083850312156134e5575f80fd5b823567ffffffffffffffff808211156134fc575f80fd5b818501915085601f83011261350f575f80fd5b81358181111561351d575f80fd5b8660208260051b8501011115613531575f80fd5b60209290920196919550909350505050565b8015158114611691575f80fd5b5f8060408385031215613561575f80fd5b823561356c8161345c565b9150602083013561357c81613543565b809150509250929050565b5f805f60608486031215613599575f80fd5b505081359360208301359350604090920135919050565b5f80604083850312156135c1575f80fd5b50508035926020909101359150565b5f805f805f60a086880312156135e4575f80fd5b505083359560208501359550604085013594606081013594506080013592509050565b5f60208284031215613617575f80fd5b813560ff811681146119af575f80fd5b5f8060408385031215613638575f80fd5b82356136438161345c565b946020939093013593505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f6001820161368a5761368a613665565b5060010190565b80516001600160701b03811681146136a7575f80fd5b919050565b5f805f606084860312156136be575f80fd5b6136c784613691565b92506136d560208501613691565b9150604084015163ffffffff811681146136ed575f80fd5b809150509250925092565b5f60208284031215613708575f80fd5b81516119af8161345c565b808202811582820484141761372a5761372a613665565b92915050565b5f8261374a57634e487b7160e01b5f52601260045260245ffd5b500490565b8082018082111561372a5761372a613665565b8181038181111561372a5761372a613665565b6020808252602a908201527f47616d6520686173206e6f7420737461727465642079657420284472696c6c696040820152696e67204c6f636b65642960b01b606082015260800190565b5f602082840312156137cf575f80fd5b81516119af81613543565b5f602082840312156137ea575f80fd5b5051919050565b5f816137ff576137ff613665565b505f19019056fea26469706673582212206d951f7ac4f0d052329a23db1492f6fb45a120ca79422b48a36a82b67b932ee664736f6c63430008140033

Deployed Bytecode Sourcemap

12204:21820:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33610:91;;;;;;;;;;-1:-1:-1;33610:91:0;;;;;:::i;:::-;;:::i;:::-;;13568:35;;;;;;;;;;-1:-1:-1;13568:35:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;924:25:1;;;980:2;965:18;;958:34;;;;1008:18;;;1001:34;;;;1066:2;1051:18;;1044:34;;;;1109:3;1094:19;;1087:35;1153:3;1138:19;;1131:35;1197:3;1182:19;;1175:35;1254:14;1247:22;1241:3;1226:19;;1219:51;911:3;896:19;13568:35:0;;;;;;;;14421:29;;;;;;;;;;-1:-1:-1;14421:29:0;;;;;;;;;;;1453:4:1;1441:17;;;1423:36;;1411:2;1396:18;14421:29:0;1281:184:1;12304:25:0;;;;;;;;;;-1:-1:-1;12304:25:0;;;;-1:-1:-1;;;;;12304:25:0;;;;;;-1:-1:-1;;;;;1634:32:1;;;1616:51;;1604:2;1589:18;12304:25:0;1470:203:1;14074:87:0;;;;;;;;;;-1:-1:-1;14074:87:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2212:25:1;;;2200:2;2185:18;14074:87:0;2066:177:1;27549:188:0;;;;;;;;;;-1:-1:-1;27549:188:0;;;;;:::i;:::-;;:::i;13665:70::-;;;;;;;;;;-1:-1:-1;13665:70:0;;;;;:::i;:::-;;;;;;;;;;;;;;13850:55;;;;;;;;;;-1:-1:-1;13850:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3033:14:1;;3026:22;3008:41;;2996:2;2981:18;13850:55:0;2868:187:1;13610:42:0;;;;;;;;;;-1:-1:-1;13610:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3341:25:1;;;3397:2;3382:18;;3375:34;;;;3425:18;;;3418:34;;;;3495:14;3488:22;3483:2;3468:18;;3461:50;3542:3;3527:19;;3520:35;3586:3;3571:19;;3564:35;3328:3;3313:19;13610:42:0;3060:545:1;13158:37:0;;;;;;;;;;;;;;;;26359:727;;;;;;;;;;;;;:::i;14646:56::-;;;;;;;;;;;;14692:10;14646:56;;29963:230;;;;;;;;;;-1:-1:-1;29963:230:0;;;;;:::i;:::-;;:::i;:::-;;;;3812:25:1;;;3868:2;3853:18;;3846:34;;;;3896:18;;;3889:34;3800:2;3785:18;29963:230:0;3610:319:1;13387:49:0;;;;;;;;;;-1:-1:-1;13387:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;26033:192;;;;;;;;;;-1:-1:-1;26033:192:0;;;;;:::i;:::-;;:::i;33709:312::-;;;;;;;;;;-1:-1:-1;33709:312:0;;;;;:::i;:::-;;:::i;14289:55::-;;;;;;;;;;-1:-1:-1;14289:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;12938:29;;;;;;;;;;;;;;;;23608:2116;;;:::i;12797:47::-;;;;;;;;;;;;12838:6;12797:47;;13271:50;;;;;;;;;;-1:-1:-1;13271:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;13443:55;;;;;;;;;;-1:-1:-1;13443:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;12707:70;;;;;;;;;;;;12758:19;12707:70;;13505:50;;;;;;;;;;-1:-1:-1;13505:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;12468:29;;;;;;;;;;-1:-1:-1;12468:29:0;;;;-1:-1:-1;;;12468:29:0;;;;;;28998:626;;;;;;;;;;-1:-1:-1;28998:626:0;;;;;:::i;:::-;;:::i;18985:639::-;;;;;;;;;;-1:-1:-1;18985:639:0;;;;;:::i;:::-;;:::i;14875:44::-;;;;;;;;;;;;;;;20195:2854;;;;;;:::i;:::-;;:::i;13123:28::-;;;;;;;;;;;;;;;;27098:108;;;;;;;;;;-1:-1:-1;27098:108:0;;;;;:::i;:::-;;:::i;13912:50::-;;;;;;;;;;-1:-1:-1;13912:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;30201:225;;;;;;;;;;;;;:::i;1279:103::-;;;;;;;;;;;;;:::i;14470:45::-;;;;;;;;;;;;;;;;12368:30;;;;;;;;;;-1:-1:-1;12368:30:0;;;;-1:-1:-1;;;;;12368:30:0;;;13226:31;;;;;;;;;;;;;;;;12567:24;;;;;;;;;;;;;;;;12432:28;;;;;;;;;;-1:-1:-1;12432:28:0;;;;-1:-1:-1;;;;;12432:28:0;;;29632:323;;;;;;;;;;;;;:::i;12505:46::-;;;;;;;;;;;;;;;;26233:118;;;;;;;;;;-1:-1:-1;26233:118:0;;;;;:::i;:::-;;:::i;12852:48::-;;;;;;;;;;;;12896:4;12852:48;;1010:87;;;;;;;;;;-1:-1:-1;1056:7:0;1083:6;-1:-1:-1;;;;;1083:6:0;1010:87;;12336:24;;;;;;;;;;-1:-1:-1;12336:24:0;;;;-1:-1:-1;;;;;12336:24:0;;;13086:29;;;;;;;;;;;;;;;;12599:28;;;;;;;;;;-1:-1:-1;12599:28:0;;;;;;;;14175:44;;;;;;;;;;-1:-1:-1;14175:44:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;14175:44:0;;;30630:435;;;;;;;;;;-1:-1:-1;30630:435:0;;;;;:::i;:::-;;:::i;13046:30::-;;;;;;;;;;;;;;;;14826:42;;;;;;;;;;;;;;;27353:188;;;;;;;;;;-1:-1:-1;27353:188:0;;;;;:::i;:::-;;:::i;13792:45::-;;;;;;;;;;-1:-1:-1;13792:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5333:25:1;;;5389:2;5374:18;;5367:34;;;;5417:18;;;5410:34;;;;5475:2;5460:18;;5453:34;;;;5518:3;5503:19;;5496:35;5562:3;5547:19;;5540:35;5606:3;5591:19;;5584:35;5320:3;5305:19;13792:45:0;5018:607:1;13329:48:0;;;;;;;;;;-1:-1:-1;13329:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;12974:25;;;;;;;;;;;;;;;;17156:271;;;;;;;;;;-1:-1:-1;17156:271:0;;;;;:::i;:::-;;:::i;27218:127::-;;;;;;;;;;-1:-1:-1;27218:127:0;;;;;:::i;:::-;;:::i;14716:47::-;;;;;;;;;;-1:-1:-1;14716:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;13742:43;;;;;;;;;;-1:-1:-1;13742:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14770:47;;;;;;;;;;-1:-1:-1;14770:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;31077:1185;;;;;;;;;;-1:-1:-1;31077:1185:0;;;;;:::i;:::-;;:::i;18631:346::-;;;;;;;;;;;;;:::i;13975:92::-;;;;;;;;;;-1:-1:-1;13975:92:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14226:50;;;;;;;;;;-1:-1:-1;14226:50:0;;;;;:::i;:::-;;:::i;14584:51::-;;;;;;;;;;;;14626:9;14584:51;;1390:220;;;;;;;;;;-1:-1:-1;1390:220:0;;;;;:::i;:::-;;:::i;30434:188::-;;;;;;;;;;;;;:::i;27745:1245::-;;;;;;;;;;;;;:::i;17699:916::-;;;;;;;;;;-1:-1:-1;17699:916:0;;;;;:::i;:::-;;:::i;13006:27::-;;;;;;;;;;;;;;;;14352:53;;;;;;;;;;-1:-1:-1;14352:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;16947:201;;;;;;;;;;-1:-1:-1;16947:201:0;;;;;:::i;:::-;;:::i;33610:91::-;969:13;:11;:13::i;:::-;33674:10:::1;:19:::0;;-1:-1:-1;;;;;;33674:19:0::1;-1:-1:-1::0;;;;;33674:19:0;;;::::1;::::0;;;::::1;::::0;;33610:91::o;27549:188::-;969:13;:11;:13::i;:::-;27638:6:::1;27634:96;27648:15:::0;;::::1;27634:96;;;27714:4;27685:15;:26;27701:6;;27708:1;27701:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;27685:26:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;27685:26:0;:33;;-1:-1:-1;;27685:33:0::1;::::0;::::1;;::::0;;;::::1;::::0;;27665:3;::::1;::::0;::::1;:::i;:::-;;;;27634:96;;;;27549:188:::0;;:::o;26359:727::-;26430:9;;26405:7;;-1:-1:-1;;;26430:9:0;;;;26429:10;;:41;;-1:-1:-1;26443:13:0;;-1:-1:-1;;;;;26443:13:0;:27;26429:41;26425:97;;;-1:-1:-1;26494:16:0;;;26359:727::o;26425:97::-;26588:13;;;26573:43;;;-1:-1:-1;;;26573:43:0;;;;26533:16;;;;-1:-1:-1;;;;;26588:13:0;;26573:41;;:43;;;;;;;;;;;26588:13;26573:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26532:84;;;;;26627:14;26659:13;;;;;;;;;-1:-1:-1;;;;;26659:13:0;-1:-1:-1;;;;;26644:36:0;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26627:55;-1:-1:-1;;;;;;26697:13:0;;;;:30;;-1:-1:-1;;;;;;26714:13:0;;;26697:30;26693:59;;;26736:16;;26729:23;;;;;26359:727;:::o;26693:59::-;26837:10;;26763:18;;;;-1:-1:-1;;;;;26837:10:0;;;26827:20;;;;26823:204;;-1:-1:-1;;;;;;;26902:21:0;;;;26864:23;;26823:204;;;-1:-1:-1;;;;;;;26956:21:0;;;;26992:23;;26823:204;27066:12;27045:17;:10;27058:4;27045:17;:::i;:::-;27044:34;;;;:::i;:::-;27037:41;;;;;;;26359:727;:::o;29963:230::-;-1:-1:-1;;;;;30104:19:0;;30026:17;30104:19;;;:13;:19;;;;;;;:26;30132:18;:24;;;;;;30158:20;:26;;;;;;29963:230;;;;;;:::o;26033:192::-;969:13;:11;:13::i;:::-;26119::::1;:21:::0;;-1:-1:-1;;;;;26119:21:0;::::1;-1:-1:-1::0;;;;;;26151:20:0;;;;;-1:-1:-1;;;26151:20:0;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;26187:30:::1;::::0;;8554:51:1;;;8636:2;8621:18;;8614:50;;;;26187:30:0::1;::::0;8527:18:1;26187:30:0::1;;;;;;;26033:192:::0;;:::o;33709:312::-;33780:12;33794:18;33814:16;33863:10;;33847:12;:26;33843:46;;-1:-1:-1;33883:1:0;;-1:-1:-1;33883:1:0;;-1:-1:-1;33883:1:0;33875:14;;33843:46;33900:20;33923:6;33900:20;33930:16;:12;33945:1;33930:16;:::i;:::-;33923:24;;;;;;;;;;;;;;-1:-1:-1;33923:24:0;33900:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33900:47:0;;-1:-1:-1;33709:312:0;-1:-1:-1;;;33709:312:0:o;23608:2116::-;23665:16;;;;23660:57;;23690:27;;-1:-1:-1;;;23690:27:0;;;;;;;;;;;23660:57;23728:26;23743:10;23728:14;:26::i;:::-;23818:10;23775:19;23797:32;;;:20;:32;;;;;;23844:15;;23840:1877;;23927:10;23876:16;23913:25;;;:13;:25;;;;;;23895:43;;:15;:43;:::i;:::-;23876:62;-1:-1:-1;23953:19:0;23975:15;23986:4;23876:62;23975:15;:::i;:::-;23953:37;-1:-1:-1;24020:19:0;24077:2;24101:23;;;24097:158;;24159:1;24145:15;;24097:158;;;24216:22;24227:11;24216:8;:22;:::i;:::-;24202:36;;24097:158;24271:25;24299:15;:13;:15::i;:::-;24271:43;-1:-1:-1;24330:23:0;24392:4;24357:31;24271:43;24357:11;:31;:::i;:::-;24356:40;;;;:::i;:::-;24330:66;-1:-1:-1;24411:19:0;24458:3;24434:20;24330:66;24452:2;24434:20;:::i;:::-;24433:28;;;;:::i;:::-;24411:50;;24498:11;24485:9;:24;;24477:66;;;;-1:-1:-1;;;24477:66:0;;9140:2:1;24477:66:0;;;9122:21:1;9179:2;9159:18;;;9152:30;9218:31;9198:18;;;9191:59;9267:18;;24477:66:0;;;;;;;;;24560:16;24579:15;24593:1;24579:11;:15;:::i;:::-;24560:34;-1:-1:-1;24609:22:0;24634;24560:34;24634:11;:22;:::i;:::-;24679:9;;24671:37;;24609:47;;-1:-1:-1;;;;;;24679:9:0;;24671:37;;;;;24699:8;;24679:9;24671:37;24679:9;24671:37;24699:8;24679:9;24671:37;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24731:15:0;;24723:49;;-1:-1:-1;;;;;24731:15:0;;;;24723:49;;;;;24757:14;;24731:15;24723:49;24731:15;24723:49;24757:14;24731:15;24723:49;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24792:63:0;;;3812:25:1;;;3868:2;3853:18;;3846:34;;;3896:18;;;3889:34;;;24805:10:0;;24792:63;;3800:2:1;3785:18;24792:63:0;;;;;;;24893:10;24907:1;24872:32;;;:20;:32;;;;;;;;:36;;;24924:13;:25;;;;;24952:15;24924:43;;25036:3;25007:25;25021:11;25007;:25;:::i;:::-;25006:33;;;;:::i;:::-;24985:54;-1:-1:-1;25054:17:0;25074:24;24985:54;25074:11;:24;:::i;:::-;25054:44;-1:-1:-1;25115:21:0;25160:4;25140:16;:11;25154:2;25140:16;:::i;:::-;25139:25;;;;:::i;:::-;25115:49;-1:-1:-1;25180:16:0;25220:4;25200:16;:11;25214:2;25200:16;:::i;:::-;25199:25;;;;:::i;:::-;25249:10;;25242:46;;-1:-1:-1;;;25242:46:0;;25266:10;25242:46;;;9470:51:1;9537:18;;;9530:34;;;25180:44:0;;-1:-1:-1;;;;;;25249:10:0;;25242:23;;9443:18:1;;25242:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25334:10:0;25305:16;25324:21;;;:9;:21;;;;;;-1:-1:-1;;;;;25324:21:0;;-1:-1:-1;;25364:22:0;;25360:282;;25414:10;;25407:53;;-1:-1:-1;;;25407:53:0;;25439:4;25407:53;;;9470:51:1;9537:18;;;9530:34;;;-1:-1:-1;;;;;25414:10:0;;;;25407:23;;9443:18:1;;25407:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;25479:30:0;;;;;;:20;:30;;;;;:42;;25513:8;;25479:30;:42;;25513:8;;25479:42;:::i;:::-;;;;-1:-1:-1;25360:282:0;;-1:-1:-1;25360:282:0;;25569:10;;-1:-1:-1;;;;;25569:10:0;25562:23;25594:4;25601:24;25617:8;25601:13;:24;:::i;:::-;25562:64;;-1:-1:-1;;;;;;25562:64:0;;;;;;;-1:-1:-1;;;;;9488:32:1;;;25562:64:0;;;9470:51:1;9537:18;;;9530:34;9443:18;;25562:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25360:282;25661:44;;2212:25:1;;;25683:10:0;;25661:44;;2200:2:1;2185:18;25661:44:0;;;;;;;23861:1856;;;;;;;;;;;;;;23840:1877;23649:2075;23608:2116::o;28998:626::-;29086:12;;;;29102:1;29086:17;29078:72;;;;-1:-1:-1;;;29078:72:0;;;;;;;:::i;:::-;29190:10;29166:35;;;;:23;:35;;;;;;;;29161:79;;29210:30;;-1:-1:-1;;;29210:30:0;;;;;;;;;;;29161:79;29251:14;29268:16;;;:4;:16;;;;;;;;29251:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29299:17;29295:53;;29325:23;;-1:-1:-1;;;29325:23:0;;;;;;;;;;;29295:53;29382:10;;29434:8;;;;29375:68;;-1:-1:-1;;;29375:68:0;;29407:10;29375:68;;;10226:34:1;29427:4:0;10276:18:1;;;10269:43;10328:18;;;10321:34;;;;29360:12:0;;-1:-1:-1;;;;;29382:10:0;;29375:31;;10161:18:1;;29375:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29360:83;;29462:7;29454:41;;;;-1:-1:-1;;;29454:41:0;;10818:2:1;29454:41:0;;;10800:21:1;10857:2;10837:18;;;10830:30;-1:-1:-1;;;10876:18:1;;;10869:51;10937:18;;29454:41:0;10616:345:1;29454:41:0;29510:8;;;;:12;29506:51;;29531:10;;29548:8;;;;29524:33;;-1:-1:-1;;;29524:33:0;;-1:-1:-1;;;;;29531:10:0;;;;29524:23;;:33;;;;2212:25:1;;;2200:2;2185:18;;2066:177;29524:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29506:51;29568:48;29577:10;29589;29601:1;29604;29607:3;:8;;;29568;:48::i;:::-;29067:557;;28998:626;;;:::o;18985:639::-;19094:22;;19159:14;;19047:7;;19094:22;19141:15;:32;:54;;;;-1:-1:-1;19177:13:0;;:18;;19141:54;19137:343;;;19212:17;19250:14;;19232:15;:32;;;;:::i;:::-;19212:52;;19279:21;19303:27;:25;:27::i;:::-;19279:51;-1:-1:-1;19345:15:0;19363:25;19279:51;19363:9;:25;:::i;:::-;19455:13;;19345:43;;-1:-1:-1;19424:27:0;12896:4;19345:43;19424:27;:::i;:::-;19423:45;;;;:::i;:::-;19403:65;;;;:::i;:::-;;;19197:283;;;19137:343;-1:-1:-1;;;;;19572:22:0;;;;;;:15;:22;;;;;;12896:4;;19553:41;;:16;:41;:::i;:::-;-1:-1:-1;;;;;19528:21:0;;;;;;:14;:21;;;;;;:67;;;;:::i;:::-;19527:89;;;;:::i;:::-;-1:-1:-1;;;;;19497:27:0;;;;;;:20;:27;;;;;;:119;;;;:::i;:::-;19490:126;18985:639;-1:-1:-1;;;18985:639:0:o;20195:2854::-;20299:10;20275:35;;;;:23;:35;;;;;;;;20271:85;;;20319:37;;-1:-1:-1;;;20319:37:0;;;;;;;;;;;20271:85;20375:12;;;;20367:46;;;;-1:-1:-1;;;20367:46:0;;11168:2:1;20367:46:0;;;11150:21:1;11207:2;11187:18;;;11180:30;-1:-1:-1;;;11226:18:1;;;11219:47;11283:18;;20367:46:0;10966:341:1;20367:46:0;20469:12;;20426:18;;20469:12;;;:17;20465:663;;20527:10;20511:27;;;;:15;:27;;;;;;;;20503:67;;;;-1:-1:-1;;;20503:67:0;;11514:2:1;20503:67:0;;;11496:21:1;11553:2;11533:18;;;11526:30;11592:29;11572:18;;;11565:57;11639:18;;20503:67:0;11312:351:1;20503:67:0;-1:-1:-1;14567:7:0;20465:663;;;20642:12;;;;20658:1;20642:17;20638:490;;20710:10;20694:27;;;;:15;:27;;;;;;;;20690:192;;;-1:-1:-1;14626:9:0;20638:490;;20690:192;-1:-1:-1;14692:10:0;20638:490;;;-1:-1:-1;20951:17:0;;-1:-1:-1;;;;;20988:22:0;;;;;;:48;;-1:-1:-1;;;;;;21014:22:0;;21026:10;21014:22;;20988:48;20984:133;;;21097:3;21071:17;;21091:2;21071:22;;;;:::i;:::-;21070:30;;;;:::i;:::-;21057:43;;20984:133;21156:10;21144:9;:22;21140:58;;;21175:23;;-1:-1:-1;;;21175:23:0;;;;;;;;;;;21140:58;21221:15;-1:-1:-1;;;;;21240:22:0;;;;;;:48;;-1:-1:-1;;;;;;21266:22:0;;21278:10;21266:22;;21240:48;:69;;;;-1:-1:-1;21292:12:0;;;;21308:1;21292:17;21240:69;21221:89;;21335:10;21331:1145;;;21362:16;21408:3;21382:17;;21402:2;21382:22;;;;:::i;:::-;21381:30;;;;:::i;:::-;21362:49;-1:-1:-1;21426:22:0;21451:20;21362:49;21451:9;:20;:::i;:::-;21488:36;;21426:45;;-1:-1:-1;;;;;;21488:26:0;;;:36;;;;;21515:8;;21488:36;;;;21515:8;21488:26;:36;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21539:28:0;;;;;;:18;:28;;;;;:40;;21571:8;;21539:28;:40;;21571:8;;21539:40;:::i;:::-;;;;-1:-1:-1;;21604:10:0;21594:21;;;;:9;:21;;;;;;;;:32;;-1:-1:-1;;;;;21594:32:0;;;-1:-1:-1;;;;;;21594:32:0;;;;;;;;21641:23;;;;;;;;;:40;;21594:32;21641:40;;;;;;;;;;;;;;;;;;;;;;;;;21702:15;;;:29;;;;:61;;-1:-1:-1;21754:9:0;;21735:15;;-1:-1:-1;;;;;21735:15:0;;;21754:9;;21735:28;;21702:61;21698:369;;;21784:19;21806:18;21823:1;21806:14;:18;:::i;:::-;21852:9;;21844:40;;21784;;-1:-1:-1;;;;;;21852:9:0;;21844:40;;;;;21784;;21852:9;21844:40;21852:9;21844:40;21784;21852:9;21844:40;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21911:15:0;;-1:-1:-1;;;;;21911:15:0;21903:63;21937:28;21954:11;21937:14;:28;:::i;:::-;21903:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21765:217;21698:369;;;22015:9;;22007:43;;-1:-1:-1;;;;;22015:9:0;;;;22007:43;;;;;22035:14;;22015:9;22007:43;22015:9;22007:43;22035:14;22015:9;22007:43;;;;;;;;;;;;;;;;;;;;;21698:369;21347:731;;21331:1145;;;22117:15;;-1:-1:-1;;;;;22117:15:0;:29;;;;:61;;-1:-1:-1;22169:9:0;;22150:15;;-1:-1:-1;;;;;22150:15:0;;;22169:9;;22150:28;;22117:61;22113:352;;;22199:19;22221:13;22233:1;22221:9;:13;:::i;:::-;22261:9;;22253:40;;22199:35;;-1:-1:-1;;;;;;22261:9:0;;22253:40;;;;;22199:35;;22261:9;22253:40;22261:9;22253:40;22199:35;22261:9;22253:40;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22320:15:0;;-1:-1:-1;;;;;22320:15:0;22312:58;22346:23;22358:11;22346:9;:23;:::i;:::-;22312:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22113:352;22419:9;;22411:38;;-1:-1:-1;;;;;22419:9:0;;;;22439;22411:38;;;;;22419:9;22411:38;22419:9;22411:38;22439:9;22419;22411:38;;;;;;;;;;;;;;;;;;;;;22113:352;22512:10;22488:35;;;;:23;:35;;;;;:42;;-1:-1:-1;;22488:42:0;22526:4;22488:42;;;22541:12;:14;;;;;;:::i;:::-;;;;-1:-1:-1;;22580:10:0;22566:25;;;;:13;:25;;;;;;;;22594:15;22566:43;;22657:19;22650:27;;;:6;:27;;;;;22623:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22710:24;;;:12;:24;;;;;;22745:38;;;22810:16;;22794:13;;;:32;;;;22862:25;;22837:22;;;:50;22898:21;;:25;;;22944:10;22934:7;;;:20;;;;22975:10;;22965:7;;;:20;23001:40;;22623:54;;22710:24;;22580:10;;23001:40;;22566:25;23001:40;20260:2789;;;;20195:2854;:::o;27098:108::-;969:13;:11;:13::i;:::-;27173:15:::1;:25:::0;;-1:-1:-1;;;;;;27173:25:0::1;-1:-1:-1::0;;;;;27173:25:0;;;::::1;::::0;;;::::1;::::0;;27098:108::o;30201:225::-;969:13;:11;:13::i;:::-;30281:10:::1;::::0;30274:43:::1;::::0;-1:-1:-1;;;30274:43:0;;30311:4:::1;30274:43;::::0;::::1;1616:51:1::0;30256:15:0::1;::::0;-1:-1:-1;;;;;30281:10:0::1;::::0;30274:28:::1;::::0;1589:18:1;;30274:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30256:61;;30346:1;30336:7;:11;30328:32;;;::::0;-1:-1:-1;;;30328:32:0;;12059:2:1;30328:32:0::1;::::0;::::1;12041:21:1::0;12098:1;12078:18;;;12071:29;-1:-1:-1;;;12116:18:1;;;12109:38;12164:18;;30328:32:0::1;11857:331:1::0;30328:32:0::1;30378:10;::::0;30399:9:::1;::::0;30371:47:::1;::::0;-1:-1:-1;;;30371:47:0;;-1:-1:-1;;;;;30399:9:0;;::::1;30371:47;::::0;::::1;9470:51:1::0;9537:18;;;9530:34;;;30378:10:0;::::1;::::0;30371:27:::1;::::0;9443:18:1;;30371:47:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30245:181;30201:225::o:0;1279:103::-;969:13;:11;:13::i;:::-;1344:30:::1;1371:1;1344:18;:30::i;:::-;1279:103::o:0;29632:323::-;29723:10;29685:14;29702:32;;;:20;:32;;;;;;29753:10;29745:43;;;;-1:-1:-1;;;29745:43:0;;12395:2:1;29745:43:0;;;12377:21:1;12434:2;12414:18;;;12407:30;-1:-1:-1;;;12453:18:1;;;12446:50;12513:18;;29745:43:0;12193:344:1;29745:43:0;29820:10;29834:1;29799:32;;;:20;:32;;;;;;:36;;;;29853:10;;29846:43;;-1:-1:-1;;;29846:43:0;;;;;9470:51:1;;;;9537:18;;;9530:34;;;-1:-1:-1;;;;;29853:10:0;;29846:23;;9443:18:1;;29846:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29906:41:0;;2212:25:1;;;29928:10:0;;-1:-1:-1;29906:41:0;;-1:-1:-1;2200:2:1;2185:18;29906:41:0;;;;;;;29674:281;29632:323::o;26233:118::-;969:13;:11;:13::i;:::-;26313:16:::1;:30:::0;26233:118::o;30630:435::-;30707:12;;;;30723:1;30707:17;30699:72;;;;-1:-1:-1;;;30699:72:0;;;;;;;:::i;:::-;30805:10;30786:30;;;;:18;:30;;;;;;;;30782:77;;;30825:34;;-1:-1:-1;;;30825:34:0;;;;;;;;;;;30782:77;30899:10;30875:35;;;;:23;:35;;;;;;;;30870:79;;30919:30;;-1:-1:-1;;;30919:30:0;;;;;;;;;;;30870:79;30979:10;30960:30;;;;:18;:30;;;;;:37;;-1:-1:-1;;30960:37:0;30993:4;30960:37;;;31008:48;;30979:10;31029:17;;31048:1;;31051;;31008:8;:48::i;27353:188::-;969:13;:11;:13::i;:::-;27442:6:::1;27438:96;27452:15:::0;;::::1;27438:96;;;27518:4;27489:15;:26;27505:6;;27512:1;27505:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;27489:26:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;27489:26:0;:33;;-1:-1:-1;;27489:33:0::1;::::0;::::1;;::::0;;;::::1;::::0;;27469:3;::::1;::::0;::::1;:::i;:::-;;;;27438:96;;17156:271:::0;969:13;:11;:13::i;:::-;17309:54:::1;;;;;;;;17318:7;17309:54;;;;17327:16;17309:54;;;;17345:4;17309:54;;;;17351:5;17309:54;;;;;;17358:1;17309:54;;;;17361:1;17309:54;;::::0;17286:6:::1;:20;17295:10;;17293:12;;;;;:::i;:::-;::::0;;;;-1:-1:-1;17286:20:0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;17286:20:0;:77;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;-1:-1:-1;;17286:77:0::1;::::0;::::1;;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;17393:10:::1;::::0;17379:40;;3812:25:1;;;3853:18;;;3846:34;;;3896:18;;3889:34;;;17379:40:0::1;::::0;3785:18:1;17379:40:0::1;;;;;;;17156:271:::0;;;;;:::o;27218:127::-;969:13;:11;:13::i;:::-;27280:12:::1;:21:::0;;-1:-1:-1;;27280:21:0::1;;::::0;::::1;::::0;;::::1;::::0;;;27317:20:::1;::::0;1423:36:1;;;27317:20:0::1;::::0;1411:2:1;1396:18;27317:20:0::1;;;;;;;27218:127:::0;:::o;31077:1185::-;31164:10;31143:32;;;;:20;:32;;;;;;;;:35;;;;;;;;:38;;;;;;;;;;;31138:79;;31190:27;;-1:-1:-1;;;31190:27:0;;;;;;;;;;;31138:79;31263:10;31228:19;31250:24;;;:12;:24;;;;;;;;31302:12;:24;;;;;:27;;;;;;;;:30;;;;;;;;;31364:12;;;:4;:12;;;;;;31343:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31250:24;31387:26;;:14;:26::i;:::-;31455:7;:16;;;31438:13;;:33;31434:149;;31505:7;:16;;;31488:13;;:33;;;;;;;:::i;:::-;;;;-1:-1:-1;31434:149:0;;-1:-1:-1;31434:149:0;;31570:1;31554:13;:17;31434:149;31627:16;;;;31612:10;31597:26;;;;:14;:26;;;;;;:46;31593:188;;31690:16;;;;31675:10;31660:26;;;;:14;:26;;;;;:46;;:26;;;:46;;31690:16;;31660:46;:::i;:::-;;;;-1:-1:-1;31593:188:0;;-1:-1:-1;31593:188:0;;31754:10;31768:1;31739:26;;;:14;:26;;;;;:30;31593:188;31820:7;:24;;;31795:5;:21;;;:49;31791:189;;31886:7;:24;;;31861:5;:21;;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;31791:189:0;;-1:-1:-1;31791:189:0;;31967:1;31943:21;;;:25;31791:189;32013:10;32033:5;31992:32;;;:20;:32;;;;;;;;:35;;;;;;;;:38;;;;;;;;:46;;-1:-1:-1;;31992:46:0;;;32049:24;;;:12;:24;;;;;:27;;;;;;;;:30;;;;;;;;:34;32098:14;;;;:18;32094:40;;32118:14;;;:16;;;:14;:16;;;:::i;:::-;;;;;;32094:40;32181:10;32193:26;;;;:14;:26;;;;;;;;;32221:20;:32;;;;;;;;32150:104;;;;;;12857:25:1;;12913:2;12898:18;;12891:34;12845:2;12830:18;;12683:248;32150:104:0;;;;;;;;31127:1135;;;31077:1185;;:::o;18631:346::-;18714:16;;18689:7;;18714:16;;18709:31;;-1:-1:-1;18739:1:0;;18631:346::o;18709:31::-;18761:18;18800:9;;18782:15;:27;;;;:::i;:::-;18761:48;-1:-1:-1;18820:16:0;18839:27;12838:6;18761:48;18839:27;:::i;:::-;18820:46;;18903:2;18892:8;:13;18888:27;;;18914:1;18907:8;;;;18631:346;:::o;18888:27::-;12758:19;18933:36;;;18631:346;-1:-1:-1;;18631:346:0:o;14226:50::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14226:50:0;;-1:-1:-1;14226:50:0;;-1:-1:-1;14226:50:0:o;1390:220::-;969:13;:11;:13::i;:::-;-1:-1:-1;;;;;1475:22:0;::::1;1471:93;;1521:31;::::0;-1:-1:-1;;;1521:31:0;;1549:1:::1;1521:31;::::0;::::1;1616:51:1::0;1589:18;;1521:31:0::1;1470:203:1::0;1471:93:0::1;1574:28;1593:8;1574:18;:28::i;30434:188::-:0;969:13;:11;:13::i;:::-;30505:21:::1;30545:11:::0;30537:30:::1;;;::::0;-1:-1:-1;;;30537:30:0;;13138:2:1;30537:30:0::1;::::0;::::1;13120:21:1::0;13177:1;13157:18;;;13150:29;-1:-1:-1;;;13195:18:1;;;13188:36;13241:18;;30537:30:0::1;12936:329:1::0;30537:30:0::1;30586:9;::::0;30578:36:::1;::::0;-1:-1:-1;;;;;30586:9:0;;::::1;::::0;30578:36;::::1;;;::::0;30606:7;;30586:9:::1;30578:36:::0;30586:9;30578:36;30606:7;30586:9;30578:36;::::1;;;;;;;;;;;;;::::0;::::1;;;;27745:1245:::0;27797:12;;;;27813:1;27797:17;27789:72;;;;-1:-1:-1;;;27789:72:0;;13472:2:1;27789:72:0;;;13454:21:1;13511:2;13491:18;;;13484:30;13550:34;13530:18;;;13523:62;-1:-1:-1;;;13601:18:1;;;13594:40;13651:19;;27789:72:0;13270:406:1;27789:72:0;27901:10;27877:35;;;;:23;:35;;;;;;;;27872:79;;27921:30;;-1:-1:-1;;;27921:30:0;;;;;;;;;;;27872:79;28019:8;;28005:10;27989:27;;;;:15;:27;;;;;;:38;;28019:8;27989:38;:::i;:::-;27970:15;:57;;27962:99;;;;-1:-1:-1;;;27962:99:0;;13883:2:1;27962:99:0;;;13865:21:1;13922:2;13902:18;;;13895:30;13961:31;13941:18;;;13934:59;14010:18;;27962:99:0;13681:353:1;27962:99:0;28111:10;28072:23;28098:24;;;:12;:24;;;;;28158:20;;28098:24;;28072:23;28158:24;;28181:1;28158:24;:::i;:::-;28133:49;;28214:10;;28197:14;:27;28193:66;;;28233:26;;-1:-1:-1;;;28233:26:0;;;;;;;;;;;28193:66;28270:29;28302:22;;;:6;:22;;;;;;;;28270:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28357:10;;28350:78;;-1:-1:-1;;;28350:78:0;;28382:10;28350:78;;;10226:34:1;;;;28402:4:0;10276:18:1;;;10269:43;10328:18;;;10321:34;;;;28270:54:0;;:29;-1:-1:-1;;;;;28357:10:0;;;;28350:31;;10161:18:1;;28350:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28335:93;;28447:7;28439:41;;;;-1:-1:-1;;;28439:41:0;;10818:2:1;28439:41:0;;;10800:21:1;10857:2;10837:18;;;10830:30;-1:-1:-1;;;10876:18:1;;;10869:51;10937:18;;28439:41:0;10616:345:1;28439:41:0;28495:18;;;;:22;28491:71;;28526:10;;28543:18;;;;;28519:43;;-1:-1:-1;;;28519:43:0;;-1:-1:-1;;;;;28526:10:0;;;;28519:23;;:43;;;;2212:25:1;;;2200:2;2185:18;;2066:177;28519:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28491:71;28573:37;;;28641:21;;28621:17;;;:41;28702:30;;;;;;28673:26;;;:59;28757:15;;;;28743:11;;;:29;28798:15;;;;28784:11;;;:29;28841:10;-1:-1:-1;28825:27:0;;;:15;:27;;;;;;;28855:15;28825:45;;28928:21;;28951:30;;28886:96;;3812:25:1;;;3853:18;;;3846:34;;;;3896:18;;3889:34;;;;28841:10:0;28886:96;;3800:2:1;3785:18;28886:96:0;;;;;;;27778:1212;;;;27745:1245::o;17699:916::-;969:13;:11;:13::i;:::-;17811:19:::1;17774:27;17804::::0;;;:6:::1;:27;::::0;;;;;;;17774:57;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;::::1;::::0;::::1;;;;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;;::::0;;;;;;17838:726:::1;17852:15:::0;;::::1;17838:726;;;17885:12;17900:6;;17907:1;17900:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;17925:29:0;::::1;;::::0;;;:23:::1;:29;::::0;;;;;17885:24;;-1:-1:-1;17925:29:0::1;;17920:633;;-1:-1:-1::0;;;;;17971:29:0;::::1;;::::0;;;:23:::1;:29;::::0;;;;:36;;-1:-1:-1;;17971:36:0::1;18003:4;17971:36;::::0;;18022:12:::1;:14:::0;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;18075:22:0::1;::::0;-1:-1:-1;;;;;18051:21:0;::::1;;::::0;;;:15:::1;:21;::::0;;;;;;;:46;;;;18112:13:::1;:19:::0;;;;;18134:15:::1;18112:37:::0;;18208:12:::1;:18:::0;;;;;18264:19:::1;18245:38:::0;;18318:19;;18302:13:::1;::::0;::::1;:35:::0;18381:28;;::::1;::::0;18356:22:::1;::::0;::::1;:53:::0;18428:21:::1;::::0;::::1;:25:::0;18482:13:::1;::::0;::::1;::::0;18472:7:::1;::::0;::::1;:23:::0;18524:13:::1;::::0;::::1;::::0;18514:7:::1;::::0;;::::1;:23:::0;17920:633:::1;-1:-1:-1::0;17869:3:0;::::1;::::0;::::1;:::i;:::-;;;;17838:726;;;-1:-1:-1::0;18579:28:0::1;::::0;2212:25:1;;;18579:28:0::1;::::0;2200:2:1;2185:18;18579:28:0::1;;;;;;;;17767:848;17699:916:::0;;:::o;16947:201::-;969:13;:11;:13::i;:::-;17043:38:::1;17059:8;17069:5;17076:4;17043:15;:38::i;:::-;17109:14;::::0;17097:43:::1;::::0;;3812:25:1;;;3868:2;3853:18;;3846:34;;;3896:18;;3889:34;;;17097:43:0::1;::::0;3800:2:1;3785:18;17097:43:0::1;3610:319:1::0;1105:166:0;1056:7;1083:6;-1:-1:-1;;;;;1083:6:0;224:10;1165:23;1161:103;;1212:40;;-1:-1:-1;;;1212:40:0;;224:10;1212:40;;;1616:51:1;1589:18;;1212:40:0;1470:203:1;25732:293:0;25792:26;:24;:26::i;:::-;-1:-1:-1;;;;;25913:23:0;;;;;;:15;:23;;;;;;25888:22;;12896:4;;25888:48;;;:::i;:::-;-1:-1:-1;;;;;25862:22:0;;;;;;:14;:22;;;;;;:75;;;;:::i;:::-;25861:97;;;;:::i;:::-;-1:-1:-1;;;;;25829:28:0;;;;;;:20;:28;;;;;:129;;:28;;;:129;;;;;:::i;:::-;;;;-1:-1:-1;;25995:22:0;;-1:-1:-1;;;;;25969:23:0;;;;;;;:15;:23;;;;;:48;25732:293::o;32270:1038::-;32378:14;32395;;;:4;:14;;;;;;;;32378:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32442:20:0;;;;:12;:20;;;;;;;32513:7;;;;32522;;;;32378:31;;32477:53;;32455:6;;32507:1;;32510;;32513:7;32477:21;:53::i;:::-;32473:96;;;32539:30;;-1:-1:-1;;;32539:30:0;;;;;;;;;;;32473:96;32602:5;:13;;;32584:5;:14;;;:31;32580:71;;32624:27;;-1:-1:-1;;;32624:27:0;;;;;;;;;;;32580:71;32715:5;:22;;;32692:3;:20;;;32668:5;:21;;;:44;;;;:::i;:::-;:69;32664:117;;;32746:35;;-1:-1:-1;;;32746:35:0;;;;;;;;;;;32664:117;32817:3;:20;;;32792:5;:21;;;:45;;;;;;;:::i;:::-;;;;-1:-1:-1;;32848:14:0;:16;;;:14;:16;;;:::i;:::-;;;;-1:-1:-1;;32875:5:0;;;;:9;;;32895:5;;;:9;;;32924:14;;;32915:6;;;;:23;;;;-1:-1:-1;;;;;32949:28:0;;-1:-1:-1;32949:28:0;;;:20;:28;;;;;:31;;;;;;;;:34;;;;;;;;:41;;-1:-1:-1;;32949:41:0;32986:4;32949:41;;;33001:20;;;:12;:20;;;;;:23;;;;;;;;:26;;;;;;;;:37;;;33077:14;;33049:23;;;:15;:23;;;;;;:43;;:27;:43::i;:::-;-1:-1:-1;33116:14:0;;33103:28;;;;:12;:28;;;;;;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33103:34:0;;;;;;;;;;;33148:14;;:16;;;;;;:::i;:::-;;;;;;33175:39;33193:6;33201:3;:12;;;33175:17;:39::i;:::-;33279:14;;33230:70;;;14270:25:1;;;14326:2;14311:18;;14304:34;;;;14354:18;;14347:34;;;14412:2;14397:18;;14390:34;;;33263:8:0;;-1:-1:-1;;;;;33230:70:0;;;;;;;14257:3:1;14242:19;33230:70:0;;;;;;;32367:941;;32270:1038;;;;;:::o;1618:191::-;1692:16;1711:6;;-1:-1:-1;;;;;1728:17:0;;;-1:-1:-1;;;;;;1728:17:0;;;;;;1761:40;;1711:6;;;;;;;1761:40;;1692:16;1761:40;1681:128;1618:191;:::o;17435:256::-;17527:14;:16;;;:14;:16;;;:::i;:::-;;;;-1:-1:-1;;17577:106:0;;;;;;;;17581:14;;17577:106;;;-1:-1:-1;;17577:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17577:106:0;;;;;;17554:20;;;:4;:20;;;;;;;:129;;;;;17577:106;17554:129;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17554:129:0;;;;;;;;;;17435:256::o;19632:547::-;19711:14;;19692:15;:33;19688:46;;19632:547::o;19688:46::-;19748:13;;19765:1;19748:18;19744:104;;19800:15;19783:14;:32;19632:547::o;19744:104::-;19868:17;19906:14;;19888:15;:32;;;;:::i;:::-;19868:52;;19931:21;19955:27;:25;:27::i;:::-;19931:51;-1:-1:-1;19993:15:0;20011:25;19931:51;20011:9;:25;:::i;:::-;20115:13;;19993:43;;-1:-1:-1;20084:27:0;12896:4;19993:43;20084:27;:::i;:::-;20083:45;;;;:::i;:::-;20057:22;;:71;;;;;;;:::i;:::-;;;;-1:-1:-1;;20156:15:0;20139:14;:32;-1:-1:-1;;;19632:547:0:o;33316:286::-;33454:4;33487:6;33475:8;:18;;:40;;;;33509:6;33497:8;:18;;33475:40;33471:57;;;-1:-1:-1;33524:4:0;33517:11;;33471:57;-1:-1:-1;;;;;;33546:28:0;;;;;;:20;:28;;;;;;;;:38;;;;;;;;:48;;;;;;;;;;;33316:286;;;;;;;;:::o;2816:150::-;2886:11;2919:39;2937:3;2951:5;2919:3;:39::i;23065:531::-;23151:16;;;;23146:221;;23184:16;:23;;-1:-1:-1;;23184:23:0;23203:4;23184:23;;;23234:15;23222:9;:27;;;23269:14;:32;23321:34;;;;;;23342:12;2212:25:1;;2200:2;2185:18;;2066:177;23321:34:0;;;;;;;;23146:221;23377:22;23392:6;23377:14;:22::i;:::-;23427:8;23410:13;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;23446:22:0;;;;;;:14;:22;;;;;:34;;23472:8;;23446:22;:34;;23472:8;;23446:34;:::i;:::-;;;;-1:-1:-1;;;;;;;23496:92:0;;23535:22;;;;:14;:22;;;;;;;;;23559:20;:28;;;;;;;;23496:92;;;;;;12857:25:1;;12913:2;12898:18;;12891:34;12845:2;12830:18;;12683:248;23496:92:0;;;;;;;;23065:531;;:::o;4090:761::-;6458:30;6452:4;6445:44;4160:11;6503:20;;;6558:4;6542:21;;4265:14;4258:5;4255:25;4252:76;;4296:10;4290:4;4283:24;4321:4;4315;4308:18;4252:76;4352:5;4342:44;;4370:14;4361:23;;4342:44;4413:8;4407:4;4400:22;4449:5;4443:4;4436:19;4494:4;4488;4478:21;4529:1;4523:8;4513:320;;4571:8;4567:13;4561:20;4612:1;4606:4;4599:15;4686:5;4681:1;4678;4674:9;4664:8;4660:24;4653:39;4734:1;4731;4727:9;4724:1;4720:17;4717:1;4710:28;4785:1;4782;4778:9;4767:8;4763:13;4756:32;;4817:1;4807:11;;4513:320;;4237:607;4090:761;;;;:::o;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:247;209:6;262:2;250:9;241:7;237:23;233:32;230:52;;;278:1;275;268:12;230:52;317:9;304:23;336:31;361:5;336:31;:::i;402:180::-;461:6;514:2;502:9;493:7;489:23;485:32;482:52;;;530:1;527;520:12;482:52;-1:-1:-1;553:23:1;;402:180;-1:-1:-1;402:180:1:o;1678:383::-;1755:6;1763;1771;1824:2;1812:9;1803:7;1799:23;1795:32;1792:52;;;1840:1;1837;1830:12;1792:52;1879:9;1866:23;1898:31;1923:5;1898:31;:::i;:::-;1948:5;2000:2;1985:18;;1972:32;;-1:-1:-1;2051:2:1;2036:18;;;2023:32;;1678:383;-1:-1:-1;;;1678:383:1:o;2248:615::-;2334:6;2342;2395:2;2383:9;2374:7;2370:23;2366:32;2363:52;;;2411:1;2408;2401:12;2363:52;2451:9;2438:23;2480:18;2521:2;2513:6;2510:14;2507:34;;;2537:1;2534;2527:12;2507:34;2575:6;2564:9;2560:22;2550:32;;2620:7;2613:4;2609:2;2605:13;2601:27;2591:55;;2642:1;2639;2632:12;2591:55;2682:2;2669:16;2708:2;2700:6;2697:14;2694:34;;;2724:1;2721;2714:12;2694:34;2777:7;2772:2;2762:6;2759:1;2755:14;2751:2;2747:23;2743:32;2740:45;2737:65;;;2798:1;2795;2788:12;2737:65;2829:2;2821:11;;;;;2851:6;;-1:-1:-1;2248:615:1;;-1:-1:-1;;;;2248:615:1:o;3934:118::-;4020:5;4013:13;4006:21;3999:5;3996:32;3986:60;;4042:1;4039;4032:12;4057:382;4122:6;4130;4183:2;4171:9;4162:7;4158:23;4154:32;4151:52;;;4199:1;4196;4189:12;4151:52;4238:9;4225:23;4257:31;4282:5;4257:31;:::i;:::-;4307:5;-1:-1:-1;4364:2:1;4349:18;;4336:32;4377:30;4336:32;4377:30;:::i;:::-;4426:7;4416:17;;;4057:382;;;;;:::o;4444:316::-;4521:6;4529;4537;4590:2;4578:9;4569:7;4565:23;4561:32;4558:52;;;4606:1;4603;4596:12;4558:52;-1:-1:-1;;4629:23:1;;;4699:2;4684:18;;4671:32;;-1:-1:-1;4750:2:1;4735:18;;;4722:32;;4444:316;-1:-1:-1;4444:316:1:o;4765:248::-;4833:6;4841;4894:2;4882:9;4873:7;4869:23;4865:32;4862:52;;;4910:1;4907;4900:12;4862:52;-1:-1:-1;;4933:23:1;;;5003:2;4988:18;;;4975:32;;-1:-1:-1;4765:248:1:o;5630:454::-;5725:6;5733;5741;5749;5757;5810:3;5798:9;5789:7;5785:23;5781:33;5778:53;;;5827:1;5824;5817:12;5778:53;-1:-1:-1;;5850:23:1;;;5920:2;5905:18;;5892:32;;-1:-1:-1;5971:2:1;5956:18;;5943:32;;6022:2;6007:18;;5994:32;;-1:-1:-1;6073:3:1;6058:19;6045:33;;-1:-1:-1;5630:454:1;-1:-1:-1;5630:454:1:o;6089:269::-;6146:6;6199:2;6187:9;6178:7;6174:23;6170:32;6167:52;;;6215:1;6212;6205:12;6167:52;6254:9;6241:23;6304:4;6297:5;6293:16;6286:5;6283:27;6273:55;;6324:1;6321;6314:12;6363:315;6431:6;6439;6492:2;6480:9;6471:7;6467:23;6463:32;6460:52;;;6508:1;6505;6498:12;6460:52;6547:9;6534:23;6566:31;6591:5;6566:31;:::i;:::-;6616:5;6668:2;6653:18;;;;6640:32;;-1:-1:-1;;;6363:315:1:o;6683:127::-;6744:10;6739:3;6735:20;6732:1;6725:31;6775:4;6772:1;6765:15;6799:4;6796:1;6789:15;6815:127;6876:10;6871:3;6867:20;6864:1;6857:31;6907:4;6904:1;6897:15;6931:4;6928:1;6921:15;6947:135;6986:3;7007:17;;;7004:43;;7027:18;;:::i;:::-;-1:-1:-1;7074:1:1;7063:13;;6947:135::o;7087:188::-;7166:13;;-1:-1:-1;;;;;7208:42:1;;7198:53;;7188:81;;7265:1;7262;7255:12;7188:81;7087:188;;;:::o;7280:450::-;7367:6;7375;7383;7436:2;7424:9;7415:7;7411:23;7407:32;7404:52;;;7452:1;7449;7442:12;7404:52;7475:40;7505:9;7475:40;:::i;:::-;7465:50;;7534:49;7579:2;7568:9;7564:18;7534:49;:::i;:::-;7524:59;;7626:2;7615:9;7611:18;7605:25;7670:10;7663:5;7659:22;7652:5;7649:33;7639:61;;7696:1;7693;7686:12;7639:61;7719:5;7709:15;;;7280:450;;;;;:::o;7735:251::-;7805:6;7858:2;7846:9;7837:7;7833:23;7829:32;7826:52;;;7874:1;7871;7864:12;7826:52;7906:9;7900:16;7925:31;7950:5;7925:31;:::i;7991:168::-;8064:9;;;8095;;8112:15;;;8106:22;;8092:37;8082:71;;8133:18;;:::i;:::-;7991:168;;;;:::o;8164:217::-;8204:1;8230;8220:132;;8274:10;8269:3;8265:20;8262:1;8255:31;8309:4;8306:1;8299:15;8337:4;8334:1;8327:15;8220:132;-1:-1:-1;8366:9:1;;8164:217::o;8675:125::-;8740:9;;;8761:10;;;8758:36;;;8774:18;;:::i;8805:128::-;8872:9;;;8893:11;;;8890:37;;;8907:18;;:::i;9575:406::-;9777:2;9759:21;;;9816:2;9796:18;;;9789:30;9855:34;9850:2;9835:18;;9828:62;-1:-1:-1;;;9921:2:1;9906:18;;9899:40;9971:3;9956:19;;9575:406::o;10366:245::-;10433:6;10486:2;10474:9;10465:7;10461:23;10457:32;10454:52;;;10502:1;10499;10492:12;10454:52;10534:9;10528:16;10553:28;10575:5;10553:28;:::i;11668:184::-;11738:6;11791:2;11779:9;11770:7;11766:23;11762:32;11759:52;;;11807:1;11804;11797:12;11759:52;-1:-1:-1;11830:16:1;;11668:184;-1:-1:-1;11668:184:1:o;12542:136::-;12581:3;12609:5;12599:39;;12618:18;;:::i;:::-;-1:-1:-1;;;12654:18:1;;12542:136::o

Swarm Source

ipfs://6d951f7ac4f0d052329a23db1492f6fb45a120ca79422b48a36a82b67b932ee6

Block Transaction Gas Used Reward
view all blocks produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
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.