ETH Price: $3,365.21 (+0.09%)

Token

EverRise NFT Stakes (nftRISE)
 

Overview

Max Total Supply

760 nftRISE

Holders

388

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 nftRISE
0xd5cfd86e09c9d736a49816f115c26dd73adccedf
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The EverRise token is a multi-chain cryptocurrency with an on-chain NFT staking platform that powers the EverRise dApp ecosystem. This smart contract locks staked EverRise (RISE) tokens as an on-blockchain NFT.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
nftEverRise

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-01
*/

// Copyright (c) 2022 EverRise Pte Ltd. All rights reserved.
// EverRise licenses this file to you under the MIT license.
/*
 EverRise Staking NFTs are containers of Vote Escrowed (ve)EverRise 
 weighted governance tokens. veRISE generates rewards from the 
 auto-buyback with a market driven yield curve, based on the transaction
 volume of EverRise trades and veEverRise sales.

 On sales of nftEverRise Staking NFTs a 10% royalty fee is collected:

 * 6% for token auto-buyback from the market, with bought back tokens
      directly distributed as ve-staking rewards
 * 4% for Business Development (Development, Sustainability and Marketing)

                           ________                              _______   __
                          /        |                            /       \ /  |
                          $$$$$$$$/__     __  ______    ______  $$$$$$$  |$$/   _______   ______  v3.14159265
                          $$ |__  /  \   /  |/      \  /      \ $$ |__$$ |/  | /       | /      \
                          $$    | $$  \ /$$//$$$$$$  |/$$$$$$  |$$    $$< $$ |/$$$$$$$/ /$$$$$$  |
 _______ _______ _______  $$$$$/   $$  /$$/ $$    $$ |$$ |  $$/ $$$$$$$  |$$ |$$      \ $$    $$ |
|    |  |    ___|_     _| $$ |_____ $$ $$/  $$$$$$$$/ $$ |      $$ |  $$ |$$ | $$$$$$  |$$$$$$$$/
|       |    ___| |   |   $$       | $$$/   $$       |$$ |      $$ |  $$ |$$ |/     $$/ $$       |
|__|____|___|     |___|   $$$$$$$$/   $/     $$$$$$$/ $$/       $$/   $$/ $$/ $$$$$$$/   $$$$$$$/ Magnum opus

Learn more about EverRise and the EverRise Ecosystem of dApps and
how our utilities and partners can help protect your investors
and help your project grow: https://everrise.com
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.13;

error NotZeroAddress();                    // 0x66385fa3
error CallerNotApproved();                 // 0x4014f1a5
error InvalidAddress();                    // 0xe6c4247b
error CallerNotOwner();
error WalletLocked();                      // 0xd550ed24
error DoesNotExist();                      // 0xb0ce7591
error AmountMustBeGreaterThanZero();       // 0x5e85ae73
error AmountOutOfRange();                  // 0xc64200e9
error StakeStillLocked();                  // 0x7f6699f6
error NotStakerAddress();                  // 0x2a310a0c
error AmountLargerThanAvailable();         // 0xbb296109
error StakeCanOnlyBeExtended();            // 0x73f7040a
error ArrayLengthsMismatch();              // 0x3b800a46
error NotSetup();                          // 0xb09c99c0
error NotAllowedToCreateRewards();         // 0xfdc42f29
error NotAllowedToDeliverRewards();        // 0x69a3e246
error ERC721ReceiverReject();              // 0xfa34343f
error ERC721ReceiverNotImplemented();      // 0xa89c6c0d
error NotEnoughToCoverStakeFee();          // 0x627554ed
error AmountLargerThanAllowance();         // 0x9b144c57
error AchievementNotClaimed();             // 0x3834dd9c
error AchievementAlreadyClaimed();         // 0x2d5345f4
error AmountMustBeAnInteger();             // 0x743aec61
error BrokenStatusesDiffer();              // 0x097b027d
error AchievementClaimStatusesDiffer();    // 0x6524e8b0
error UnlockedStakesMustBeSametimePeriod();// 0x42e227b0
error CannotMergeLockedAndUnlockedStakes();// 0x9efeef2c
error StakeUnlocked();                     // 0x6717a455
error NoRewardsToClaim();                  // 0x73380d99
error NotTransferrable();                  // 0x54ee5151
error Overflow();                          // 0x35278d12
error MergeNotEnabled();                   // 0x

// File: EverRise-v3/Interfaces/IERC173-Ownable.sol

interface IOwnable {
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    function owner() external view returns (address);
    function transferOwnership(address newOwner) external;
}

// File: EverRise-v3/Abstract/Context.sol

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

// File: EverRise-v3/Abstract/ERC173-Ownable.sol

contract Ownable is IOwnable, Context {
    address public owner;

    function _onlyOwner() private view {
        if (owner != _msgSender()) revert CallerNotOwner();
    }

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

    constructor() {
        address msgSender = _msgSender();
        owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    // Allow contract ownership and access to contract onlyOwner functions
    // to be locked using EverOwn with control gated by community vote.
    //
    // EverRise ($RISE) stakers become voting members of the
    // decentralized autonomous organization (DAO) that controls access
    // to the token contract via the EverRise Ecosystem dApp EverOwn
    function transferOwnership(address newOwner) external virtual onlyOwner {
        if (newOwner == address(0)) revert NotZeroAddress();

        emit OwnershipTransferred(owner, newOwner);
        owner = newOwner;
    }
}

struct ApprovalChecks {
    // Prevent permits being reused (IERC2612)
    uint64 nonce;
    // Allow revoke all spenders/operators approvals in single txn
    uint32 nftCheck;
    uint32 tokenCheck;
    // Allow auto timeout on approvals
    uint16 autoRevokeNftHours;
    uint16 autoRevokeTokenHours;
    // Allow full wallet locking of all transfers
    uint48 unlockTimestamp;
}

struct Allowance {
    uint128 tokenAmount;
    uint32 nftCheck;
    uint32 tokenCheck;
    uint48 timestamp;
    uint8 nftApproval;
    uint8 tokenApproval;
}

interface IEverRiseWallet {
    event RevokeAllApprovals(address indexed account, bool tokens, bool nfts);
    event SetApprovalAutoTimeout(address indexed account, uint16 tokensHrs, uint16 nftsHrs);
    event LockWallet(address indexed account, address altAccount, uint256 length);
    event LockWalletExtend(address indexed account, uint256 length);
}

// File: EverRise-v3/Interfaces/IERC20-Token.sol

interface IERC20 {
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    function increaseAllowance(address spender, uint256 addedValue) external returns (bool);
    function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool);
    function transferFromWithPermit(address sender, address recipient, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external returns (bool);
}

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}

// File: EverRise-v3/Interfaces/IEverRise.sol

interface IEverRise is IERC20Metadata {
    function totalBuyVolume() external view returns (uint256);
    function totalSellVolume() external view returns (uint256);
    function holders() external view returns (uint256);
    function uniswapV2Pair() external view returns (address);
    function transferStake(address fromAddress, address toAddress, uint96 amountToTransfer) external;
    function isWalletLocked(address fromAddress) external view returns (bool);
    function setApprovalForAll(address fromAddress, address operator, bool approved) external;
    function isApprovedForAll(address account, address operator) external view returns (bool);
    function isExcludedFromFee(address account) external view returns (bool);

    function approvals(address operator) external view returns (ApprovalChecks memory);
}


// File: EverRise-v3/Interfaces/IERC721-Nft.sol

interface IERC721 /* is ERC165 */ {
    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
    event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
    function balanceOf(address _owner) external view returns (uint256);
    function ownerOf(uint256 _tokenId) external view returns (address);
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) external payable;
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
    function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
    function approve(address _approved, uint256 _tokenId) external payable;
    function setApprovalForAll(address _operator, bool _approved) external;
    function getApproved(uint256 _tokenId) external view returns (address);
    function isApprovedForAll(address _owner, address _operator) external view returns (bool);
}

// File: EverRise-v3/Interfaces/InftEverRise.sol

struct StakingDetails {
    uint96 initialTokenAmount;    // Max 79 Bn tokens
    uint96 withdrawnAmount;       // Max 79 Bn tokens
    uint48 depositTime;           // 8 M years
    uint8 numOfMonths;            // Max 256 month period
    uint8 achievementClaimed;
    // 256 bits, 20000 gwei gas
    address stakerAddress;        // 160 bits (96 bits remaining)
    uint32 nftId;                 // Max 4 Bn nfts issued
    uint32 lookupIndex;           // Max 4 Bn active stakes
    uint24 stakerIndex;           // Max 16 M active stakes per wallet
    uint8 isActive;
    // 256 bits, 20000 gwei gas
} // Total 768 bits, 40000 gwei gas

interface InftEverRise is IERC721 {
    function voteEscrowedBalance(address account) external view returns (uint256);
    function unclaimedRewardsBalance(address account) external view returns (uint256);
    function totalAmountEscrowed() external view returns (uint256);
    function totalAmountVoteEscrowed() external view returns (uint256);
    function totalRewardsDistributed() external view returns (uint256);
    function totalRewardsUnclaimed() external view returns (uint256);

    function createRewards(uint256 tAmount) external;

    function getNftData(uint256 id) external view returns (StakingDetails memory);
    function enterStaking(address fromAddress, uint96 amount, uint8 numOfMonths) external returns (uint32 nftId);
    function leaveStaking(address fromAddress, uint256 id, bool overrideNotClaimed) external returns (uint96 amount);
    function earlyWithdraw(address fromAddress, uint256 id, uint96 amount) external returns (uint32 newNftId, uint96 penaltyAmount);
    function withdraw(address fromAddress, uint256 id, uint96 amount, bool overrideNotClaimed) external returns (uint32 newNftId);
    function bridgeStakeNftOut(address fromAddress, uint256 id) external returns (uint96 amount);
    function bridgeOrAirdropStakeNftIn(address toAddress, uint96 depositAmount, uint8 numOfMonths, uint48 depositTime, uint96 withdrawnAmount, uint96 rewards, bool achievementClaimed) external returns (uint32 nftId);
    function addStaker(address staker, uint256 nftId) external;
    function removeStaker(address staker, uint256 nftId) external;
    function reissueStakeNft(address staker, uint256 oldNftId, uint256 newNftId) external;
    function increaseStake(address staker, uint256 nftId, uint96 amount) external returns (uint32 newNftId, uint96 original, uint8 numOfMonths);
    function splitStake(uint256 id, uint96 amount) external payable returns (uint32 newNftId0, uint32 newNftId1);
    function claimAchievement(address staker, uint256 nftId) external returns (uint32 newNftId);
    function stakeCreateCost() external view returns (uint256);
    function approve(address owner, address _operator, uint256 nftId) external;
}

// File: EverRise-v3/Abstract/virtualToken.sol

abstract contract virtualToken is Ownable, IERC20, IERC20Metadata {
    InftEverRise public veEverRise;

    uint8 public constant decimals = 18;
    string public name;
    string public symbol;
  
    constructor(string memory _name, string memory _symbol ) {
        name = _name;
        symbol = _symbol;
        veEverRise = InftEverRise(owner);
    }

    function transferFrom(address sender, address recipient, uint256 amount)
        external returns (bool) {
        
        if (_msgSender() != owner) { 
            notTransferrable();
        }

        emit Transfer(sender, recipient, amount);
        return true;
    }

    function transfer(address, uint256) pure external returns (bool) {
        notTransferrable();
    }
    function allowance(address, address) pure external returns (uint256) {
        return 0;
    }
    function approve(address, uint256) pure external returns (bool) {
        notTransferrable();
    }
    function increaseAllowance(address, uint256) pure external returns (bool) {
        notTransferrable();
    }
    function decreaseAllowance(address, uint256) pure external returns (bool) {
        notTransferrable();
    }
    function transferFromWithPermit(address, address, uint256, uint256, uint8, bytes32, bytes32) pure external returns (bool) {
        notTransferrable();
    }

    function notTransferrable() pure private {
        revert NotTransferrable();
    }
}
// File: EverRise-v3/claimRISE.sol

// Copyright (c) 2022 EverRise Pte Ltd. All rights reserved.
// EverRise licenses this file to you under the MIT license.
/*
 Virtual token that allows unclaimed rewards from EverRise Staking NFTs
 and its Vote Escrowed (ve) EverRise to display in wallet balances.
                                    ________                              _______   __
                                   /        |                            /       \ /  |
                                   $$$$$$$$/__     __  ______    ______  $$$$$$$  |$$/   _______   ______  v3.14159265
                                   $$ |__  /  \   /  |/      \  /      \ $$ |__$$ |/  | /       | /      \
      ______      _____            $$    | $$  \ /$$//$$$$$$  |/$$$$$$  |$$    $$< $$ |/$$$$$$$/ /$$$$$$  |
_________  /_____ ___(_)______ ___ $$$$$/   $$  /$$/ $$    $$ |$$ |  $$/ $$$$$$$  |$$ |$$      \ $$    $$ |
_  ___/_  /_  __ `/_  /__  __ `__ \$$ |_____ $$ $$/  $$$$$$$$/ $$ |      $$ |  $$ |$$ | $$$$$$  |$$$$$$$$/
/ /__ _  / / /_/ /_  / _  / / / / /$$       | $$$/   $$       |$$ |      $$ |  $$ |$$ |/     $$/ $$       |
\___/ /_/  \__,_/ /_/  /_/ /_/ /_/ $$$$$$$$/   $/     $$$$$$$/ $$/       $$/   $$/ $$/ $$$$$$$/   $$$$$$$/

Learn more about EverRise and the EverRise Ecosystem of dApps and
how our utilities and partners can help protect your investors
and help your project grow: https://www.everrise.com
*/

contract claimRise is virtualToken("EverRise Rewards", "claimRISE") {
    function totalSupply() override external view returns (uint256) {
        return veEverRise.totalRewardsUnclaimed();
    }

    function balanceOf(address account) override external view returns (uint256) {
        if (account == owner) return 0;
        
        return veEverRise.unclaimedRewardsBalance(account);
    }
}
// File: EverRise-v3/veRISE.sol

// Copyright (c) 2022 EverRise Pte Ltd. All rights reserved.
// EverRise licenses this file to you under the MIT license.
/*
 Virtual token that allows the Vote Escrowed (ve) EverRise weigthed
 governance tokens from EverRise Staking NFTs to display in
 wallet balances.
 
             ________                              _______   __
            /        |                            /       \ /  |
            $$$$$$$$/__     __  ______    ______  $$$$$$$  |$$/   _______   ______  v3.14159265
            $$ |__  /  \   /  |/      \  /      \ $$ |__$$ |/  | /       | /      \
            $$    | $$  \ /$$//$$$$$$  |/$$$$$$  |$$    $$< $$ |/$$$$$$$/ /$$$$$$  |
__   _____  $$$$$/   $$  /$$/ $$    $$ |$$ |  $$/ $$$$$$$  |$$ |$$      \ $$    $$ |
\ \ / / _ \ $$ |_____ $$ $$/  $$$$$$$$/ $$ |      $$ |  $$ |$$ | $$$$$$  |$$$$$$$$/
 \ V /  __/ $$       | $$$/   $$       |$$ |      $$ |  $$ |$$ |/     $$/ $$       |
  \_/ \___| $$$$$$$$/   $/     $$$$$$$/ $$/       $$/   $$/ $$/ $$$$$$$/   $$$$$$$/

Learn more about EverRise and the EverRise Ecosystem of dApps and
how our utilities and partners can help protect your investors
and help your project grow: https://www.everrise.com
*/

contract veRise is virtualToken("Vote-escrowed EverRise", "veRISE") {
    function totalSupply() override external view returns (uint256) {
        return veEverRise.totalAmountVoteEscrowed();
    }

    function balanceOf(address account) override external view returns (uint256) {
        if (account == owner) return 0;

        return veEverRise.voteEscrowedBalance(account);
    }
}

// File: EverRise-v3/Interfaces/IEverRoyaltySplitter.sol

interface IEverRoyaltySplitter {
    event RoyaltiesSplit(uint256 value);
    event SplitUpdated(uint256 previous, uint256 current);
    event UniswapV2RouterSet(address indexed previous, address indexed current);
    event EverRiseEcosystemSet(address indexed previous, address indexed current);
    event EverRiseTokenSet(address indexed previous, address indexed current);
    event StableCoinSet(address indexed previous, address indexed current);

    function distribute() external;
}

/// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02.
interface IERC721TokenReceiver {
    function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) external view returns(bytes4);
}

interface IERC721Metadata /* is ERC721 */ {
    function name() external view returns (string memory _name);
    function symbol() external view returns (string memory _symbol);
    function tokenURI(uint256 _tokenId) external view returns (string memory);
}

interface IERC721Enumerable /* is ERC721 */ {
    function totalSupply() external view returns (uint256);
    function tokenByIndex(uint256 _index) external view returns (uint256);
    function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256);
}

// File: EverRise-v3/Interfaces/IEverRiseRenderer.sol

interface IOpenSeaCollectible {
    function contractURI() external view returns (string memory);
}

interface IEverRiseRenderer is IOpenSeaCollectible {
    event SetEverRiseNftStakes(address indexed addressStakes);
    event SetEverRiseRendererGlyph(address indexed addressGlyphs);
    
    function tokenURI(uint256 _tokenId) external view returns (string memory);

    function everRiseNftStakes() external view returns (InftEverRise);
    function setEverRiseNftStakes(address contractAddress) external;
}

// File: EverRise-v3/Interfaces/IERC165-SupportsInterface.sol

interface IERC165 {
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: EverRise-v3/Abstract/ERC165-SupportsInterface.sol

abstract contract ERC165 is IERC165 {
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: EverRise-v3/Interfaces/IERC2981-Royalty.sol

interface IERC2981 is IERC165 {
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (
        address receiver,
        uint256 royaltyAmount
    );
}

// File: EverRise-v3/nftEverRise.sol

// Copyright (c) 2022 EverRise Pte Ltd. All rights reserved.
// EverRise licenses this file to you under the MIT license.
/*
 EverRise Staking NFTs are Vote Escrowed (ve) EverRise weigthed governance tokens
 which generate rewards with a market driven yield curve, based of the
 transaction volume of EverRise trades and veEverRise sales.

 On sales of veEverRise Staking NFTs a 10% royalty fee is collected
 * 6% for token Buyback from the market, 
     with bought back tokens directly distributed as ve-staking rewards
 * 4% for Business Development (Development, Sustainability and Marketing)

                           ________                              _______   __
                          /        |                            /       \ /  |
                          $$$$$$$$/__     __  ______    ______  $$$$$$$  |$$/   _______   ______  v3.14159265
                          $$ |__  /  \   /  |/      \  /      \ $$ |__$$ |/  | /       | /      \
                          $$    | $$  \ /$$//$$$$$$  |/$$$$$$  |$$    $$< $$ |/$$$$$$$/ /$$$$$$  |
 _______ _______ _______  $$$$$/   $$  /$$/ $$    $$ |$$ |  $$/ $$$$$$$  |$$ |$$      \ $$    $$ |
|    |  |    ___|_     _| $$ |_____ $$ $$/  $$$$$$$$/ $$ |      $$ |  $$ |$$ | $$$$$$  |$$$$$$$$/
|       |    ___| |   |   $$       | $$$/   $$       |$$ |      $$ |  $$ |$$ |/     $$/ $$       |
|__|____|___|     |___|   $$$$$$$$/   $/     $$$$$$$/ $$/       $$/   $$/ $$/ $$$$$$$/   $$$$$$$/

Learn more about EverRise and the EverRise Ecosystem of dApps and
how our utilities and partners can help protect your investors
and help your project grow: https://www.everrise.com
*/

contract EverRiseTokenOwned is Ownable {
    IEverRise public everRiseToken;

    event EverRiseTokenSet(address indexed tokenAddress);
    
    function _onlyEverRiseToken(address senderAddress) private view {
        if (address(everRiseToken) == address(0)) revert NotSetup();
        if (address(everRiseToken) != senderAddress) revert CallerNotApproved();
    }

    modifier onlyEverRiseToken() {
        _onlyEverRiseToken(_msgSender());
        _;
    }
}

struct IndividualAllowance {
    address operator;
    uint48 timestamp;
    uint32 nftCheck;
}

abstract contract nftEverRiseConfigurable is EverRiseTokenOwned, InftEverRise, ERC165, IERC2981, IERC721Metadata, IOpenSeaCollectible {
    event AddRewardCreator(address indexed _address);
    event RemoveRewardCreator(address indexed _address);
    event SetAchievementNfts(address indexed _address);
    event RoyaltyFeeUpdated(uint256 newValue);
    event RoyaltyAddressUpdated(address indexed contractAddress);
    event RendererAddressUpdated(address indexed contractAddress);
    event StakeCreateCostUpdated(uint256 newValue);
    event StakingParametersSet(uint256 withdrawPct, uint256 firstHalfPenality, uint256 secondHalfPenality, uint256 maxStakeMonths, bool mergeEnabled);
 
    IEverRiseRenderer public renderer;
    IEverRoyaltySplitter public royaltySplitter;
    uint256 public nftRoyaltySplit = 10;
    address public currentAchievementNfts;
    uint8 public maxEarlyWithdrawalPercent = 60;
    uint8 public firstHalfPenality = 25;
    uint8 public secondHalfPenality = 10;
    uint8 public maxStakeMonths = 36;
    uint256 public stakeCreateCost = 1 * 10**18 / (10**2);
    uint256 public mergeEnabled = _FALSE;

    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.
    uint256 constant _FALSE = 1;
    uint256 constant _TRUE = 2;

    mapping (address => bool) internal _canCreateRewards;

    function setEverRiseToken(address tokenAddress) external onlyOwner {
        if (tokenAddress == address(0)) revert NotZeroAddress();

        _removeAddressToCreate(address(everRiseToken));
        addAddressToCreate(tokenAddress);

        everRiseToken = IEverRise(tokenAddress);

        emit EverRiseTokenSet(tokenAddress);
    }

    function setStakeCreateCost(uint256 _stakeCreateCost, uint256 numOfDecimals)
        external onlyOwner
    {
        // Catch typos, if decimals are pre-added
        if (_stakeCreateCost > 1_000) revert AmountOutOfRange();

        stakeCreateCost = _stakeCreateCost * (10**18) / (10**numOfDecimals);
        emit StakeCreateCostUpdated(_stakeCreateCost);
    }
    
    function setAchievementNfts(address contractAddress) external onlyOwner() {
        if (contractAddress == address(0)) revert NotZeroAddress();

        currentAchievementNfts = contractAddress;

        emit SetAchievementNfts(contractAddress);
    }

    function addAddressToCreate(address account) public onlyOwner {
        if (account == address(0)) revert NotZeroAddress();

        _canCreateRewards[account] = true;
        emit AddRewardCreator(account);
    }

    function removeAddressToCreate(address account) external onlyOwner {
        if (account == address(0)) revert NotZeroAddress();

        _removeAddressToCreate(account);
    }

    function _removeAddressToCreate(address account) private {
        if (account != address(0)){
            _canCreateRewards[account] = false;
            emit RemoveRewardCreator(account);
        }
    }
    
    function setNftRoyaltyFeePercent(uint256 royaltySplitRate) external onlyOwner {
        if (royaltySplitRate > 10) revert AmountOutOfRange();
        nftRoyaltySplit = royaltySplitRate;

        emit RoyaltyFeeUpdated(royaltySplitRate);
    }

    function setRoyaltyAddress(address newAddress) external onlyOwner {
        if (newAddress == address(0)) revert NotZeroAddress();

        royaltySplitter = IEverRoyaltySplitter(newAddress);
        emit RoyaltyAddressUpdated(newAddress);
    }

    function setRendererAddress(address newAddress) external onlyOwner {
        if (newAddress == address(0)) revert NotZeroAddress();

        renderer = IEverRiseRenderer(newAddress);
        emit RendererAddressUpdated(newAddress);
    }

    function setStakingParameters(uint8 _withdrawPercent, uint8 _firstHalfPenality, uint8 _secondHalfPenality, uint8 _maxStakeMonths, bool _mergEnabled)
        external onlyOwner
    {
        if (_maxStakeMonths == 0 || _maxStakeMonths > 120) {
            revert AmountOutOfRange();
        }

        maxEarlyWithdrawalPercent = _withdrawPercent;
        firstHalfPenality = _firstHalfPenality;
        secondHalfPenality = _secondHalfPenality;
        maxStakeMonths = _maxStakeMonths;
        mergeEnabled = _mergEnabled ? _TRUE : _FALSE;

        emit StakingParametersSet(_withdrawPercent, _firstHalfPenality, _secondHalfPenality, _maxStakeMonths, _mergEnabled);
    }
}

contract nftEverRise is nftEverRiseConfigurable {
    string public constant name = "EverRise NFT Stakes";
    string public constant symbol = "nftRISE";

    uint256 public constant month = 30 days;

    uint256 private constant MAX = ~uint256(0);
    uint8 public constant decimals = 0;
    uint256 private constant totalStakeTokensSupply = 120_000_000 * 10**6 * 10**18;
    uint8 constant _FALSE8 = 1;
    uint8 constant _TRUE8 = 2;
    
    event RewardsWithdrawn(address indexed from, uint256 amount);
    event ExcludedFromRewards(address indexed _address);
    event IncludedToRewards(address indexed _address);

    mapping (address => bool) private _isExcludedFromReward;
    mapping (address => uint256) private _rOwned;
    mapping (address => uint256) private _tOwned;
    mapping (address => uint256) private _withdrawnRewards;
    mapping (uint256 => IndividualAllowance) private _individualApproval;

    address[] private _excludedList;

    uint256 private _rTotal = (MAX - (MAX % totalStakeTokensSupply));

    StakingDetails[] private _allStakeDetails;
    mapping (address => uint256[]) private _individualStakes;
    mapping (uint256 => uint256) private _stakeById;
    uint256[] private _freeStakes;
    mapping (address => uint256) public voteEscrowedBalance;
    uint256 public totalAmountEscrowed;
    uint256 public totalAmountVoteEscrowed;
    uint256 public totalRewardsDistributed;
    
    uint32 private nextNftId = 1;
    veRise public immutable veRiseToken;
    claimRise public immutable claimRiseToken;

    constructor() {
        veRiseToken = new veRise();
        claimRiseToken = new claimRise();

        _rOwned[address(this)] = _rTotal;
        
        excludeFromReward(address(this));

        _allStakeDetails.push(StakingDetails({
            initialTokenAmount: 0,
            withdrawnAmount: 0,
            depositTime: 0,
            numOfMonths: 1,
            achievementClaimed: 0,
            stakerAddress: address(0),
            nftId: 0,
            lookupIndex: 0,
            stakerIndex: 0,
            isActive: _FALSE8
        }));
    }
 
    function _walletLock(address fromAddress) private view {
        if (everRiseToken.isWalletLocked(fromAddress)) revert WalletLocked();
    }

    modifier walletLock(address fromAddress) {
        _walletLock(fromAddress);
        _;
    }

    function totalSupply() external view returns (uint256) {
        return _allStakeDetails.length - _freeStakes.length - 1;
    }

    function _onlyRewardCreator(address senderAddress) private view {
        if (!_canCreateRewards[senderAddress]) revert CallerNotApproved();
    }

    modifier onlyRewardCreator() {
        _onlyRewardCreator(_msgSender());
        _;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override (ERC165, IERC165) returns (bool) {
        return 
            interfaceId == type(IERC2981).interfaceId ||
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    function contractURI() external view returns (string memory) {
        return renderer.contractURI();
    }

    function tokenURI(uint256 nftId) external view returns (string memory) {
        return renderer.tokenURI(nftId);
    }
    
    function createRewards(uint256 amount) external onlyRewardCreator() {
        address sender = _msgSender();
        if (_isExcludedFromReward[sender]) revert NotAllowedToDeliverRewards();
        
        _transferFromExcluded(address(this), sender, amount);

        totalRewardsDistributed += amount;
        
        uint256 rAmount = amount * _getRate();
        _rOwned[sender] -= rAmount;
        _rTotal -= rAmount;

        claimRiseToken.transferFrom(address(0), address(this), amount);
    }

    function voteEscrowedAndRewards(address account) private view returns (uint256) {
        if (account == address(0)) revert NotZeroAddress();

        if (_isExcludedFromReward[account]) return _tOwned[account];
        return tokenFromRewards(_rOwned[account]);
    }

    function totalRewardsUnclaimed() external view returns (uint256) {
        return everRiseToken.balanceOf(address(this));
    }

    function isExcludedFromReward(address account) external view returns (bool) {
        if (account == address(0)) revert NotZeroAddress();

        return _isExcludedFromReward[account];
    }
    
    function rewardsFromToken(uint256 tAmount) external view returns(uint256) {
        if (tAmount > totalStakeTokensSupply) revert AmountOutOfRange();

        return tAmount * _getRate();
    }

    function tokenFromRewards(uint256 rAmount) public view returns(uint256) {
        if (rAmount > _rTotal) revert AmountOutOfRange();

        uint256 currentRate =  _getRate();
        return rAmount / currentRate;
    }
    
    function excludeFromReward(address account) public onlyOwner() {
        if (account == address(0)) revert NotZeroAddress();
        if (_isExcludedFromReward[account]) revert InvalidAddress();

        if(_rOwned[account] > 0) {
            _tOwned[account] = tokenFromRewards(_rOwned[account]);
        }
        _isExcludedFromReward[account] = true;
        _excludedList.push(account);

        emit ExcludedFromRewards(account);
    }

    function includeInReward(address account) external onlyOwner() {
        if (account == address(0)) revert NotZeroAddress();
        if (!_isExcludedFromReward[account]) revert InvalidAddress();
          
        uint256 length = _excludedList.length;
        for (uint256 i = 0; i < length;) {
            if (_excludedList[i] == account) {
                _excludedList[i] = _excludedList[_excludedList.length - 1];
                _tOwned[account] = 0;
                _isExcludedFromReward[account] = false;
                _excludedList.pop();
                break;
            }
            unchecked {
                ++i;
            }
        }

        emit IncludedToRewards(account);
    }
    
    function _transfer(
        address sender,
        address recipient,
        uint256 amount,
        bool emitEvent
    ) private {
        if (sender == address(0)) revert NotZeroAddress();
        if (recipient == address(0)) revert NotZeroAddress();
        if (amount == 0) revert AmountMustBeGreaterThanZero();
        // One of the addresses has to be this contract
        if (sender != address(this) && recipient != address(this)) revert InvalidAddress();

        if (_isExcludedFromReward[sender]) {
            if (!_isExcludedFromReward[recipient]) {
                _transferFromExcluded(sender, recipient, amount);
            } else {
                _transferBothExcluded(sender, recipient, amount);
            }
        } else if (_isExcludedFromReward[recipient]) {
            _transferToExcluded(sender, recipient, amount);
        } else {
            _transferStandard(sender, recipient, amount);
        }

        if (emitEvent) {
            if (sender == address(this)) {
                veRiseToken.transferFrom(address(0), recipient, amount);
            }
            else if (recipient == address(this)) {
                veRiseToken.transferFrom(sender, address(0), amount);
            }
        }
    }
    
    function _transferStandard(address sender, address recipient, uint256 tAmount) private {
        uint256 rAmount = tAmount * _getRate();
        _rOwned[sender] -= rAmount;
        _rOwned[recipient] += rAmount;
    }

    function _transferToExcluded(address sender, address recipient, uint256 tAmount) private {
        uint256 rAmount = tAmount * _getRate();
	    _rOwned[sender] -= rAmount;
        _tOwned[recipient] += tAmount;
        _rOwned[recipient] += rAmount;           
    }

    function _transferFromExcluded(address sender, address recipient, uint256 tAmount) private {
        uint256 rAmount = tAmount * _getRate();
    	_tOwned[sender] -= tAmount;
        _rOwned[sender] -= rAmount;
        _rOwned[recipient] += rAmount;   
    }

    function _transferBothExcluded(address sender, address recipient, uint256 tAmount) private {
        uint256 rAmount = tAmount * _getRate();
    	_tOwned[sender] -= tAmount;
        _rOwned[sender] -= rAmount;
        _tOwned[recipient] += tAmount;
        _rOwned[recipient] += rAmount;        
    }
    
    function _getRate() private view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply / tSupply;
    }

    function _getCurrentSupply() private view returns(uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = totalStakeTokensSupply;      
        uint256 length = _excludedList.length;

        for (uint256 i = 0; i < length;) {
            if (_rOwned[_excludedList[i]] > rSupply || _tOwned[_excludedList[i]] > tSupply) {
                return (_rTotal, totalStakeTokensSupply);
            }
            rSupply -= _rOwned[_excludedList[i]];
            tSupply -= _tOwned[_excludedList[i]];
            
            unchecked {
                ++i;
            }
        }
        if (rSupply < (_rTotal / totalStakeTokensSupply)) return (_rTotal, totalStakeTokensSupply);
        return (rSupply, tSupply);
    }

    function getStakeIndex(uint256 nftId) private view returns (uint256 lookupIndex) {
        if (nftId == 0) revert DoesNotExist();
        lookupIndex = _stakeById[nftId];
        if (lookupIndex >= _allStakeDetails.length) revert DoesNotExist();
        if (_allStakeDetails[lookupIndex].isActive != _TRUE8) revert DoesNotExist();
    }

    function ownerOf(uint256 nftId) public view returns (address) {
        uint256 lookupIndex = getStakeIndex(nftId);
        StakingDetails storage stakeDetails = _allStakeDetails[lookupIndex];
        
        return stakeDetails.stakerAddress;
    }

    function _getStake(uint256 nftId, address staker) private view returns (uint256 lookupIndex, StakingDetails storage stakeDetails) {
        lookupIndex = getStakeIndex(nftId);
        stakeDetails = _allStakeDetails[lookupIndex];

        if (stakeDetails.stakerAddress != staker) revert NotStakerAddress();

        assert(nftId == stakeDetails.nftId);
    }

    function getStake(uint256 nftId, address staker) external view returns (StakingDetails memory stakeDetails) {
        (, stakeDetails) = _getStake(nftId, staker);
    }

    function getNftData(uint256 nftId) external view returns (StakingDetails memory) {
        uint256 lookupIndex = getStakeIndex(nftId);
        return _allStakeDetails[lookupIndex];
    }

    function balanceOf(address account) external view returns (uint256) {
        return _individualStakes[account].length;
    }
    
    function unclaimedRewardsBalance(address account) public view returns (uint256) {
        return voteEscrowedAndRewards(account) - voteEscrowedBalance[account];
    }

    function getTotalRewards(address account) external view returns (uint256) {
        return unclaimedRewardsBalance(account) + _withdrawnRewards[account];
    }
    
    function tokenOfOwnerByIndex(address _owner, uint256 index) external view returns (uint32) {
        uint256[] storage stakes = _individualStakes[_owner];
        if (index > stakes.length) revert AmountOutOfRange();
        uint256 lookupIndex = stakes[index];
        return _allStakeDetails[lookupIndex].nftId;
    }
    
    function enterStaking(address staker, uint96 amount, uint8 numOfMonths)
        external onlyEverRiseToken returns (uint32 nftId) {
        // Stake time period must be in valid range
        if (numOfMonths == 0 || 
            numOfMonths > maxStakeMonths || 
            (numOfMonths > 12 && (numOfMonths % 12) > 0)
        ) {
            revert AmountOutOfRange();
        }

        roundingCheck(amount, false);

        nftId = _createStake(staker, amount, 0, numOfMonths, uint48(block.timestamp), false);
     }
 
    // Rewards withdrawal doesn't need token lock check as is adding to locked wallet not removing
    function withdrawRewards() external {
        address staker = _msgSender();
        uint256 rewards = unclaimedRewardsBalance(staker);

        if (rewards == 0) revert NoRewardsToClaim();

        // Something to withdraw
        _withdrawnRewards[staker] += rewards;
        // Remove the veTokens for the rewards
        _transfer(staker, address(this), rewards, false);
        // Emit transfer
        claimRiseToken.transferFrom(staker, address(0), rewards);
        // Send RISE rewards
        require(everRiseToken.transfer(staker, rewards));

        emit RewardsWithdrawn(staker, rewards);
    }

    function checkNotLocked(uint256 depositTime, uint256 numOfMonths) private view {
        if (depositTime + (numOfMonths * month) > block.timestamp) {
            revert StakeStillLocked();
        }
    }

    function leaveStaking(address staker, uint256 nftId, bool overrideNotClaimed) external onlyEverRiseToken returns (uint96 amount) {
        (uint256 lookupIndex, StakingDetails storage stakeDetails) = _getStake(nftId, staker);

        checkNotLocked(stakeDetails.depositTime, stakeDetails.numOfMonths);

        if (!overrideNotClaimed && stakeDetails.achievementClaimed != _TRUE8) {
            revert AchievementNotClaimed();
        }
        
        amount = _removeStake(staker, nftId, lookupIndex, stakeDetails);
    }

    function withdraw(address staker, uint256 nftId, uint96 amount, bool overrideNotClaimed) external onlyEverRiseToken returns (uint32 newNftId) {
        (uint256 lookupIndex, StakingDetails storage stakeDetails) = _getStake(nftId, staker);

        checkNotLocked(stakeDetails.depositTime, stakeDetails.numOfMonths);

        if (!overrideNotClaimed && stakeDetails.achievementClaimed != _TRUE8) {
            revert AchievementNotClaimed();
        }

        uint96 remaining = stakeDetails.initialTokenAmount - stakeDetails.withdrawnAmount;
        if (amount > remaining) revert AmountLargerThanAvailable();
        roundingCheck(amount, true);

        bool reissueNft = false;
        if (amount > 0) {
            decreaseVeAmount(staker, amount, stakeDetails.numOfMonths, true);
            // Out of period, inital now becomes remaining
            remaining -= amount;
            reissueNft = true;
        }
        if (stakeDetails.initialTokenAmount != remaining) {
            // Out of period, zero out the withdrawal amount
            stakeDetails.initialTokenAmount = remaining;
            stakeDetails.withdrawnAmount = 0;
            reissueNft = true;
        }

        if (reissueNft) {
            if (remaining == 0) {
                _burnStake(staker, nftId, lookupIndex, stakeDetails);
                newNftId = 0;
            } else {
                newNftId = _reissueStakeNftId(nftId, lookupIndex);
                stakeDetails.nftId = newNftId;
            }
        } else {
            // Nothing changed, keep the same nft
            newNftId = uint32(nftId);
        }
    }

    function claimAchievement(address staker, uint256 nftId) external returns (uint32 newNftId) {
        if (_msgSender() != currentAchievementNfts) revert CallerNotApproved();

        (uint256 lookupIndex, StakingDetails storage stakeDetails) = _getStake(nftId, staker);

        checkNotLocked(stakeDetails.depositTime, stakeDetails.numOfMonths);

        // Can only claim once
        if (stakeDetails.achievementClaimed == _TRUE8) {
            revert AchievementAlreadyClaimed();
        }

        // Reset broken status if unlocked
        if (stakeDetails.withdrawnAmount > 0) {
            stakeDetails.initialTokenAmount -= stakeDetails.withdrawnAmount;
            stakeDetails.withdrawnAmount = 0;
        }

        // Mark claimed
        stakeDetails.achievementClaimed = _TRUE8;
        // Get new id
        newNftId = _reissueStakeNftId(nftId, lookupIndex);
        // Set new id
        stakeDetails.nftId = newNftId;
        // Emit burn and mint events
        _reissueStakeNft(staker, nftId, newNftId);
    }

    function getTime() external view returns (uint256) {
        // Used to workout UI time drift from blockchain
        return block.timestamp;
    }

    function checkLocked(uint48 depositTime, uint8 numOfMonths) private view {
        if (depositTime + (numOfMonths * month) < block.timestamp) {
            revert StakeUnlocked();
        }
    }

    function earlyWithdraw(address staker, uint256 nftId, uint96 amount) external onlyEverRiseToken returns (uint32 newNftId, uint96 penaltyAmount) {
        (uint256 lookupIndex, StakingDetails storage stakeDetails) = _getStake(nftId, staker);
        
        checkLocked(stakeDetails.depositTime, stakeDetails.numOfMonths);

        uint256 remaingEarlyWithdrawal = (stakeDetails.initialTokenAmount * maxEarlyWithdrawalPercent) / 100 - stakeDetails.withdrawnAmount;

        if (amount > remaingEarlyWithdrawal) {
            revert AmountLargerThanAvailable();
        }

        roundingCheck(amount, false);

        decreaseVeAmount(staker, amount, stakeDetails.numOfMonths, true);
        
        penaltyAmount = calculateTax(amount, stakeDetails.depositTime, stakeDetails.numOfMonths); // calculate early penalty tax

        stakeDetails.withdrawnAmount += uint96(amount); // update the withdrawl amount

        newNftId = _reissueStakeNftId(nftId, lookupIndex);
        stakeDetails.nftId = newNftId;
    }

    function increaseStake(address staker, uint256 nftId, uint96 amount)
        external onlyEverRiseToken returns (uint32 newNftId, uint96 original, uint8 numOfMonths)
    {
        (uint256 lookupIndex, StakingDetails storage stakeDetails) = _getStake(nftId, staker);

        checkLocked(stakeDetails.depositTime, stakeDetails.numOfMonths);

        roundingCheck(amount, false);
        numOfMonths = stakeDetails.numOfMonths;

        increaseVeAmount(staker, amount, numOfMonths, true);
        // Get current amount for main contract change event
        original = stakeDetails.initialTokenAmount - stakeDetails.withdrawnAmount;
        // Take amount off the withdrawnAmount, "repairing" the stake
        if (amount > stakeDetails.withdrawnAmount) {
            // Take withdrawn off amount
            amount -= stakeDetails.withdrawnAmount;
            // Clear withdrawn
            stakeDetails.withdrawnAmount = 0;
            // Add remaining to initial
            stakeDetails.initialTokenAmount += amount;
        } else {
            // Just reduce amount withdrawn
            stakeDetails.withdrawnAmount -= amount;
        }

        // Relock
        stakeDetails.depositTime = uint48(block.timestamp);

        newNftId =  _reissueStakeNftId(nftId, lookupIndex);
        stakeDetails.nftId = newNftId;
        _reissueStakeNft(staker, nftId, newNftId);
    }
    
    function extendStake(uint256 nftId, uint8 numOfMonths) external walletLock(_msgSender()) returns (uint32 newNftId) {
        address staker = _msgSender();
        (uint256 lookupIndex, StakingDetails storage stakeDetails) = _getStake(nftId, staker);
        
        checkLocked(stakeDetails.depositTime, stakeDetails.numOfMonths);

        if (stakeDetails.numOfMonths >= numOfMonths) revert StakeCanOnlyBeExtended();

        // Stake time period must be in valid range
        if (numOfMonths > maxStakeMonths || 
            (numOfMonths > 12 && (numOfMonths % 12) > 0)
        ) {
            revert AmountOutOfRange();
        }

        uint8 extraMonths = numOfMonths - stakeDetails.numOfMonths;
        uint96 amount = (stakeDetails.initialTokenAmount - stakeDetails.withdrawnAmount);
        
        increaseVeAmount(staker, amount, extraMonths, true);
        
        stakeDetails.numOfMonths = numOfMonths;
        // Relock
        stakeDetails.depositTime = uint48(block.timestamp);

        newNftId =  _reissueStakeNftId(nftId, lookupIndex);
        stakeDetails.nftId = newNftId;
        _reissueStakeNft(staker, nftId, newNftId);
    }

    function toUint96(uint256 value) internal pure returns (uint96) {
        if (value > type(uint96).max) revert Overflow();
        return uint96(value);
    }

    function splitStake(uint256 nftId, uint96 amount) external payable walletLock(_msgSender()) returns (uint32 newNftId0, uint32 newNftId1) {
        address staker = _msgSender();
        
        if (msg.value < stakeCreateCost) revert NotEnoughToCoverStakeFee();
        roundingCheck(amount, false);

        // Transfer everything, easier than transferring extras later
        payable(address(everRiseToken)).transfer(address(this).balance);

        (uint256 lookupIndex, StakingDetails storage stakeDetails) = _getStake(nftId, staker);

        uint256 remainingAmount = stakeDetails.initialTokenAmount - stakeDetails.withdrawnAmount;

        if (amount >= remainingAmount) revert AmountLargerThanAvailable();
  
        newNftId0 = _reissueStakeNftId(nftId, lookupIndex);
        // Update the existing stake
        uint96 transferredWithdrawnAmount = toUint96(stakeDetails.withdrawnAmount * uint256(amount) / stakeDetails.initialTokenAmount);

        stakeDetails.initialTokenAmount -= amount;
        stakeDetails.withdrawnAmount -= transferredWithdrawnAmount;
        stakeDetails.nftId = newNftId0;

        // Create new stake
        newNftId1 = _addSplitStake(
            staker, 
            amount, // initialTokenAmount
            transferredWithdrawnAmount, // withdrawnAmount
            stakeDetails.depositTime,        // depositTime
            stakeDetails.numOfMonths,
            stakeDetails.achievementClaimed == _TRUE8 // achievementClaimed
        );

        _reissueStakeNft(staker, nftId, newNftId0);
        emit Transfer(address(0), staker, newNftId1);
    }

    function roundingCheck(uint96 amount, bool allowZero) private pure {
        // Round to nearest unit
        uint96 roundedAmount = amount - (amount % uint96(10**18));

        if (amount != roundedAmount || (!allowZero && amount == 0)) revert AmountMustBeAnInteger();
    }

    function mergeStakes(uint256 nftId0, uint256 nftId1, bool overrideStatuses)
        external walletLock(_msgSender())
        returns (uint32 newNftId)
    {
        if (mergeEnabled != _TRUE) revert MergeNotEnabled();
        
        address staker = _msgSender();
        (uint256 lookupIndex0, StakingDetails storage stakeDetails0) = _getStake(nftId0, staker);
        (uint256 lookupIndex1, StakingDetails storage stakeDetails1) = _getStake(nftId1, staker);

        bool unlocked0 = stakeDetails0.depositTime + (stakeDetails0.numOfMonths * month) < block.timestamp;
        bool unlocked1 = stakeDetails1.depositTime + (stakeDetails1.numOfMonths * month) < block.timestamp;

        if (unlocked0 == unlocked1) {
            if (stakeDetails0.numOfMonths != stakeDetails1.numOfMonths) {
                revert UnlockedStakesMustBeSametimePeriod();
            }
            if (!overrideStatuses && stakeDetails0.achievementClaimed != stakeDetails1.achievementClaimed) {
                revert AchievementClaimStatusesDiffer();
            }
            
            // Reset broken status if unlocked
            if (stakeDetails0.withdrawnAmount > 0) {
                stakeDetails0.initialTokenAmount -= stakeDetails0.withdrawnAmount;
                stakeDetails0.withdrawnAmount = 0;
            }
            if (stakeDetails1.withdrawnAmount > 0) {
                stakeDetails1.initialTokenAmount -= stakeDetails1.withdrawnAmount;
                stakeDetails1.withdrawnAmount = 0;
            }
        } else if (unlocked0 != unlocked1) {
            revert CannotMergeLockedAndUnlockedStakes();
        } else {
            // Both locked
            if (!overrideStatuses && (stakeDetails0.withdrawnAmount > 0) != (stakeDetails1.withdrawnAmount > 0)) {
                revert BrokenStatusesDiffer();
            }
        }

        uint8 numOfMonths0 = stakeDetails0.numOfMonths;
        if (!unlocked0) {
            uint8 extraMonths = 0;
            uint96 amount = 0;
            // Must both be locked
            uint8 numOfMonths1 = stakeDetails1.numOfMonths;
            if (numOfMonths0 > numOfMonths1) {
                extraMonths = numOfMonths0 - numOfMonths1;
                amount = (stakeDetails1.initialTokenAmount - stakeDetails1.withdrawnAmount);
            } else if (numOfMonths0 < numOfMonths1) {
                extraMonths = numOfMonths1 - numOfMonths0;
                amount = (stakeDetails0.initialTokenAmount - stakeDetails0.withdrawnAmount);
                numOfMonths0 = numOfMonths1;
            }

            if (extraMonths > 0 && amount > 0) {
                // Give new tokens for time period
                increaseVeAmount(staker, amount, extraMonths, true);
            }
        }

        stakeDetails0.initialTokenAmount += stakeDetails1.initialTokenAmount;
        stakeDetails0.withdrawnAmount += stakeDetails1.withdrawnAmount;
        if (unlocked0) {
            // For unlocked, use higher of two deposit times
            // Can't "age" and nft by merging an older one in
            stakeDetails0.depositTime = stakeDetails0.depositTime > stakeDetails1.depositTime ?
                stakeDetails0.depositTime : stakeDetails1.depositTime;
        } else {
            // Re-lock starting now
            stakeDetails0.depositTime = uint48(block.timestamp);
        }

        stakeDetails0.numOfMonths = numOfMonths0;
        if (stakeDetails1.achievementClaimed == _TRUE8) {
            stakeDetails0.achievementClaimed = _TRUE8;
        }
        
        // Drop the second stake
        stakeDetails1.isActive = _FALSE8;
        uint24 stakerIndex = stakeDetails1.stakerIndex;
        _removeIndividualStake(staker, stakerIndex);
        // Clear the lookup for second
        _stakeById[nftId1] = 0;
        // Add to available data items
        _freeStakes.push(lookupIndex1);
        // Burn the second stake completely
        emit Transfer(staker, address(0), nftId1);

        // Renumber first stake
        newNftId = _reissueStakeNftId(nftId0, lookupIndex0);
        stakeDetails0.nftId = newNftId;
        _reissueStakeNft(staker, nftId0, newNftId);
    }

    function _addSplitStake(
        address staker, 
        uint96 initialTokenAmount,
        uint96 withdrawnAmount,
        uint48 depositTime,
        uint8 numOfMonths,
        bool achievementClaimed
    ) private returns (uint32 nftId) {
        uint256[] storage stakes = _individualStakes[staker];
        // Create new stake
        StakingDetails storage splitStakeDetails = _createStakeDetails(
            initialTokenAmount, // initialTokenAmount
            withdrawnAmount, // withdrawnAmount
            depositTime,        // depositTime
            numOfMonths,
            achievementClaimed, // achievementClaimed
            staker,
            uint24(stakes.length) // New staker's stake index
        );

        // Add new stake to individual's list
        stakes.push(splitStakeDetails.lookupIndex); 
        nftId = splitStakeDetails.nftId;
    }

    function bridgeStakeNftOut(address fromAddress, uint256 nftId) 
        external onlyEverRiseToken returns (uint96 amount)
    {
        (uint256 lookupIndex, StakingDetails storage stakeDetails) = _getStake(nftId, fromAddress);

        return _removeStake(fromAddress, nftId, lookupIndex, stakeDetails);
    }

    function bridgeOrAirdropStakeNftIn(address toAddress, uint96 depositAmount, uint8 numOfMonths, uint48 depositTime, uint96 withdrawnAmount, uint96 rewards, bool achievementClaimed) 
        external onlyEverRiseToken returns (uint32 nftId) {
            
        nftId = _createStake(toAddress, depositAmount, withdrawnAmount, numOfMonths, depositTime, achievementClaimed);
        if (rewards > 0) {
            _transfer(address(this), toAddress, rewards, false);
            // Emit event
            claimRiseToken.transferFrom(address(0), toAddress, rewards);
        }
    }

    function _createStakeDetails(
        uint96 initialTokenAmount,
        uint96 withdrawnAmount,
        uint48 depositTime,
        uint8 numOfMonths,
        bool achievementClaimed,
        address stakerAddress,
        uint24 stakerIndex
    ) private returns (StakingDetails storage stakeDetails) {
        uint256 index = _freeStakes.length;
        if (index > 0) {
            // Is an existing allocated StakingDetails
            // that we can reuse for cheaper gas
            index = _freeStakes[index - 1];
            _freeStakes.pop();
            stakeDetails = _allStakeDetails[index];
        } else {
            // None free, allocate a new StakingDetails
            index = _allStakeDetails.length;
            stakeDetails = _allStakeDetails.push();
        }

        // Set stake details
        stakeDetails.initialTokenAmount = initialTokenAmount;
        stakeDetails.withdrawnAmount = withdrawnAmount;
        stakeDetails.depositTime = depositTime;
        stakeDetails.numOfMonths = numOfMonths;
        stakeDetails.achievementClaimed = achievementClaimed ? _TRUE8 : _FALSE8;

        stakeDetails.stakerAddress = stakerAddress;
        stakeDetails.nftId = nextNftId;
        stakeDetails.lookupIndex = uint32(index);
        stakeDetails.stakerIndex = stakerIndex;
        stakeDetails.isActive = _TRUE8;

        // Set lookup
        _stakeById[nextNftId] = index;
        // Increase the next nft id
        ++nextNftId;
    }

    function _transferStake(address fromAddress, address toAddress, uint256 nftId) 
        private
    {
        (uint256 lookupIndex, StakingDetails storage stakeDetails) = _getStake(nftId, fromAddress);
        require(stakeDetails.withdrawnAmount == 0, "Broken, non-transferable");

        stakeDetails.stakerAddress = toAddress;
        // Full initial as withdrawn must be zero (above)
        uint96 amountToTransfer = stakeDetails.initialTokenAmount;

        uint8 numOfMonths = stakeDetails.numOfMonths;
        // Remove veTokens from sender (don't emit ve transfer event)
        decreaseVeAmount(fromAddress, amountToTransfer, numOfMonths, false);
        // Give veTokens to receiver (don't emit ve transfer event)
        increaseVeAmount(toAddress, amountToTransfer, numOfMonths, false);
        // Emit the ve transfer event
        veRiseToken.transferFrom(fromAddress, toAddress, amountToTransfer * numOfMonths);

        // Remove from previous owners list
        _removeIndividualStake(fromAddress, stakeDetails.stakerIndex);
        // Add to new owners list
        stakeDetails.stakerIndex = uint24(_individualStakes[toAddress].length);
        _individualStakes[toAddress].push(lookupIndex);

        everRiseToken.transferStake(fromAddress, toAddress, amountToTransfer);
    }

    function _removeIndividualStake(address staker, uint24 stakerIndex) private {
        uint256[] storage stakes = _individualStakes[staker];

        uint24 stakerLength = uint24(stakes.length);

        if (stakerLength >= stakerIndex + 1) {
            // Not last item, overwrite with last item from account stakes
            uint256 lastStakeIndex = stakes[stakerLength - 1];
            _allStakeDetails[lastStakeIndex].stakerIndex = stakerIndex;
            stakes[stakerIndex] = lastStakeIndex;
        }
        // Remove last item
        stakes.pop();
    }

    function _reissueStakeNftId(uint256 nftId, uint256 stakeIndex) private returns (uint32 newNftId) {
        // Burn the Stake NFT id
        _stakeById[nftId] = 0;
        // Reissue new Stake NFT id
        newNftId = nextNftId;
        _stakeById[newNftId] = stakeIndex;
        // Increase the next nft id
        ++nextNftId;
    }

    function increaseVeAmount(address staker, uint96 amount, uint8 numOfMonths, bool emitEvent) private {
        // Transfer vote escrowed tokens from contract to staker
        uint256 veTokens = amount * numOfMonths;
        totalAmountEscrowed += amount;
        totalAmountVoteEscrowed += veTokens;
        voteEscrowedBalance[staker] += veTokens; // increase the ve tokens amount
        _transfer(address(this), staker, veTokens, emitEvent);
    }

    function decreaseVeAmount(address staker, uint96 amount, uint8 numOfMonths, bool emitEvent) private {
        // Transfer vote escrowed tokens back to the contract
        uint256 veTokens = amount * numOfMonths;
        totalAmountEscrowed -= amount;
        totalAmountVoteEscrowed -= veTokens;
        voteEscrowedBalance[staker] -= veTokens; // decrease the ve tokens amount
        _transfer(staker, address(this), veTokens, emitEvent);
    }

    function _removeStake(address staker, uint256 nftId, uint256 lookupIndex, StakingDetails storage stakeDetails) private returns (uint96 amount) {        
        uint96 remainingAmount = stakeDetails.initialTokenAmount - stakeDetails.withdrawnAmount;

        decreaseVeAmount(staker, remainingAmount, stakeDetails.numOfMonths, true);

        _burnStake(staker, nftId, lookupIndex, stakeDetails);

        return remainingAmount;
    }

    function _burnStake(address staker, uint256 nftId, uint256 lookupIndex, StakingDetails storage stakeDetails) private {        
        stakeDetails.isActive = _FALSE8;

        uint24 stakerIndex = stakeDetails.stakerIndex;
        _removeIndividualStake(staker, stakerIndex);

        // Clear the lookup
        _stakeById[nftId] = 0;
        // Add to available data items
        _freeStakes.push(lookupIndex);
    }

    function _createStake(address staker, uint96 depositAmount, uint96 withdrawnAmount, uint8 numOfMonths, uint48 depositTime, bool achievementClaimed)
        private returns (uint32 nftId)
    {
        if (withdrawnAmount >= depositAmount) revert AmountOutOfRange();
        uint256[] storage stakes = _individualStakes[staker];

        // Create new stake
        StakingDetails storage stakeDetails = _createStakeDetails(
            depositAmount,   // initialTokenAmount
            withdrawnAmount, // withdrawnAmount
            depositTime,     // depositTime
            numOfMonths,
            achievementClaimed,           // achievementClaimed
            staker,
            uint24(stakes.length)   // New staker's stake index
        );

        // Add new stake to individual's list
        stakes.push(stakeDetails.lookupIndex);  
        
        uint96 remaining = depositAmount - withdrawnAmount;
        increaseVeAmount(staker, remaining, numOfMonths, true);

        // Mint new Stake NFT to staker
        nftId = stakeDetails.nftId;
    }

    function calculateTax(uint96 amount, uint256 depositTime, uint256 numOfMonths) public view returns (uint96) {
        return calculateTaxAt(amount, depositTime, numOfMonths, block.timestamp);
    }

    function calculateTaxAt(uint96 amount, uint256 depositTime, uint256 numOfMonths, uint256 timestamp) public view returns (uint96) {
        uint256 lockTime = depositTime + (numOfMonths * month);
        uint96 taxAmount = 0;

        if (timestamp < depositTime + (numOfMonths * month / 2)) {
            taxAmount = (amount * firstHalfPenality) / 100;
        } else if (timestamp < lockTime) {
            taxAmount = (amount * secondHalfPenality) / 100;
        }

        return taxAmount;
    }

    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (
        address receiver,
        uint256 royaltyAmount
    ) {
        if (_tokenId == 0) revert AmountMustBeGreaterThanZero();

        return (address(royaltySplitter), _salePrice / nftRoyaltySplit);
    }
    
    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external {
        if (address(everRiseToken) == address(0)) revert NotSetup();

        address _owner = _msgSender();
        everRiseToken.setApprovalForAll(_owner, operator, approved);

        emit ApprovalForAll(_owner, operator, approved);
    }

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) public view returns (bool) {
        return everRiseToken.isApprovedForAll(account, operator);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external payable walletLock(_msgSender()) {
        address operator = _msgSender();
        _transferFrom(operator, from, to, tokenId);
        _doSafeERC721TransferAcceptanceCheck(operator, from, to, tokenId, data);
    }
    
    function safeTransferFrom(address from, address to, uint256 tokenId) external payable walletLock(_msgSender()) {
        address operator = _msgSender();
        _transferFrom(operator, from, to, tokenId);
        _doSafeERC721TransferAcceptanceCheck(operator, from, to, tokenId, new bytes(0));
    }

    function transferFrom(address from, address to, uint256 tokenId)
        external payable walletLock(_msgSender()) {
        address operator = _msgSender();
        _transferFrom(operator, from, to, tokenId);
    }
    
   function approve(address account, address _operator, uint256 nftId)
        external onlyEverRiseToken {
        _approve(account, _operator, nftId);
    }

    function approve(address _operator, uint256 nftId) external payable {
        _approve(_msgSender(), _operator, nftId);
    }

    function _approve(address account, address _operator, uint256 nftId) private {
        if (ownerOf(nftId) != account) revert NotStakerAddress();

        ApprovalChecks memory approvals = everRiseToken.approvals(account);

        _individualApproval[nftId] = IndividualAllowance({
            operator: _operator, 
            timestamp: approvals.autoRevokeNftHours == 0 ? 
                type(uint48).max : // Don't timeout approval
                uint48(block.timestamp) + approvals.autoRevokeNftHours * 1 hours, // Timeout after user chosen period,
            nftCheck: approvals.nftCheck
        });
    }

    function getApproved(uint256 nftId) external view returns (address) {
        getStakeIndex(nftId); // Reverts on not exist
        
        IndividualAllowance storage _allowance = _individualApproval[nftId];
        ApprovalChecks memory approvals = everRiseToken.approvals(ownerOf(nftId));

        if (block.timestamp > _allowance.timestamp ||
            approvals.nftCheck != _allowance.nftCheck)
        {
            return address(0);
        }

        return _allowance.operator;
    }

    function _isAddressApproved(address operator, uint256 nftId) private view returns (bool) {
        IndividualAllowance storage _allowance = _individualApproval[nftId];
        ApprovalChecks memory approvals = everRiseToken.approvals(ownerOf(nftId));

        if (_allowance.operator != operator ||
            block.timestamp > _allowance.timestamp ||
            approvals.nftCheck != _allowance.nftCheck)
        {
            return false;
        }

        return true;
    }

    function _transferFrom(
        address operator,
        address from,
        address to,
        uint256 nftId
    ) private {
        if (address(everRiseToken) == address(0)) revert NotSetup();
        if (from == address(0)) revert NotZeroAddress();
        if (to == address(0)) revert NotZeroAddress();
        if (operator != from && 
            !isApprovedForAll(from, operator) &&
            !_isAddressApproved(from, nftId)
        ) revert AmountLargerThanAllowance();

        // Clear any individual approvals
        delete _individualApproval[nftId];
        _transferStake(from, to, nftId);

        // Signal transfer complete
        emit Transfer(from, to, nftId);
    }

    function addStaker(address staker, uint256 nftId)
        external onlyEverRiseToken 
    {
        // Send event for new staking
        emit Transfer(address(0), staker, nftId);
    }

    function _doSafeERC721TransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        bytes memory data
    ) private view {
        if (isContract(to)) {
            try IERC721TokenReceiver(to).onERC721Received(operator, from, id, data) returns (bytes4 response) {
                if (response != IERC721TokenReceiver.onERC721Received.selector) {
                    revert ERC721ReceiverReject();
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert ERC721ReceiverNotImplemented();
            }
        }
    }

    function isContract(address account) private view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    function removeStaker(address staker, uint256 nftId)
        external onlyEverRiseToken 
    {
        // Send event for left staking
        emit Transfer(staker, address(0), nftId);
    }

    function reissueStakeNft(address staker, uint256 oldNftId, uint256 newNftId)
        external onlyEverRiseToken 
    {
        _reissueStakeNft(staker, oldNftId, newNftId);
    }

    function _reissueStakeNft(address staker, uint256 oldNftId, uint256 newNftId)
        private
    {
        // Burn old Stake NFT
        emit Transfer(staker, address(0), oldNftId);
        // Reissue new Stake NFT
        emit Transfer(address(0), staker, newNftId);
    }

    // Admin for trapped tokens

    function transferExternalTokens(address tokenAddress, address toAddress) external onlyOwner {
        if (tokenAddress == address(0)) revert NotZeroAddress();
        if (toAddress == address(0)) revert NotZeroAddress();
        if (IERC20(tokenAddress).balanceOf(address(this)) == 0) revert AmountLargerThanAvailable();

        require(IERC20(tokenAddress).transfer(toAddress, IERC20(tokenAddress).balanceOf(address(this))));
    }

    function transferToAddressETH(address payable receipient) external onlyOwner {
        if (receipient == address(0)) revert NotZeroAddress();

        receipient.transfer(address(this).balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AchievementAlreadyClaimed","type":"error"},{"inputs":[],"name":"AchievementClaimStatusesDiffer","type":"error"},{"inputs":[],"name":"AchievementNotClaimed","type":"error"},{"inputs":[],"name":"AmountLargerThanAllowance","type":"error"},{"inputs":[],"name":"AmountLargerThanAvailable","type":"error"},{"inputs":[],"name":"AmountMustBeAnInteger","type":"error"},{"inputs":[],"name":"AmountMustBeGreaterThanZero","type":"error"},{"inputs":[],"name":"AmountOutOfRange","type":"error"},{"inputs":[],"name":"BrokenStatusesDiffer","type":"error"},{"inputs":[],"name":"CallerNotApproved","type":"error"},{"inputs":[],"name":"CallerNotOwner","type":"error"},{"inputs":[],"name":"CannotMergeLockedAndUnlockedStakes","type":"error"},{"inputs":[],"name":"DoesNotExist","type":"error"},{"inputs":[],"name":"ERC721ReceiverNotImplemented","type":"error"},{"inputs":[],"name":"ERC721ReceiverReject","type":"error"},{"inputs":[],"name":"InvalidAddress","type":"error"},{"inputs":[],"name":"MergeNotEnabled","type":"error"},{"inputs":[],"name":"NoRewardsToClaim","type":"error"},{"inputs":[],"name":"NotAllowedToDeliverRewards","type":"error"},{"inputs":[],"name":"NotEnoughToCoverStakeFee","type":"error"},{"inputs":[],"name":"NotSetup","type":"error"},{"inputs":[],"name":"NotStakerAddress","type":"error"},{"inputs":[],"name":"NotZeroAddress","type":"error"},{"inputs":[],"name":"Overflow","type":"error"},{"inputs":[],"name":"StakeCanOnlyBeExtended","type":"error"},{"inputs":[],"name":"StakeStillLocked","type":"error"},{"inputs":[],"name":"StakeUnlocked","type":"error"},{"inputs":[],"name":"UnlockedStakesMustBeSametimePeriod","type":"error"},{"inputs":[],"name":"WalletLocked","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"}],"name":"AddRewardCreator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"}],"name":"EverRiseTokenSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"}],"name":"ExcludedFromRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"}],"name":"IncludedToRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"}],"name":"RemoveRewardCreator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"}],"name":"RendererAddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"}],"name":"RoyaltyAddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"RoyaltyFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"}],"name":"SetAchievementNfts","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"StakeCreateCostUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"withdrawPct","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"firstHalfPenality","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"secondHalfPenality","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxStakeMonths","type":"uint256"},{"indexed":false,"internalType":"bool","name":"mergeEnabled","type":"bool"}],"name":"StakingParametersSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addAddressToCreate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"addStaker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"_operator","type":"address"},{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"toAddress","type":"address"},{"internalType":"uint96","name":"depositAmount","type":"uint96"},{"internalType":"uint8","name":"numOfMonths","type":"uint8"},{"internalType":"uint48","name":"depositTime","type":"uint48"},{"internalType":"uint96","name":"withdrawnAmount","type":"uint96"},{"internalType":"uint96","name":"rewards","type":"uint96"},{"internalType":"bool","name":"achievementClaimed","type":"bool"}],"name":"bridgeOrAirdropStakeNftIn","outputs":[{"internalType":"uint32","name":"nftId","type":"uint32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fromAddress","type":"address"},{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"bridgeStakeNftOut","outputs":[{"internalType":"uint96","name":"amount","type":"uint96"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint96","name":"amount","type":"uint96"},{"internalType":"uint256","name":"depositTime","type":"uint256"},{"internalType":"uint256","name":"numOfMonths","type":"uint256"}],"name":"calculateTax","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint96","name":"amount","type":"uint96"},{"internalType":"uint256","name":"depositTime","type":"uint256"},{"internalType":"uint256","name":"numOfMonths","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"calculateTaxAt","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"claimAchievement","outputs":[{"internalType":"uint32","name":"newNftId","type":"uint32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimRiseToken","outputs":[{"internalType":"contract claimRise","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"createRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentAchievementNfts","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"nftId","type":"uint256"},{"internalType":"uint96","name":"amount","type":"uint96"}],"name":"earlyWithdraw","outputs":[{"internalType":"uint32","name":"newNftId","type":"uint32"},{"internalType":"uint96","name":"penaltyAmount","type":"uint96"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint96","name":"amount","type":"uint96"},{"internalType":"uint8","name":"numOfMonths","type":"uint8"}],"name":"enterStaking","outputs":[{"internalType":"uint32","name":"nftId","type":"uint32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"everRiseToken","outputs":[{"internalType":"contract IEverRise","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"},{"internalType":"uint8","name":"numOfMonths","type":"uint8"}],"name":"extendStake","outputs":[{"internalType":"uint32","name":"newNftId","type":"uint32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"firstHalfPenality","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"getNftData","outputs":[{"components":[{"internalType":"uint96","name":"initialTokenAmount","type":"uint96"},{"internalType":"uint96","name":"withdrawnAmount","type":"uint96"},{"internalType":"uint48","name":"depositTime","type":"uint48"},{"internalType":"uint8","name":"numOfMonths","type":"uint8"},{"internalType":"uint8","name":"achievementClaimed","type":"uint8"},{"internalType":"address","name":"stakerAddress","type":"address"},{"internalType":"uint32","name":"nftId","type":"uint32"},{"internalType":"uint32","name":"lookupIndex","type":"uint32"},{"internalType":"uint24","name":"stakerIndex","type":"uint24"},{"internalType":"uint8","name":"isActive","type":"uint8"}],"internalType":"struct StakingDetails","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"},{"internalType":"address","name":"staker","type":"address"}],"name":"getStake","outputs":[{"components":[{"internalType":"uint96","name":"initialTokenAmount","type":"uint96"},{"internalType":"uint96","name":"withdrawnAmount","type":"uint96"},{"internalType":"uint48","name":"depositTime","type":"uint48"},{"internalType":"uint8","name":"numOfMonths","type":"uint8"},{"internalType":"uint8","name":"achievementClaimed","type":"uint8"},{"internalType":"address","name":"stakerAddress","type":"address"},{"internalType":"uint32","name":"nftId","type":"uint32"},{"internalType":"uint32","name":"lookupIndex","type":"uint32"},{"internalType":"uint24","name":"stakerIndex","type":"uint24"},{"internalType":"uint8","name":"isActive","type":"uint8"}],"internalType":"struct StakingDetails","name":"stakeDetails","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getTotalRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"nftId","type":"uint256"},{"internalType":"uint96","name":"amount","type":"uint96"}],"name":"increaseStake","outputs":[{"internalType":"uint32","name":"newNftId","type":"uint32"},{"internalType":"uint96","name":"original","type":"uint96"},{"internalType":"uint8","name":"numOfMonths","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"nftId","type":"uint256"},{"internalType":"bool","name":"overrideNotClaimed","type":"bool"}],"name":"leaveStaking","outputs":[{"internalType":"uint96","name":"amount","type":"uint96"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxEarlyWithdrawalPercent","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxStakeMonths","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mergeEnabled","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId0","type":"uint256"},{"internalType":"uint256","name":"nftId1","type":"uint256"},{"internalType":"bool","name":"overrideStatuses","type":"bool"}],"name":"mergeStakes","outputs":[{"internalType":"uint32","name":"newNftId","type":"uint32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"month","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftRoyaltySplit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"oldNftId","type":"uint256"},{"internalType":"uint256","name":"newNftId","type":"uint256"}],"name":"reissueStakeNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeAddressToCreate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"removeStaker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renderer","outputs":[{"internalType":"contract IEverRiseRenderer","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"rewardsFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltySplitter","outputs":[{"internalType":"contract IEverRoyaltySplitter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"secondHalfPenality","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setAchievementNfts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"setEverRiseToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"royaltySplitRate","type":"uint256"}],"name":"setNftRoyaltyFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setRendererAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setRoyaltyAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeCreateCost","type":"uint256"},{"internalType":"uint256","name":"numOfDecimals","type":"uint256"}],"name":"setStakeCreateCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_withdrawPercent","type":"uint8"},{"internalType":"uint8","name":"_firstHalfPenality","type":"uint8"},{"internalType":"uint8","name":"_secondHalfPenality","type":"uint8"},{"internalType":"uint8","name":"_maxStakeMonths","type":"uint8"},{"internalType":"bool","name":"_mergEnabled","type":"bool"}],"name":"setStakingParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"},{"internalType":"uint96","name":"amount","type":"uint96"}],"name":"splitStake","outputs":[{"internalType":"uint32","name":"newNftId0","type":"uint32"},{"internalType":"uint32","name":"newNftId1","type":"uint32"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"stakeCreateCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAmountEscrowed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAmountVoteEscrowed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRewardsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRewardsUnclaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"toAddress","type":"address"}],"name":"transferExternalTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"receipient","type":"address"}],"name":"transferToAddressETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"unclaimedRewardsBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"veRiseToken","outputs":[{"internalType":"contract veRise","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"voteEscrowedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"nftId","type":"uint256"},{"internalType":"uint96","name":"amount","type":"uint96"},{"internalType":"bool","name":"overrideNotClaimed","type":"bool"}],"name":"withdraw","outputs":[{"internalType":"uint32","name":"newNftId","type":"uint32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawRewards","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c0604052600a6004556005805463ffffffff60a01b1916630902864f60a21b179055662386f26fc1000060065560016007556200004e6d05ea9ce981a106cf85ce000000006000196200077f565b6200005c9060001962000796565b600f556018805463ffffffff191660011790553480156200007c57600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350604051620000cc906200074d565b604051809103906000f080158015620000e9573d6000803e3d6000fd5b506001600160a01b031660805260405162000104906200075b565b604051809103906000f08015801562000121573d6000803e3d6000fd5b506001600160a01b031660a052600f54306000818152600a60205260409020919091556200014f9062000399565b601060405180610140016040528060006001600160601b0316815260200160006001600160601b03168152602001600065ffffffffffff168152602001600160ff168152602001600060ff16815260200160006001600160a01b03168152602001600063ffffffff168152602001600063ffffffff168152602001600062ffffff168152602001600160ff16815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000160006101000a8154816001600160601b0302191690836001600160601b03160217905550602082015181600001600c6101000a8154816001600160601b0302191690836001600160601b0316021790555060408201518160000160186101000a81548165ffffffffffff021916908365ffffffffffff160217905550606082015181600001601e6101000a81548160ff021916908360ff160217905550608082015181600001601f6101000a81548160ff021916908360ff16021790555060a08201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060c08201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555061010082015181600101601c6101000a81548162ffffff021916908362ffffff16021790555061012082015181600101601f6101000a81548160ff021916908360ff1602179055505050620007e9565b620003a3620004ef565b6001600160a01b038116620003cb576040516366385fa360e01b815260040160405180910390fd5b6001600160a01b03811660009081526009602052604090205460ff1615620004065760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b0381166000908152600a60205260409020541562000463576001600160a01b0381166000908152600a602052604090205462000449906200051d565b6001600160a01b0382166000908152600b60205260409020555b6001600160a01b038116600081815260096020526040808220805460ff19166001908117909155600e8054918201815583527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0180546001600160a01b03191684179055517f743dcd4a012534912a3350f3ed8937d3b4f0771c62892ed15e4373dc2c5f584a9190a250565b6000546001600160a01b031633146200051b57604051632e6c18c960e11b815260040160405180910390fd5b565b6000600f54821115620005435760405163c64200e960e01b815260040160405180910390fd5b60006200054f62000564565b90506200055d8184620007bc565b9392505050565b60008080620005726200058a565b9092509050620005838183620007bc565b9250505090565b600f54600e5460009182916d05ea9ce981a106cf85ce0000000090835b81811015620007005783600a6000600e8481548110620005cb57620005cb620007d3565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806200063a575082600b6000600e8481548110620006135762000613620007d3565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156200065d575050600f54946d05ea9ce981a106cf85ce00000000945092505050565b600a6000600e8381548110620006775762000677620007d3565b60009182526020808320909101546001600160a01b03168352820192909252604001902054620006a8908562000796565b9350600b6000600e8381548110620006c457620006c4620007d3565b60009182526020808320909101546001600160a01b03168352820192909252604001902054620006f5908462000796565b9250600101620005a7565b506d05ea9ce981a106cf85ce00000000600f546200071f9190620007bc565b83101562000743575050600f54936d05ea9ce981a106cf85ce000000009350915050565b5090939092509050565b61093f806200682e83390190565b610935806200716d83390190565b634e487b7160e01b600052601260045260246000fd5b60008262000791576200079162000769565b500690565b600082821015620007b757634e487b7160e01b600052601160045260246000fd5b500390565b600082620007ce57620007ce62000769565b500490565b634e487b7160e01b600052603260045260246000fd5b60805160a051615ff56200083960003960008181610b7601528181611857015281816129450152612dbd015260008181610624015281816143a9015281816144530152614d9f0152615ff56000f3fe6080604052600436106104685760003560e01c80638116ed721161024a578063c87b56dd11610139578063e985e9c5116100b6578063ee1725461161007a578063ee17254614610e8f578063f04f384414610ea5578063f128b0c114610ec6578063f13ca76f14610ee6578063f2fde38b14610f0757600080fd5b8063e985e9c514610df9578063eb77837514610e19578063eb84fd7714610e39578063ebbbb8f414610e59578063ed74d26e14610e7957600080fd5b8063e33e4b49116100fd578063e33e4b4914610d6d578063e683015f14610d83578063e6c1c9fc14610da3578063e6f203f314610dc3578063e8a3d48514610de457600080fd5b8063c87b56dd14610ca0578063d22d6f4314610cc0578063d9fbb1e914610ce0578063e1f21c6714610d00578063e2c281db14610d2057600080fd5b8063a578be6c116101c7578063b88d4fde1161018b578063b88d4fde14610c18578063bada23d514610c2b578063c6557fd214610c4b578063c7b8981c14610c6b578063c7bb8dc414610c8057600080fd5b8063a578be6c14610b64578063a802d82b14610b98578063a94ea3b014610bb8578063abdf943414610bd8578063ad1ff74b14610bf857600080fd5b80638da5cb5b1161020e5780638da5cb5b14610ab057806393da8b8114610ad057806395d89b4114610af1578063a22cb46514610b24578063a556f60f14610b4457600080fd5b80638116ed7214610a03578063846ea2d014610a2357806388f8202014610a43578063894f03b514610a635780638ada6b0f14610a9057600080fd5b80632f745c59116103665780635a034bd8116102e357806368c5805e116102a757806368c5805e14610949578063702921f51461097657806370a082311461098d5780637cdd109d146109c35780637d87feb9146109e357600080fd5b80635a034bd8146108b35780635be1ee5d146108d3578063615eaa59146108f357806363234f3d146109135780636352211e1461092957600080fd5b806344d34e501161032a57806344d34e501461082a578063471a751e1461084057806352390c0214610860578063557ed1ba146108805780635718f41a1461089357600080fd5b80632f745c5914610790578063313ce567146107b05780633685d419146107d7578063411d8f2f146107f757806342842e0e1461081757600080fd5b80631370733c116103f457806323b872dd116103b857806323b872dd146106c95780632a55205a146106dc5780632a7b11e61461071b5780632b0e1d79146107505780632bcf161c1461077057600080fd5b80631370733c146106125780631635aa0314610646578063171c1fda1461067e57806317c0287c1461069e57806318160ddd146106b457600080fd5b806306fdde031161043b57806306fdde031461052b578063081812fc14610577578063095ea7b3146105af578063099785f6146105c2578063121407c9146105e257600080fd5b806301ffc9a71461046d57806304a9bbec146104a257806306d254da146104e657806306dd29e514610508575b600080fd5b34801561047957600080fd5b5061048d61048836600461523f565b610f27565b60405190151581526020015b60405180910390f35b3480156104ae57600080fd5b506104c26104bd366004615288565b610f94565b6040805163ffffffff90931683526001600160601b03909116602083015201610499565b3480156104f257600080fd5b506105066105013660046152c6565b611125565b005b34801561051457600080fd5b5061051d61119e565b604051908152602001610499565b34801561053757600080fd5b5061056a604051806040016040528060138152602001724576657252697365204e4654205374616b657360681b81525081565b604051610499919061533b565b34801561058357600080fd5b5061059761059236600461534e565b611210565b6040516001600160a01b039091168152602001610499565b6105066105bd366004615367565b611306565b3480156105ce57600080fd5b5061051d6105dd3660046152c6565b611315565b6105f56105f0366004615393565b611341565b6040805163ffffffff938416815292909116602083015201610499565b34801561061e57600080fd5b506105977f000000000000000000000000000000000000000000000000000000000000000081565b34801561065257600080fd5b506106666106613660046153bf565b611598565b6040516001600160601b039091168152602001610499565b34801561068a57600080fd5b506105066106993660046153f2565b6115ae565b3480156106aa57600080fd5b5061051d60065481565b3480156106c057600080fd5b5061051d611776565b6105066106d736600461542b565b611796565b3480156106e857600080fd5b506106fc6106f736600461546c565b6117b4565b604080516001600160a01b039093168352602083019190915201610499565b34801561072757600080fd5b5061073b6107363660046154c1565b611800565b60405163ffffffff9091168152602001610499565b34801561075c57600080fd5b5061066661076b366004615367565b6118e1565b34801561077c57600080fd5b5061051d61078b3660046152c6565b611912565b34801561079c57600080fd5b5061073b6107ab366004615367565b61193e565b3480156107bc57600080fd5b506107c5600081565b60405160ff9091168152602001610499565b3480156107e357600080fd5b506105066107f23660046152c6565b6119d6565b34801561080357600080fd5b50600354610597906001600160a01b031681565b61050661082536600461542b565b611b8f565b34801561083657600080fd5b5061051d60045481565b34801561084c57600080fd5b5061050661085b366004615367565b611bc6565b34801561086c57600080fd5b5061050661087b3660046152c6565b611bf9565b34801561088c57600080fd5b504261051d565b34801561089f57600080fd5b506105066108ae3660046152c6565b611d48565b3480156108bf57600080fd5b506105066108ce36600461554f565b611ddf565b3480156108df57600080fd5b506105066108ee36600461556f565b611df8565b3480156108ff57600080fd5b5061073b61090e3660046155d8565b611ef6565b34801561091f57600080fd5b5061051d60165481565b34801561093557600080fd5b5061059761094436600461534e565b611f7f565b34801561095557600080fd5b50610969610964366004615614565b611fc7565b6040516104999190615639565b34801561098257600080fd5b5061051d62278d0081565b34801561099957600080fd5b5061051d6109a83660046152c6565b6001600160a01b031660009081526011602052604090205490565b3480156109cf57600080fd5b506106666109de366004615719565b612092565b3480156109ef57600080fd5b506105066109fe3660046152c6565b61213e565b348015610a0f57600080fd5b50600154610597906001600160a01b031681565b348015610a2f57600080fd5b50610506610a3e3660046152c6565b612179565b348015610a4f57600080fd5b5061048d610a5e3660046152c6565b6121f4565b348015610a6f57600080fd5b5061051d610a7e3660046152c6565b60146020526000908152604090205481565b348015610a9c57600080fd5b50600254610597906001600160a01b031681565b348015610abc57600080fd5b50600054610597906001600160a01b031681565b348015610adc57600080fd5b506005546107c590600160b81b900460ff1681565b348015610afd57600080fd5b5061056a604051806040016040528060078152602001666e66745249534560c81b81525081565b348015610b3057600080fd5b50610506610b3f366004615752565b61223c565b348015610b5057600080fd5b50610506610b5f3660046152c6565b61232d565b348015610b7057600080fd5b506105977f000000000000000000000000000000000000000000000000000000000000000081565b348015610ba457600080fd5b50610969610bb336600461534e565b6123a6565b348015610bc457600080fd5b5061051d610bd336600461534e565b61249c565b348015610be457600080fd5b5061073b610bf3366004615780565b6124df565b348015610c0457600080fd5b50600554610597906001600160a01b031681565b610506610c263660046157d1565b612695565b348015610c3757600080fd5b5061073b610c46366004615870565b6126f8565b348015610c5757600080fd5b50610506610c66366004615367565b612891565b348015610c7757600080fd5b506105066128c4565b348015610c8c57600080fd5b5061073b610c9b366004615367565b612a8a565b348015610cac57600080fd5b5061056a610cbb36600461534e565b612bf2565b348015610ccc57600080fd5b50610666610cdb366004615893565b612c64565b348015610cec57600080fd5b50610506610cfb36600461534e565b612cea565b348015610d0c57600080fd5b50610506610d1b36600461542b565b612e40565b348015610d2c57600080fd5b50610d40610d3b366004615288565b612e54565b6040805163ffffffff90941684526001600160601b03909216602084015260ff1690820152606001610499565b348015610d7957600080fd5b5061051d60075481565b348015610d8f57600080fd5b50610506610d9e36600461546c565b613025565b348015610daf57600080fd5b50610506610dbe3660046152c6565b6130b1565b348015610dcf57600080fd5b506005546107c590600160a81b900460ff1681565b348015610df057600080fd5b5061056a61312a565b348015610e0557600080fd5b5061048d610e143660046153f2565b61319c565b348015610e2557600080fd5b50610506610e3436600461534e565b61321a565b348015610e4557600080fd5b5061051d610e5436600461534e565b61327f565b348015610e6557600080fd5b5061073b610e743660046158d5565b6132ba565b348015610e8557600080fd5b5061051d60155481565b348015610e9b57600080fd5b5061051d60175481565b348015610eb157600080fd5b506005546107c590600160b01b900460ff1681565b348015610ed257600080fd5b50610506610ee13660046152c6565b61387b565b348015610ef257600080fd5b506005546107c590600160a01b900460ff1681565b348015610f1357600080fd5b50610506610f223660046152c6565b6138df565b60006001600160e01b0319821663152a902d60e11b1480610f5857506001600160e01b031982166380ac58cd60e01b145b80610f7357506001600160e01b03198216635b5e139f60e01b145b80610f8e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b600080610fa033613969565b600080610fad86886139c0565b80549193509150610fd790600160c01b810465ffffffffffff1690600160f01b900460ff16613a44565b8054600554600091600160601b81046001600160601b039081169260649261100b92600160a01b90920460ff169116615919565b611015919061595e565b61101f9190615984565b6001600160601b0316905080866001600160601b031611156110545760405163bb29610960e01b815260040160405180910390fd5b61105f866000613a86565b815461107a9089908890600160f01b900460ff166001613af5565b81546110a1908790600160c01b810465ffffffffffff1690600160f01b900460ff16611598565b825490945086908390600c906110c8908490600160601b90046001600160601b03166159ac565b92506101000a8154816001600160601b0302191690836001600160601b031602179055506110f68784613b82565b600192909201805463ffffffff60a01b1916600160a01b63ffffffff8516021790555096919550909350505050565b61112d613bdd565b6001600160a01b038116611154576040516366385fa360e01b815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040517fc3f6f2bdf6d9c842a3bc549613cd55a1e4949821f557b66feb8d73eb7f576d9390600090a250565b6001546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156111e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120b91906159d7565b905090565b600061121b82613c0a565b506000828152600d602052604081206001549091906001600160a01b0316635d0341ba61124786611f7f565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160c060405180830381865afa15801561128b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112af9190615a59565b8254909150600160a01b900465ffffffffffff164211806112e657508154602082015163ffffffff908116600160d01b9092041614155b156112f5575060009392505050565b50546001600160a01b031692915050565b611311338383613cb8565b5050565b6001600160a01b03811660009081526014602052604081205461133783613e3c565b610f8e9190615b06565b6000803361134e81613ec4565b60065433903410156113735760405163627554ed60e01b815260040160405180910390fd5b61137e856000613a86565b6001546040516001600160a01b03909116904780156108fc02916000818181858888f193505050501580156113b7573d6000803e3d6000fd5b506000806113c588846139c0565b805491935091506000906113eb906001600160601b03600160601b820481169116615984565b6001600160601b0316905080886001600160601b03161061141f5760405163bb29610960e01b815260040160405180910390fd5b6114298984613b82565b8254909750600090611465906001600160601b0380821691611456918d811691600160601b900416615b1d565b6114609190615b3c565b613f50565b8354909150899084906000906114859084906001600160601b0316615984565b92506101000a8154816001600160601b0302191690836001600160601b031602179055508083600001600c8282829054906101000a90046001600160601b03166114cf9190615984565b82546001600160601b039182166101009390930a92830291909202199091161790555060018301805463ffffffff8a16600160a01b0263ffffffff60a01b19909116179055825461154c9086908b90849065ffffffffffff600160c01b8204169060ff600160f01b8204811691600160f81b900416600214613f7e565b965061155f858b8a63ffffffff16613ff3565b60405163ffffffff8816906001600160a01b03871690600090600080516020615fa0833981519152908290a45050505050509250929050565b60006115a684848442612092565b949350505050565b6115b6613bdd565b6001600160a01b0382166115dd576040516366385fa360e01b815260040160405180910390fd5b6001600160a01b038116611604576040516366385fa360e01b815260040160405180910390fd5b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015611648573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166c91906159d7565b60000361168c5760405163bb29610960e01b815260040160405180910390fd5b6040516370a0823160e01b81523060048201526001600160a01b0383169063a9059cbb90839083906370a0823190602401602060405180830381865afa1580156116da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116fe91906159d7565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611749573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061176d9190615b50565b61131157600080fd5b60135460105460009160019161178c9190615b06565b61120b9190615b06565b336117a081613ec4565b336117ad81868686614044565b5050505050565b600080836000036117d857604051635e85ae7360e01b815260040160405180910390fd5b6003546004546001600160a01b03909116906117f49085615b3c565b915091505b9250929050565b600061180b33613969565b611819888886898987614171565b90506001600160601b038316156118d6576118403089856001600160601b0316600061423a565b6040516323b872dd60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906323b872dd90611891906000908c908890600401615b6d565b6020604051808303816000875af11580156118b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d49190615b50565b505b979650505050505050565b60006118ec33613969565b6000806118f984866139c0565b91509150611909858584846144d0565b95945050505050565b6001600160a01b0381166000908152600c602052604081205461193483611315565b610f8e9190615b99565b6001600160a01b038216600090815260116020526040812080548311156119785760405163c64200e960e01b815260040160405180910390fd5b600081848154811061198c5761198c615bb1565b90600052602060002001549050601081815481106119ac576119ac615bb1565b6000918252602090912060029091020160010154600160a01b900463ffffffff1695945050505050565b6119de613bdd565b6001600160a01b038116611a05576040516366385fa360e01b815260040160405180910390fd5b6001600160a01b03811660009081526009602052604090205460ff16611a3e5760405163e6c4247b60e01b815260040160405180910390fd5b600e5460005b81811015611b5657826001600160a01b0316600e8281548110611a6957611a69615bb1565b6000918252602090912001546001600160a01b031603611b4e57600e8054611a9390600190615b06565b81548110611aa357611aa3615bb1565b600091825260209091200154600e80546001600160a01b039092169183908110611acf57611acf615bb1565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559185168152600b82526040808220829055600990925220805460ff19169055600e805480611b2757611b27615bc7565b600082815260209020810160001990810180546001600160a01b0319169055019055611b56565b600101611a44565b506040516001600160a01b038316907f5e8208b8ab7d1d84def348579f7a8420999ac8b055b5a49d9859b3f820fdde1290600090a25050565b33611b9981613ec4565b33611ba681868686614044565b6040805160008152602081019091526117ad90829087908790879061451d565b611bcf33613969565b60405181906001600160a01b03841690600090600080516020615fa0833981519152908290a45050565b611c01613bdd565b6001600160a01b038116611c28576040516366385fa360e01b815260040160405180910390fd5b6001600160a01b03811660009081526009602052604090205460ff1615611c625760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b0381166000908152600a602052604090205415611cbc576001600160a01b0381166000908152600a6020526040902054611ca29061327f565b6001600160a01b0382166000908152600b60205260409020555b6001600160a01b038116600081815260096020526040808220805460ff19166001908117909155600e8054918201815583527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0180546001600160a01b03191684179055517f743dcd4a012534912a3350f3ed8937d3b4f0771c62892ed15e4373dc2c5f584a9190a250565b611d50613bdd565b6001600160a01b038116611d77576040516366385fa360e01b815260040160405180910390fd5b600154611d8c906001600160a01b031661463a565b611d9581612179565b600180546001600160a01b0319166001600160a01b0383169081179091556040517f151b7e66bd44c3b053284cb5cc54c216555683d266fbd4518b9dc513064be66d90600090a250565b611de833613969565b611df3838383613ff3565b505050565b611e00613bdd565b60ff82161580611e13575060788260ff16115b15611e315760405163c64200e960e01b815260040160405180910390fd5b6005805461ffff60a01b1916600160a01b60ff8881169190910260ff60a81b191691909117600160a81b878316021761ffff60b01b1916600160b01b8683160260ff60b81b191617600160b81b9185169190910217905580611e94576001611e97565b60025b6007556040805160ff878116825286811660208301528581168284015284166060820152821515608082015290517fa6bd3ea50016bdc4bfa355baf0d0174bfd46fc6e640605397501935630aafec59181900360a00190a15050505050565b6000611f0133613969565b60ff82161580611f20575060055460ff600160b81b9091048116908316115b80611f465750600c8260ff16118015611f4657506000611f41600c84615bdd565b60ff16115b15611f645760405163c64200e960e01b815260040160405180910390fd5b611f6f836000613a86565b6115a68484600085426000614171565b600080611f8b83613c0a565b9050600060108281548110611fa257611fa2615bb1565b60009182526020909120600160029092020101546001600160a01b0316949350505050565b611fcf6151d5565b611fd983836139c0565b604080516101408101825282546001600160601b038082168352600160601b8204166020830152600160c01b80820465ffffffffffff1693830193909352600160f01b810460ff9081166060840152600160f81b91829004811660808401526001909401546001600160a01b03811660a0840152600160a01b810463ffffffff90811660c085015293810490931660e0830152600160e01b830462ffffff16610100830152909104909116610120820152949350505050565b6000806120a262278d0085615b1d565b6120ac9086615b99565b9050600060026120bf62278d0087615b1d565b6120c99190615b3c565b6120d39087615b99565b841015612105576005546064906120f490600160a81b900460ff1689615919565b6120fe919061595e565b9050612134565b818410156121345760055460649061212790600160b01b900460ff1689615919565b612131919061595e565b90505b9695505050505050565b612146613bdd565b6001600160a01b03811661216d576040516366385fa360e01b815260040160405180910390fd5b6121768161463a565b50565b612181613bdd565b6001600160a01b0381166121a8576040516366385fa360e01b815260040160405180910390fd5b6001600160a01b038116600081815260086020526040808220805460ff19166001179055517f55c7ccdd680e7fe5636cf2334be362332f7e4972e3f724d2c01df0bc85222f039190a250565b60006001600160a01b03821661221d576040516366385fa360e01b815260040160405180910390fd5b506001600160a01b031660009081526009602052604090205460ff1690565b6001546001600160a01b0316612265576040516302c2726760e61b815260040160405180910390fd5b600033600154604051631b3b02e560e11b81526001600160a01b0380841660048301528681166024830152851515604483015292935091169063367605ca90606401600060405180830381600087803b1580156122c157600080fd5b505af11580156122d5573d6000803e3d6000fd5b50505050826001600160a01b0316816001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3184604051612320911515815260200190565b60405180910390a3505050565b612335613bdd565b6001600160a01b03811661235c576040516366385fa360e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517f57f5e93e81d1f0875d66647df6e542cf10af3b19c7e656121bc389e20afab77790600090a250565b6123ae6151d5565b60006123b983613c0a565b9050601081815481106123ce576123ce615bb1565b60009182526020918290206040805161014081018252600290930290910180546001600160601b038082168552600160601b8204169484019490945265ffffffffffff600160c01b808604919091169284019290925260ff600160f01b850481166060850152600160f81b94859004811660808501526001909101546001600160a01b03811660a085015263ffffffff600160a01b8204811660c086015292810490921660e084015262ffffff600160e01b8304166101008401529290049091166101208201529392505050565b60006d05ea9ce981a106cf85ce000000008211156124cd5760405163c64200e960e01b815260040160405180910390fd5b6124d5614692565b610f8e9083615b1d565b60006124ea33613969565b6000806124f786886139c0565b8054919350915061252190600160c01b810465ffffffffffff1690600160f01b900460ff166146b5565b8315801561253b57508054600160f81b900460ff16600214155b1561255957604051630e0d376760e21b815260040160405180910390fd5b805460009061257a906001600160601b03600160601b820481169116615984565b9050806001600160601b0316866001600160601b031611156125af5760405163bb29610960e01b815260040160405180910390fd5b6125ba866001613a86565b60006001600160601b038716156125f75782546125e6908a908990600160f01b900460ff166001613af5565b6125f08783615984565b9150600190505b82546001600160601b03838116911614612628575081546001600160c01b0319166001600160601b03821617825560015b801561268557816001600160601b03166000036126545761264b898986866146ec565b60009450612689565b61265e8885613b82565b60018401805463ffffffff60a01b1916600160a01b63ffffffff8416021790559450612689565b8794505b50505050949350505050565b3361269f81613ec4565b336126ac81888888614044565b6126ef8188888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061451d92505050565b50505050505050565b60003361270481613ec4565b3360008061271287846139c0565b8054919350915061273c90600160c01b810465ffffffffffff1690600160f01b900460ff16613a44565b805460ff808816600160f01b909204161061276a576040516339fb820560e11b815260040160405180910390fd5b60055460ff600160b81b909104811690871611806127a35750600c8660ff161180156127a35750600061279e600c88615bdd565b60ff16115b156127c15760405163c64200e960e01b815260040160405180910390fd5b80546000906127da90600160f01b900460ff1688615bff565b82549091506000906127fe906001600160601b03600160601b820481169116615984565b905061280d8582846001614763565b825466ffffffffffffff60c01b1916600160f01b60ff8a160265ffffffffffff60c01b191617600160c01b4265ffffffffffff160217835561284f8985613b82565b9650868360010160146101000a81548163ffffffff021916908363ffffffff160217905550612885858a8963ffffffff16613ff3565b50505050505092915050565b61289a33613969565b60405181906000906001600160a01b03851690600080516020615fa0833981519152908390a45050565b3360006128d082611315565b9050806000036128f3576040516373380d9960e01b815260040160405180910390fd5b6001600160a01b0382166000908152600c60205260408120805483929061291b908490615b99565b9091555061292e9050823083600061423a565b6040516323b872dd60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906323b872dd9061297f9085906000908690600401615c22565b6020604051808303816000875af115801561299e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129c29190615b50565b5060015460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490529091169063a9059cbb906044016020604051808303816000875af1158015612a16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a3a9190615b50565b612a4357600080fd5b816001600160a01b03167f8a43c4352486ec339f487f64af78ca5cbf06cd47833f073d3baf3a193e50316182604051612a7e91815260200190565b60405180910390a25050565b6005546000906001600160a01b0316336001600160a01b031614612ac157604051634014f1a560e01b815260040160405180910390fd5b600080612ace84866139c0565b80549193509150612af890600160c01b810465ffffffffffff1690600160f01b900460ff166146b5565b8054600119600160f81b90910460ff1601612b2657604051630b54d17d60e21b815260040160405180910390fd5b8054600160601b90046001600160601b031615612b975780546001600160601b03600160601b82048116918391600091612b6291859116615984565b82546001600160601b039182166101009390930a9283029190920219909116179055508054600160601b600160c01b03191681555b80546001600160f81b0316600160f91b178155612bb48483613b82565b9250828160010160146101000a81548163ffffffff021916908363ffffffff160217905550612bea85858563ffffffff16613ff3565b505092915050565b60025460405163c87b56dd60e01b8152600481018390526060916001600160a01b03169063c87b56dd90602401600060405180830381865afa158015612c3c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f8e9190810190615c46565b6000612c6f33613969565b600080612c7c85876139c0565b80549193509150612ca690600160c01b810465ffffffffffff1690600160f01b900460ff166146b5565b83158015612cc057508054600160f81b900460ff16600214155b15612cde57604051630e0d376760e21b815260040160405180910390fd5b612134868684846144d0565b612cf3336147f0565b3360008181526009602052604090205460ff1615612d24576040516334d1f12360e11b815260040160405180910390fd5b612d2f308284614829565b8160176000828254612d419190615b99565b9091555060009050612d51614692565b612d5b9084615b1d565b6001600160a01b0383166000908152600a6020526040812080549293508392909190612d88908490615b06565b9250508190555080600f6000828254612da19190615b06565b90915550506040516323b872dd60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906323b872dd90612df79060009030908890600401615c22565b6020604051808303816000875af1158015612e16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e3a9190615b50565b50505050565b612e4933613969565b611df3838383613cb8565b60008080612e6133613969565b600080612e6e87896139c0565b80549193509150612e9890600160c01b810465ffffffffffff1690600160f01b900460ff16613a44565b612ea3866000613a86565b8054600160f01b900460ff169250612ebe8887856001614763565b8054612edc906001600160601b03600160601b820481169116615984565b81549094506001600160601b03600160601b90910481169087161115612f71578054612f1890600160601b90046001600160601b031687615984565b8154600160601b600160c01b03198116835590965086908290600090612f489084906001600160601b03166159ac565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550612fba565b805486908290600c90612f95908490600160601b90046001600160601b0316615984565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505b805465ffffffffffff60c01b1916600160c01b4265ffffffffffff1602178155612fe48783613b82565b9450848160010160146101000a81548163ffffffff021916908363ffffffff16021790555061301a88888763ffffffff16613ff3565b505093509350939050565b61302d613bdd565b6103e88211156130505760405163c64200e960e01b815260040160405180910390fd5b61305b81600a615dc2565b61306d83670de0b6b3a7640000615b1d565b6130779190615b3c565b6006556040518281527f2b31447d1e8e344a5cedfa80160758f11af3dbc174e4f7fbf4b6f7a67207519c9060200160405180910390a15050565b6130b9613bdd565b6001600160a01b0381166130e0576040516366385fa360e01b815260040160405180910390fd5b600580546001600160a01b0319166001600160a01b0383169081179091556040517f4971c9b5ab1ad9f04eba5badf6c7ae3def7b48a2a8c703666b313e647fd4f5e290600090a250565b6002546040805163e8a3d48560e01b815290516060926001600160a01b03169163e8a3d4859160048083019260009291908290030181865afa158015613174573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261120b9190810190615c46565b60015460405163e985e9c560e01b81526001600160a01b0384811660048301528381166024830152600092169063e985e9c590604401602060405180830381865afa1580156131ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132139190615b50565b9392505050565b613222613bdd565b600a8111156132445760405163c64200e960e01b815260040160405180910390fd5b60048190556040518181527fd9b587d0d884e97b8e3772325d18ffc0412781f43cb5471b8eb5972667724f019060200160405180910390a150565b6000600f548211156132a45760405163c64200e960e01b815260040160405180910390fd5b60006132ae614692565b90506132138184615b3c565b6000336132c681613ec4565b6002600754146132e9576040516310a2f14360e11b815260040160405180910390fd5b336000806132f788846139c0565b9150915060008061330889866139c0565b84549193509150600090429061332c9062278d0090600160f01b900460ff16615b1d565b85546133479190600160c01b900465ffffffffffff16615b99565b835491119150600090429061336a9062278d0090600160f01b900460ff16615b1d565b84546133859190600160c01b900465ffffffffffff16615b99565b1090508115158190036134ef5782548554600160f01b9182900460ff9081169290910416146133c75760405163042e227b60e41b815260040160405180910390fd5b891580156133ea575082548554600160f81b9182900460ff908116929091041614155b15613408576040516306524e8b60e41b815260040160405180910390fd5b8454600160601b90046001600160601b0316156134795784546001600160601b03600160601b8204811691879160009161344491859116615984565b82546001600160601b039182166101009390930a9283029190920219909116179055508454600160601b600160c01b03191685555b8254600160601b90046001600160601b0316156134ea5782546001600160601b03600160601b820481169185916000916134b591859116615984565b82546001600160601b039182166101009390930a9283029190920219909116179055508254600160601b600160c01b03191683555b61355e565b80151582151514613513576040516327bfbbcb60e21b815260040160405180910390fd5b89158015613540575082548554600160601b918290046001600160601b0390811615159290910416151514155b1561355e5760405163097b027d60e01b815260040160405180910390fd5b8454600160f01b900460ff168261362f578354600090819060ff600160f01b90910481169084168110156135be576135968185615bff565b87549093506135b7906001600160601b03600160601b820481169116615984565b91506135fd565b8060ff168460ff1610156135fd576135d68482615bff565b89549093506135f7906001600160601b03600160601b820481169116615984565b91508093505b60008360ff1611801561361957506000826001600160601b0316115b1561362b5761362b8b83856001614763565b5050505b835486546001600160601b03918216918891600091613650918591166159ac565b82546101009290920a6001600160601b0381810219909316918316021790915585548854600160601b91829004831693508992600c92613695928692919004166159ac565b92506101000a8154816001600160601b0302191690836001600160601b031602179055508215613730578354865465ffffffffffff600160c01b9283900481169290910416116136f5578354600160c01b900465ffffffffffff16613707565b8554600160c01b900465ffffffffffff165b865465ffffffffffff91909116600160c01b0265ffffffffffff60c01b19909116178655613751565b855465ffffffffffff60c01b1916600160c01b4265ffffffffffff16021786555b855460ff60f01b1916600160f01b60ff838116919091029190911787558454600160f81b900416600119016137945785546001600160f81b0316600160f91b1786555b6001840180546001600160f81b0316600160f81b179081905562ffffff600160e01b909104166137c489826148cf565b60008d815260126020526040808220829055601380546001810182559083527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a09001889055518e91906001600160a01b038c1690600080516020615fa0833981519152908390a46138348e89613b82565b9a508a8760010160146101000a81548163ffffffff021916908363ffffffff16021790555061386a898f8d63ffffffff16613ff3565b505050505050505050509392505050565b613883613bdd565b6001600160a01b0381166138aa576040516366385fa360e01b815260040160405180910390fd5b6040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015611311573d6000803e3d6000fd5b6138e7613bdd565b6001600160a01b03811661390e576040516366385fa360e01b815260040160405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b0316613992576040516302c2726760e61b815260040160405180910390fd5b6001546001600160a01b0382811691161461217657604051634014f1a560e01b815260040160405180910390fd5b6000806139cc84613c0a565b9150601082815481106139e1576139e1615bb1565b6000918252602090912060029091020160018101549091506001600160a01b03848116911614613a2457604051630a8c428360e21b815260040160405180910390fd5b6001810154600160a01b900463ffffffff1684146117f9576117f9615dce565b42613a5562278d0060ff8416615b1d565b613a679065ffffffffffff8516615b99565b101561131157604051636717a45560e01b815260040160405180910390fd5b6000613a9a670de0b6b3a764000084615de4565b613aa49084615984565b9050806001600160601b0316836001600160601b0316141580613ad7575081158015613ad757506001600160601b038316155b15611df35760405163743aec6160e01b815260040160405180910390fd5b6000613b0460ff841685615919565b6001600160601b03169050836001600160601b031660156000828254613b2a9190615b06565b925050819055508060166000828254613b439190615b06565b90915550506001600160a01b03851660009081526014602052604081208054839290613b70908490615b06565b909155506117ad90508530838561423a565b6000828152601260205260408082208290556018805463ffffffff908116808552928420859055815492939192613bb99116615e0a565b91906101000a81548163ffffffff021916908363ffffffff16021790555092915050565b6000546001600160a01b03163314613c0857604051632e6c18c960e11b815260040160405180910390fd5b565b600081600003613c2d5760405163b0ce759160e01b815260040160405180910390fd5b506000818152601260205260409020546010548110613c5f5760405163b0ce759160e01b815260040160405180910390fd5b600260ff1660108281548110613c7757613c77615bb1565b6000918252602090912060029091020160010154600160f81b900460ff1614613cb35760405163b0ce759160e01b815260040160405180910390fd5b919050565b826001600160a01b0316613ccb82611f7f565b6001600160a01b031614613cf257604051630a8c428360e21b815260040160405180910390fd5b600154604051632e81a0dd60e11b81526001600160a01b0385811660048301526000921690635d0341ba9060240160c060405180830381865afa158015613d3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d619190615a59565b90506040518060600160405280846001600160a01b03168152602001826060015161ffff16600014613db1576060830151613d9e90610e10615e2d565b613dac9061ffff1642615e4e565b613db9565b65ffffffffffff5b65ffffffffffff908116825260209384015163ffffffff908116928501929092526000948552600d845260409485902083518154958501519490960151909216600160d01b0263ffffffff60d01b1993909116600160a01b026001600160d01b03199094166001600160a01b039095169490941792909217169190911790555050565b60006001600160a01b038216613e65576040516366385fa360e01b815260040160405180910390fd5b6001600160a01b03821660009081526009602052604090205460ff1615613ea257506001600160a01b03166000908152600b602052604090205490565b6001600160a01b0382166000908152600a6020526040902054610f8e9061327f565b60015460405163060648d160e11b81526001600160a01b03838116600483015290911690630c0c91a290602401602060405180830381865afa158015613f0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f329190615b50565b15612176576040516335543b4960e21b815260040160405180910390fd5b60006001600160601b03821115613f7a57604051631a93c68960e11b815260040160405180910390fd5b5090565b6001600160a01b038616600090815260116020526040812080548290613faf90899089908990899089908f906149c7565b60019081018054845492830185556000948552602090942063ffffffff600160c01b909504851692019190915554600160a01b900490911698975050505050505050565b60405182906000906001600160a01b03861690600080516020615fa0833981519152908390a460405181906001600160a01b03851690600090600080516020615fa0833981519152908290a4505050565b6001546001600160a01b031661406d576040516302c2726760e61b815260040160405180910390fd5b6001600160a01b038316614094576040516366385fa360e01b815260040160405180910390fd5b6001600160a01b0382166140bb576040516366385fa360e01b815260040160405180910390fd5b826001600160a01b0316846001600160a01b0316141580156140e457506140e2838561319c565b155b80156140f757506140f58382614bda565b155b1561411557604051639b144c5760e01b815260040160405180910390fd5b6000818152600d6020526040902080546001600160f01b031916905561413c838383614cd6565b80826001600160a01b0316846001600160a01b0316600080516020615fa083398151915260405160405180910390a450505050565b6000856001600160601b0316856001600160601b0316106141a55760405163c64200e960e01b815260040160405180910390fd5b6001600160a01b038716600090815260116020526040812080549091906141d7908990899088908a9089908f906149c7565b60018181015484549182018555600085815260208120600160c01b90920463ffffffff16919092015590915061420d888a615984565b905061421c8a82896001614763565b5060010154600160a01b900463ffffffff1698975050505050505050565b6001600160a01b038416614261576040516366385fa360e01b815260040160405180910390fd5b6001600160a01b038316614288576040516366385fa360e01b815260040160405180910390fd5b816000036142a957604051635e85ae7360e01b815260040160405180910390fd5b6001600160a01b03841630148015906142cb57506001600160a01b0383163014155b156142e95760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b03841660009081526009602052604090205460ff1615614345576001600160a01b03831660009081526009602052604090205460ff1661433a57614335848484614829565b61437c565b614335848484614f0c565b6001600160a01b03831660009081526009602052604090205460ff161561437157614335848484614fa7565b61437c848484614fe8565b8015612e3a57306001600160a01b0385160361442c576040516323b872dd60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906323b872dd906143e39060009087908790600401615c22565b6020604051808303816000875af1158015614402573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144269190615b50565b50612e3a565b306001600160a01b03841603612e3a576040516323b872dd60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906323b872dd9061448d9087906000908790600401615c22565b6020604051808303816000875af11580156144ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ad9190615b50565b805460009081906144f3906001600160601b03600160601b820481169116615984565b83549091506145119087908390600160f01b900460ff166001613af5565b611909868686866146ec565b6001600160a01b0383163b156117ad57604051630a85bd0160e11b81526001600160a01b0384169063150b7a029061455f908890889087908790600401615e6f565b602060405180830381865afa925050508015614598575060408051601f3d908101601f1916820190925261459591810190615ea2565b60015b614601576145a4615ebf565b806308c379a0036145e657506145b8615edb565b806145c357506145e8565b8060405162461bcd60e51b81526004016145dd919061533b565b60405180910390fd5b505b60405163a89c6c0d60e01b815260040160405180910390fd5b6001600160e01b03198116630a85bd0160e11b146146325760405163fa34343f60e01b815260040160405180910390fd5b505050505050565b6001600160a01b03811615612176576001600160a01b038116600081815260086020526040808220805460ff19169055517ffa3e816eec15bc5031b3b3d818bcdf26a7322c33bb66a4eaebd63a92b89ada829190a250565b600080600061469f615029565b90925090506146ae8183615b3c565b9250505090565b426146c362278d0083615b1d565b6146cd9084615b99565b111561131157604051633fb34cfb60e11b815260040160405180910390fd5b6001810180546001600160f81b0316600160f81b179081905562ffffff600160e01b9091041661471c85826148cf565b505060009182526012602052604082208290556013805460018101825592527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0909091015550565b600061477260ff841685615919565b6001600160601b03169050836001600160601b0316601560008282546147989190615b99565b9250508190555080601660008282546147b19190615b99565b90915550506001600160a01b038516600090815260146020526040812080548392906147de908490615b99565b909155506117ad90503086838561423a565b6001600160a01b03811660009081526008602052604090205460ff1661217657604051634014f1a560e01b815260040160405180910390fd5b6000614833614692565b61483d9083615b1d565b6001600160a01b0385166000908152600b602052604081208054929350849290919061486a908490615b06565b90915550506001600160a01b0384166000908152600a602052604081208054839290614897908490615b06565b90915550506001600160a01b0383166000908152600a6020526040812080548392906148c4908490615b99565b909155505050505050565b6001600160a01b038216600090815260116020526040902080546148f4836001615f65565b62ffffff168162ffffff161061499b57600082614912600184615f83565b62ffffff168154811061492757614927615bb1565b90600052602060002001549050836010828154811061494857614948615bb1565b9060005260206000209060020201600101601c6101000a81548162ffffff021916908362ffffff16021790555080838562ffffff168154811061498d5761498d615bb1565b600091825260209091200155505b818054806149ab576149ab615bc7565b6001900381819060005260206000200160009055905550505050565b6013546000908015614a4c5760136149e0600183615b06565b815481106149f0576149f0615bb1565b906000526020600020015490506013805480614a0e57614a0e615bc7565b6001900381819060005260206000200160009055905560108181548110614a3757614a37615bb1565b90600052602060002090600202019150614a86565b505060108054600181018255600091909152600281027f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae67201905b81546001600160601b038a81166001600160c01b031990921691909117600160601b918a16919091021766ffffffffffffff60c01b1916600160c01b65ffffffffffff89160260ff60f01b191617600160f01b60ff88160217825584614aed576001614af0565b60025b82546001600160f81b03908116600160f81b60ff93909316929092029190911783556001830180546001600160a01b031981166001600160a01b0388169081178355601880546001600160c01b031990931690911763ffffffff928316600160a01b021766ffffffffffffff60c01b1916600160c01b8684160262ffffff60e01b191617600160e01b62ffffff89160217909316600160f91b1790915581548116600090815260126020526040812084905582549091614bb09116615e0a565b91906101000a81548163ffffffff021916908363ffffffff16021790555050979650505050505050565b6000818152600d6020526040812060015482906001600160a01b0316635d0341ba614c0486611f7f565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160c060405180830381865afa158015614c48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c6c9190615a59565b82549091506001600160a01b038681169116141580614c9a57508154600160a01b900465ffffffffffff1642115b80614cbb57508154602082015163ffffffff908116600160d01b9092041614155b15614ccb57600092505050610f8e565b506001949350505050565b600080614ce383866139c0565b80549193509150600160601b90046001600160601b031615614d475760405162461bcd60e51b815260206004820152601860248201527f42726f6b656e2c206e6f6e2d7472616e7366657261626c65000000000000000060448201526064016145dd565b6001810180546001600160a01b0319166001600160a01b03861617905580546001600160601b03811690600160f01b900460ff16614d888783836000613af5565b614d958683836000614763565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166323b872dd8888614dd360ff861687615919565b6040518463ffffffff1660e01b8152600401614df193929190615b6d565b6020604051808303816000875af1158015614e10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e349190615b50565b506001830154614e51908890600160e01b900462ffffff166148cf565b6001600160a01b03808716600090815260116020908152604080832080546001808a01805462ffffff909316600160e01b0262ffffff60e01b19909316929092179091558154808201835591855292909320909201879055549051633d77147b60e21b815291169063f5dc51ec90614ed1908a908a908790600401615b6d565b600060405180830381600087803b158015614eeb57600080fd5b505af1158015614eff573d6000803e3d6000fd5b5050505050505050505050565b6000614f16614692565b614f209083615b1d565b6001600160a01b0385166000908152600b6020526040812080549293508492909190614f4d908490615b06565b90915550506001600160a01b0384166000908152600a602052604081208054839290614f7a908490615b06565b90915550506001600160a01b0383166000908152600b602052604081208054849290614897908490615b99565b6000614fb1614692565b614fbb9083615b1d565b6001600160a01b0385166000908152600a6020526040812080549293508392909190614f7a908490615b06565b6000614ff2614692565b614ffc9083615b1d565b6001600160a01b0385166000908152600a6020526040812080549293508392909190614897908490615b06565b600f54600e5460009182916d05ea9ce981a106cf85ce0000000090835b8181101561518b5783600a6000600e848154811061506657615066615bb1565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806150d1575082600b6000600e84815481106150aa576150aa615bb1565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156150f3575050600f54946d05ea9ce981a106cf85ce00000000945092505050565b600a6000600e838154811061510a5761510a615bb1565b60009182526020808320909101546001600160a01b031683528201929092526040019020546151399085615b06565b9350600b6000600e838154811061515257615152615bb1565b60009182526020808320909101546001600160a01b031683528201929092526040019020546151819084615b06565b9250600101615046565b506d05ea9ce981a106cf85ce00000000600f546151a89190615b3c565b8310156151cb575050600f54936d05ea9ce981a106cf85ce000000009350915050565b5090939092509050565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081019190915290565b6001600160e01b03198116811461217657600080fd5b60006020828403121561525157600080fd5b813561321381615229565b6001600160a01b038116811461217657600080fd5b80356001600160601b0381168114613cb357600080fd5b60008060006060848603121561529d57600080fd5b83356152a88161525c565b9250602084013591506152bd60408501615271565b90509250925092565b6000602082840312156152d857600080fd5b81356132138161525c565b60005b838110156152fe5781810151838201526020016152e6565b83811115612e3a5750506000910152565b600081518084526153278160208601602086016152e3565b601f01601f19169290920160200192915050565b602081526000613213602083018461530f565b60006020828403121561536057600080fd5b5035919050565b6000806040838503121561537a57600080fd5b82356153858161525c565b946020939093013593505050565b600080604083850312156153a657600080fd5b823591506153b660208401615271565b90509250929050565b6000806000606084860312156153d457600080fd5b6153dd84615271565b95602085013595506040909401359392505050565b6000806040838503121561540557600080fd5b82356154108161525c565b915060208301356154208161525c565b809150509250929050565b60008060006060848603121561544057600080fd5b833561544b8161525c565b9250602084013561545b8161525c565b929592945050506040919091013590565b6000806040838503121561547f57600080fd5b50508035926020909101359150565b803560ff81168114613cb357600080fd5b65ffffffffffff8116811461217657600080fd5b801515811461217657600080fd5b600080600080600080600060e0888a0312156154dc57600080fd5b87356154e78161525c565b96506154f560208901615271565b95506155036040890161548e565b945060608801356155138161549f565b935061552160808901615271565b925061552f60a08901615271565b915060c088013561553f816154b3565b8091505092959891949750929550565b60008060006060848603121561556457600080fd5b83356153dd8161525c565b600080600080600060a0868803121561558757600080fd5b6155908661548e565b945061559e6020870161548e565b93506155ac6040870161548e565b92506155ba6060870161548e565b915060808601356155ca816154b3565b809150509295509295909350565b6000806000606084860312156155ed57600080fd5b83356155f88161525c565b925061560660208501615271565b91506152bd6040850161548e565b6000806040838503121561562757600080fd5b8235915060208301356154208161525c565b81516001600160601b031681526101408101602083015161566560208401826001600160601b03169052565b50604083015161567f604084018265ffffffffffff169052565b506060830151615694606084018260ff169052565b5060808301516156a9608084018260ff169052565b5060a08301516156c460a08401826001600160a01b03169052565b5060c08301516156dc60c084018263ffffffff169052565b5060e08301516156f460e084018263ffffffff169052565b506101008381015162ffffff16908301526101208084015160ff811682850152612bea565b6000806000806080858703121561572f57600080fd5b61573885615271565b966020860135965060408601359560600135945092505050565b6000806040838503121561576557600080fd5b82356157708161525c565b91506020830135615420816154b3565b6000806000806080858703121561579657600080fd5b84356157a18161525c565b9350602085013592506157b660408601615271565b915060608501356157c6816154b3565b939692955090935050565b6000806000806000608086880312156157e957600080fd5b85356157f48161525c565b945060208601356158048161525c565b935060408601359250606086013567ffffffffffffffff8082111561582857600080fd5b818801915088601f83011261583c57600080fd5b81358181111561584b57600080fd5b89602082850101111561585d57600080fd5b9699959850939650602001949392505050565b6000806040838503121561588357600080fd5b823591506153b66020840161548e565b6000806000606084860312156158a857600080fd5b83356158b38161525c565b92506020840135915060408401356158ca816154b3565b809150509250925092565b6000806000606084860312156158ea57600080fd5b833592506020840135915060408401356158ca816154b3565b634e487b7160e01b600052601160045260246000fd5b60006001600160601b038083168185168183048111821515161561593f5761593f615903565b02949350505050565b634e487b7160e01b600052601260045260246000fd5b60006001600160601b038084168061597857615978615948565b92169190910492915050565b60006001600160601b03838116908316818110156159a4576159a4615903565b039392505050565b60006001600160601b038083168185168083038211156159ce576159ce615903565b01949350505050565b6000602082840312156159e957600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff81118282101715615a2c57615a2c6159f0565b6040525050565b805163ffffffff81168114613cb357600080fd5b805161ffff81168114613cb357600080fd5b600060c08284031215615a6b57600080fd5b60405160c0810167ffffffffffffffff8282108183111715615a8f57615a8f6159f0565b81604052845191508082168214615aa557600080fd5b508152615ab460208401615a33565b6020820152615ac560408401615a33565b6040820152615ad660608401615a47565b6060820152615ae760808401615a47565b608082015260a0830151615afa8161549f565b60a08201529392505050565b600082821015615b1857615b18615903565b500390565b6000816000190483118215151615615b3757615b37615903565b500290565b600082615b4b57615b4b615948565b500490565b600060208284031215615b6257600080fd5b8151613213816154b3565b6001600160a01b0393841681529190921660208201526001600160601b03909116604082015260600190565b60008219821115615bac57615bac615903565b500190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b600060ff831680615bf057615bf0615948565b8060ff84160691505092915050565b600060ff821660ff841680821015615c1957615c19615903565b90039392505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600060208284031215615c5857600080fd5b815167ffffffffffffffff80821115615c7057600080fd5b818401915084601f830112615c8457600080fd5b815181811115615c9657615c966159f0565b6040519150615caf601f8201601f191660200183615a06565b808252856020828501011115615cc457600080fd5b615cd58160208401602086016152e3565b50949350505050565b600181815b80851115615d19578160001904821115615cff57615cff615903565b80851615615d0c57918102915b93841c9390800290615ce3565b509250929050565b600082615d3057506001610f8e565b81615d3d57506000610f8e565b8160018114615d535760028114615d5d57615d79565b6001915050610f8e565b60ff841115615d6e57615d6e615903565b50506001821b610f8e565b5060208310610133831016604e8410600b8410161715615d9c575081810a610f8e565b615da68383615cde565b8060001904821115615dba57615dba615903565b029392505050565b60006132138383615d21565b634e487b7160e01b600052600160045260246000fd5b60006001600160601b0380841680615dfe57615dfe615948565b92169190910692915050565b600063ffffffff808316818103615e2357615e23615903565b6001019392505050565b600061ffff8083168185168183048111821515161561593f5761593f615903565b600065ffffffffffff8083168185168083038211156159ce576159ce615903565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906121349083018461530f565b600060208284031215615eb457600080fd5b815161321381615229565b600060033d1115615ed85760046000803e5060005160e01c5b90565b600060443d1015615ee95790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715615f1957505050505090565b8285019150815181811115615f315750505050505090565b843d8701016020828501011115615f4b5750505050505090565b615f5a60208286010187615a06565b509095945050505050565b600062ffffff8083168185168083038211156159ce576159ce615903565b600062ffffff838116908316818110156159a4576159a461590356feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220ab5707e5fb50ef514258469c76028b72d8676abd2c1c4b8579ea8bd92c526a4764736f6c634300080d0033608060405234801561001057600080fd5b506040518060400160405280601681526020017f566f74652d657363726f776564204576657252697365000000000000000000008152506040518060400160405280600681526020016576655249534560d01b815250600061007661011160201b60201c565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35081516100d3906002906020850190610115565b5080516100e7906003906020840190610115565b5050600054600180546001600160a01b0319166001600160a01b03909216919091179055506101e8565b3390565b828054610121906101ae565b90600052602060002090601f0160209004810192826101435760008555610189565b82601f1061015c57805160ff1916838001178555610189565b82800160010185558215610189579182015b8281111561018957825182559160200191906001019061016e565b50610195929150610199565b5090565b5b80821115610195576000815560010161019a565b600181811c908216806101c257607f821691505b6020821081036101e257634e487b7160e01b600052602260045260246000fd5b50919050565b610748806101f76000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c80638da5cb5b11610097578063b038f20d11610066578063b038f20d146101c4578063d6e03cd4146101d7578063dd62ed3e146101ea578063f2fde38b1461020057600080fd5b80638da5cb5b1461019157806395d89b41146101bc578063a457c2d714610118578063a9059cbb1461011857600080fd5b806323b872dd116100d357806323b872dd14610151578063313ce56714610164578063395093511461011857806370a082311461017e57600080fd5b806306fdde03146100fa578063095ea7b31461011857806318160ddd1461013b575b600080fd5b610102610215565b60405161010f9190610520565b60405180910390f35b61012b610126366004610591565b6102a3565b604051901515815260200161010f565b6101436102b3565b60405190815260200161010f565b61012b61015f3660046105bb565b610326565b61016c601281565b60405160ff909116815260200161010f565b61014361018c3660046105f7565b6103a1565b6000546101a4906001600160a01b031681565b6040516001600160a01b03909116815260200161010f565b61010261042e565b6001546101a4906001600160a01b031681565b61012b6101e5366004610619565b61043b565b6101436101f836600461068c565b600092915050565b61021361020e3660046105f7565b610450565b005b60028054610222906106bf565b80601f016020809104026020016040519081016040528092919081815260200182805461024e906106bf565b801561029b5780601f106102705761010080835404028352916020019161029b565b820191906000526020600020905b81548152906001019060200180831161027e57829003601f168201915b505050505081565b60006102ad6104da565b92915050565b600154604080516363234f3d60e01b815290516000926001600160a01b0316916363234f3d9160048083019260209291908290030181865afa1580156102fd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061032191906106f9565b905090565b600080546001600160a01b0316336001600160a01b03161461034a5761034a6104da565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161038f91815260200190565b60405180910390a35060019392505050565b600080546001600160a01b03908116908316036103c057506000919050565b60015460405163894f03b560e01b81526001600160a01b0384811660048301529091169063894f03b590602401602060405180830381865afa15801561040a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ad91906106f9565b60038054610222906106bf565b60006104456104da565b979650505050505050565b6104586104f3565b6001600160a01b03811661047f576040516366385fa360e01b815260040160405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6040516354ee515160e01b815260040160405180910390fd5b6000546001600160a01b0316331461051e57604051632e6c18c960e11b815260040160405180910390fd5b565b600060208083528351808285015260005b8181101561054d57858101830151858201604001528201610531565b8181111561055f576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b038116811461058c57600080fd5b919050565b600080604083850312156105a457600080fd5b6105ad83610575565b946020939093013593505050565b6000806000606084860312156105d057600080fd5b6105d984610575565b92506105e760208501610575565b9150604084013590509250925092565b60006020828403121561060957600080fd5b61061282610575565b9392505050565b600080600080600080600060e0888a03121561063457600080fd5b61063d88610575565b965061064b60208901610575565b95506040880135945060608801359350608088013560ff8116811461066f57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561069f57600080fd5b6106a883610575565b91506106b660208401610575565b90509250929050565b600181811c908216806106d357607f821691505b6020821081036106f357634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561070b57600080fd5b505191905056fea26469706673582212201e80de34cf8f2824df4d8a4de6eda16b4b93f6b4d9af40966fdf522b9197067864736f6c634300080d0033608060405234801561001057600080fd5b506040518060400160405280601081526020016f4576657252697365205265776172647360801b81525060405180604001604052806009815260200168636c61696d5249534560b81b815250600061006c61010760201b60201c565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35081516100c990600290602085019061010b565b5080516100dd90600390602084019061010b565b5050600054600180546001600160a01b0319166001600160a01b03909216919091179055506101de565b3390565b828054610117906101a4565b90600052602060002090601f016020900481019282610139576000855561017f565b82601f1061015257805160ff191683800117855561017f565b8280016001018555821561017f579182015b8281111561017f578251825591602001919060010190610164565b5061018b92915061018f565b5090565b5b8082111561018b5760008155600101610190565b600181811c908216806101b857607f821691505b6020821081036101d857634e487b7160e01b600052602260045260246000fd5b50919050565b610748806101ed6000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c80638da5cb5b11610097578063b038f20d11610066578063b038f20d146101c4578063d6e03cd4146101d7578063dd62ed3e146101ea578063f2fde38b1461020057600080fd5b80638da5cb5b1461019157806395d89b41146101bc578063a457c2d714610118578063a9059cbb1461011857600080fd5b806323b872dd116100d357806323b872dd14610151578063313ce56714610164578063395093511461011857806370a082311461017e57600080fd5b806306fdde03146100fa578063095ea7b31461011857806318160ddd1461013b575b600080fd5b610102610215565b60405161010f9190610520565b60405180910390f35b61012b610126366004610591565b6102a3565b604051901515815260200161010f565b6101436102b3565b60405190815260200161010f565b61012b61015f3660046105bb565b610326565b61016c601281565b60405160ff909116815260200161010f565b61014361018c3660046105f7565b6103a1565b6000546101a4906001600160a01b031681565b6040516001600160a01b03909116815260200161010f565b61010261042e565b6001546101a4906001600160a01b031681565b61012b6101e5366004610619565b61043b565b6101436101f836600461068c565b600092915050565b61021361020e3660046105f7565b610450565b005b60028054610222906106bf565b80601f016020809104026020016040519081016040528092919081815260200182805461024e906106bf565b801561029b5780601f106102705761010080835404028352916020019161029b565b820191906000526020600020905b81548152906001019060200180831161027e57829003601f168201915b505050505081565b60006102ad6104da565b92915050565b600154604080516306dd29e560e01b815290516000926001600160a01b0316916306dd29e59160048083019260209291908290030181865afa1580156102fd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061032191906106f9565b905090565b600080546001600160a01b0316336001600160a01b03161461034a5761034a6104da565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161038f91815260200190565b60405180910390a35060019392505050565b600080546001600160a01b03908116908316036103c057506000919050565b6001546040516304cbc2fb60e11b81526001600160a01b0384811660048301529091169063099785f690602401602060405180830381865afa15801561040a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ad91906106f9565b60038054610222906106bf565b60006104456104da565b979650505050505050565b6104586104f3565b6001600160a01b03811661047f576040516366385fa360e01b815260040160405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6040516354ee515160e01b815260040160405180910390fd5b6000546001600160a01b0316331461051e57604051632e6c18c960e11b815260040160405180910390fd5b565b600060208083528351808285015260005b8181101561054d57858101830151858201604001528201610531565b8181111561055f576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b038116811461058c57600080fd5b919050565b600080604083850312156105a457600080fd5b6105ad83610575565b946020939093013593505050565b6000806000606084860312156105d057600080fd5b6105d984610575565b92506105e760208501610575565b9150604084013590509250925092565b60006020828403121561060957600080fd5b61061282610575565b9392505050565b600080600080600080600060e0888a03121561063457600080fd5b61063d88610575565b965061064b60208901610575565b95506040880135945060608801359350608088013560ff8116811461066f57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561069f57600080fd5b6106a883610575565b91506106b660208401610575565b90509250929050565b600181811c908216806106d357607f821691505b6020821081036106f357634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561070b57600080fd5b505191905056fea2646970667358221220f35afae76adc4b92710eb555fc201d0373faf6a7430815869d3d45f9c99a850e64736f6c634300080d0033

Deployed Bytecode

0x6080604052600436106104685760003560e01c80638116ed721161024a578063c87b56dd11610139578063e985e9c5116100b6578063ee1725461161007a578063ee17254614610e8f578063f04f384414610ea5578063f128b0c114610ec6578063f13ca76f14610ee6578063f2fde38b14610f0757600080fd5b8063e985e9c514610df9578063eb77837514610e19578063eb84fd7714610e39578063ebbbb8f414610e59578063ed74d26e14610e7957600080fd5b8063e33e4b49116100fd578063e33e4b4914610d6d578063e683015f14610d83578063e6c1c9fc14610da3578063e6f203f314610dc3578063e8a3d48514610de457600080fd5b8063c87b56dd14610ca0578063d22d6f4314610cc0578063d9fbb1e914610ce0578063e1f21c6714610d00578063e2c281db14610d2057600080fd5b8063a578be6c116101c7578063b88d4fde1161018b578063b88d4fde14610c18578063bada23d514610c2b578063c6557fd214610c4b578063c7b8981c14610c6b578063c7bb8dc414610c8057600080fd5b8063a578be6c14610b64578063a802d82b14610b98578063a94ea3b014610bb8578063abdf943414610bd8578063ad1ff74b14610bf857600080fd5b80638da5cb5b1161020e5780638da5cb5b14610ab057806393da8b8114610ad057806395d89b4114610af1578063a22cb46514610b24578063a556f60f14610b4457600080fd5b80638116ed7214610a03578063846ea2d014610a2357806388f8202014610a43578063894f03b514610a635780638ada6b0f14610a9057600080fd5b80632f745c59116103665780635a034bd8116102e357806368c5805e116102a757806368c5805e14610949578063702921f51461097657806370a082311461098d5780637cdd109d146109c35780637d87feb9146109e357600080fd5b80635a034bd8146108b35780635be1ee5d146108d3578063615eaa59146108f357806363234f3d146109135780636352211e1461092957600080fd5b806344d34e501161032a57806344d34e501461082a578063471a751e1461084057806352390c0214610860578063557ed1ba146108805780635718f41a1461089357600080fd5b80632f745c5914610790578063313ce567146107b05780633685d419146107d7578063411d8f2f146107f757806342842e0e1461081757600080fd5b80631370733c116103f457806323b872dd116103b857806323b872dd146106c95780632a55205a146106dc5780632a7b11e61461071b5780632b0e1d79146107505780632bcf161c1461077057600080fd5b80631370733c146106125780631635aa0314610646578063171c1fda1461067e57806317c0287c1461069e57806318160ddd146106b457600080fd5b806306fdde031161043b57806306fdde031461052b578063081812fc14610577578063095ea7b3146105af578063099785f6146105c2578063121407c9146105e257600080fd5b806301ffc9a71461046d57806304a9bbec146104a257806306d254da146104e657806306dd29e514610508575b600080fd5b34801561047957600080fd5b5061048d61048836600461523f565b610f27565b60405190151581526020015b60405180910390f35b3480156104ae57600080fd5b506104c26104bd366004615288565b610f94565b6040805163ffffffff90931683526001600160601b03909116602083015201610499565b3480156104f257600080fd5b506105066105013660046152c6565b611125565b005b34801561051457600080fd5b5061051d61119e565b604051908152602001610499565b34801561053757600080fd5b5061056a604051806040016040528060138152602001724576657252697365204e4654205374616b657360681b81525081565b604051610499919061533b565b34801561058357600080fd5b5061059761059236600461534e565b611210565b6040516001600160a01b039091168152602001610499565b6105066105bd366004615367565b611306565b3480156105ce57600080fd5b5061051d6105dd3660046152c6565b611315565b6105f56105f0366004615393565b611341565b6040805163ffffffff938416815292909116602083015201610499565b34801561061e57600080fd5b506105977f000000000000000000000000dba7b24257fc6e397cb7368b4bc922e944072f1b81565b34801561065257600080fd5b506106666106613660046153bf565b611598565b6040516001600160601b039091168152602001610499565b34801561068a57600080fd5b506105066106993660046153f2565b6115ae565b3480156106aa57600080fd5b5061051d60065481565b3480156106c057600080fd5b5061051d611776565b6105066106d736600461542b565b611796565b3480156106e857600080fd5b506106fc6106f736600461546c565b6117b4565b604080516001600160a01b039093168352602083019190915201610499565b34801561072757600080fd5b5061073b6107363660046154c1565b611800565b60405163ffffffff9091168152602001610499565b34801561075c57600080fd5b5061066661076b366004615367565b6118e1565b34801561077c57600080fd5b5061051d61078b3660046152c6565b611912565b34801561079c57600080fd5b5061073b6107ab366004615367565b61193e565b3480156107bc57600080fd5b506107c5600081565b60405160ff9091168152602001610499565b3480156107e357600080fd5b506105066107f23660046152c6565b6119d6565b34801561080357600080fd5b50600354610597906001600160a01b031681565b61050661082536600461542b565b611b8f565b34801561083657600080fd5b5061051d60045481565b34801561084c57600080fd5b5061050661085b366004615367565b611bc6565b34801561086c57600080fd5b5061050661087b3660046152c6565b611bf9565b34801561088c57600080fd5b504261051d565b34801561089f57600080fd5b506105066108ae3660046152c6565b611d48565b3480156108bf57600080fd5b506105066108ce36600461554f565b611ddf565b3480156108df57600080fd5b506105066108ee36600461556f565b611df8565b3480156108ff57600080fd5b5061073b61090e3660046155d8565b611ef6565b34801561091f57600080fd5b5061051d60165481565b34801561093557600080fd5b5061059761094436600461534e565b611f7f565b34801561095557600080fd5b50610969610964366004615614565b611fc7565b6040516104999190615639565b34801561098257600080fd5b5061051d62278d0081565b34801561099957600080fd5b5061051d6109a83660046152c6565b6001600160a01b031660009081526011602052604090205490565b3480156109cf57600080fd5b506106666109de366004615719565b612092565b3480156109ef57600080fd5b506105066109fe3660046152c6565b61213e565b348015610a0f57600080fd5b50600154610597906001600160a01b031681565b348015610a2f57600080fd5b50610506610a3e3660046152c6565b612179565b348015610a4f57600080fd5b5061048d610a5e3660046152c6565b6121f4565b348015610a6f57600080fd5b5061051d610a7e3660046152c6565b60146020526000908152604090205481565b348015610a9c57600080fd5b50600254610597906001600160a01b031681565b348015610abc57600080fd5b50600054610597906001600160a01b031681565b348015610adc57600080fd5b506005546107c590600160b81b900460ff1681565b348015610afd57600080fd5b5061056a604051806040016040528060078152602001666e66745249534560c81b81525081565b348015610b3057600080fd5b50610506610b3f366004615752565b61223c565b348015610b5057600080fd5b50610506610b5f3660046152c6565b61232d565b348015610b7057600080fd5b506105977f000000000000000000000000bbd7b847c6d0d0b5691518a363194d71426475f181565b348015610ba457600080fd5b50610969610bb336600461534e565b6123a6565b348015610bc457600080fd5b5061051d610bd336600461534e565b61249c565b348015610be457600080fd5b5061073b610bf3366004615780565b6124df565b348015610c0457600080fd5b50600554610597906001600160a01b031681565b610506610c263660046157d1565b612695565b348015610c3757600080fd5b5061073b610c46366004615870565b6126f8565b348015610c5757600080fd5b50610506610c66366004615367565b612891565b348015610c7757600080fd5b506105066128c4565b348015610c8c57600080fd5b5061073b610c9b366004615367565b612a8a565b348015610cac57600080fd5b5061056a610cbb36600461534e565b612bf2565b348015610ccc57600080fd5b50610666610cdb366004615893565b612c64565b348015610cec57600080fd5b50610506610cfb36600461534e565b612cea565b348015610d0c57600080fd5b50610506610d1b36600461542b565b612e40565b348015610d2c57600080fd5b50610d40610d3b366004615288565b612e54565b6040805163ffffffff90941684526001600160601b03909216602084015260ff1690820152606001610499565b348015610d7957600080fd5b5061051d60075481565b348015610d8f57600080fd5b50610506610d9e36600461546c565b613025565b348015610daf57600080fd5b50610506610dbe3660046152c6565b6130b1565b348015610dcf57600080fd5b506005546107c590600160a81b900460ff1681565b348015610df057600080fd5b5061056a61312a565b348015610e0557600080fd5b5061048d610e143660046153f2565b61319c565b348015610e2557600080fd5b50610506610e3436600461534e565b61321a565b348015610e4557600080fd5b5061051d610e5436600461534e565b61327f565b348015610e6557600080fd5b5061073b610e743660046158d5565b6132ba565b348015610e8557600080fd5b5061051d60155481565b348015610e9b57600080fd5b5061051d60175481565b348015610eb157600080fd5b506005546107c590600160b01b900460ff1681565b348015610ed257600080fd5b50610506610ee13660046152c6565b61387b565b348015610ef257600080fd5b506005546107c590600160a01b900460ff1681565b348015610f1357600080fd5b50610506610f223660046152c6565b6138df565b60006001600160e01b0319821663152a902d60e11b1480610f5857506001600160e01b031982166380ac58cd60e01b145b80610f7357506001600160e01b03198216635b5e139f60e01b145b80610f8e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b600080610fa033613969565b600080610fad86886139c0565b80549193509150610fd790600160c01b810465ffffffffffff1690600160f01b900460ff16613a44565b8054600554600091600160601b81046001600160601b039081169260649261100b92600160a01b90920460ff169116615919565b611015919061595e565b61101f9190615984565b6001600160601b0316905080866001600160601b031611156110545760405163bb29610960e01b815260040160405180910390fd5b61105f866000613a86565b815461107a9089908890600160f01b900460ff166001613af5565b81546110a1908790600160c01b810465ffffffffffff1690600160f01b900460ff16611598565b825490945086908390600c906110c8908490600160601b90046001600160601b03166159ac565b92506101000a8154816001600160601b0302191690836001600160601b031602179055506110f68784613b82565b600192909201805463ffffffff60a01b1916600160a01b63ffffffff8516021790555096919550909350505050565b61112d613bdd565b6001600160a01b038116611154576040516366385fa360e01b815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040517fc3f6f2bdf6d9c842a3bc549613cd55a1e4949821f557b66feb8d73eb7f576d9390600090a250565b6001546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156111e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120b91906159d7565b905090565b600061121b82613c0a565b506000828152600d602052604081206001549091906001600160a01b0316635d0341ba61124786611f7f565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160c060405180830381865afa15801561128b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112af9190615a59565b8254909150600160a01b900465ffffffffffff164211806112e657508154602082015163ffffffff908116600160d01b9092041614155b156112f5575060009392505050565b50546001600160a01b031692915050565b611311338383613cb8565b5050565b6001600160a01b03811660009081526014602052604081205461133783613e3c565b610f8e9190615b06565b6000803361134e81613ec4565b60065433903410156113735760405163627554ed60e01b815260040160405180910390fd5b61137e856000613a86565b6001546040516001600160a01b03909116904780156108fc02916000818181858888f193505050501580156113b7573d6000803e3d6000fd5b506000806113c588846139c0565b805491935091506000906113eb906001600160601b03600160601b820481169116615984565b6001600160601b0316905080886001600160601b03161061141f5760405163bb29610960e01b815260040160405180910390fd5b6114298984613b82565b8254909750600090611465906001600160601b0380821691611456918d811691600160601b900416615b1d565b6114609190615b3c565b613f50565b8354909150899084906000906114859084906001600160601b0316615984565b92506101000a8154816001600160601b0302191690836001600160601b031602179055508083600001600c8282829054906101000a90046001600160601b03166114cf9190615984565b82546001600160601b039182166101009390930a92830291909202199091161790555060018301805463ffffffff8a16600160a01b0263ffffffff60a01b19909116179055825461154c9086908b90849065ffffffffffff600160c01b8204169060ff600160f01b8204811691600160f81b900416600214613f7e565b965061155f858b8a63ffffffff16613ff3565b60405163ffffffff8816906001600160a01b03871690600090600080516020615fa0833981519152908290a45050505050509250929050565b60006115a684848442612092565b949350505050565b6115b6613bdd565b6001600160a01b0382166115dd576040516366385fa360e01b815260040160405180910390fd5b6001600160a01b038116611604576040516366385fa360e01b815260040160405180910390fd5b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015611648573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166c91906159d7565b60000361168c5760405163bb29610960e01b815260040160405180910390fd5b6040516370a0823160e01b81523060048201526001600160a01b0383169063a9059cbb90839083906370a0823190602401602060405180830381865afa1580156116da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116fe91906159d7565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611749573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061176d9190615b50565b61131157600080fd5b60135460105460009160019161178c9190615b06565b61120b9190615b06565b336117a081613ec4565b336117ad81868686614044565b5050505050565b600080836000036117d857604051635e85ae7360e01b815260040160405180910390fd5b6003546004546001600160a01b03909116906117f49085615b3c565b915091505b9250929050565b600061180b33613969565b611819888886898987614171565b90506001600160601b038316156118d6576118403089856001600160601b0316600061423a565b6040516323b872dd60e01b81526001600160a01b037f000000000000000000000000bbd7b847c6d0d0b5691518a363194d71426475f116906323b872dd90611891906000908c908890600401615b6d565b6020604051808303816000875af11580156118b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d49190615b50565b505b979650505050505050565b60006118ec33613969565b6000806118f984866139c0565b91509150611909858584846144d0565b95945050505050565b6001600160a01b0381166000908152600c602052604081205461193483611315565b610f8e9190615b99565b6001600160a01b038216600090815260116020526040812080548311156119785760405163c64200e960e01b815260040160405180910390fd5b600081848154811061198c5761198c615bb1565b90600052602060002001549050601081815481106119ac576119ac615bb1565b6000918252602090912060029091020160010154600160a01b900463ffffffff1695945050505050565b6119de613bdd565b6001600160a01b038116611a05576040516366385fa360e01b815260040160405180910390fd5b6001600160a01b03811660009081526009602052604090205460ff16611a3e5760405163e6c4247b60e01b815260040160405180910390fd5b600e5460005b81811015611b5657826001600160a01b0316600e8281548110611a6957611a69615bb1565b6000918252602090912001546001600160a01b031603611b4e57600e8054611a9390600190615b06565b81548110611aa357611aa3615bb1565b600091825260209091200154600e80546001600160a01b039092169183908110611acf57611acf615bb1565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559185168152600b82526040808220829055600990925220805460ff19169055600e805480611b2757611b27615bc7565b600082815260209020810160001990810180546001600160a01b0319169055019055611b56565b600101611a44565b506040516001600160a01b038316907f5e8208b8ab7d1d84def348579f7a8420999ac8b055b5a49d9859b3f820fdde1290600090a25050565b33611b9981613ec4565b33611ba681868686614044565b6040805160008152602081019091526117ad90829087908790879061451d565b611bcf33613969565b60405181906001600160a01b03841690600090600080516020615fa0833981519152908290a45050565b611c01613bdd565b6001600160a01b038116611c28576040516366385fa360e01b815260040160405180910390fd5b6001600160a01b03811660009081526009602052604090205460ff1615611c625760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b0381166000908152600a602052604090205415611cbc576001600160a01b0381166000908152600a6020526040902054611ca29061327f565b6001600160a01b0382166000908152600b60205260409020555b6001600160a01b038116600081815260096020526040808220805460ff19166001908117909155600e8054918201815583527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0180546001600160a01b03191684179055517f743dcd4a012534912a3350f3ed8937d3b4f0771c62892ed15e4373dc2c5f584a9190a250565b611d50613bdd565b6001600160a01b038116611d77576040516366385fa360e01b815260040160405180910390fd5b600154611d8c906001600160a01b031661463a565b611d9581612179565b600180546001600160a01b0319166001600160a01b0383169081179091556040517f151b7e66bd44c3b053284cb5cc54c216555683d266fbd4518b9dc513064be66d90600090a250565b611de833613969565b611df3838383613ff3565b505050565b611e00613bdd565b60ff82161580611e13575060788260ff16115b15611e315760405163c64200e960e01b815260040160405180910390fd5b6005805461ffff60a01b1916600160a01b60ff8881169190910260ff60a81b191691909117600160a81b878316021761ffff60b01b1916600160b01b8683160260ff60b81b191617600160b81b9185169190910217905580611e94576001611e97565b60025b6007556040805160ff878116825286811660208301528581168284015284166060820152821515608082015290517fa6bd3ea50016bdc4bfa355baf0d0174bfd46fc6e640605397501935630aafec59181900360a00190a15050505050565b6000611f0133613969565b60ff82161580611f20575060055460ff600160b81b9091048116908316115b80611f465750600c8260ff16118015611f4657506000611f41600c84615bdd565b60ff16115b15611f645760405163c64200e960e01b815260040160405180910390fd5b611f6f836000613a86565b6115a68484600085426000614171565b600080611f8b83613c0a565b9050600060108281548110611fa257611fa2615bb1565b60009182526020909120600160029092020101546001600160a01b0316949350505050565b611fcf6151d5565b611fd983836139c0565b604080516101408101825282546001600160601b038082168352600160601b8204166020830152600160c01b80820465ffffffffffff1693830193909352600160f01b810460ff9081166060840152600160f81b91829004811660808401526001909401546001600160a01b03811660a0840152600160a01b810463ffffffff90811660c085015293810490931660e0830152600160e01b830462ffffff16610100830152909104909116610120820152949350505050565b6000806120a262278d0085615b1d565b6120ac9086615b99565b9050600060026120bf62278d0087615b1d565b6120c99190615b3c565b6120d39087615b99565b841015612105576005546064906120f490600160a81b900460ff1689615919565b6120fe919061595e565b9050612134565b818410156121345760055460649061212790600160b01b900460ff1689615919565b612131919061595e565b90505b9695505050505050565b612146613bdd565b6001600160a01b03811661216d576040516366385fa360e01b815260040160405180910390fd5b6121768161463a565b50565b612181613bdd565b6001600160a01b0381166121a8576040516366385fa360e01b815260040160405180910390fd5b6001600160a01b038116600081815260086020526040808220805460ff19166001179055517f55c7ccdd680e7fe5636cf2334be362332f7e4972e3f724d2c01df0bc85222f039190a250565b60006001600160a01b03821661221d576040516366385fa360e01b815260040160405180910390fd5b506001600160a01b031660009081526009602052604090205460ff1690565b6001546001600160a01b0316612265576040516302c2726760e61b815260040160405180910390fd5b600033600154604051631b3b02e560e11b81526001600160a01b0380841660048301528681166024830152851515604483015292935091169063367605ca90606401600060405180830381600087803b1580156122c157600080fd5b505af11580156122d5573d6000803e3d6000fd5b50505050826001600160a01b0316816001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3184604051612320911515815260200190565b60405180910390a3505050565b612335613bdd565b6001600160a01b03811661235c576040516366385fa360e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517f57f5e93e81d1f0875d66647df6e542cf10af3b19c7e656121bc389e20afab77790600090a250565b6123ae6151d5565b60006123b983613c0a565b9050601081815481106123ce576123ce615bb1565b60009182526020918290206040805161014081018252600290930290910180546001600160601b038082168552600160601b8204169484019490945265ffffffffffff600160c01b808604919091169284019290925260ff600160f01b850481166060850152600160f81b94859004811660808501526001909101546001600160a01b03811660a085015263ffffffff600160a01b8204811660c086015292810490921660e084015262ffffff600160e01b8304166101008401529290049091166101208201529392505050565b60006d05ea9ce981a106cf85ce000000008211156124cd5760405163c64200e960e01b815260040160405180910390fd5b6124d5614692565b610f8e9083615b1d565b60006124ea33613969565b6000806124f786886139c0565b8054919350915061252190600160c01b810465ffffffffffff1690600160f01b900460ff166146b5565b8315801561253b57508054600160f81b900460ff16600214155b1561255957604051630e0d376760e21b815260040160405180910390fd5b805460009061257a906001600160601b03600160601b820481169116615984565b9050806001600160601b0316866001600160601b031611156125af5760405163bb29610960e01b815260040160405180910390fd5b6125ba866001613a86565b60006001600160601b038716156125f75782546125e6908a908990600160f01b900460ff166001613af5565b6125f08783615984565b9150600190505b82546001600160601b03838116911614612628575081546001600160c01b0319166001600160601b03821617825560015b801561268557816001600160601b03166000036126545761264b898986866146ec565b60009450612689565b61265e8885613b82565b60018401805463ffffffff60a01b1916600160a01b63ffffffff8416021790559450612689565b8794505b50505050949350505050565b3361269f81613ec4565b336126ac81888888614044565b6126ef8188888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061451d92505050565b50505050505050565b60003361270481613ec4565b3360008061271287846139c0565b8054919350915061273c90600160c01b810465ffffffffffff1690600160f01b900460ff16613a44565b805460ff808816600160f01b909204161061276a576040516339fb820560e11b815260040160405180910390fd5b60055460ff600160b81b909104811690871611806127a35750600c8660ff161180156127a35750600061279e600c88615bdd565b60ff16115b156127c15760405163c64200e960e01b815260040160405180910390fd5b80546000906127da90600160f01b900460ff1688615bff565b82549091506000906127fe906001600160601b03600160601b820481169116615984565b905061280d8582846001614763565b825466ffffffffffffff60c01b1916600160f01b60ff8a160265ffffffffffff60c01b191617600160c01b4265ffffffffffff160217835561284f8985613b82565b9650868360010160146101000a81548163ffffffff021916908363ffffffff160217905550612885858a8963ffffffff16613ff3565b50505050505092915050565b61289a33613969565b60405181906000906001600160a01b03851690600080516020615fa0833981519152908390a45050565b3360006128d082611315565b9050806000036128f3576040516373380d9960e01b815260040160405180910390fd5b6001600160a01b0382166000908152600c60205260408120805483929061291b908490615b99565b9091555061292e9050823083600061423a565b6040516323b872dd60e01b81526001600160a01b037f000000000000000000000000bbd7b847c6d0d0b5691518a363194d71426475f116906323b872dd9061297f9085906000908690600401615c22565b6020604051808303816000875af115801561299e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129c29190615b50565b5060015460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490529091169063a9059cbb906044016020604051808303816000875af1158015612a16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a3a9190615b50565b612a4357600080fd5b816001600160a01b03167f8a43c4352486ec339f487f64af78ca5cbf06cd47833f073d3baf3a193e50316182604051612a7e91815260200190565b60405180910390a25050565b6005546000906001600160a01b0316336001600160a01b031614612ac157604051634014f1a560e01b815260040160405180910390fd5b600080612ace84866139c0565b80549193509150612af890600160c01b810465ffffffffffff1690600160f01b900460ff166146b5565b8054600119600160f81b90910460ff1601612b2657604051630b54d17d60e21b815260040160405180910390fd5b8054600160601b90046001600160601b031615612b975780546001600160601b03600160601b82048116918391600091612b6291859116615984565b82546001600160601b039182166101009390930a9283029190920219909116179055508054600160601b600160c01b03191681555b80546001600160f81b0316600160f91b178155612bb48483613b82565b9250828160010160146101000a81548163ffffffff021916908363ffffffff160217905550612bea85858563ffffffff16613ff3565b505092915050565b60025460405163c87b56dd60e01b8152600481018390526060916001600160a01b03169063c87b56dd90602401600060405180830381865afa158015612c3c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f8e9190810190615c46565b6000612c6f33613969565b600080612c7c85876139c0565b80549193509150612ca690600160c01b810465ffffffffffff1690600160f01b900460ff166146b5565b83158015612cc057508054600160f81b900460ff16600214155b15612cde57604051630e0d376760e21b815260040160405180910390fd5b612134868684846144d0565b612cf3336147f0565b3360008181526009602052604090205460ff1615612d24576040516334d1f12360e11b815260040160405180910390fd5b612d2f308284614829565b8160176000828254612d419190615b99565b9091555060009050612d51614692565b612d5b9084615b1d565b6001600160a01b0383166000908152600a6020526040812080549293508392909190612d88908490615b06565b9250508190555080600f6000828254612da19190615b06565b90915550506040516323b872dd60e01b81526001600160a01b037f000000000000000000000000bbd7b847c6d0d0b5691518a363194d71426475f116906323b872dd90612df79060009030908890600401615c22565b6020604051808303816000875af1158015612e16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e3a9190615b50565b50505050565b612e4933613969565b611df3838383613cb8565b60008080612e6133613969565b600080612e6e87896139c0565b80549193509150612e9890600160c01b810465ffffffffffff1690600160f01b900460ff16613a44565b612ea3866000613a86565b8054600160f01b900460ff169250612ebe8887856001614763565b8054612edc906001600160601b03600160601b820481169116615984565b81549094506001600160601b03600160601b90910481169087161115612f71578054612f1890600160601b90046001600160601b031687615984565b8154600160601b600160c01b03198116835590965086908290600090612f489084906001600160601b03166159ac565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550612fba565b805486908290600c90612f95908490600160601b90046001600160601b0316615984565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505b805465ffffffffffff60c01b1916600160c01b4265ffffffffffff1602178155612fe48783613b82565b9450848160010160146101000a81548163ffffffff021916908363ffffffff16021790555061301a88888763ffffffff16613ff3565b505093509350939050565b61302d613bdd565b6103e88211156130505760405163c64200e960e01b815260040160405180910390fd5b61305b81600a615dc2565b61306d83670de0b6b3a7640000615b1d565b6130779190615b3c565b6006556040518281527f2b31447d1e8e344a5cedfa80160758f11af3dbc174e4f7fbf4b6f7a67207519c9060200160405180910390a15050565b6130b9613bdd565b6001600160a01b0381166130e0576040516366385fa360e01b815260040160405180910390fd5b600580546001600160a01b0319166001600160a01b0383169081179091556040517f4971c9b5ab1ad9f04eba5badf6c7ae3def7b48a2a8c703666b313e647fd4f5e290600090a250565b6002546040805163e8a3d48560e01b815290516060926001600160a01b03169163e8a3d4859160048083019260009291908290030181865afa158015613174573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261120b9190810190615c46565b60015460405163e985e9c560e01b81526001600160a01b0384811660048301528381166024830152600092169063e985e9c590604401602060405180830381865afa1580156131ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132139190615b50565b9392505050565b613222613bdd565b600a8111156132445760405163c64200e960e01b815260040160405180910390fd5b60048190556040518181527fd9b587d0d884e97b8e3772325d18ffc0412781f43cb5471b8eb5972667724f019060200160405180910390a150565b6000600f548211156132a45760405163c64200e960e01b815260040160405180910390fd5b60006132ae614692565b90506132138184615b3c565b6000336132c681613ec4565b6002600754146132e9576040516310a2f14360e11b815260040160405180910390fd5b336000806132f788846139c0565b9150915060008061330889866139c0565b84549193509150600090429061332c9062278d0090600160f01b900460ff16615b1d565b85546133479190600160c01b900465ffffffffffff16615b99565b835491119150600090429061336a9062278d0090600160f01b900460ff16615b1d565b84546133859190600160c01b900465ffffffffffff16615b99565b1090508115158190036134ef5782548554600160f01b9182900460ff9081169290910416146133c75760405163042e227b60e41b815260040160405180910390fd5b891580156133ea575082548554600160f81b9182900460ff908116929091041614155b15613408576040516306524e8b60e41b815260040160405180910390fd5b8454600160601b90046001600160601b0316156134795784546001600160601b03600160601b8204811691879160009161344491859116615984565b82546001600160601b039182166101009390930a9283029190920219909116179055508454600160601b600160c01b03191685555b8254600160601b90046001600160601b0316156134ea5782546001600160601b03600160601b820481169185916000916134b591859116615984565b82546001600160601b039182166101009390930a9283029190920219909116179055508254600160601b600160c01b03191683555b61355e565b80151582151514613513576040516327bfbbcb60e21b815260040160405180910390fd5b89158015613540575082548554600160601b918290046001600160601b0390811615159290910416151514155b1561355e5760405163097b027d60e01b815260040160405180910390fd5b8454600160f01b900460ff168261362f578354600090819060ff600160f01b90910481169084168110156135be576135968185615bff565b87549093506135b7906001600160601b03600160601b820481169116615984565b91506135fd565b8060ff168460ff1610156135fd576135d68482615bff565b89549093506135f7906001600160601b03600160601b820481169116615984565b91508093505b60008360ff1611801561361957506000826001600160601b0316115b1561362b5761362b8b83856001614763565b5050505b835486546001600160601b03918216918891600091613650918591166159ac565b82546101009290920a6001600160601b0381810219909316918316021790915585548854600160601b91829004831693508992600c92613695928692919004166159ac565b92506101000a8154816001600160601b0302191690836001600160601b031602179055508215613730578354865465ffffffffffff600160c01b9283900481169290910416116136f5578354600160c01b900465ffffffffffff16613707565b8554600160c01b900465ffffffffffff165b865465ffffffffffff91909116600160c01b0265ffffffffffff60c01b19909116178655613751565b855465ffffffffffff60c01b1916600160c01b4265ffffffffffff16021786555b855460ff60f01b1916600160f01b60ff838116919091029190911787558454600160f81b900416600119016137945785546001600160f81b0316600160f91b1786555b6001840180546001600160f81b0316600160f81b179081905562ffffff600160e01b909104166137c489826148cf565b60008d815260126020526040808220829055601380546001810182559083527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a09001889055518e91906001600160a01b038c1690600080516020615fa0833981519152908390a46138348e89613b82565b9a508a8760010160146101000a81548163ffffffff021916908363ffffffff16021790555061386a898f8d63ffffffff16613ff3565b505050505050505050509392505050565b613883613bdd565b6001600160a01b0381166138aa576040516366385fa360e01b815260040160405180910390fd5b6040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015611311573d6000803e3d6000fd5b6138e7613bdd565b6001600160a01b03811661390e576040516366385fa360e01b815260040160405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b0316613992576040516302c2726760e61b815260040160405180910390fd5b6001546001600160a01b0382811691161461217657604051634014f1a560e01b815260040160405180910390fd5b6000806139cc84613c0a565b9150601082815481106139e1576139e1615bb1565b6000918252602090912060029091020160018101549091506001600160a01b03848116911614613a2457604051630a8c428360e21b815260040160405180910390fd5b6001810154600160a01b900463ffffffff1684146117f9576117f9615dce565b42613a5562278d0060ff8416615b1d565b613a679065ffffffffffff8516615b99565b101561131157604051636717a45560e01b815260040160405180910390fd5b6000613a9a670de0b6b3a764000084615de4565b613aa49084615984565b9050806001600160601b0316836001600160601b0316141580613ad7575081158015613ad757506001600160601b038316155b15611df35760405163743aec6160e01b815260040160405180910390fd5b6000613b0460ff841685615919565b6001600160601b03169050836001600160601b031660156000828254613b2a9190615b06565b925050819055508060166000828254613b439190615b06565b90915550506001600160a01b03851660009081526014602052604081208054839290613b70908490615b06565b909155506117ad90508530838561423a565b6000828152601260205260408082208290556018805463ffffffff908116808552928420859055815492939192613bb99116615e0a565b91906101000a81548163ffffffff021916908363ffffffff16021790555092915050565b6000546001600160a01b03163314613c0857604051632e6c18c960e11b815260040160405180910390fd5b565b600081600003613c2d5760405163b0ce759160e01b815260040160405180910390fd5b506000818152601260205260409020546010548110613c5f5760405163b0ce759160e01b815260040160405180910390fd5b600260ff1660108281548110613c7757613c77615bb1565b6000918252602090912060029091020160010154600160f81b900460ff1614613cb35760405163b0ce759160e01b815260040160405180910390fd5b919050565b826001600160a01b0316613ccb82611f7f565b6001600160a01b031614613cf257604051630a8c428360e21b815260040160405180910390fd5b600154604051632e81a0dd60e11b81526001600160a01b0385811660048301526000921690635d0341ba9060240160c060405180830381865afa158015613d3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d619190615a59565b90506040518060600160405280846001600160a01b03168152602001826060015161ffff16600014613db1576060830151613d9e90610e10615e2d565b613dac9061ffff1642615e4e565b613db9565b65ffffffffffff5b65ffffffffffff908116825260209384015163ffffffff908116928501929092526000948552600d845260409485902083518154958501519490960151909216600160d01b0263ffffffff60d01b1993909116600160a01b026001600160d01b03199094166001600160a01b039095169490941792909217169190911790555050565b60006001600160a01b038216613e65576040516366385fa360e01b815260040160405180910390fd5b6001600160a01b03821660009081526009602052604090205460ff1615613ea257506001600160a01b03166000908152600b602052604090205490565b6001600160a01b0382166000908152600a6020526040902054610f8e9061327f565b60015460405163060648d160e11b81526001600160a01b03838116600483015290911690630c0c91a290602401602060405180830381865afa158015613f0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f329190615b50565b15612176576040516335543b4960e21b815260040160405180910390fd5b60006001600160601b03821115613f7a57604051631a93c68960e11b815260040160405180910390fd5b5090565b6001600160a01b038616600090815260116020526040812080548290613faf90899089908990899089908f906149c7565b60019081018054845492830185556000948552602090942063ffffffff600160c01b909504851692019190915554600160a01b900490911698975050505050505050565b60405182906000906001600160a01b03861690600080516020615fa0833981519152908390a460405181906001600160a01b03851690600090600080516020615fa0833981519152908290a4505050565b6001546001600160a01b031661406d576040516302c2726760e61b815260040160405180910390fd5b6001600160a01b038316614094576040516366385fa360e01b815260040160405180910390fd5b6001600160a01b0382166140bb576040516366385fa360e01b815260040160405180910390fd5b826001600160a01b0316846001600160a01b0316141580156140e457506140e2838561319c565b155b80156140f757506140f58382614bda565b155b1561411557604051639b144c5760e01b815260040160405180910390fd5b6000818152600d6020526040902080546001600160f01b031916905561413c838383614cd6565b80826001600160a01b0316846001600160a01b0316600080516020615fa083398151915260405160405180910390a450505050565b6000856001600160601b0316856001600160601b0316106141a55760405163c64200e960e01b815260040160405180910390fd5b6001600160a01b038716600090815260116020526040812080549091906141d7908990899088908a9089908f906149c7565b60018181015484549182018555600085815260208120600160c01b90920463ffffffff16919092015590915061420d888a615984565b905061421c8a82896001614763565b5060010154600160a01b900463ffffffff1698975050505050505050565b6001600160a01b038416614261576040516366385fa360e01b815260040160405180910390fd5b6001600160a01b038316614288576040516366385fa360e01b815260040160405180910390fd5b816000036142a957604051635e85ae7360e01b815260040160405180910390fd5b6001600160a01b03841630148015906142cb57506001600160a01b0383163014155b156142e95760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b03841660009081526009602052604090205460ff1615614345576001600160a01b03831660009081526009602052604090205460ff1661433a57614335848484614829565b61437c565b614335848484614f0c565b6001600160a01b03831660009081526009602052604090205460ff161561437157614335848484614fa7565b61437c848484614fe8565b8015612e3a57306001600160a01b0385160361442c576040516323b872dd60e01b81526001600160a01b037f000000000000000000000000dba7b24257fc6e397cb7368b4bc922e944072f1b16906323b872dd906143e39060009087908790600401615c22565b6020604051808303816000875af1158015614402573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144269190615b50565b50612e3a565b306001600160a01b03841603612e3a576040516323b872dd60e01b81526001600160a01b037f000000000000000000000000dba7b24257fc6e397cb7368b4bc922e944072f1b16906323b872dd9061448d9087906000908790600401615c22565b6020604051808303816000875af11580156144ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ad9190615b50565b805460009081906144f3906001600160601b03600160601b820481169116615984565b83549091506145119087908390600160f01b900460ff166001613af5565b611909868686866146ec565b6001600160a01b0383163b156117ad57604051630a85bd0160e11b81526001600160a01b0384169063150b7a029061455f908890889087908790600401615e6f565b602060405180830381865afa925050508015614598575060408051601f3d908101601f1916820190925261459591810190615ea2565b60015b614601576145a4615ebf565b806308c379a0036145e657506145b8615edb565b806145c357506145e8565b8060405162461bcd60e51b81526004016145dd919061533b565b60405180910390fd5b505b60405163a89c6c0d60e01b815260040160405180910390fd5b6001600160e01b03198116630a85bd0160e11b146146325760405163fa34343f60e01b815260040160405180910390fd5b505050505050565b6001600160a01b03811615612176576001600160a01b038116600081815260086020526040808220805460ff19169055517ffa3e816eec15bc5031b3b3d818bcdf26a7322c33bb66a4eaebd63a92b89ada829190a250565b600080600061469f615029565b90925090506146ae8183615b3c565b9250505090565b426146c362278d0083615b1d565b6146cd9084615b99565b111561131157604051633fb34cfb60e11b815260040160405180910390fd5b6001810180546001600160f81b0316600160f81b179081905562ffffff600160e01b9091041661471c85826148cf565b505060009182526012602052604082208290556013805460018101825592527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0909091015550565b600061477260ff841685615919565b6001600160601b03169050836001600160601b0316601560008282546147989190615b99565b9250508190555080601660008282546147b19190615b99565b90915550506001600160a01b038516600090815260146020526040812080548392906147de908490615b99565b909155506117ad90503086838561423a565b6001600160a01b03811660009081526008602052604090205460ff1661217657604051634014f1a560e01b815260040160405180910390fd5b6000614833614692565b61483d9083615b1d565b6001600160a01b0385166000908152600b602052604081208054929350849290919061486a908490615b06565b90915550506001600160a01b0384166000908152600a602052604081208054839290614897908490615b06565b90915550506001600160a01b0383166000908152600a6020526040812080548392906148c4908490615b99565b909155505050505050565b6001600160a01b038216600090815260116020526040902080546148f4836001615f65565b62ffffff168162ffffff161061499b57600082614912600184615f83565b62ffffff168154811061492757614927615bb1565b90600052602060002001549050836010828154811061494857614948615bb1565b9060005260206000209060020201600101601c6101000a81548162ffffff021916908362ffffff16021790555080838562ffffff168154811061498d5761498d615bb1565b600091825260209091200155505b818054806149ab576149ab615bc7565b6001900381819060005260206000200160009055905550505050565b6013546000908015614a4c5760136149e0600183615b06565b815481106149f0576149f0615bb1565b906000526020600020015490506013805480614a0e57614a0e615bc7565b6001900381819060005260206000200160009055905560108181548110614a3757614a37615bb1565b90600052602060002090600202019150614a86565b505060108054600181018255600091909152600281027f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae67201905b81546001600160601b038a81166001600160c01b031990921691909117600160601b918a16919091021766ffffffffffffff60c01b1916600160c01b65ffffffffffff89160260ff60f01b191617600160f01b60ff88160217825584614aed576001614af0565b60025b82546001600160f81b03908116600160f81b60ff93909316929092029190911783556001830180546001600160a01b031981166001600160a01b0388169081178355601880546001600160c01b031990931690911763ffffffff928316600160a01b021766ffffffffffffff60c01b1916600160c01b8684160262ffffff60e01b191617600160e01b62ffffff89160217909316600160f91b1790915581548116600090815260126020526040812084905582549091614bb09116615e0a565b91906101000a81548163ffffffff021916908363ffffffff16021790555050979650505050505050565b6000818152600d6020526040812060015482906001600160a01b0316635d0341ba614c0486611f7f565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160c060405180830381865afa158015614c48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c6c9190615a59565b82549091506001600160a01b038681169116141580614c9a57508154600160a01b900465ffffffffffff1642115b80614cbb57508154602082015163ffffffff908116600160d01b9092041614155b15614ccb57600092505050610f8e565b506001949350505050565b600080614ce383866139c0565b80549193509150600160601b90046001600160601b031615614d475760405162461bcd60e51b815260206004820152601860248201527f42726f6b656e2c206e6f6e2d7472616e7366657261626c65000000000000000060448201526064016145dd565b6001810180546001600160a01b0319166001600160a01b03861617905580546001600160601b03811690600160f01b900460ff16614d888783836000613af5565b614d958683836000614763565b6001600160a01b037f000000000000000000000000dba7b24257fc6e397cb7368b4bc922e944072f1b166323b872dd8888614dd360ff861687615919565b6040518463ffffffff1660e01b8152600401614df193929190615b6d565b6020604051808303816000875af1158015614e10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e349190615b50565b506001830154614e51908890600160e01b900462ffffff166148cf565b6001600160a01b03808716600090815260116020908152604080832080546001808a01805462ffffff909316600160e01b0262ffffff60e01b19909316929092179091558154808201835591855292909320909201879055549051633d77147b60e21b815291169063f5dc51ec90614ed1908a908a908790600401615b6d565b600060405180830381600087803b158015614eeb57600080fd5b505af1158015614eff573d6000803e3d6000fd5b5050505050505050505050565b6000614f16614692565b614f209083615b1d565b6001600160a01b0385166000908152600b6020526040812080549293508492909190614f4d908490615b06565b90915550506001600160a01b0384166000908152600a602052604081208054839290614f7a908490615b06565b90915550506001600160a01b0383166000908152600b602052604081208054849290614897908490615b99565b6000614fb1614692565b614fbb9083615b1d565b6001600160a01b0385166000908152600a6020526040812080549293508392909190614f7a908490615b06565b6000614ff2614692565b614ffc9083615b1d565b6001600160a01b0385166000908152600a6020526040812080549293508392909190614897908490615b06565b600f54600e5460009182916d05ea9ce981a106cf85ce0000000090835b8181101561518b5783600a6000600e848154811061506657615066615bb1565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806150d1575082600b6000600e84815481106150aa576150aa615bb1565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156150f3575050600f54946d05ea9ce981a106cf85ce00000000945092505050565b600a6000600e838154811061510a5761510a615bb1565b60009182526020808320909101546001600160a01b031683528201929092526040019020546151399085615b06565b9350600b6000600e838154811061515257615152615bb1565b60009182526020808320909101546001600160a01b031683528201929092526040019020546151819084615b06565b9250600101615046565b506d05ea9ce981a106cf85ce00000000600f546151a89190615b3c565b8310156151cb575050600f54936d05ea9ce981a106cf85ce000000009350915050565b5090939092509050565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081019190915290565b6001600160e01b03198116811461217657600080fd5b60006020828403121561525157600080fd5b813561321381615229565b6001600160a01b038116811461217657600080fd5b80356001600160601b0381168114613cb357600080fd5b60008060006060848603121561529d57600080fd5b83356152a88161525c565b9250602084013591506152bd60408501615271565b90509250925092565b6000602082840312156152d857600080fd5b81356132138161525c565b60005b838110156152fe5781810151838201526020016152e6565b83811115612e3a5750506000910152565b600081518084526153278160208601602086016152e3565b601f01601f19169290920160200192915050565b602081526000613213602083018461530f565b60006020828403121561536057600080fd5b5035919050565b6000806040838503121561537a57600080fd5b82356153858161525c565b946020939093013593505050565b600080604083850312156153a657600080fd5b823591506153b660208401615271565b90509250929050565b6000806000606084860312156153d457600080fd5b6153dd84615271565b95602085013595506040909401359392505050565b6000806040838503121561540557600080fd5b82356154108161525c565b915060208301356154208161525c565b809150509250929050565b60008060006060848603121561544057600080fd5b833561544b8161525c565b9250602084013561545b8161525c565b929592945050506040919091013590565b6000806040838503121561547f57600080fd5b50508035926020909101359150565b803560ff81168114613cb357600080fd5b65ffffffffffff8116811461217657600080fd5b801515811461217657600080fd5b600080600080600080600060e0888a0312156154dc57600080fd5b87356154e78161525c565b96506154f560208901615271565b95506155036040890161548e565b945060608801356155138161549f565b935061552160808901615271565b925061552f60a08901615271565b915060c088013561553f816154b3565b8091505092959891949750929550565b60008060006060848603121561556457600080fd5b83356153dd8161525c565b600080600080600060a0868803121561558757600080fd5b6155908661548e565b945061559e6020870161548e565b93506155ac6040870161548e565b92506155ba6060870161548e565b915060808601356155ca816154b3565b809150509295509295909350565b6000806000606084860312156155ed57600080fd5b83356155f88161525c565b925061560660208501615271565b91506152bd6040850161548e565b6000806040838503121561562757600080fd5b8235915060208301356154208161525c565b81516001600160601b031681526101408101602083015161566560208401826001600160601b03169052565b50604083015161567f604084018265ffffffffffff169052565b506060830151615694606084018260ff169052565b5060808301516156a9608084018260ff169052565b5060a08301516156c460a08401826001600160a01b03169052565b5060c08301516156dc60c084018263ffffffff169052565b5060e08301516156f460e084018263ffffffff169052565b506101008381015162ffffff16908301526101208084015160ff811682850152612bea565b6000806000806080858703121561572f57600080fd5b61573885615271565b966020860135965060408601359560600135945092505050565b6000806040838503121561576557600080fd5b82356157708161525c565b91506020830135615420816154b3565b6000806000806080858703121561579657600080fd5b84356157a18161525c565b9350602085013592506157b660408601615271565b915060608501356157c6816154b3565b939692955090935050565b6000806000806000608086880312156157e957600080fd5b85356157f48161525c565b945060208601356158048161525c565b935060408601359250606086013567ffffffffffffffff8082111561582857600080fd5b818801915088601f83011261583c57600080fd5b81358181111561584b57600080fd5b89602082850101111561585d57600080fd5b9699959850939650602001949392505050565b6000806040838503121561588357600080fd5b823591506153b66020840161548e565b6000806000606084860312156158a857600080fd5b83356158b38161525c565b92506020840135915060408401356158ca816154b3565b809150509250925092565b6000806000606084860312156158ea57600080fd5b833592506020840135915060408401356158ca816154b3565b634e487b7160e01b600052601160045260246000fd5b60006001600160601b038083168185168183048111821515161561593f5761593f615903565b02949350505050565b634e487b7160e01b600052601260045260246000fd5b60006001600160601b038084168061597857615978615948565b92169190910492915050565b60006001600160601b03838116908316818110156159a4576159a4615903565b039392505050565b60006001600160601b038083168185168083038211156159ce576159ce615903565b01949350505050565b6000602082840312156159e957600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff81118282101715615a2c57615a2c6159f0565b6040525050565b805163ffffffff81168114613cb357600080fd5b805161ffff81168114613cb357600080fd5b600060c08284031215615a6b57600080fd5b60405160c0810167ffffffffffffffff8282108183111715615a8f57615a8f6159f0565b81604052845191508082168214615aa557600080fd5b508152615ab460208401615a33565b6020820152615ac560408401615a33565b6040820152615ad660608401615a47565b6060820152615ae760808401615a47565b608082015260a0830151615afa8161549f565b60a08201529392505050565b600082821015615b1857615b18615903565b500390565b6000816000190483118215151615615b3757615b37615903565b500290565b600082615b4b57615b4b615948565b500490565b600060208284031215615b6257600080fd5b8151613213816154b3565b6001600160a01b0393841681529190921660208201526001600160601b03909116604082015260600190565b60008219821115615bac57615bac615903565b500190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b600060ff831680615bf057615bf0615948565b8060ff84160691505092915050565b600060ff821660ff841680821015615c1957615c19615903565b90039392505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600060208284031215615c5857600080fd5b815167ffffffffffffffff80821115615c7057600080fd5b818401915084601f830112615c8457600080fd5b815181811115615c9657615c966159f0565b6040519150615caf601f8201601f191660200183615a06565b808252856020828501011115615cc457600080fd5b615cd58160208401602086016152e3565b50949350505050565b600181815b80851115615d19578160001904821115615cff57615cff615903565b80851615615d0c57918102915b93841c9390800290615ce3565b509250929050565b600082615d3057506001610f8e565b81615d3d57506000610f8e565b8160018114615d535760028114615d5d57615d79565b6001915050610f8e565b60ff841115615d6e57615d6e615903565b50506001821b610f8e565b5060208310610133831016604e8410600b8410161715615d9c575081810a610f8e565b615da68383615cde565b8060001904821115615dba57615dba615903565b029392505050565b60006132138383615d21565b634e487b7160e01b600052600160045260246000fd5b60006001600160601b0380841680615dfe57615dfe615948565b92169190910692915050565b600063ffffffff808316818103615e2357615e23615903565b6001019392505050565b600061ffff8083168185168183048111821515161561593f5761593f615903565b600065ffffffffffff8083168185168083038211156159ce576159ce615903565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906121349083018461530f565b600060208284031215615eb457600080fd5b815161321381615229565b600060033d1115615ed85760046000803e5060005160e01c5b90565b600060443d1015615ee95790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715615f1957505050505090565b8285019150815181811115615f315750505050505090565b843d8701016020828501011115615f4b5750505050505090565b615f5a60208286010187615a06565b509095945050505050565b600062ffffff8083168185168083038211156159ce576159ce615903565b600062ffffff838116908316818110156159a4576159a461590356feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220ab5707e5fb50ef514258469c76028b72d8676abd2c1c4b8579ea8bd92c526a4764736f6c634300080d0033

Deployed Bytecode Sourcemap

27047:43493:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29928:365;;;;;;;;;;-1:-1:-1;29928:365:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;29928:365:0;;;;;;;;43951:1036;;;;;;;;;;-1:-1:-1;43951:1036:0;;;;;:::i;:::-;;:::i;:::-;;;;1718:10:1;1706:23;;;1688:42;;-1:-1:-1;;;;;1766:39:1;;;1761:2;1746:18;;1739:67;1661:18;43951:1036:0;1518:294:1;25846:250:0;;;;;;;;;;-1:-1:-1;25846:250:0;;;;;:::i;:::-;;:::i;:::-;;31355:129;;;;;;;;;;;;;:::i;:::-;;;2215:25:1;;;2203:2;2188:18;31355:129:0;2069:177:1;27102:51:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27102:51:0;;;;;;;;;;;;:::i;66211:509::-;;;;;;;;;;-1:-1:-1;66211:509:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3460:32:1;;;3442:51;;3430:2;3415:18;66211:509:0;3296:203:1;65442:127:0;;;;;;:::i;:::-;;:::i;38145:168::-;;;;;;;;;;-1:-1:-1;38145:168:0;;;;;:::i;:::-;;:::i;47779:1631::-;;;;;;:::i;:::-;;:::i;:::-;;;;4261:10:1;4298:15;;;4280:34;;4350:15;;;;4345:2;4330:18;;4323:43;4224:18;47779:1631:0;4081:291:1;28537:35:0;;;;;;;;;;;;;;;62465:199;;;;;;;;;;-1:-1:-1;62465:199:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;5086:39:1;;;5068:58;;5056:2;5041:18;62465:199:0;4924:208:1;69886:439:0;;;;;;;;;;-1:-1:-1;69886:439:0;;;;;:::i;:::-;;:::i;23348:53::-;;;;;;;;;;;;;;;;29471:129;;;;;;;;;;;;;:::i;65046:219::-;;;;;;:::i;:::-;;:::i;63190:298::-;;;;;;;;;;-1:-1:-1;63190:298:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;6436:32:1;;;6418:51;;6500:2;6485:18;;6478:34;;;;6391:18;63190:298:0;6244:274:1;55175:588:0;;;;;;;;;;-1:-1:-1;55175:588:0;;;;;:::i;:::-;;:::i;:::-;;;7927:10:1;7915:23;;;7897:42;;7885:2;7870:18;55175:588:0;7753:192:1;54850:317:0;;;;;;;;;;-1:-1:-1;54850:317:0;;;;;:::i;:::-;;:::i;38321:161::-;;;;;;;;;;-1:-1:-1;38321:161:0;;;;;:::i;:::-;;:::i;38494:324::-;;;;;;;;;;-1:-1:-1;38494:324:0;;;;;:::i;:::-;;:::i;27307:34::-;;;;;;;;;;;;27340:1;27307:34;;;;;8202:4:1;8190:17;;;8172:36;;8160:2;8145:18;27307:34:0;8030:184:1;32598:722:0;;;;;;;;;;-1:-1:-1;32598:722:0;;;;;:::i;:::-;;:::i;23038:43::-;;;;;;;;;;-1:-1:-1;23038:43:0;;;;-1:-1:-1;;;;;23038:43:0;;;64734:304;;;;;;:::i;:::-;;:::i;23088:35::-;;;;;;;;;;;;;;;;67950:190;;;;;;;;;;-1:-1:-1;67950:190:0;;;;;:::i;:::-;;:::i;32139:451::-;;;;;;;;;;-1:-1:-1;32139:451:0;;;;;:::i;:::-;;:::i;43586:150::-;;;;;;;;;;-1:-1:-1;43713:15:0;43586:150;;23956:343;;;;;;;;;;-1:-1:-1;23956:343:0;;;;;:::i;:::-;;:::i;69372:182::-;;;;;;;;;;-1:-1:-1;69372:182:0;;;;;:::i;:::-;;:::i;26354:686::-;;;;;;;;;;-1:-1:-1;26354:686:0;;;;;:::i;:::-;;:::i;38830:533::-;;;;;;;;;;-1:-1:-1;38830:533:0;;;;;:::i;:::-;;:::i;28406:38::-;;;;;;;;;;;;;;;;36994:255;;;;;;;;;;-1:-1:-1;36994:255:0;;;;;:::i;:::-;;:::i;37631:170::-;;;;;;;;;;-1:-1:-1;37631:170:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;27210:39::-;;;;;;;;;;;;27242:7;27210:39;;38006:127;;;;;;;;;;-1:-1:-1;38006:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;38092:26:0;38065:7;38092:26;;;:17;:26;;;;;:33;;38006:127;62672:510;;;;;;;;;;-1:-1:-1;62672:510:0;;;;;:::i;:::-;;:::i;25181:180::-;;;;;;;;;;-1:-1:-1;25181:180:0;;;;;:::i;:::-;;:::i;21758:30::-;;;;;;;;;;-1:-1:-1;21758:30:0;;;;-1:-1:-1;;;;;21758:30:0;;;24955:218;;;;;;;;;;-1:-1:-1;24955:218:0;;;;;:::i;:::-;;:::i;31492:195::-;;;;;;;;;;-1:-1:-1;31492:195:0;;;;;:::i;:::-;;:::i;28303:55::-;;;;;;;;;;-1:-1:-1;28303:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;22998:33;;;;;;;;;;-1:-1:-1;22998:33:0;;;;-1:-1:-1;;;;;22998:33:0;;;4192:20;;;;;;;;;;-1:-1:-1;4192:20:0;;;;-1:-1:-1;;;;;4192:20:0;;;23309:32;;;;;;;;;;-1:-1:-1;23309:32:0;;;;-1:-1:-1;;;23309:32:0;;;;;;27160:41;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27160:41:0;;;;;63762:319;;;;;;;;;;-1:-1:-1;63762:319:0;;;;;:::i;:::-;;:::i;26104:242::-;;;;;;;;;;-1:-1:-1;26104:242:0;;;;;:::i;:::-;;:::i;28579:41::-;;;;;;;;;;;;;;;37809:189;;;;;;;;;;-1:-1:-1;37809:189:0;;;;;:::i;:::-;;:::i;31699:196::-;;;;;;;;;;-1:-1:-1;31699:196:0;;;;;:::i;:::-;;:::i;40862:1653::-;;;;;;;;;;-1:-1:-1;40862:1653:0;;;;;:::i;:::-;;:::i;23130:37::-;;;;;;;;;;-1:-1:-1;23130:37:0;;;;-1:-1:-1;;;;;23130:37:0;;;64405:317;;;;;;:::i;:::-;;:::i;46419:1183::-;;;;;;;;;;-1:-1:-1;46419:1183:0;;;;;:::i;:::-;;:::i;69170:194::-;;;;;;;;;;-1:-1:-1;69170:194:0;;;;;:::i;:::-;;:::i;39472:623::-;;;;;;;;;;;;;:::i;42523:1055::-;;;;;;;;;;-1:-1:-1;42523:1055:0;;;;;:::i;:::-;;:::i;30418:121::-;;;;;;;;;;-1:-1:-1;30418:121:0;;;;;:::i;:::-;;:::i;40319:535::-;;;;;;;;;;-1:-1:-1;40319:535:0;;;;;:::i;:::-;;:::i;30551:515::-;;;;;;;;;;-1:-1:-1;30551:515:0;;;;;:::i;:::-;;:::i;65276:158::-;;;;;;;;;;-1:-1:-1;65276:158:0;;;;;:::i;:::-;;:::i;44995:1412::-;;;;;;;;;;-1:-1:-1;44995:1412:0;;;;;:::i;:::-;;:::i;:::-;;;;15524:10:1;15512:23;;;15494:42;;-1:-1:-1;;;;;15572:39:1;;;15567:2;15552:18;;15545:67;15660:4;15648:17;15628:18;;;15621:45;15482:2;15467:18;44995:1412:0;15300:372:1;23408:36:0;;;;;;;;;;;;;;;;24307:371;;;;;;;;;;-1:-1:-1;24307:371:0;;;;;:::i;:::-;;:::i;24690:257::-;;;;;;;;;;-1:-1:-1;24690:257:0;;;;;:::i;:::-;;:::i;23224:35::-;;;;;;;;;;-1:-1:-1;23224:35:0;;;;-1:-1:-1;;;23224:35:0;;;;;;30301:109;;;;;;;;;;;;;:::i;64234:163::-;;;;;;;;;;-1:-1:-1;64234:163:0;;;;;:::i;:::-;;:::i;25591:247::-;;;;;;;;;;-1:-1:-1;25591:247:0;;;;;:::i;:::-;;:::i;31903:224::-;;;;;;;;;;-1:-1:-1;31903:224:0;;;;;:::i;:::-;;:::i;49706:4233::-;;;;;;;;;;-1:-1:-1;49706:4233:0;;;;;:::i;:::-;;:::i;28365:34::-;;;;;;;;;;;;;;;;28451:38;;;;;;;;;;;;;;;;23266:36;;;;;;;;;;-1:-1:-1;23266:36:0;;;;-1:-1:-1;;;23266:36:0;;;;;;70333:204;;;;;;;;;;-1:-1:-1;70333:204:0;;;;;:::i;:::-;;:::i;23174:43::-;;;;;;;;;;-1:-1:-1;23174:43:0;;;;-1:-1:-1;;;23174:43:0;;;;;;4927:224;;;;;;;;;;-1:-1:-1;4927:224:0;;;;;:::i;:::-;;:::i;29928:365::-;30031:4;-1:-1:-1;;;;;;30069:41:0;;-1:-1:-1;;;30069:41:0;;:98;;-1:-1:-1;;;;;;;30127:40:0;;-1:-1:-1;;;30127:40:0;30069:98;:163;;;-1:-1:-1;;;;;;;30184:48:0;;-1:-1:-1;;;30184:48:0;30069:163;:216;;;-1:-1:-1;;;;;;;;;;19699:40:0;;;30249:36;30048:237;29928:365;-1:-1:-1;;29928:365:0:o;43951:1036::-;44056:15;;22134:32;4069:10;22134:18;:32::i;:::-;44107:19:::1;44128:35:::0;44167:24:::1;44177:5;44184:6;44167:9;:24::i;:::-;44224::::0;;44106:85;;-1:-1:-1;44224:24:0;-1:-1:-1;44212:63:0::1;::::0;-1:-1:-1;;;44224:24:0;::::1;;;::::0;-1:-1:-1;;;44250:24:0;::::1;;;44212:11;:63::i;:::-;44391:28:::0;;44356:25:::1;::::0;44288:30:::1;::::0;-1:-1:-1;;;44391:28:0;::::1;-1:-1:-1::0;;;;;44391:28:0;;::::1;::::0;44385:3:::1;::::0;44322:59:::1;::::0;-1:-1:-1;;;44356:25:0;;::::1;;;::::0;44322:31:::1;:59;:::i;:::-;44321:67;;;;:::i;:::-;:98;;;;:::i;:::-;-1:-1:-1::0;;;;;44288:131:0::1;;;44445:22;44436:6;-1:-1:-1::0;;;;;44436:31:0::1;;44432:98;;;44491:27;;-1:-1:-1::0;;;44491:27:0::1;;;;;;;;;;;44432:98;44542:28;44556:6;44564:5;44542:13;:28::i;:::-;44616:24:::0;;44583:64:::1;::::0;44600:6;;44608;;-1:-1:-1;;;44616:24:0;::::1;;;44642:4;44583:16;:64::i;:::-;44705:24:::0;;44684:72:::1;::::0;44697:6;;-1:-1:-1;;;44705:24:0;::::1;;;::::0;-1:-1:-1;;;44731:24:0;::::1;;;44684:12;:72::i;:::-;44800:46:::0;;44668:88;;-1:-1:-1;44839:6:0;;44800:46;;:28:::1;::::0;:46:::1;::::0;44839:6;;-1:-1:-1;;;44800:46:0;::::1;-1:-1:-1::0;;;;;44800:46:0::1;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;44800:46:0::1;;;;;-1:-1:-1::0;;;;;44800:46:0::1;;;;;;44901:38;44920:5;44927:11;44901:18;:38::i;:::-;44950:18;::::0;;;::::1;:29:::0;;-1:-1:-1;;;;44950:29:0::1;-1:-1:-1::0;;;44950:29:0::1;::::0;::::1;;;::::0;;-1:-1:-1;44950:18:0;43951:1036;;-1:-1:-1;44890:49:0;;-1:-1:-1;;;;43951:1036:0:o;25846:250::-;4365:12;:10;:12::i;:::-;-1:-1:-1;;;;;25927:24:0;::::1;25923:53;;25960:16;;-1:-1:-1::0;;;25960:16:0::1;;;;;;;;;;;25923:53;25989:15;:50:::0;;-1:-1:-1;;;;;;25989:50:0::1;-1:-1:-1::0;;;;;25989:50:0;::::1;::::0;;::::1;::::0;;;26055:33:::1;::::0;::::1;::::0;-1:-1:-1;;26055:33:0::1;25846:250:::0;:::o;31355:129::-;31438:13;;:38;;-1:-1:-1;;;31438:38:0;;31470:4;31438:38;;;3442:51:1;31411:7:0;;-1:-1:-1;;;;;31438:13:0;;:23;;3415:18:1;;31438:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31431:45;;31355:129;:::o;66211:509::-;66270:7;66290:20;66304:5;66290:13;:20::i;:::-;-1:-1:-1;66355:38:0;66396:26;;;:19;:26;;;;;66467:13;;66396:26;;66355:38;-1:-1:-1;;;;;66467:13:0;:23;66491:14;66416:5;66491:7;:14::i;:::-;66467:39;;-1:-1:-1;;;;;;66467:39:0;;;;;;;-1:-1:-1;;;;;3460:32:1;;;66467:39:0;;;3442:51:1;3415:18;;66467:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66541:20;;66433:73;;-1:-1:-1;;;;66541:20:0;;;;66523:15;:38;;:96;;-1:-1:-1;66600:19:0;;66578:18;;;;66600:19;66578:41;;;-1:-1:-1;;;66600:19:0;;;;66578:41;;66523:96;66519:155;;;-1:-1:-1;66660:1:0;;66211:509;-1:-1:-1;;;66211:509:0:o;66519:155::-;-1:-1:-1;66693:19:0;-1:-1:-1;;;;;66693:19:0;;66211:509;-1:-1:-1;;66211:509:0:o;65442:127::-;65521:40;4069:10;65544:9;65555:5;65521:8;:40::i;:::-;65442:127;;:::o;38145:168::-;-1:-1:-1;;;;;38277:28:0;;38216:7;38277:28;;;:19;:28;;;;;;38243:31;38297:7;38243:22;:31::i;:::-;:62;;;;:::i;47779:1631::-;47880:16;;4069:10;29419:24;29431:11;29419;:24::i;:::-;47993:15:::1;::::0;4069:10;;47981:9:::1;:27;47977:66;;;48017:26;;-1:-1:-1::0;;;48017:26:0::1;;;;;;;;;;;47977:66;48054:28;48068:6;48076:5;48054:13;:28::i;:::-;48182:13;::::0;48166:63:::1;::::0;-1:-1:-1;;;;;48182:13:0;;::::1;::::0;48207:21:::1;48166:63:::0;::::1;;;::::0;48182:13:::1;48166:63:::0;48182:13;48166:63;48207:21;48182:13;48166:63;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;48243:19;48264:35:::0;48303:24:::1;48313:5;48320:6;48303:9;:24::i;:::-;48400:28:::0;;48242:85;;-1:-1:-1;48242:85:0;-1:-1:-1;48340:23:0::1;::::0;48366:62:::1;::::0;-1:-1:-1;;;;;;;;48400:28:0;::::1;::::0;::::1;::::0;48366:31:::1;:62;:::i;:::-;-1:-1:-1::0;;;;;48340:88:0::1;;;48455:15;48445:6;-1:-1:-1::0;;;;;48445:25:0::1;;48441:65;;48479:27;;-1:-1:-1::0;;;48479:27:0::1;;;;;;;;;;;48441:65;48533:38;48552:5;48559:11;48533:18;:38::i;:::-;48714:31:::0;;48521:50;;-1:-1:-1;48620:33:0::1;::::0;48656:90:::1;::::0;-1:-1:-1;;;;;48714:31:0;;::::1;::::0;48665:46:::1;::::0;48696:15;;::::1;::::0;-1:-1:-1;;;48665:28:0;::::1;;:46;:::i;:::-;:80;;;;:::i;:::-;48656:8;:90::i;:::-;48759:41:::0;;48620:126;;-1:-1:-1;48794:6:0;;48759:12;;:31:::1;::::0;:41:::1;::::0;48794:6;;-1:-1:-1;;;;;48759:41:0::1;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;48759:41:0::1;;;;;-1:-1:-1::0;;;;;48759:41:0::1;;;;;;48843:26;48811:12;:28;;;:58;;;;;;;;;;-1:-1:-1::0;;;;;48811:58:0::1;;;;;:::i;:::-;::::0;;-1:-1:-1;;;;;48811:58:0;;::::1;;::::0;;;::::1;::::0;;::::1;::::0;;;::::1;;::::0;;::::1;;::::0;;-1:-1:-1;;48880:18:0;::::1;:30:::0;;::::1;::::0;::::1;-1:-1:-1::0;;;48880:30:0::1;-1:-1:-1::0;;;;48880:30:0;;::::1;;::::0;;49118:24;;48964:328:::1;::::0;48993:6;;49015;;49058:26;;49118:24:::1;-1:-1:-1::0;;;49118:24:0;::::1;;::::0;49179::::1;-1:-1:-1::0;;;49179:24:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;49218:31:0;::::1;;27490:1;49218:41;48964:14;:328::i;:::-;48952:340;;49305:42;49322:6;49330:5;49337:9;49305:42;;:16;:42::i;:::-;49363:39;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;49363:39:0;::::1;::::0;49380:1:::1;::::0;-1:-1:-1;;;;;;;;;;;49363:39:0;49380:1;;49363:39:::1;47916:1494;;;;;47779:1631:::0;;;;;;:::o;62465:199::-;62565:6;62591:65;62606:6;62614:11;62627;62640:15;62591:14;:65::i;:::-;62584:72;62465:199;-1:-1:-1;;;;62465:199:0:o;69886:439::-;4365:12;:10;:12::i;:::-;-1:-1:-1;;;;;69993:26:0;::::1;69989:55;;70028:16;;-1:-1:-1::0;;;70028:16:0::1;;;;;;;;;;;69989:55;-1:-1:-1::0;;;;;70059:23:0;::::1;70055:52;;70091:16;;-1:-1:-1::0;;;70091:16:0::1;;;;;;;;;;;70055:52;70122:45;::::0;-1:-1:-1;;;70122:45:0;;70161:4:::1;70122:45;::::0;::::1;3442:51:1::0;-1:-1:-1;;;;;70122:30:0;::::1;::::0;::::1;::::0;3415:18:1;;70122:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70171:1;70122:50:::0;70118:90:::1;;70181:27;;-1:-1:-1::0;;;70181:27:0::1;;;;;;;;;;;70118:90;70270:45;::::0;-1:-1:-1;;;70270:45:0;;70309:4:::1;70270:45;::::0;::::1;3442:51:1::0;-1:-1:-1;;;;;70229:29:0;::::1;::::0;::::1;::::0;70259:9;;70229:29;;70270:30:::1;::::0;3415:18:1;;70270:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70229:87;::::0;-1:-1:-1;;;;;;70229:87:0::1;::::0;;;;;;-1:-1:-1;;;;;6436:32:1;;;70229:87:0::1;::::0;::::1;6418:51:1::0;6485:18;;;6478:34;6391:18;;70229:87:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70221:96;;;::::0;::::1;29471:129:::0;29570:11;:18;29544:16;:23;29517:7;;29591:1;;29544:44;;29570:18;29544:44;:::i;:::-;:48;;;;:::i;65046:219::-;4069:10;29419:24;29431:11;29419;:24::i;:::-;4069:10;65215:42:::1;4069:10:::0;65239:4;65245:2;65249:7;65215:13:::1;:42::i;:::-;65162:103;65046:219:::0;;;;:::o;63190:298::-;63282:16;63309:21;63353:8;63365:1;63353:13;63349:55;;63375:29;;-1:-1:-1;;;63375:29:0;;;;;;;;;;;63349:55;63433:15;;63464;;-1:-1:-1;;;;;63433:15:0;;;;63451:28;;:10;:28;:::i;:::-;63417:63;;;;63190:298;;;;;;:::o;55175:588::-;55401:12;22134:32;4069:10;22134:18;:32::i;:::-;55448:101:::1;55461:9;55472:13;55487:15;55504:11;55517;55530:18;55448:12;:101::i;:::-;55440:109:::0;-1:-1:-1;;;;;;55564:11:0;::::1;::::0;55560:196:::1;;55592:51;55610:4;55617:9;55628:7;-1:-1:-1::0;;;;;55592:51:0::1;55637:5;55592:9;:51::i;:::-;55685:59;::::0;-1:-1:-1;;;55685:59:0;;-1:-1:-1;;;;;55685:14:0::1;:27;::::0;::::1;::::0;:59:::1;::::0;55721:1:::1;::::0;55725:9;;55736:7;;55685:59:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55560:196;55175:588:::0;;;;;;;;;:::o;54850:317::-;54959:13;22134:32;4069:10;22134:18;:32::i;:::-;54991:19:::1;55012:35:::0;55051:29:::1;55061:5;55068:11;55051:9;:29::i;:::-;54990:90;;;;55100:59;55113:11;55126:5;55133:11;55146:12;55100;:59::i;:::-;55093:66:::0;54850:317;-1:-1:-1;;;;;54850:317:0:o;38321:161::-;-1:-1:-1;;;;;38448:26:0;;38386:7;38448:26;;;:17;:26;;;;;;38413:32;38466:7;38413:23;:32::i;:::-;:61;;;;:::i;38494:324::-;-1:-1:-1;;;;;38623:25:0;;38577:6;38623:25;;;:17;:25;;;;;38671:13;;38663:21;;38659:52;;;38693:18;;-1:-1:-1;;;38693:18:0;;;;;;;;;;;38659:52;38722:19;38744:6;38751:5;38744:13;;;;;;;;:::i;:::-;;;;;;;;;38722:35;;38775:16;38792:11;38775:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:35;;;-1:-1:-1;;;38775:35:0;;;;;;-1:-1:-1;;;;;38494:324:0:o;32598:722::-;4365:12;:10;:12::i;:::-;-1:-1:-1;;;;;32676:21:0;::::1;32672:50;;32706:16;;-1:-1:-1::0;;;32706:16:0::1;;;;;;;;;;;32672:50;-1:-1:-1::0;;;;;32738:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;;::::1;;32733:60;;32777:16;;-1:-1:-1::0;;;32777:16:0::1;;;;;;;;;;;32733:60;32833:13;:20:::0;32816:14:::1;32864:405;32888:6;32884:1;:10;32864:405;;;32936:7;-1:-1:-1::0;;;;;32916:27:0::1;:13;32930:1;32916:16;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;32916:16:0::1;:27:::0;32912:284:::1;;32983:13;32997:20:::0;;:24:::1;::::0;33020:1:::1;::::0;32997:24:::1;:::i;:::-;32983:39;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;32964:13:::1;:16:::0;;-1:-1:-1;;;;;32983:39:0;;::::1;::::0;32978:1;;32964:16;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:58:::0;;-1:-1:-1;;;;;;32964:58:0::1;-1:-1:-1::0;;;;;32964:58:0;;::::1;;::::0;;33041:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;33080:21:::1;:30:::0;;;;:38;;-1:-1:-1;;33080:38:0::1;::::0;;33137:13:::1;:19:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;33137:19:0;;;;;-1:-1:-1;;;;;;33137:19:0::1;::::0;;;;;33175:5:::1;;32912:284;33239:3;;32864:405;;;-1:-1:-1::0;33286:26:0::1;::::0;-1:-1:-1;;;;;33286:26:0;::::1;::::0;::::1;::::0;;;::::1;32661:659;32598:722:::0;:::o;64734:304::-;4069:10;29419:24;29431:11;29419;:24::i;:::-;4069:10;64898:42:::1;4069:10:::0;64922:4;64928:2;64932:7;64898:13:::1;:42::i;:::-;65017:12;::::0;;65027:1:::1;65017:12:::0;;::::1;::::0;::::1;::::0;;;64951:79:::1;::::0;64988:8;;64998:4;;65004:2;;65008:7;;64951:36:::1;:79::i;67950:190::-:0;22134:32;4069:10;22134:18;:32::i;:::-;68097:35:::1;::::0;68126:5;;-1:-1:-1;;;;;68097:35:0;::::1;::::0;68114:1:::1;::::0;-1:-1:-1;;;;;;;;;;;68097:35:0;68114:1;;68097:35:::1;67950:190:::0;;:::o;32139:451::-;4365:12;:10;:12::i;:::-;-1:-1:-1;;;;;32217:21:0;::::1;32213:50;;32247:16;;-1:-1:-1::0;;;32247:16:0::1;;;;;;;;;;;32213:50;-1:-1:-1::0;;;;;32278:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;;::::1;;32274:59;;;32317:16;;-1:-1:-1::0;;;32317:16:0::1;;;;;;;;;;;32274:59;-1:-1:-1::0;;;;;32349:16:0;::::1;32368:1;32349:16:::0;;;:7:::1;:16;::::0;;;;;:20;32346:105:::1;;-1:-1:-1::0;;;;;32422:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;32405:34:::1;::::0;:16:::1;:34::i;:::-;-1:-1:-1::0;;;;;32386:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:53;32346:105:::1;-1:-1:-1::0;;;;;32461:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;;:37;;-1:-1:-1;;32461:37:0::1;32494:4;32461:37:::0;;::::1;::::0;;;32509:13:::1;:27:::0;;;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;;32509:27:0::1;::::0;::::1;::::0;;32554:28;::::1;::::0;32461:30;32554:28:::1;32139:451:::0;:::o;23956:343::-;4365:12;:10;:12::i;:::-;-1:-1:-1;;;;;24038:26:0;::::1;24034:55;;24073:16;;-1:-1:-1::0;;;24073:16:0::1;;;;;;;;;;;24034:55;24133:13;::::0;24102:46:::1;::::0;-1:-1:-1;;;;;24133:13:0::1;24102:22;:46::i;:::-;24159:32;24178:12;24159:18;:32::i;:::-;24204:13;:39:::0;;-1:-1:-1;;;;;;24204:39:0::1;-1:-1:-1::0;;;;;24204:39:0;::::1;::::0;;::::1;::::0;;;24261:30:::1;::::0;::::1;::::0;-1:-1:-1;;24261:30:0::1;23956:343:::0;:::o;69372:182::-;22134:32;4069:10;22134:18;:32::i;:::-;69502:44:::1;69519:6;69527:8;69537;69502:16;:44::i;:::-;69372:182:::0;;;:::o;26354:686::-;4365:12;:10;:12::i;:::-;26551:20:::1;::::0;::::1;::::0;;:45:::1;;;26593:3;26575:15;:21;;;26551:45;26547:103;;;26620:18;;-1:-1:-1::0;;;26620:18:0::1;;;;;;;;;;;26547:103;26662:25;:44:::0;;-1:-1:-1;;;;26717:38:0;-1:-1:-1;;;26662:44:0::1;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;26717:38:0;;;;;-1:-1:-1;;;26717:38:0;;::::1;;;-1:-1:-1::0;;;;26817:32:0;-1:-1:-1;;;26766:40:0;;::::1;;-1:-1:-1::0;;;;26817:32:0;;-1:-1:-1;;;26817:32:0;;::::1;::::0;;;::::1;;::::0;;26875:12;:29:::1;;23852:1;26875:29;;;23885:1;26875:29;26860:12;:44:::0;26922:110:::1;::::0;;21274:4:1;21262:17;;;21244:36;;21316:17;;;21311:2;21296:18;;21289:45;21370:17;;;21350:18;;;21343:45;21424:17;;21419:2;21404:18;;21397:45;21486:14;;21479:22;21473:3;21458:19;;21451:51;26922:110:0;;::::1;::::0;;;;21231:3:1;26922:110:0;;::::1;26354:686:::0;;;;;:::o;38830:533::-;38947:12;22134:32;4069:10;22134:18;:32::i;:::-;39029:16:::1;::::0;::::1;::::0;;:62:::1;;-1:-1:-1::0;39077:14:0::1;::::0;::::1;-1:-1:-1::0;;;39077:14:0;;::::1;::::0;::::1;39063:28:::0;;::::1;;39029:62;:124;;;;39124:2;39110:11;:16;;;:42;;;;-1:-1:-1::0;39151:1:0::1;39131:16;39145:2;39131:11:::0;:16:::1;:::i;:::-;39130:22;;;39110:42;39025:192;;;39187:18;;-1:-1:-1::0;;;39187:18:0::1;;;;;;;;;;;39025:192;39229:28;39243:6;39251:5;39229:13;:28::i;:::-;39278:76;39291:6;39299;39307:1;39310:11;39330:15;39348:5;39278:12;:76::i;36994:255::-:0;37047:7;37067:19;37089:20;37103:5;37089:13;:20::i;:::-;37067:42;;37120:35;37158:16;37175:11;37158:29;;;;;;;;:::i;:::-;;;;;;;;;37215:26;37158:29;;;;;37215:26;;-1:-1:-1;;;;;37215:26:0;;36994:255;-1:-1:-1;;;;36994:255:0:o;37631:170::-;37703:34;;:::i;:::-;37769:24;37779:5;37786:6;37769:9;:24::i;:::-;37750:43;;;;;;;;;;-1:-1:-1;;;;;37750:43:0;;;;;-1:-1:-1;;;37750:43:0;;;;;;;-1:-1:-1;;;37750:43:0;;;;;;;;;;;;-1:-1:-1;;;37750:43:0;;;;;;;;;;-1:-1:-1;;;37750:43:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37750:43:0;;;;;;-1:-1:-1;;;37750:43:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;37750:43:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;37631:170:0:o;62672:510::-;62793:6;;62846:19;27242:7;62846:11;:19;:::i;:::-;62831:35;;:11;:35;:::i;:::-;62812:54;-1:-1:-1;62877:16:0;62963:1;62941:19;27242:7;62941:11;:19;:::i;:::-;:23;;;;:::i;:::-;62926:39;;:11;:39;:::i;:::-;62914:9;:51;62910:236;;;63004:17;;63025:3;;62995:26;;-1:-1:-1;;;63004:17:0;;;;62995:6;:26;:::i;:::-;62994:34;;;;:::i;:::-;62982:46;;62910:236;;;63062:8;63050:9;:20;63046:100;;;63109:18;;63131:3;;63100:27;;-1:-1:-1;;;63109:18:0;;;;63100:6;:27;:::i;:::-;63099:35;;;;:::i;:::-;63087:47;;63046:100;63165:9;62672:510;-1:-1:-1;;;;;;62672:510:0:o;25181:180::-;4365:12;:10;:12::i;:::-;-1:-1:-1;;;;;25263:21:0;::::1;25259:50;;25293:16;;-1:-1:-1::0;;;25293:16:0::1;;;;;;;;;;;25259:50;25322:31;25345:7;25322:22;:31::i;:::-;25181:180:::0;:::o;24955:218::-;4365:12;:10;:12::i;:::-;-1:-1:-1;;;;;25032:21:0;::::1;25028:50;;25062:16;;-1:-1:-1::0;;;25062:16:0::1;;;;;;;;;;;25028:50;-1:-1:-1::0;;;;;25091:26:0;::::1;;::::0;;;:17:::1;:26;::::0;;;;;:33;;-1:-1:-1;;25091:33:0::1;25120:4;25091:33;::::0;;25140:25;::::1;::::0;25091:26;25140:25:::1;24955:218:::0;:::o;31492:195::-;31562:4;-1:-1:-1;;;;;31583:21:0;;31579:50;;31613:16;;-1:-1:-1;;;31613:16:0;;;;;;;;;;;31579:50;-1:-1:-1;;;;;;31649:30:0;;;;;:21;:30;;;;;;;;;31492:195::o;63762:319::-;63854:13;;-1:-1:-1;;;;;63854:13:0;63842:59;;63891:10;;-1:-1:-1;;;63891:10:0;;;;;;;;;;;63842:59;63914:14;4069:10;63954:13;;:59;;-1:-1:-1;;;63954:59:0;;-1:-1:-1;;;;;21927:15:1;;;63954:59:0;;;21909:34:1;21979:15;;;21959:18;;;21952:43;22038:14;;22031:22;22011:18;;;22004:50;63914:29:0;;-1:-1:-1;63954:13:0;;;:31;;21844:18:1;;63954:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64054:8;-1:-1:-1;;;;;64031:42:0;64046:6;-1:-1:-1;;;;;64031:42:0;;64064:8;64031:42;;;;565:14:1;558:22;540:41;;528:2;513:18;;400:187;64031:42:0;;;;;;;;63831:250;63762:319;;:::o;26104:242::-;4365:12;:10;:12::i;:::-;-1:-1:-1;;;;;26186:24:0;::::1;26182:53;;26219:16;;-1:-1:-1::0;;;26219:16:0::1;;;;;;;;;;;26182:53;26248:8;:40:::0;;-1:-1:-1;;;;;;26248:40:0::1;-1:-1:-1::0;;;;;26248:40:0;::::1;::::0;;::::1;::::0;;;26304:34:::1;::::0;::::1;::::0;-1:-1:-1;;26304:34:0::1;26104:242:::0;:::o;37809:189::-;37867:21;;:::i;:::-;37901:19;37923:20;37937:5;37923:13;:20::i;:::-;37901:42;;37961:16;37978:11;37961:29;;;;;;;;:::i;:::-;;;;;;;;;;37954:36;;;;;;;;37961:29;;;;;;;37954:36;;-1:-1:-1;;;;;37954:36:0;;;;;-1:-1:-1;;;37954:36:0;;;;;;;;;;;-1:-1:-1;;;37954:36:0;;;;;;;;;;;;;;;-1:-1:-1;;;37954:36:0;;;;;;;;-1:-1:-1;;;37954:36:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37954:36:0;;;;;;;-1:-1:-1;;;37954:36:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;37954:36:0;;;;;;;;;;;;;;;;;;37809:189;-1:-1:-1;;;37809:189:0:o;31699:196::-;31764:7;27398:28;31788:7;:32;31784:63;;;31829:18;;-1:-1:-1;;;31829:18:0;;;;;;;;;;;31784:63;31877:10;:8;:10::i;:::-;31867:20;;:7;:20;:::i;40862:1653::-;40987:15;22134:32;4069:10;22134:18;:32::i;:::-;41016:19:::1;41037:35:::0;41076:24:::1;41086:5;41093:6;41076:9;:24::i;:::-;41128::::0;;41015:85;;-1:-1:-1;41128:24:0;-1:-1:-1;41113:66:0::1;::::0;-1:-1:-1;;;41128:24:0;::::1;;;::::0;-1:-1:-1;;;41154:24:0;::::1;;;41113:14;:66::i;:::-;41197:18;41196:19;:64;;;;-1:-1:-1::0;41219:31:0;;-1:-1:-1;;;41219:31:0;::::1;:41;:31;27490:1;41219:41;;41196:64;41192:127;;;41284:23;;-1:-1:-1::0;;;41284:23:0::1;;;;;;;;;;;41192:127;41384:28:::0;;41331:16:::1;::::0;41350:62:::1;::::0;-1:-1:-1;;;;;;;;41384:28:0;::::1;::::0;::::1;::::0;41350:31:::1;:62;:::i;:::-;41331:81;;41436:9;-1:-1:-1::0;;;;;41427:18:0::1;:6;-1:-1:-1::0;;;;;41427:18:0::1;;41423:58;;;41454:27;;-1:-1:-1::0;;;41454:27:0::1;;;;;;;;;;;41423:58;41492:27;41506:6;41514:4;41492:13;:27::i;:::-;41532:15;-1:-1:-1::0;;;;;41570:10:0;::::1;::::0;41566:233:::1;;41630:24:::0;;41597:64:::1;::::0;41614:6;;41622;;-1:-1:-1;;;41630:24:0;::::1;;;41656:4;41597:16;:64::i;:::-;41736:19;41749:6:::0;41736:19;::::1;:::i;:::-;;;41783:4;41770:17;;41566:233;41813:31:::0;;-1:-1:-1;;;;;41813:44:0;;::::1;:31:::0;::::1;:44;41809:261;;-1:-1:-1::0;41936:43:0;;-1:-1:-1;;;;;;41994:32:0;-1:-1:-1;;;;;41936:43:0;::::1;41994:32:::0;;;41936:43;41809:261:::1;42086:10;42082:426;;;42117:9;-1:-1:-1::0;;;;;42117:14:0::1;42130:1;42117:14:::0;42113:276:::1;;42152:52;42163:6;42171:5;42178:11;42191:12;42152:10;:52::i;:::-;42234:1;42223:12;;42082:426;;42113:276;42287:38;42306:5;42313:11;42287:18;:38::i;:::-;42344:18;::::0;::::1;:29:::0;;-1:-1:-1;;;;42344:29:0::1;-1:-1:-1::0;;;42344:29:0::1;::::0;::::1;;;::::0;;;-1:-1:-1;42082:426:0::1;;;42490:5;42472:24;;42082:426;41004:1511;;;;40862:1653:::0;;;;;;:::o;64405:317::-;4069:10;29419:24;29431:11;29419;:24::i;:::-;4069:10;64590:42:::1;4069:10:::0;64614:4;64620:2;64624:7;64590:13:::1;:42::i;:::-;64643:71;64680:8;64690:4;64696:2;64700:7;64709:4;;64643:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;64643:36:0::1;::::0;-1:-1:-1;;;64643:71:0:i:1;:::-;64537:185;64405:317:::0;;;;;;:::o;46419:1183::-;46517:15;4069:10;29419:24;29431:11;29419;:24::i;:::-;4069:10;46545:14:::1;::::0;46646:24:::1;46656:5:::0;4069:10;46646:9:::1;:24::i;:::-;46703::::0;;46585:85;;-1:-1:-1;46703:24:0;-1:-1:-1;46691:63:0::1;::::0;-1:-1:-1;;;46703:24:0;::::1;;;::::0;-1:-1:-1;;;46729:24:0;::::1;;;46691:11;:63::i;:::-;46771:24:::0;;:39:::1;::::0;;::::1;-1:-1:-1::0;;;46771:24:0;;::::1;;:39;46767:76;;46819:24;;-1:-1:-1::0;;;46819:24:0::1;;;;;;;;;;;46767:76;46927:14;::::0;::::1;-1:-1:-1::0;;;46927:14:0;;::::1;::::0;::::1;46913:28:::0;;::::1;;::::0;:90:::1;;;46974:2;46960:11;:16;;;:42;;;;-1:-1:-1::0;47001:1:0::1;46981:16;46995:2;46981:11:::0;:16:::1;:::i;:::-;46980:22;;;46960:42;46909:158;;;47037:18;;-1:-1:-1::0;;;47037:18:0::1;;;;;;;;;;;46909:158;47113:24:::0;;47079:17:::1;::::0;47099:38:::1;::::0;-1:-1:-1;;;47113:24:0;::::1;;;47099:11:::0;:38:::1;:::i;:::-;47199:28:::0;;47079:58;;-1:-1:-1;47148:13:0::1;::::0;47165:62:::1;::::0;-1:-1:-1;;;;;;;;47199:28:0;::::1;::::0;::::1;::::0;47165:31:::1;:62;:::i;:::-;47148:80;;47249:51;47266:6;47274;47282:11;47295:4;47249:16;:51::i;:::-;47321:38:::0;;-1:-1:-1;;;;47389:50:0;-1:-1:-1;;;47321:38:0::1;::::0;::::1;;-1:-1:-1::0;;;;47389:50:0;;-1:-1:-1;;;47423:15:0::1;47389:50;;;;::::0;;47464:38:::1;47483:5:::0;47490:11;47464:18:::1;:38::i;:::-;47452:50;;47534:8;47513:12;:18;;;:29;;;;;;;;;;;;;;;;;;47553:41;47570:6;47578:5;47585:8;47553:41;;:16;:41::i;:::-;46534:1068;;;;;46419:1183:::0;;;;;:::o;69170:194::-;22134:32;4069:10;22134:18;:32::i;:::-;69321:35:::1;::::0;69350:5;;69346:1:::1;::::0;-1:-1:-1;;;;;69321:35:0;::::1;::::0;-1:-1:-1;;;;;;;;;;;69321:35:0;69346:1;;69321:35:::1;69170:194:::0;;:::o;39472:623::-;4069:10;39519:14;39577:31;4069:10;39577:23;:31::i;:::-;39559:49;;39625:7;39636:1;39625:12;39621:43;;39646:18;;-1:-1:-1;;;39646:18:0;;;;;;;;;;;39621:43;-1:-1:-1;;;;;39711:25:0;;;;;;:17;:25;;;;;:36;;39740:7;;39711:25;:36;;39740:7;;39711:36;:::i;:::-;;;;-1:-1:-1;39806:48:0;;-1:-1:-1;39816:6:0;39832:4;39839:7;39848:5;39806:9;:48::i;:::-;39891:56;;-1:-1:-1;;;39891:56:0;;-1:-1:-1;;;;;39891:14:0;:27;;;;:56;;39919:6;;39935:1;;39939:7;;39891:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;39996:13:0;;:39;;-1:-1:-1;;;39996:39:0;;-1:-1:-1;;;;;6436:32:1;;;39996:39:0;;;6418:51:1;6485:18;;;6478:34;;;39996:13:0;;;;:22;;6391:18:1;;39996:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39988:48;;;;;;40071:6;-1:-1:-1;;;;;40054:33:0;;40079:7;40054:33;;;;2215:25:1;;2203:2;2188:18;;2069:177;40054:33:0;;;;;;;;39508:587;;39472:623::o;42523:1055::-;42646:22;;42598:15;;-1:-1:-1;;;;;42646:22:0;4069:10;-1:-1:-1;;;;;42630:38:0;;42626:70;;42677:19;;-1:-1:-1;;;42677:19:0;;;;;;;;;;;42626:70;42710:19;42731:35;42770:24;42780:5;42787:6;42770:9;:24::i;:::-;42822;;42709:85;;-1:-1:-1;42822:24:0;-1:-1:-1;42807:66:0;;-1:-1:-1;;;42822:24:0;;;;;-1:-1:-1;;;42848:24:0;;;;42807:14;:66::i;:::-;42922:31;;-1:-1:-1;;;;;42922:31:0;;;:41;:31;:41;42918:108;;42987:27;;-1:-1:-1;;;42987:27:0;;;;;;;;;;;42918:108;43086:28;;-1:-1:-1;;;43086:28:0;;-1:-1:-1;;;;;43086:28:0;:32;43082:175;;43170:28;;-1:-1:-1;;;;;;;;43170:28:0;;;;;:12;;:28;;43135:63;;43170:28;;43135:63;;:::i;:::-;;;-1:-1:-1;;;;;43135:63:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43213:32:0;;-1:-1:-1;;;;;;;;43213:32:0;;;43082:175;43294:40;;-1:-1:-1;;;;;43294:40:0;-1:-1:-1;;;43294:40:0;;;43379:38;43398:5;43405:11;43379:18;:38::i;:::-;43368:49;;43472:8;43451:12;:18;;;:29;;;;;;;;;;;;;;;;;;43529:41;43546:6;43554:5;43561:8;43529:41;;:16;:41::i;:::-;42615:963;;42523:1055;;;;:::o;30418:121::-;30507:8;;:24;;-1:-1:-1;;;30507:24:0;;;;;2215:25:1;;;30474:13:0;;-1:-1:-1;;;;;30507:8:0;;:17;;2188:18:1;;30507:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30507:24:0;;;;;;;;;;;;:::i;40319:535::-;40433:13;22134:32;4069:10;22134:18;:32::i;:::-;40460:19:::1;40481:35:::0;40520:24:::1;40530:5;40537:6;40520:9;:24::i;:::-;40572::::0;;40459:85;;-1:-1:-1;40572:24:0;-1:-1:-1;40557:66:0::1;::::0;-1:-1:-1;;;40572:24:0;::::1;;;::::0;-1:-1:-1;;;40598:24:0;::::1;;;40557:14;:66::i;:::-;40641:18;40640:19;:64;;;;-1:-1:-1::0;40663:31:0;;-1:-1:-1;;;40663:31:0;::::1;:41;:31;27490:1;40663:41;;40640:64;40636:127;;;40728:23;;-1:-1:-1::0;;;40728:23:0::1;;;;;;;;;;;40636:127;40792:54;40805:6;40813:5;40820:11;40833:12;40792;:54::i;30551:515::-:0;29804:32;4069:10;29804:18;:32::i;:::-;4069:10;30630:14:::1;30674:29:::0;;;:21:::1;:29;::::0;;;;;::::1;;30670:70;;;30712:28;;-1:-1:-1::0;;;30712:28:0::1;;;;;;;;;;;30670:70;30761:52;30791:4;30798:6;30806;30761:21;:52::i;:::-;30853:6;30826:23;;:33;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;30880:15:0::1;::::0;-1:-1:-1;30907:10:0::1;:8;:10::i;:::-;30898:19;::::0;:6;:19:::1;:::i;:::-;-1:-1:-1::0;;;;;30928:15:0;::::1;;::::0;;;:7:::1;:15;::::0;;;;:26;;30880:37;;-1:-1:-1;30880:37:0;;30928:15;;;:26:::1;::::0;30880:37;;30928:26:::1;:::i;:::-;;;;;;;;30976:7;30965;;:18;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;30996:62:0::1;::::0;-1:-1:-1;;;30996:62:0;;-1:-1:-1;;;;;30996:14:0::1;:27;::::0;::::1;::::0;:62:::1;::::0;31032:1:::1;::::0;31044:4:::1;::::0;31051:6;;30996:62:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30619:447;;30551:515:::0;:::o;65276:158::-;22134:32;4069:10;22134:18;:32::i;:::-;65391:35:::1;65400:7;65409:9;65420:5;65391:8;:35::i;44995:1412::-:0;45109:15;;;22134:32;4069:10;22134:18;:32::i;:::-;45179:19:::1;45200:35:::0;45239:24:::1;45249:5;45256:6;45239:9;:24::i;:::-;45288::::0;;45178:85;;-1:-1:-1;45288:24:0;-1:-1:-1;45276:63:0::1;::::0;-1:-1:-1;;;45288:24:0;::::1;;;::::0;-1:-1:-1;;;45314:24:0;::::1;;;45276:11;:63::i;:::-;45352:28;45366:6;45374:5;45352:13;:28::i;:::-;45405:24:::0;;-1:-1:-1;;;45405:24:0;::::1;;;::::0;-1:-1:-1;45442:51:0::1;45459:6:::0;45467;45405:24;45488:4:::1;45442:16;:51::i;:::-;45611:28:::0;;45577:62:::1;::::0;-1:-1:-1;;;;;;;;45611:28:0;::::1;::::0;::::1;::::0;45577:31:::1;:62;:::i;:::-;45734:28:::0;;45566:73;;-1:-1:-1;;;;;;;;;45734:28:0;;::::1;::::0;::::1;45725:37:::0;;::::1;;45721:442;;;45831:28:::0;;45821:38:::1;::::0;-1:-1:-1;;;45831:28:0;::::1;-1:-1:-1::0;;;;;45831:28:0::1;45821:38:::0;::::1;:::i;:::-;45906:32:::0;;-1:-1:-1;;;;;;;;45906:32:0;::::1;::::0;;45821:38;;-1:-1:-1;45821:38:0;;45906:12;;45937:1:::1;::::0;45994:41:::1;::::0;45821:38;;-1:-1:-1;;;;;45994:41:0;::::1;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;45994:41:0::1;;;;;-1:-1:-1::0;;;;;45994:41:0::1;;;;;;45721:442;;;46113:38:::0;;46145:6;;46113:38;;:28:::1;::::0;:38:::1;::::0;46145:6;;-1:-1:-1;;;46113:38:0;::::1;-1:-1:-1::0;;;;;46113:38:0::1;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;46113:38:0::1;;;;;-1:-1:-1::0;;;;;46113:38:0::1;;;;;;45721:442;46194:50:::0;;-1:-1:-1;;;;46194:50:0::1;-1:-1:-1::0;;;46228:15:0::1;46194:50;;;;::::0;;46269:38:::1;46288:5:::0;46295:11;46269:18:::1;:38::i;:::-;46257:50;;46339:8;46318:12;:18;;;:29;;;;;;;;;;;;;;;;;;46358:41;46375:6;46383:5;46390:8;46358:41;;:16;:41::i;:::-;45167:1240;;44995:1412:::0;;;;;;;:::o;24307:371::-;4365:12;:10;:12::i;:::-;24502:5:::1;24483:16;:24;24479:55;;;24516:18;;-1:-1:-1::0;;;24516:18:0::1;;;;;;;;;;;24479:55;24596:17;24600:13:::0;24596:2:::1;:17;:::i;:::-;24565:27;:16:::0;24585:6:::1;24565:27;:::i;:::-;:49;;;;:::i;:::-;24547:15;:67:::0;24630:40:::1;::::0;2215:25:1;;;24630:40:0::1;::::0;2203:2:1;2188:18;24630:40:0::1;;;;;;;24307:371:::0;;:::o;24690:257::-;4365:12;:10;:12::i;:::-;-1:-1:-1;;;;;24779:29:0;::::1;24775:58;;24817:16;;-1:-1:-1::0;;;24817:16:0::1;;;;;;;;;;;24775:58;24846:22;:40:::0;;-1:-1:-1;;;;;;24846:40:0::1;-1:-1:-1::0;;;;;24846:40:0;::::1;::::0;;::::1;::::0;;;24904:35:::1;::::0;::::1;::::0;-1:-1:-1;;24904:35:0::1;24690:257:::0;:::o;30301:109::-;30380:8;;:22;;;-1:-1:-1;;;30380:22:0;;;;30347:13;;-1:-1:-1;;;;;30380:8:0;;:20;;:22;;;;;:8;;:22;;;;;;;:8;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30380:22:0;;;;;;;;;;;;:::i;64234:163::-;64340:13;;:49;;-1:-1:-1;;;64340:49:0;;-1:-1:-1;;;;;24994:15:1;;;64340:49:0;;;24976:34:1;25046:15;;;25026:18;;;25019:43;64316:4:0;;64340:13;;:30;;24911:18:1;;64340:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64333:56;64234:163;-1:-1:-1;;;64234:163:0:o;25591:247::-;4365:12;:10;:12::i;:::-;25703:2:::1;25684:16;:21;25680:52;;;25714:18;;-1:-1:-1::0;;;25714:18:0::1;;;;;;;;;;;25680:52;25743:15;:34:::0;;;25795:35:::1;::::0;2215:25:1;;;25795:35:0::1;::::0;2203:2:1;2188:18;25795:35:0::1;;;;;;;25591:247:::0;:::o;31903:224::-;31966:7;32000;;31990;:17;31986:48;;;32016:18;;-1:-1:-1;;;32016:18:0;;;;;;;;;;;31986:48;32047:19;32070:10;:8;:10::i;:::-;32047:33;-1:-1:-1;32098:21:0;32047:33;32098:7;:21;:::i;49706:4233::-;49843:15;4069:10;29419:24;29431:11;29419;:24::i;:::-;23885:1:::1;49880:12;;:21;49876:51;;49910:17;;-1:-1:-1::0;;;49910:17:0::1;;;;;;;;;;;49876:51;4069:10:::0;49948:14:::1;::::0;50051:25:::1;50061:6:::0;4069:10;50051:9:::1;:25::i;:::-;49988:88;;;;50088:20;50110:36:::0;50150:25:::1;50160:6;50168;50150:9;:25::i;:::-;50234::::0;;50087:88;;-1:-1:-1;50087:88:0;-1:-1:-1;50188:14:0::1;::::0;50271:15:::1;::::0;50234:33:::1;::::0;27242:7:::1;::::0;-1:-1:-1;;;50234:25:0;::::1;;;:33;:::i;:::-;50205:25:::0;;:63:::1;::::0;;-1:-1:-1;;;50205:25:0;::::1;;;:63;:::i;:::-;50343:25:::0;;-1:-1:-1;;;;50297:14:0::1;::::0;50380:15:::1;::::0;50343:33:::1;::::0;27242:7:::1;::::0;-1:-1:-1;;;50343:25:0;::::1;;;:33;:::i;:::-;50314:25:::0;;:63:::1;::::0;;-1:-1:-1;;;50314:25:0;::::1;;;:63;:::i;:::-;:81;::::0;-1:-1:-1;50412:22:0;::::1;;::::0;;;50408:1176:::1;;50484:25:::0;;50455;;-1:-1:-1;;;50484:25:0;;;::::1;;::::0;;::::1;50455::::0;;;::::1;;:54;50451:138;;50537:36;;-1:-1:-1::0;;;50537:36:0::1;;;;;;;;;;;50451:138;50608:16;50607:17;:89;;;;-1:-1:-1::0;50664:32:0;;50628;;-1:-1:-1;;;50664:32:0;;;::::1;;::::0;;::::1;50628::::0;;;::::1;;:68;;50607:89;50603:169;;;50724:32;;-1:-1:-1::0;;;50724:32:0::1;;;;;;;;;;;50603:169;50852:29:::0;;-1:-1:-1;;;50852:29:0;::::1;-1:-1:-1::0;;;;;50852:29:0::1;:33:::0;50848:191:::1;;50942:29:::0;;-1:-1:-1;;;;;;;;50942:29:0;::::1;::::0;::::1;::::0;:13;;:29:::1;::::0;50906:65:::1;::::0;50942:29;;50906:65:::1;;:::i;:::-;::::0;;-1:-1:-1;;;;;50906:65:0;;::::1;;::::0;;;::::1;::::0;;::::1;::::0;;;::::1;;::::0;;::::1;;::::0;;-1:-1:-1;50990:33:0;;-1:-1:-1;;;;;;;;50990:33:0::1;::::0;;50848:191:::1;51057:29:::0;;-1:-1:-1;;;51057:29:0;::::1;-1:-1:-1::0;;;;;51057:29:0::1;:33:::0;51053:191:::1;;51147:29:::0;;-1:-1:-1;;;;;;;;51147:29:0;::::1;::::0;::::1;::::0;:13;;:29:::1;::::0;51111:65:::1;::::0;51147:29;;51111:65:::1;;:::i;:::-;::::0;;-1:-1:-1;;;;;51111:65:0;;::::1;;::::0;;;::::1;::::0;;::::1;::::0;;;::::1;;::::0;;::::1;;::::0;;-1:-1:-1;51195:33:0;;-1:-1:-1;;;;;;;;51195:33:0::1;::::0;;51053:191:::1;50408:1176;;;51278:9;51265:22;;:9;:22;;;51261:323;;51311:36;;-1:-1:-1::0;;;51311:36:0::1;;;;;;;;;;;51261:323;51413:16;51412:17;:95;;;;-1:-1:-1::0;51473:29:0;;51434;;-1:-1:-1;;;51473:29:0;;;::::1;-1:-1:-1::0;;;;;51473:29:0;;::::1;:33:::0;;51434:29;;;::::1;;:33:::0;;51433:74:::1;;51412:95;51408:165;;;51535:22;;-1:-1:-1::0;;;51535:22:0::1;;;;;;;;;;;51408:165;51617:25:::0;;-1:-1:-1;;;51617:25:0;::::1;;;51658:9:::0;51653:854:::1;;51809:25:::0;;51684:17:::1;::::0;;;51809:25:::1;-1:-1:-1::0;;;51809:25:0;;::::1;::::0;::::1;::::0;51853:27;::::1;::::0;-1:-1:-1;51849:458:0::1;;;51915:27;51930:12:::0;51915;:27:::1;:::i;:::-;52006:29:::0;;51901:41;;-1:-1:-1;51971:64:0::1;::::0;-1:-1:-1;;;;;;;;52006:29:0;::::1;::::0;::::1;::::0;51971:32:::1;:64;:::i;:::-;51961:75;;51849:458;;;52077:12;52062:27;;:12;:27;;;52058:249;;;52124:27;52139:12:::0;52124;:27:::1;:::i;:::-;52215:29:::0;;52110:41;;-1:-1:-1;52180:64:0::1;::::0;-1:-1:-1;;;;;;;;52215:29:0;::::1;::::0;::::1;::::0;52180:32:::1;:64;:::i;:::-;52170:75;;52279:12;52264:27;;52058:249;52341:1;52327:11;:15;;;:29;;;;;52355:1;52346:6;-1:-1:-1::0;;;;;52346:10:0::1;;52327:29;52323:173;;;52429:51;52446:6;52454;52462:11;52475:4;52429:16;:51::i;:::-;51669:838;;;51653:854;52555:32:::0;;52519:68;;-1:-1:-1;;;;;52555:32:0;;::::1;::::0;52519:13;;52555:32:::1;::::0;52519:68:::1;::::0;52555:32;;52519:68:::1;;:::i;:::-;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;;52519:68:0;;::::1;;::::0;;::::1;::::0;;::::1;;;::::0;;;52631:29;;52598:62;;-1:-1:-1;;;52631:29:0;;;::::1;::::0;::::1;::::0;-1:-1:-1;52598:62:0;;52631:29:::1;::::0;52598:62:::1;::::0;52631:29;;52598:62;;::::1;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;52598:62:0::1;;;;;-1:-1:-1::0;;;;;52598:62:0::1;;;;;;52675:9;52671:442;;;52882:25:::0;;52854;;52882::::1;-1:-1:-1::0;;;52882:25:0;;;::::1;::::0;::::1;52854::::0;;;::::1;;:53;:126;;52955:25:::0;;-1:-1:-1;;;52955:25:0;::::1;;;52854:126;;;52927:25:::0;;-1:-1:-1;;;52927:25:0;::::1;;;52854:126;52826:154:::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;52826:154:0::1;-1:-1:-1::0;;;;52826:154:0;;::::1;;::::0;;52671:442:::1;;;53050:51:::0;;-1:-1:-1;;;;53050:51:0::1;-1:-1:-1::0;;;53085:15:0::1;53050:51;;;;::::0;;52671:442:::1;53125:40:::0;;-1:-1:-1;;;;53125:40:0::1;-1:-1:-1::0;;;53125:40:0::1;::::0;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;53180:32;;-1:-1:-1;;;53180:32:0;::::1;;-1:-1:-1::0;;53180:42:0;53176:116:::1;;53239:41:::0;;-1:-1:-1;;;;;53239:41:0::1;-1:-1:-1::0;;;53239:41:0::1;::::0;;53176:116:::1;27458:1;53346:22:::0;::::1;:32:::0;;-1:-1:-1;;;;;53346:32:0::1;-1:-1:-1::0;;;53346:32:0::1;::::0;;;;53410:25:::1;-1:-1:-1::0;;;53410:25:0;;::::1;;53446:43;53469:6:::0;53410:25;53446:22:::1;:43::i;:::-;53561:1;53540:18:::0;;;:10:::1;:18;::::0;;;;;:22;;;53613:11:::1;:30:::0;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;;53704:36;53551:6;;53561:1;-1:-1:-1;;;;;53704:36:0;::::1;::::0;-1:-1:-1;;;;;;;;;;;53704:36:0;53561:1;;53704:36:::1;53797:40;53816:6;53824:12;53797:18;:40::i;:::-;53786:51;;53870:8;53848:13;:19;;;:30;;;;;;;;;;;;;;;;;;53889:42;53906:6;53914;53922:8;53889:42;;:16;:42::i;:::-;49865:4074;;;;;;;;;49706:4233:::0;;;;;;:::o;70333:204::-;4365:12;:10;:12::i;:::-;-1:-1:-1;;;;;70425:24:0;::::1;70421:53;;70458:16;;-1:-1:-1::0;;;70458:16:0::1;;;;;;;;;;;70421:53;70487:42;::::0;-1:-1:-1;;;;;70487:19:0;::::1;::::0;70507:21:::1;70487:42:::0;::::1;;;::::0;::::1;::::0;;;70507:21;70487:19;:42;::::1;;;;;;;;;;;;;::::0;::::1;;;;4927:224:::0;4365:12;:10;:12::i;:::-;-1:-1:-1;;;;;5014:22:0;::::1;5010:51;;5045:16;;-1:-1:-1::0;;;5045:16:0::1;;;;;;;;;;;5010:51;5100:5;::::0;;5079:37:::1;::::0;-1:-1:-1;;;;;5079:37:0;;::::1;::::0;5100:5;::::1;::::0;5079:37:::1;::::0;::::1;5127:5;:16:::0;;-1:-1:-1;;;;;;5127:16:0::1;-1:-1:-1::0;;;;;5127:16:0;;;::::1;::::0;;;::::1;::::0;;4927:224::o;21862:::-;21949:13;;-1:-1:-1;;;;;21949:13:0;21937:59;;21986:10;;-1:-1:-1;;;21986:10:0;;;;;;;;;;;21937:59;22019:13;;-1:-1:-1;;;;;22011:39:0;;;22019:13;;22011:39;22007:71;;22059:19;;-1:-1:-1;;;22059:19:0;;;;;;;;;;;37257:366;37329:19;37350:35;37412:20;37426:5;37412:13;:20::i;:::-;37398:34;;37458:16;37475:11;37458:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;37504:26;;;;37458:29;;-1:-1:-1;;;;;;37504:36:0;;;:26;;:36;37500:67;;37549:18;;-1:-1:-1;;;37549:18:0;;;;;;;;;;;37500:67;37596:18;;;;-1:-1:-1;;;37596:18:0;;;;37587:27;;37580:35;;;;:::i;43744:199::-;43870:15;43847:19;27242:7;43847:19;;;;:::i;:::-;43832:35;;;;;;:::i;:::-;:53;43828:108;;;43909:15;;-1:-1:-1;;;43909:15:0;;;;;;;;;;;49418:280;49530:20;49563:23;49579:6;49563;:23;:::i;:::-;49553:34;;:6;:34;:::i;:::-;49530:57;;49614:13;-1:-1:-1;;;;;49604:23:0;:6;-1:-1:-1;;;;;49604:23:0;;;:54;;;;49633:9;49632:10;:25;;;;-1:-1:-1;;;;;;49646:11:0;;;49632:25;49600:90;;;49667:23;;-1:-1:-1;;;49667:23:0;;;;;;;;;;;60019:454;60193:16;60212:20;;;;:6;:20;:::i;:::-;-1:-1:-1;;;;;60193:39:0;;;60266:6;-1:-1:-1;;;;;60243:29:0;:19;;:29;;;;;;;:::i;:::-;;;;;;;;60310:8;60283:23;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;60329:27:0;;;;;;:19;:27;;;;;:39;;60360:8;;60329:27;:39;;60360:8;;60329:39;:::i;:::-;;;;-1:-1:-1;60412:53:0;;-1:-1:-1;60422:6:0;60438:4;60445:8;60455:9;60412;:53::i;59204:342::-;59284:15;59346:17;;;:10;:17;;;;;;:21;;;59426:9;;;;;;;59446:20;;;;;;:33;;;59527:11;;59426:9;;;;59527:11;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;59204:342;;;;:::o;4221:104::-;4271:5;;-1:-1:-1;;;;;4271:5:0;4069:10;4271:21;4267:50;;4301:16;;-1:-1:-1;;;4301:16:0;;;;;;;;;;;4267:50;4221:104::o;36645:341::-;36705:19;36741:5;36750:1;36741:10;36737:37;;36760:14;;-1:-1:-1;;;36760:14:0;;;;;;;;;;;36737:37;-1:-1:-1;36799:17:0;;;;:10;:17;;;;;;36846:16;:23;36831:38;;36827:65;;36878:14;;-1:-1:-1;;;36878:14:0;;;;;;;;;;;36827:65;27490:1;36907:48;;:16;36924:11;36907:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:38;;;-1:-1:-1;;;36907:38:0;;;;:48;36903:75;;36964:14;;-1:-1:-1;;;36964:14:0;;;;;;;;;;;36903:75;36645:341;;;:::o;65577:626::-;65687:7;-1:-1:-1;;;;;65669:25:0;:14;65677:5;65669:7;:14::i;:::-;-1:-1:-1;;;;;65669:25:0;;65665:56;;65703:18;;-1:-1:-1;;;65703:18:0;;;;;;;;;;;65665:56;65768:13;;:32;;-1:-1:-1;;;65768:32:0;;-1:-1:-1;;;;;3460:32:1;;;65768::0;;;3442:51:1;65734:31:0;;65768:13;;:23;;3415:18:1;;65768:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65734:66;;65842:353;;;;;;;;65887:9;-1:-1:-1;;;;;65842:353:0;;;;;65923:9;:28;;;:33;;65955:1;65923:33;:180;;66065:28;;;;:38;;66096:7;66065:38;:::i;:::-;66039:64;;;;66046:15;66039:64;:::i;:::-;65923:180;;;65977:16;65923:180;65842:353;;;;;;;66165:18;;;;65842:353;;;;;;;;;;;-1:-1:-1;65813:26:0;;;:19;:26;;;;;;;:382;;;;;;;;;;;;;;;;-1:-1:-1;;;65813:382:0;-1:-1:-1;;;;65813:382:0;;;;-1:-1:-1;;;65813:382:0;-1:-1:-1;;;;;;65813:382:0;;;-1:-1:-1;;;;;65813:382:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;65577:626:0:o;31074:273::-;31145:7;-1:-1:-1;;;;;31169:21:0;;31165:50;;31199:16;;-1:-1:-1;;;31199:16:0;;;;;;;;;;;31165:50;-1:-1:-1;;;;;31232:30:0;;;;;;:21;:30;;;;;;;;31228:59;;;-1:-1:-1;;;;;;31271:16:0;;;;;:7;:16;;;;;;;31074:273::o;31228:59::-;-1:-1:-1;;;;;31322:16:0;;;;;;:7;:16;;;;;;31305:34;;:16;:34::i;29217:142::-;29287:13;;:41;;-1:-1:-1;;;29287:41:0;;-1:-1:-1;;;;;3460:32:1;;;29287:41:0;;;3442:51:1;29287:13:0;;;;:28;;3415:18:1;;29287:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29283:68;;;29337:14;;-1:-1:-1;;;29337:14:0;;;;;;;;;;;47610:161;47666:6;-1:-1:-1;;;;;47689:24:0;;47685:47;;;47722:10;;-1:-1:-1;;;47722:10:0;;;;;;;;;;;47685:47;-1:-1:-1;47757:5:0;47610:161::o;53947:895::-;-1:-1:-1;;;;;54233:25:0;;54181:12;54233:25;;;:17;:25;;;;;54636:13;;54181:12;;54341:348;;54375:18;;54430:15;;54479:11;;54527;;54553:18;;54251:6;;54341:19;:348::i;:::-;54761:29;;;;;;54749:42;;;;;;;-1:-1:-1;54749:42:0;;;;;;;54761:29;-1:-1:-1;;;54761:29:0;;;;;54749:42;;;;;;54811:23;-1:-1:-1;;;54811:23:0;;;;;;53947:895;-1:-1:-1;;;;;;;;53947:895:0:o;69562:281::-;69709:38;;69738:8;;69734:1;;-1:-1:-1;;;;;69709:38:0;;;-1:-1:-1;;;;;;;;;;;69709:38:0;69734:1;;69709:38;69797;;69826:8;;-1:-1:-1;;;;;69797:38:0;;;69814:1;;-1:-1:-1;;;;;;;;;;;69797:38:0;69814:1;;69797:38;69562:281;;;:::o;67229:713::-;67385:13;;-1:-1:-1;;;;;67385:13:0;67373:59;;67422:10;;-1:-1:-1;;;67422:10:0;;;;;;;;;;;67373:59;-1:-1:-1;;;;;67447:18:0;;67443:47;;67474:16;;-1:-1:-1;;;67474:16:0;;;;;;;;;;;67443:47;-1:-1:-1;;;;;67505:16:0;;67501:45;;67530:16;;-1:-1:-1;;;67530:16:0;;;;;;;;;;;67501:45;67573:4;-1:-1:-1;;;;;67561:16:0;:8;-1:-1:-1;;;;;67561:16:0;;;:67;;;;;67596:32;67613:4;67619:8;67596:16;:32::i;:::-;67595:33;67561:67;:116;;;;;67646:31;67665:4;67671:5;67646:18;:31::i;:::-;67645:32;67561:116;67557:166;;;67696:27;;-1:-1:-1;;;67696:27:0;;;;;;;;;;;67557:166;67786:26;;;;:19;:26;;;;;67779:33;;-1:-1:-1;;;;;;67779:33:0;;;67823:31;67838:4;67844:2;67806:5;67823:14;:31::i;:::-;67928:5;67924:2;-1:-1:-1;;;;;67909:25:0;67918:4;-1:-1:-1;;;;;67909:25:0;-1:-1:-1;;;;;;;;;;;67909:25:0;;;;;;;;;67229:713;;;;:::o;61370:1087::-;61544:12;61597:13;-1:-1:-1;;;;;61578:32:0;:15;-1:-1:-1;;;;;61578:32:0;;61574:63;;61619:18;;-1:-1:-1;;;61619:18:0;;;;;;;;;;;61574:63;-1:-1:-1;;;;;61675:25:0;;61648:24;61675:25;;;:17;:25;;;;;62079:13;;61675:25;;61648:24;61780:354;;61814:13;;61866:15;;61915:11;;61960;;61986:18;;61693:6;;61780:19;:354::i;:::-;62206:24;;;;;62194:37;;;;;;;-1:-1:-1;62194:37:0;;;;;;-1:-1:-1;;;62206:24:0;;;;;62194:37;;;;;62206:24;;-1:-1:-1;62273:31:0;62289:15;62273:13;:31;:::i;:::-;62254:50;;62315:54;62332:6;62340:9;62351:11;62364:4;62315:16;:54::i;:::-;-1:-1:-1;62431:18:0;;;-1:-1:-1;;;62431:18:0;;;;;;-1:-1:-1;;;;;;;;61370:1087:0:o;33332:1270::-;-1:-1:-1;;;;;33484:20:0;;33480:49;;33513:16;;-1:-1:-1;;;33513:16:0;;;;;;;;;;;33480:49;-1:-1:-1;;;;;33544:23:0;;33540:52;;33576:16;;-1:-1:-1;;;33576:16:0;;;;;;;;;;;33540:52;33607:6;33617:1;33607:11;33603:53;;33627:29;;-1:-1:-1;;;33627:29:0;;;;;;;;;;;33603:53;-1:-1:-1;;;;;33728:23:0;;33746:4;33728:23;;;;:53;;-1:-1:-1;;;;;;33755:26:0;;33776:4;33755:26;;33728:53;33724:82;;;33790:16;;-1:-1:-1;;;33790:16:0;;;;;;;;;;;33724:82;-1:-1:-1;;;;;33823:29:0;;;;;;:21;:29;;;;;;;;33819:466;;;-1:-1:-1;;;;;33874:32:0;;;;;;:21;:32;;;;;;;;33869:211;;33927:48;33949:6;33957:9;33968:6;33927:21;:48::i;:::-;33819:466;;33869:211;34016:48;34038:6;34046:9;34057:6;34016:21;:48::i;33819:466::-;-1:-1:-1;;;;;34101:32:0;;;;;;:21;:32;;;;;;;;34097:188;;;34150:46;34170:6;34178:9;34189:6;34150:19;:46::i;34097:188::-;34229:44;34247:6;34255:9;34266:6;34229:17;:44::i;:::-;34301:9;34297:298;;;34349:4;-1:-1:-1;;;;;34331:23:0;;;34327:257;;34375:55;;-1:-1:-1;;;34375:55:0;;-1:-1:-1;;;;;34375:11:0;:24;;;;:55;;34408:1;;34412:9;;34423:6;;34375:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34327:257;;;34490:4;-1:-1:-1;;;;;34469:26:0;;;34465:119;;34516:52;;-1:-1:-1;;;34516:52:0;;-1:-1:-1;;;;;34516:11:0;:24;;;;:52;;34541:6;;34557:1;;34561:6;;34516:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;60481:443::-;60702:28;;60609:13;;;;60668:62;;-1:-1:-1;;;;;;;;60702:28:0;;;;;60668:31;:62;:::i;:::-;60785:24;;60643:87;;-1:-1:-1;60743:73:0;;60760:6;;60643:87;;-1:-1:-1;;;60785:24:0;;;;60811:4;60743:16;:73::i;:::-;60829:52;60840:6;60848:5;60855:11;60868:12;60829:10;:52::i;68148:681::-;-1:-1:-1;;;;;69131:19:0;;;:23;68345:477;;68384:67;;-1:-1:-1;;;68384:67:0;;-1:-1:-1;;;;;68384:41:0;;;;;:67;;68426:8;;68436:4;;68442:2;;68446:4;;68384:67;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;68384:67:0;;;;;;;;-1:-1:-1;;68384:67:0;;;;;;;;;;;;:::i;:::-;;;68380:431;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;68709:6;68702:14;;-1:-1:-1;;;68702:14:0;;;;;;;;:::i;:::-;;;;;;;;68380:431;;;68765:30;;-1:-1:-1;;;68765:30:0;;;;;;;;;;;68380:431;-1:-1:-1;;;;;;68501:58:0;;-1:-1:-1;;;68501:58:0;68497:136;;68591:22;;-1:-1:-1;;;68591:22:0;;;;;;;;;;;68497:136;68452:196;68148:681;;;;;:::o;25369:210::-;-1:-1:-1;;;;;25441:21:0;;;25437:135;;-1:-1:-1;;;;;25478:26:0;;25507:5;25478:26;;;:17;:26;;;;;;:34;;-1:-1:-1;;25478:34:0;;;25532:28;;;25507:5;25532:28;25369:210;:::o;35711:160::-;35752:7;35773:15;35790;35809:19;:17;:19::i;:::-;35772:56;;-1:-1:-1;35772:56:0;-1:-1:-1;35846:17:0;35772:56;;35846:17;:::i;:::-;35839:24;;;;35711:160;:::o;40103:208::-;40235:15;40212:19;27242:7;40212:11;:19;:::i;:::-;40197:35;;:11;:35;:::i;:::-;:53;40193:111;;;40274:18;;-1:-1:-1;;;40274:18:0;;;;;;;;;;;60932:430;27458:1;61068:21;;:31;;-1:-1:-1;;;;;61068:31:0;-1:-1:-1;;;61068:31:0;;;;;61133:24;-1:-1:-1;;;61133:24:0;;;;61168:43;61191:6;61133:24;61168:22;:43::i;:::-;-1:-1:-1;;61273:1:0;61253:17;;;:10;:17;;;;;:21;;;61325:11;:29;;;;;;;;;;;;;;-1:-1:-1;60932:430:0:o;59554:457::-;59731:16;59750:20;;;;:6;:20;:::i;:::-;-1:-1:-1;;;;;59731:39:0;;;59804:6;-1:-1:-1;;;;;59781:29:0;:19;;:29;;;;;;;:::i;:::-;;;;;;;;59848:8;59821:23;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;59867:27:0;;;;;;:19;:27;;;;;:39;;59898:8;;59867:27;:39;;59898:8;;59867:39;:::i;:::-;;;;-1:-1:-1;59950:53:0;;-1:-1:-1;59968:4:0;59975:6;59983:8;59993:9;59950;:53::i;29608:148::-;-1:-1:-1;;;;;29688:32:0;;;;;;:17;:32;;;;;;;;29683:65;;29729:19;;-1:-1:-1;;;29729:19:0;;;;;;;;;;;35122:262;35224:15;35252:10;:8;:10::i;:::-;35242:20;;:7;:20;:::i;:::-;-1:-1:-1;;;;;35270:15:0;;;;;;:7;:15;;;;;:26;;35224:38;;-1:-1:-1;35289:7:0;;35270:15;;;:26;;35289:7;;35270:26;:::i;:::-;;;;-1:-1:-1;;;;;;;35307:15:0;;;;;;:7;:15;;;;;:26;;35326:7;;35307:15;:26;;35326:7;;35307:26;:::i;:::-;;;;-1:-1:-1;;;;;;;35344:18:0;;;;;;:7;:18;;;;;:29;;35366:7;;35344:18;:29;;35366:7;;35344:29;:::i;:::-;;;;-1:-1:-1;;;;;;35122:262:0:o;58616:580::-;-1:-1:-1;;;;;58730:25:0;;58703:24;58730:25;;;:17;:25;;;;;58797:13;;58844:15;:11;58858:1;58844:15;:::i;:::-;58828:31;;:12;:31;;;58824:313;;58952:22;58977:6;58984:16;58999:1;58984:12;:16;:::i;:::-;58977:24;;;;;;;;;;:::i;:::-;;;;;;;;;58952:49;;59063:11;59016:16;59033:14;59016:32;;;;;;;;:::i;:::-;;;;;;;;;;;:44;;;:58;;;;;;;;;;;;;;;;;;59111:14;59089:6;59096:11;59089:19;;;;;;;;;;:::i;:::-;;;;;;;;;;:36;-1:-1:-1;58824:313:0;59176:6;:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;58692:504;;58616:580;;:::o;55771:1504::-;56109:11;:18;56045:35;;56142:9;;56138:437;;56282:11;56294:9;56302:1;56294:5;:9;:::i;:::-;56282:22;;;;;;;;:::i;:::-;;;;;;;;;56274:30;;56319:11;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;56366:16;56383:5;56366:23;;;;;;;;:::i;:::-;;;;;;;;;;;56351:38;;56138:437;;;-1:-1:-1;;56487:16:0;:23;;56540;;;;;-1:-1:-1;56540:23:0;;;;;;;;;;56138:437;56617:52;;-1:-1:-1;;;;;56617:52:0;;;-1:-1:-1;;;;;;56680:46:0;;;;;;;-1:-1:-1;;;56680:46:0;;;;;;;;-1:-1:-1;;;;56786:38:0;-1:-1:-1;;;56737:38:0;;;;-1:-1:-1;;;;56786:38:0;;-1:-1:-1;;;56786:38:0;;;;;;;56869:18;:37;;27458:1;56869:37;;;27490:1;56869:37;56835:71;;-1:-1:-1;;;;;56835:71:0;;;-1:-1:-1;;;56835:71:0;;;;;;;;;;;;;;;-1:-1:-1;56919:26:0;;:42;;-1:-1:-1;;;;;;56919:42:0;;-1:-1:-1;;;;;56919:42:0;;;;;;;56993:9;;;-1:-1:-1;;;;;;56972:30:0;;;;;;56993:9;;;;-1:-1:-1;;;56972:30:0;;-1:-1:-1;;;;57064:38:0;-1:-1:-1;;;57013:40:0;;;;-1:-1:-1;;;;57064:38:0;;-1:-1:-1;;;57064:38:0;;;;;57113:30;;;-1:-1:-1;;;57113:30:0;;;;57190:9;;;;-1:-1:-1;57179:21:0;;;:10;:21;;;;;:29;;;57256:11;;-1:-1:-1;;57256:11:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;56082:1193;55771:1504;;;;;;;;;:::o;66728:493::-;66811:4;66869:26;;;:19;:26;;;;;66940:13;;66811:4;;-1:-1:-1;;;;;66940:13:0;:23;66964:14;66889:5;66964:7;:14::i;:::-;66940:39;;-1:-1:-1;;;;;;66940:39:0;;;;;;;-1:-1:-1;;;;;3460:32:1;;;66940:39:0;;;3442:51:1;3415:18;;66940:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66996:19;;66906:73;;-1:-1:-1;;;;;;66996:31:0;;;:19;;:31;;;:86;;-1:-1:-1;67062:20:0;;-1:-1:-1;;;67062:20:0;;;;67044:15;:38;66996:86;:144;;;-1:-1:-1;67121:19:0;;67099:18;;;;67121:19;67099:41;;;-1:-1:-1;;;67121:19:0;;;;67099:41;;66996:144;66992:198;;;67173:5;67166:12;;;;;;66992:198;-1:-1:-1;67209:4:0;;66728:493;-1:-1:-1;;;;66728:493:0:o;57283:1325::-;57397:19;57418:35;57457:29;57467:5;57474:11;57457:9;:29::i;:::-;57505:28;;57396:90;;-1:-1:-1;57505:28:0;-1:-1:-1;;;;57505:28:0;;-1:-1:-1;;;;;57505:28:0;:33;57497:70;;;;-1:-1:-1;;;57497:70:0;;28380:2:1;57497:70:0;;;28362:21:1;28419:2;28399:18;;;28392:30;28458:26;28438:18;;;28431:54;28502:18;;57497:70:0;28178:348:1;57497:70:0;57580:26;;;:38;;-1:-1:-1;;;;;;57580:38:0;-1:-1:-1;;;;;57580:38:0;;;;;57714:31;;-1:-1:-1;;;;;57714:31:0;;;-1:-1:-1;;;57778:24:0;;;;57884:67;57901:11;57714:31;57778:24;-1:-1:-1;57884:16:0;:67::i;:::-;58031:65;58048:9;58059:16;58077:11;58090:5;58031:16;:65::i;:::-;-1:-1:-1;;;;;58146:11:0;:24;;58171:11;58184:9;58195:30;;;;:16;:30;:::i;:::-;58146:80;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;58320:24:0;;;;58284:61;;58307:11;;-1:-1:-1;;;58320:24:0;;;;58284:22;:61::i;:::-;-1:-1:-1;;;;;58425:28:0;;;;;;;:17;:28;;;;;;;;:35;;58391:24;;;;:70;;;;;;-1:-1:-1;;;58391:70:0;-1:-1:-1;;;;58391:70:0;;;;;;;;;;58472:46;;;;;;;;;;;;;;;;;;;;58531:13;:69;;-1:-1:-1;;;58531:69:0;;:13;;;:27;;:69;;58559:11;;58443:9;;58583:16;;58531:69;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57385:1223;;;;57283:1325;;;:::o;35392:307::-;35494:15;35522:10;:8;:10::i;:::-;35512:20;;:7;:20;:::i;:::-;-1:-1:-1;;;;;35540:15:0;;;;;;:7;:15;;;;;:26;;35494:38;;-1:-1:-1;35559:7:0;;35540:15;;;:26;;35559:7;;35540:26;:::i;:::-;;;;-1:-1:-1;;;;;;;35577:15:0;;;;;;:7;:15;;;;;:26;;35596:7;;35577:15;:26;;35596:7;;35577:26;:::i;:::-;;;;-1:-1:-1;;;;;;;35614:18:0;;;;;;:7;:18;;;;;:29;;35636:7;;35614:18;:29;;35636:7;;35614:29;:::i;34843:271::-;34943:15;34971:10;:8;:10::i;:::-;34961:20;;:7;:20;:::i;:::-;-1:-1:-1;;;;;34989:15:0;;;;;;:7;:15;;;;;:26;;34943:38;;-1:-1:-1;34943:38:0;;34989:15;;;:26;;34943:38;;34989:26;:::i;34614:221::-;34712:15;34740:10;:8;:10::i;:::-;34730:20;;:7;:20;:::i;:::-;-1:-1:-1;;;;;34761:15:0;;;;;;:7;:15;;;;;:26;;34712:38;;-1:-1:-1;34712:38:0;;34761:15;;;:26;;34712:38;;34761:26;:::i;35879:758::-;35976:7;;36068:13;:20;35929:7;;;;27398:28;;35929:7;36101:392;36125:6;36121:1;:10;36101:392;;;36181:7;36153;:25;36161:13;36175:1;36161:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;36161:16:0;36153:25;;;;;;;;;;;;;:35;;:74;;;36220:7;36192;:25;36200:13;36214:1;36200:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;36200:16:0;36192:25;;;;;;;;;;;;;:35;36153:74;36149:155;;;-1:-1:-1;;36256:7:0;;;27398:28;;-1:-1:-1;35879:758:0;-1:-1:-1;;;35879:758:0:o;36149:155::-;36329:7;:25;36337:13;36351:1;36337:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;36337:16:0;36329:25;;;;;;;;;;;;;36318:36;;;;:::i;:::-;;;36380:7;:25;36388:13;36402:1;36388:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;36388:16:0;36380:25;;;;;;;;;;;;;36369:36;;;;:::i;:::-;;-1:-1:-1;36463:3:0;;36101:392;;;;27398:28;36518:7;;:32;;;;:::i;:::-;36507:7;:44;36503:90;;;-1:-1:-1;;36561:7:0;;;27398:28;;-1:-1:-1;35879:758:0;-1:-1:-1;;35879:758:0:o;36503:90::-;-1:-1:-1;36612:7:0;;36621;;-1:-1:-1;35879:758:0;-1:-1:-1;35879:758:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:131::-;-1:-1:-1;;;;;667:31:1;;657:42;;647:70;;713:1;710;703:12;728:179;795:20;;-1:-1:-1;;;;;844:38:1;;834:49;;824:77;;897:1;894;887:12;912:387;988:6;996;1004;1057:2;1045:9;1036:7;1032:23;1028:32;1025:52;;;1073:1;1070;1063:12;1025:52;1112:9;1099:23;1131:31;1156:5;1131:31;:::i;:::-;1181:5;-1:-1:-1;1233:2:1;1218:18;;1205:32;;-1:-1:-1;1256:37:1;1289:2;1274:18;;1256:37;:::i;:::-;1246:47;;912:387;;;;;:::o;1817:247::-;1876:6;1929:2;1917:9;1908:7;1904:23;1900:32;1897:52;;;1945:1;1942;1935:12;1897:52;1984:9;1971:23;2003:31;2028:5;2003:31;:::i;2251:258::-;2323:1;2333:113;2347:6;2344:1;2341:13;2333:113;;;2423:11;;;2417:18;2404:11;;;2397:39;2369:2;2362:10;2333:113;;;2464:6;2461:1;2458:13;2455:48;;;-1:-1:-1;;2499:1:1;2481:16;;2474:27;2251:258::o;2514:::-;2556:3;2594:5;2588:12;2621:6;2616:3;2609:19;2637:63;2693:6;2686:4;2681:3;2677:14;2670:4;2663:5;2659:16;2637:63;:::i;:::-;2754:2;2733:15;-1:-1:-1;;2729:29:1;2720:39;;;;2761:4;2716:50;;2514:258;-1:-1:-1;;2514:258:1:o;2777:220::-;2926:2;2915:9;2908:21;2889:4;2946:45;2987:2;2976:9;2972:18;2964:6;2946:45;:::i;3002:180::-;3061:6;3114:2;3102:9;3093:7;3089:23;3085:32;3082:52;;;3130:1;3127;3120:12;3082:52;-1:-1:-1;3153:23:1;;3002:180;-1:-1:-1;3002:180:1:o;3504:315::-;3572:6;3580;3633:2;3621:9;3612:7;3608:23;3604:32;3601:52;;;3649:1;3646;3639:12;3601:52;3688:9;3675:23;3707:31;3732:5;3707:31;:::i;:::-;3757:5;3809:2;3794:18;;;;3781:32;;-1:-1:-1;;;3504:315:1:o;3824:252::-;3891:6;3899;3952:2;3940:9;3931:7;3927:23;3923:32;3920:52;;;3968:1;3965;3958:12;3920:52;4004:9;3991:23;3981:33;;4033:37;4066:2;4055:9;4051:18;4033:37;:::i;:::-;4023:47;;3824:252;;;;;:::o;4599:320::-;4675:6;4683;4691;4744:2;4732:9;4723:7;4719:23;4715:32;4712:52;;;4760:1;4757;4750:12;4712:52;4783:28;4801:9;4783:28;:::i;:::-;4773:38;4858:2;4843:18;;4830:32;;-1:-1:-1;4909:2:1;4894:18;;;4881:32;;4599:320;-1:-1:-1;;;4599:320:1:o;5137:388::-;5205:6;5213;5266:2;5254:9;5245:7;5241:23;5237:32;5234:52;;;5282:1;5279;5272:12;5234:52;5321:9;5308:23;5340:31;5365:5;5340:31;:::i;:::-;5390:5;-1:-1:-1;5447:2:1;5432:18;;5419:32;5460:33;5419:32;5460:33;:::i;:::-;5512:7;5502:17;;;5137:388;;;;;:::o;5530:456::-;5607:6;5615;5623;5676:2;5664:9;5655:7;5651:23;5647:32;5644:52;;;5692:1;5689;5682:12;5644:52;5731:9;5718:23;5750:31;5775:5;5750:31;:::i;:::-;5800:5;-1:-1:-1;5857:2:1;5842:18;;5829:32;5870:33;5829:32;5870:33;:::i;:::-;5530:456;;5922:7;;-1:-1:-1;;;5976:2:1;5961:18;;;;5948:32;;5530:456::o;5991:248::-;6059:6;6067;6120:2;6108:9;6099:7;6095:23;6091:32;6088:52;;;6136:1;6133;6126:12;6088:52;-1:-1:-1;;6159:23:1;;;6229:2;6214:18;;;6201:32;;-1:-1:-1;5991:248:1:o;6523:156::-;6589:20;;6649:4;6638:16;;6628:27;;6618:55;;6669:1;6666;6659:12;6684:125;6769:14;6762:5;6758:26;6751:5;6748:37;6738:65;;6799:1;6796;6789:12;6814:118;6900:5;6893:13;6886:21;6879:5;6876:32;6866:60;;6922:1;6919;6912:12;6937:811;7041:6;7049;7057;7065;7073;7081;7089;7142:3;7130:9;7121:7;7117:23;7113:33;7110:53;;;7159:1;7156;7149:12;7110:53;7198:9;7185:23;7217:31;7242:5;7217:31;:::i;:::-;7267:5;-1:-1:-1;7291:37:1;7324:2;7309:18;;7291:37;:::i;:::-;7281:47;;7347:36;7379:2;7368:9;7364:18;7347:36;:::i;:::-;7337:46;;7435:2;7424:9;7420:18;7407:32;7448;7472:7;7448:32;:::i;:::-;7499:7;-1:-1:-1;7525:38:1;7558:3;7543:19;;7525:38;:::i;:::-;7515:48;;7582:38;7615:3;7604:9;7600:19;7582:38;:::i;:::-;7572:48;;7672:3;7661:9;7657:19;7644:33;7686:30;7708:7;7686:30;:::i;:::-;7735:7;7725:17;;;6937:811;;;;;;;;;;:::o;8456:383::-;8533:6;8541;8549;8602:2;8590:9;8581:7;8577:23;8573:32;8570:52;;;8618:1;8615;8608:12;8570:52;8657:9;8644:23;8676:31;8701:5;8676:31;:::i;8844:523::-;8928:6;8936;8944;8952;8960;9013:3;9001:9;8992:7;8988:23;8984:33;8981:53;;;9030:1;9027;9020:12;8981:53;9053:27;9070:9;9053:27;:::i;:::-;9043:37;;9099:36;9131:2;9120:9;9116:18;9099:36;:::i;:::-;9089:46;;9154:36;9186:2;9175:9;9171:18;9154:36;:::i;:::-;9144:46;;9209:36;9241:2;9230:9;9226:18;9209:36;:::i;:::-;9199:46;;9295:3;9284:9;9280:19;9267:33;9309:28;9331:5;9309:28;:::i;:::-;9356:5;9346:15;;;8844:523;;;;;;;;:::o;9372:389::-;9446:6;9454;9462;9515:2;9503:9;9494:7;9490:23;9486:32;9483:52;;;9531:1;9528;9521:12;9483:52;9570:9;9557:23;9589:31;9614:5;9589:31;:::i;:::-;9639:5;-1:-1:-1;9663:37:1;9696:2;9681:18;;9663:37;:::i;:::-;9653:47;;9719:36;9751:2;9740:9;9736:18;9719:36;:::i;9766:315::-;9834:6;9842;9895:2;9883:9;9874:7;9870:23;9866:32;9863:52;;;9911:1;9908;9901:12;9863:52;9947:9;9934:23;9924:33;;10007:2;9996:9;9992:18;9979:32;10020:31;10045:5;10020:31;:::i;10286:1365::-;10513:13;;-1:-1:-1;;;;;1468:38:1;1456:51;;10482:3;10467:19;;10585:4;10577:6;10573:17;10567:24;10600:53;10647:4;10636:9;10632:20;10618:12;-1:-1:-1;;;;;1468:38:1;1456:51;;1403:110;10600:53;;10702:4;10694:6;10690:17;10684:24;10717:55;10766:4;10755:9;10751:20;10735:14;10162;10151:26;10139:39;;10086:98;10717:55;;10821:4;10813:6;10809:17;10803:24;10836:54;10884:4;10873:9;10869:20;10853:14;8017:4;8006:16;7994:29;;7950:75;10836:54;;10939:4;10931:6;10927:17;10921:24;10954:54;11002:4;10991:9;10987:20;10971:14;8017:4;8006:16;7994:29;;7950:75;10954:54;;11057:4;11049:6;11045:17;11039:24;11072:56;11122:4;11111:9;11107:20;11091:14;-1:-1:-1;;;;;3253:31:1;3241:44;;3187:104;11072:56;;11177:4;11169:6;11165:17;11159:24;11192:55;11241:4;11230:9;11226:20;11210:14;1380:10;1369:22;1357:35;;1304:94;11192:55;;11296:4;11288:6;11284:17;11278:24;11311:55;11360:4;11349:9;11345:20;11329:14;1380:10;1369:22;1357:35;;1304:94;11311:55;-1:-1:-1;11385:6:1;11428:15;;;11422:22;10265:8;10254:20;11487:18;;;10242:33;11525:6;11568:15;;;11562:22;8017:4;8006:16;;11626:18;;;7994:29;11593:52;7950:75;11656:389;11741:6;11749;11757;11765;11818:3;11806:9;11797:7;11793:23;11789:33;11786:53;;;11835:1;11832;11825:12;11786:53;11858:28;11876:9;11858:28;:::i;:::-;11848:38;11933:2;11918:18;;11905:32;;-1:-1:-1;11984:2:1;11969:18;;11956:32;;12035:2;12020:18;12007:32;;-1:-1:-1;11656:389:1;-1:-1:-1;;;11656:389:1:o;12509:382::-;12574:6;12582;12635:2;12623:9;12614:7;12610:23;12606:32;12603:52;;;12651:1;12648;12641:12;12603:52;12690:9;12677:23;12709:31;12734:5;12709:31;:::i;:::-;12759:5;-1:-1:-1;12816:2:1;12801:18;;12788:32;12829:30;12788:32;12829:30;:::i;13121:523::-;13203:6;13211;13219;13227;13280:3;13268:9;13259:7;13255:23;13251:33;13248:53;;;13297:1;13294;13287:12;13248:53;13336:9;13323:23;13355:31;13380:5;13355:31;:::i;:::-;13405:5;-1:-1:-1;13457:2:1;13442:18;;13429:32;;-1:-1:-1;13480:37:1;13513:2;13498:18;;13480:37;:::i;:::-;13470:47;;13569:2;13558:9;13554:18;13541:32;13582:30;13604:7;13582:30;:::i;:::-;13121:523;;;;-1:-1:-1;13121:523:1;;-1:-1:-1;;13121:523:1:o;13649:936::-;13746:6;13754;13762;13770;13778;13831:3;13819:9;13810:7;13806:23;13802:33;13799:53;;;13848:1;13845;13838:12;13799:53;13887:9;13874:23;13906:31;13931:5;13906:31;:::i;:::-;13956:5;-1:-1:-1;14013:2:1;13998:18;;13985:32;14026:33;13985:32;14026:33;:::i;:::-;14078:7;-1:-1:-1;14132:2:1;14117:18;;14104:32;;-1:-1:-1;14187:2:1;14172:18;;14159:32;14210:18;14240:14;;;14237:34;;;14267:1;14264;14257:12;14237:34;14305:6;14294:9;14290:22;14280:32;;14350:7;14343:4;14339:2;14335:13;14331:27;14321:55;;14372:1;14369;14362:12;14321:55;14412:2;14399:16;14438:2;14430:6;14427:14;14424:34;;;14454:1;14451;14444:12;14424:34;14499:7;14494:2;14485:6;14481:2;14477:15;14473:24;14470:37;14467:57;;;14520:1;14517;14510:12;14467:57;13649:936;;;;-1:-1:-1;13649:936:1;;-1:-1:-1;14551:2:1;14543:11;;14573:6;13649:936;-1:-1:-1;;;13649:936:1:o;14590:250::-;14656:6;14664;14717:2;14705:9;14696:7;14692:23;14688:32;14685:52;;;14733:1;14730;14723:12;14685:52;14769:9;14756:23;14746:33;;14798:36;14830:2;14819:9;14815:18;14798:36;:::i;14845:450::-;14919:6;14927;14935;14988:2;14976:9;14967:7;14963:23;14959:32;14956:52;;;15004:1;15001;14994:12;14956:52;15043:9;15030:23;15062:31;15087:5;15062:31;:::i;:::-;15112:5;-1:-1:-1;15164:2:1;15149:18;;15136:32;;-1:-1:-1;15220:2:1;15205:18;;15192:32;15233:30;15192:32;15233:30;:::i;:::-;15282:7;15272:17;;;14845:450;;;;;:::o;15677:377::-;15751:6;15759;15767;15820:2;15808:9;15799:7;15795:23;15791:32;15788:52;;;15836:1;15833;15826:12;15788:52;15872:9;15859:23;15849:33;;15929:2;15918:9;15914:18;15901:32;15891:42;;15983:2;15972:9;15968:18;15955:32;15996:28;16018:5;15996:28;:::i;16319:127::-;16380:10;16375:3;16371:20;16368:1;16361:31;16411:4;16408:1;16401:15;16435:4;16432:1;16425:15;16451:278;16490:7;-1:-1:-1;;;;;16575:2:1;16572:1;16568:10;16605:2;16602:1;16598:10;16661:3;16657:2;16653:12;16648:3;16645:21;16638:3;16631:11;16624:19;16620:47;16617:73;;;16670:18;;:::i;:::-;16710:13;;16451:278;-1:-1:-1;;;;16451:278:1:o;16734:127::-;16795:10;16790:3;16786:20;16783:1;16776:31;16826:4;16823:1;16816:15;16850:4;16847:1;16840:15;16866:207;16905:1;-1:-1:-1;;;;;16984:2:1;16981:1;16977:10;17006:3;16996:37;;17013:18;;:::i;:::-;17051:10;;17047:20;;;;;16866:207;-1:-1:-1;;16866:207:1:o;17078:237::-;17117:4;-1:-1:-1;;;;;17222:10:1;;;;17192;;17244:12;;;17241:38;;;17259:18;;:::i;:::-;17296:13;;17078:237;-1:-1:-1;;;17078:237:1:o;17320:244::-;17359:3;-1:-1:-1;;;;;17440:2:1;17437:1;17433:10;17470:2;17467:1;17463:10;17501:3;17497:2;17493:12;17488:3;17485:21;17482:47;;;17509:18;;:::i;:::-;17545:13;;17320:244;-1:-1:-1;;;;17320:244:1:o;17569:184::-;17639:6;17692:2;17680:9;17671:7;17667:23;17663:32;17660:52;;;17708:1;17705;17698:12;17660:52;-1:-1:-1;17731:16:1;;17569:184;-1:-1:-1;17569:184:1:o;17758:127::-;17819:10;17814:3;17810:20;17807:1;17800:31;17850:4;17847:1;17840:15;17874:4;17871:1;17864:15;17890:249;18000:2;17981:13;;-1:-1:-1;;17977:27:1;17965:40;;18035:18;18020:34;;18056:22;;;18017:62;18014:88;;;18082:18;;:::i;:::-;18118:2;18111:22;-1:-1:-1;;17890:249:1:o;18144:167::-;18222:13;;18275:10;18264:22;;18254:33;;18244:61;;18301:1;18298;18291:12;18316:163;18394:13;;18447:6;18436:18;;18426:29;;18416:57;;18469:1;18466;18459:12;18484:1023;18585:6;18638:3;18626:9;18617:7;18613:23;18609:33;18606:53;;;18655:1;18652;18645:12;18606:53;18688:2;18682:9;18730:3;18722:6;18718:16;18753:18;18821:6;18809:10;18806:22;18801:2;18789:10;18786:18;18783:46;18780:72;;;18832:18;;:::i;:::-;18872:10;18868:2;18861:22;18911:9;18905:16;18892:29;;18961:2;18954:5;18950:14;18943:5;18940:25;18930:53;;18979:1;18976;18969:12;18930:53;-1:-1:-1;18992:21:1;;19046:48;19090:2;19075:18;;19046:48;:::i;:::-;19041:2;19033:6;19029:15;19022:73;19128:48;19172:2;19161:9;19157:18;19128:48;:::i;:::-;19123:2;19115:6;19111:15;19104:73;19210:48;19254:2;19243:9;19239:18;19210:48;:::i;:::-;19205:2;19197:6;19193:15;19186:73;19293:49;19337:3;19326:9;19322:19;19293:49;:::i;:::-;19287:3;19279:6;19275:16;19268:75;19388:3;19377:9;19373:19;19367:26;19402:32;19426:7;19402:32;:::i;:::-;19462:3;19450:16;;19443:33;19454:6;18484:1023;-1:-1:-1;;;18484:1023:1:o;19512:125::-;19552:4;19580:1;19577;19574:8;19571:34;;;19585:18;;:::i;:::-;-1:-1:-1;19622:9:1;;19512:125::o;19642:168::-;19682:7;19748:1;19744;19740:6;19736:14;19733:1;19730:21;19725:1;19718:9;19711:17;19707:45;19704:71;;;19755:18;;:::i;:::-;-1:-1:-1;19795:9:1;;19642:168::o;19815:120::-;19855:1;19881;19871:35;;19886:18;;:::i;:::-;-1:-1:-1;19920:9:1;;19815:120::o;19940:245::-;20007:6;20060:2;20048:9;20039:7;20035:23;20031:32;20028:52;;;20076:1;20073;20066:12;20028:52;20108:9;20102:16;20127:28;20149:5;20127:28;:::i;20190:407::-;-1:-1:-1;;;;;20447:15:1;;;20429:34;;20499:15;;;;20494:2;20479:18;;20472:43;-1:-1:-1;;;;;20551:39:1;;;20546:2;20531:18;;20524:67;20379:2;20364:18;;20190:407::o;20602:128::-;20642:3;20673:1;20669:6;20666:1;20663:13;20660:39;;;20679:18;;:::i;:::-;-1:-1:-1;20715:9:1;;20602:128::o;20735:127::-;20796:10;20791:3;20787:20;20784:1;20777:31;20827:4;20824:1;20817:15;20851:4;20848:1;20841:15;20867:127;20928:10;20923:3;20919:20;20916:1;20909:31;20959:4;20956:1;20949:15;20983:4;20980:1;20973:15;21513:157;21543:1;21577:4;21574:1;21570:12;21601:3;21591:37;;21608:18;;:::i;:::-;21660:3;21653:4;21650:1;21646:12;21642:22;21637:27;;;21513:157;;;;:::o;22065:195::-;22103:4;22140;22137:1;22133:12;22172:4;22169:1;22165:12;22197:3;22192;22189:12;22186:38;;;22204:18;;:::i;:::-;22241:13;;;22065:195;-1:-1:-1;;;22065:195:1:o;22265:375::-;-1:-1:-1;;;;;22523:15:1;;;22505:34;;22575:15;;;;22570:2;22555:18;;22548:43;22622:2;22607:18;;22600:34;;;;22455:2;22440:18;;22265:375::o;22645:740::-;22725:6;22778:2;22766:9;22757:7;22753:23;22749:32;22746:52;;;22794:1;22791;22784:12;22746:52;22827:9;22821:16;22856:18;22897:2;22889:6;22886:14;22883:34;;;22913:1;22910;22903:12;22883:34;22951:6;22940:9;22936:22;22926:32;;22996:7;22989:4;22985:2;22981:13;22977:27;22967:55;;23018:1;23015;23008:12;22967:55;23047:2;23041:9;23069:2;23065;23062:10;23059:36;;;23075:18;;:::i;:::-;23124:2;23118:9;;-1:-1:-1;23136:65:1;23191:2;23172:13;;-1:-1:-1;;23168:27:1;23197:2;23164:36;23118:9;23136:65;:::i;:::-;23225:2;23217:6;23210:18;23265:7;23260:2;23255;23251;23247:11;23243:20;23240:33;23237:53;;;23286:1;23283;23276:12;23237:53;23299:55;23351:2;23346;23338:6;23334:15;23329:2;23325;23321:11;23299:55;:::i;:::-;-1:-1:-1;23373:6:1;22645:740;-1:-1:-1;;;;22645:740:1:o;23390:422::-;23479:1;23522:5;23479:1;23536:270;23557:7;23547:8;23544:21;23536:270;;;23616:4;23612:1;23608:6;23604:17;23598:4;23595:27;23592:53;;;23625:18;;:::i;:::-;23675:7;23665:8;23661:22;23658:55;;;23695:16;;;;23658:55;23774:22;;;;23734:15;;;;23536:270;;;23540:3;23390:422;;;;;:::o;23817:806::-;23866:5;23896:8;23886:80;;-1:-1:-1;23937:1:1;23951:5;;23886:80;23985:4;23975:76;;-1:-1:-1;24022:1:1;24036:5;;23975:76;24067:4;24085:1;24080:59;;;;24153:1;24148:130;;;;24060:218;;24080:59;24110:1;24101:10;;24124:5;;;24148:130;24185:3;24175:8;24172:17;24169:43;;;24192:18;;:::i;:::-;-1:-1:-1;;24248:1:1;24234:16;;24263:5;;24060:218;;24362:2;24352:8;24349:16;24343:3;24337:4;24334:13;24330:36;24324:2;24314:8;24311:16;24306:2;24300:4;24297:12;24293:35;24290:77;24287:159;;;-1:-1:-1;24399:19:1;;;24431:5;;24287:159;24478:34;24503:8;24497:4;24478:34;:::i;:::-;24548:6;24544:1;24540:6;24536:19;24527:7;24524:32;24521:58;;;24559:18;;:::i;:::-;24597:20;;23817:806;-1:-1:-1;;;23817:806:1:o;24628:131::-;24688:5;24717:36;24744:8;24738:4;24717:36;:::i;25073:127::-;25134:10;25129:3;25125:20;25122:1;25115:31;25165:4;25162:1;25155:15;25189:4;25186:1;25179:15;25205:199;25236:1;-1:-1:-1;;;;;25315:2:1;25312:1;25308:10;25337:3;25327:37;;25344:18;;:::i;:::-;25382:10;;25378:20;;;;;25205:199;-1:-1:-1;;25205:199:1:o;25409:201::-;25447:3;25475:10;25520:2;25513:5;25509:14;25547:2;25538:7;25535:15;25532:41;;25553:18;;:::i;:::-;25602:1;25589:15;;25409:201;-1:-1:-1;;;25409:201:1:o;25615:258::-;25654:7;25686:6;25719:2;25716:1;25712:10;25749:2;25746:1;25742:10;25805:3;25801:2;25797:12;25792:3;25789:21;25782:3;25775:11;25768:19;25764:47;25761:73;;;25814:18;;:::i;25878:232::-;25917:3;25945:14;25986:2;25983:1;25979:10;26016:2;26013:1;26009:10;26047:3;26043:2;26039:12;26034:3;26031:21;26028:47;;;26055:18;;:::i;26115:489::-;-1:-1:-1;;;;;26384:15:1;;;26366:34;;26436:15;;26431:2;26416:18;;26409:43;26483:2;26468:18;;26461:34;;;26531:3;26526:2;26511:18;;26504:31;;;26309:4;;26552:46;;26578:19;;26570:6;26552:46;:::i;26609:249::-;26678:6;26731:2;26719:9;26710:7;26706:23;26702:32;26699:52;;;26747:1;26744;26737:12;26699:52;26779:9;26773:16;26798:30;26822:5;26798:30;:::i;26863:179::-;26898:3;26940:1;26922:16;26919:23;26916:120;;;26986:1;26983;26980;26965:23;-1:-1:-1;27023:1:1;27017:8;27012:3;27008:18;26916:120;26863:179;:::o;27047:671::-;27086:3;27128:4;27110:16;27107:26;27104:39;;;27047:671;:::o;27104:39::-;27170:2;27164:9;-1:-1:-1;;27235:16:1;27231:25;;27228:1;27164:9;27207:50;27286:4;27280:11;27310:16;27345:18;27416:2;27409:4;27401:6;27397:17;27394:25;27389:2;27381:6;27378:14;27375:45;27372:58;;;27423:5;;;;;27047:671;:::o;27372:58::-;27460:6;27454:4;27450:17;27439:28;;27496:3;27490:10;27523:2;27515:6;27512:14;27509:27;;;27529:5;;;;;;27047:671;:::o;27509:27::-;27613:2;27594:16;27588:4;27584:27;27580:36;27573:4;27564:6;27559:3;27555:16;27551:27;27548:69;27545:82;;;27620:5;;;;;;27047:671;:::o;27545:82::-;27636:57;27687:4;27678:6;27670;27666:19;27662:30;27656:4;27636:57;:::i;:::-;-1:-1:-1;27709:3:1;;27047:671;-1:-1:-1;;;;;27047:671:1:o;27723:226::-;27762:3;27790:8;27825:2;27822:1;27818:10;27855:2;27852:1;27848:10;27886:3;27882:2;27878:12;27873:3;27870:21;27867:47;;;27894:18;;:::i;27954:219::-;27993:4;28022:8;28080:10;;;;28050;;28102:12;;;28099:38;;;28117:18;;:::i

Swarm Source

ipfs://f35afae76adc4b92710eb555fc201d0373faf6a7430815869d3d45f9c99a850e
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.