ETH Price: $2,860.31 (-10.69%)
Gas: 12 Gwei

Token

Paralism-EPARA (EPARA)
 

Overview

Max Total Supply

17,715,236.845870453 EPARA

Holders

82 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
2,008,894.76998041 EPARA

Value
$0.00
0xb0e4654ca5d8104a8749f37907cff3008a0344c6
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

E-PARA is a digital token issued on the Ethereum network and maintains a 1:1 exchange relationship with Para coins. E-PARA can be used in both ecosystems of Ethereum and Paralism at the same time.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
EPARA

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-05-07
*/

/**
 *Paralism.com EPARA Token V1 on Ethereum
*/
pragma solidity >=0.6.4 <0.8.0;
pragma experimental ABIEncoderV2;

/// @title Math library with safety checks
/// @author Paralism.com
library SafeMath {
    function safeAdd(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x + y) >= x, "add() overflow!");
    }

    function safeSub(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x - y) <= x, "sub() underflow!");
    }
    
    function toUint64(uint256 _value) internal pure returns (uint64 z){
        require(_value < 2**64, "toUint64() overflow!");
        return uint64(_value);
    }
}

/// @title Contract of EPARA
/// @author Paralism.com
/// @notice EPARA ERC20 contract with lock functionality extension 
/// @dev EPARA V1 March 2021 
contract EPARA {
    using SafeMath for uint;

    string public name;
    string public symbol;
    uint8 public decimals;
    
    uint256 internal _supplyCap;
    uint256 public totalLocked;

    mapping (address => uint256) public balanceOf;
    mapping (address => mapping (address => uint256)) public allowance;
    mapping (address => uint256) public freezeOf;

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner,address indexed spender,uint256 value);
    
    event Freeze(address indexed from, uint256 value);
    event Unfreeze(address indexed from, uint256 value);
    event Burn(address indexed from, uint256 value);

    struct TokensWithLock {
        address sender;
        uint256 lockValue;
        uint64 lockTime;
        bool allowLockTimeUpdate;      
        uint64 initAskTime;
        uint256 askToLock;
    }

    mapping (address => TokensWithLock) public lock;
    
    event TransferWithLock(address indexed sender, address indexed owner, uint256 value, uint256 lockTime ,uint256 initLockDays);
    event ReturnLockedTokens(address indexed owner, address indexed sender, uint256 value);
    event UpdateLockTime(address indexed sender, address indexed owner, uint256 lockDays);
    event AllowUpdateLock(address indexed owner, bool allow);
    event RequestToLock(address indexed sender, address indexed owner, uint256 value, uint256 intLockDays);
    event AcceptLock(address indexed owner,address indexed sender, uint256 value, uint256 lockTime);
    event ReduceLockValue(address indexed sender, address indexed owner, uint256 value);
 
    /*MultiSign*/
    struct Approver {address addr; uint64 score; bool activated; }
    struct ApproveTrans {address to; uint256 value; }
    struct MultiSign {
        uint256 multiSignBalance;
        Approver[] approvers;
        uint64 passScore;                // score of multi party signed to effective
        uint64 expiration;               // MultiSign account expiration time in UNIX seconds
        bool holdFlag;                // hold balance flag, for transfer check gas saving
        address backAccount;             // all tokens controled by MultiSign will return to backAccount when expired
    }
    mapping (address => MultiSign) public multiSign;
    struct Vote {
        ApproveTrans approveTrans;       // transfer request
        uint256 recall;                  // the requestion of recall from keeper's balance to multisign balance
        address backAccount;             // the account where the expired token return to
        bool holdBalance;                // true: freeze account keeper's balance
        uint64 expireDays;               // update expiration days 
    }
    mapping (address => mapping(address => Vote)) public vote;
    
    event MultiSignApprover(address indexed keeper, address indexed approver, uint individualScore);
    event CreateMultiSign(address indexed keeper, uint passScore, address backAccount, uint expiration);
    event FreezeKeeper(address indexed approver, address indexed keeper, bool freeze);
    event HoldBalance(address indexed keeper, bool _freeze);
    event ApproveTransferTo(address indexed approver,address indexed keeper, address indexed to, uint value);
    event MultiSignTransfer(address indexed keeper, address indexed to, uint value);
    event RecallToMultiSign(address indexed approver, address indexed keeper, uint value);
    event MultiSignRecall(address indexed keeper, uint value);
    event UpdateExpiration(address indexed approver, address indexed keeper,uint expireDays);
    event MultiSignExpirationUpdated(address indexed keeper,uint expireDays);
    event UpdateBackAccount(address indexed approver, address indexed keeper, address newBackAccount);
    event MultiSignBackAccountUpdated(address indexed keeper, address newBackAccount);
    event CancelVote(address indexed approver, address indexed keeper);
    event TransferToMultiSign(address indexed approver,address indexed keeper, uint valu);
    event ClearMutiSign(address indexed sender,address indexed keeper, address indexed backAccount,uint value);

    constructor() {
        decimals = 9;
        name = "Paralism-EPARA";  
        symbol = "EPARA";
        _supplyCap = 21000*10000*(10**9);
        totalLocked = 0;

        balanceOf[msg.sender] = _supplyCap;         //210M
    }

    /// @notice Return total available liquidity of token
    /// @return total available liquidity of token
    function totalSupply() public view returns (uint256){
        return _supplyCap - totalLocked;
    }
    
    /// @notice transfer tokens with a timer lock to an address, the timer lock would lock up the transfered funds from being spend for given days
    /// @dev this increase totalLocked and reduce the totalSupply
    /// @param _to the receiver address of token
    /// @param _value the amount of token
    /// @param _initLockdays the how long time in days the funds would be locked up, only can be set at when timer lock initializes
    /// @return success true if transaction accomplished
    function transferWithLockInit(address _to, uint256 _value, uint256 _initLockdays) public returns (bool success) {
        require (address(0) != _to,"transfer to address 0");
        require (false == isMutltiSignHoldBalance(msg.sender), "multisign balance hold");
        require (balanceOf[msg.sender] >= theLockValue(msg.sender).safeAdd(_value),"insufficient balance or locked");

        if (0 < theLockValue(_to)) {
            require (msg.sender == lock[_to].sender,"others lock detected") ;
            require (_initLockdays == 0,"Lock detected, init fail") ;
        }

        if (0 == theLockValue(_to)) {
            lock[_to].lockTime = (block.timestamp.safeAdd(_initLockdays * 1 days)).toUint64();           //init expriation day.
            lock[_to].sender= msg.sender;                                                   //init sender
        }

        lock[_to].lockValue = lock[_to].lockValue.safeAdd(_value);                          //add lock value
        balanceOf[msg.sender] = balanceOf[msg.sender].safeSub(_value);                      //subtract from the sender
        balanceOf[_to] = balanceOf[_to].safeAdd(_value);                                    //add to the recipient
        
        if (true == lock[_to].allowLockTimeUpdate) 
            lock[_to].allowLockTimeUpdate = false;                                         //disable sender change lock time until owner allowed again
        
        emit TransferWithLock(msg.sender, _to, _value, lock[_to].lockTime , _initLockdays);

        totalLocked = totalLocked.safeAdd(_value);    //increase totalLocked
        return true;
    }
    
    /// @notice transfer more tokens to an existed lock
    /// @dev this increase totalLocked and reduce the totalSupply
    /// @param _to the receiver address of token
    /// @param _value the amount of token
    /// @return success true if transaction accomplished
    function transferMoreToLock(address _to, uint256 _value) public returns (bool success) {
        if(0 == theLockValue(_to)) revert("NO lock detected");
        return transferWithLockInit(_to,_value,0);
    }

    /// @notice get timer locked value in effective on owner address.
    /// @dev contract inernal only,once timer expired, the value will update to 0.
    /// @param _addr the address of lock funds owner
    /// @return amount the effective value of timer lock 
    function theLockValue(address _addr) internal returns (uint256 amount){
        if (lock[_addr].lockTime <= block.timestamp) {
            totalLocked = totalLocked.safeSub(lock[_addr].lockValue);           //reduce totalLocked
            lock[_addr].lockValue = 0;                      //reset expired value
        }
        return lock[_addr].lockValue;
    }

    /// @notice Query timer locked balance of funds on owner address
    /// @param _addr the address of lock funds owner
    /// @return amount the effective value of timer lock 
    function getLockValue(address _addr) public view returns (uint256 amount){
        lock[_addr].lockTime > block.timestamp ? amount = lock[_addr].lockValue : amount = 0;
    }

    /// @notice get lock remaining time in seconds of funds on owner address
    /// @param _addr the address of lock funds owner
    /// @return sec the time in seconds of timer
    function getLockRemainSeconds(address _addr) public view returns (uint256 sec){
        lock[_addr].lockTime > block.timestamp ? sec = lock[_addr].lockTime - block.timestamp : sec = 0;
    }

    /// @notice the lock expiration could be modify by lock sender
    /// @dev none.
    /// @param _addr the address of lock funds owner
    /// @param _days the how long time in days the funds would be locked up
    /// @return success true if transaction accomplished
    function updateLockTime(address _addr, uint256 _days)public returns (bool success) {
        require(theLockValue(_addr) > 0,"NO lock detected");
        require(msg.sender == lock[_addr].sender, "others lock detected");
        require(true == lock[_addr].allowLockTimeUpdate,"allowUpdateLockTime is false");

        lock[_addr].lockTime = (block.timestamp.safeAdd(_days * 1 days)).toUint64();
        lock[_addr].allowLockTimeUpdate = false;
        emit UpdateLockTime(msg.sender, _addr, _days);
        return true;
    }

    /// @notice address Owner switch on to permit lock sender updating the lock expiration or switch off to prohibit the modification
    /// @param _allow the permssion flag
    /// @return success true if transaction accomplished
    function allowUpdateLockTime(bool _allow) public returns (bool success){
        lock[msg.sender].allowLockTimeUpdate = _allow;
        emit AllowUpdateLock(msg.sender, _allow);
        return true;
    }

    /// @notice address owner return given amount of locked tokens to the lock sender when the lock in effective
    /// @dev this would reduce totalLocked and increase totalSupply.
    /// @param _value the amount return to the lock funds sender
    /// @return success true if transaction accomplished
    function returnLockedTokens(uint256 _value) public returns (bool success){
        address _returnTo = lock[msg.sender].sender;
        address _returnFrom = msg.sender;

        uint256 lockValue = theLockValue(_returnFrom);
        require(0 < lockValue, "NO lock detected");
        require(_value <= lockValue,"insufficient lock value");
        require(balanceOf[_returnFrom] >= _value,"insufficient balance");

        balanceOf[_returnFrom] = balanceOf[_returnFrom].safeSub(_value);
        balanceOf[_returnTo] = balanceOf[_returnTo].safeAdd(_value);

        lock[_returnFrom].lockValue = lock[_returnFrom].lockValue.safeSub(_value);   //reduce locked amount

        emit ReturnLockedTokens(_returnFrom, _returnTo, _value);

        totalLocked = totalLocked.safeSub(_value);  //reduce totalLocked
        return true;
    }

    /// @notice send lock request to an address, the lock would take effective once the adderss owner accept the request
    /// @dev this would have not impact to totalLocked and totalSupply.
    /// @param _to the address of funds owner
    /// @param _value the amount of token requet to locked
    /// @param _initLockdays the how long time in days the funds would be locked up
    /// @return success true if transaction accomplished
    function askToLock(address _to, uint256 _value, uint256 _initLockdays) public returns(bool success) {
        require(balanceOf[_to] >= theLockValue(_to).safeAdd(_value), "insufficient balance to lock");
        if (0 < theLockValue(_to)) {
            require (msg.sender == lock[_to].sender,"others lock detected") ;
            require (_initLockdays == 0,"lock time exist") ;
        }
        lock[_to].askToLock = _value;
        lock[_to].initAskTime = (block.timestamp + _initLockdays * 1 days).toUint64();
        lock[_to].sender = msg.sender;
        
        emit RequestToLock(msg.sender, _to, _value, _initLockdays);
        return true;
    }

    /// @notice accept a lock request by address owner, the lock take effective
    /// @dev this would increase totalLocked and decrease totalSupply.
    /// @param _sender the address of timer lock request sender
    /// @param _value the amount return to the lock funds sender
    /// @return success true if transaction accomplished
    function acceptLockReq(address _sender, uint256 _value) public returns(bool success) {
        require(lock[msg.sender].askToLock == _value,"value incorrect");
        require(balanceOf[msg.sender] >= theLockValue(msg.sender).safeAdd(_value), "insufficient balance or locked");//
        require(_sender == lock[msg.sender].sender,"sender incorrect");

        if(0 == theLockValue(msg.sender)) {
            lock[msg.sender].lockTime = lock[msg.sender].initAskTime;
        }
        lock[msg.sender].lockValue = theLockValue(msg.sender).safeAdd(_value);
        totalLocked = totalLocked.safeAdd(_value);    //increase totalLocked
        
        if (true ==lock[msg.sender].allowLockTimeUpdate) 
            lock[msg.sender].allowLockTimeUpdate = false;           //disable sender change lock timer until owner permits
            
        emit AcceptLock(msg.sender, _sender, _value, lock[msg.sender].lockTime);
        resetLockReq();
        return true;
    }

    /// @notice reset a lock request received
    /// @dev this would have not impact to totalLocked and totalSupply.
    /// @return success true if transaction accomplished
    function resetLockReq() public returns(bool success) {
        lock[msg.sender].askToLock = 0;
        lock[msg.sender].initAskTime = 0;
        return true;
    }

    /// @notice lock sender reduce given amount of locked funds
    /// @dev this would reduce totalLocked and increase totalSupply.
    /// @param _to the address of funds owner
    /// @param _value the amount of locked token to be reudced
    /// @return success true if transaction accomplished
    function reduceLockValue(address _to, uint256 _value) public returns(bool success) {
        require(_value <= theLockValue(_to), "insufficient lock balance");
        require (msg.sender == lock[_to].sender,"others lock detected") ;

        lock[_to].lockValue = lock[_to].lockValue.safeSub(_value);
        totalLocked = totalLocked.safeSub(_value);  //reduce totalLocked
        emit ReduceLockValue(msg.sender, _to, _value);
        return true;
    }
    
    /// @notice create MultiSign Account on own address 
    /// @dev this function will clean previous MultiSign account if it is expired or not activated
    /// @param _approvers the approver address list
    /// @param _individualScores the array of vote weight of each approver
    /// @param _initPassScore passing score of approver's vote
    /// @param _backAccount the account to which MultiSignBalance will transfer when Multisign are cleared   
    /// @param _initExpireDays the days from now on MultiSign account will expire 
    /// @return success true if transaction accomplished
    function createMultiSign(address[] memory _approvers, 
                             uint[] memory _individualScores, 
                             uint _initPassScore, 
                             address _backAccount, 
                             uint _initExpireDays) 
                             public returns(bool) 
    {
        require(_initPassScore > 0,"invalid pass score");
        require(false == isMultiSignActivated(msg.sender), "multiSign existed");
        require(_individualScores.length == _approvers.length,"arrays length mismatch");

        if (0 < multiSign[address(this)].approvers.length) clearMultiSign(address(this));  //have multiSign not activated and not expired, clean
        
        for (uint i = 0; i < _approvers.length; i++) {
            Approver memory a = Approver(_approvers[i],_individualScores[i].toUint64(),false);
            multiSign[msg.sender].approvers.push(a);
            emit MultiSignApprover(msg.sender, _approvers[i], _individualScores[i]);
        }
        multiSign[msg.sender].passScore = _initPassScore.toUint64();
        multiSign[msg.sender].expiration = (block.timestamp+_initExpireDays*1 days).toUint64();
        
        if (address(0) != _backAccount){
            multiSign[msg.sender].backAccount = _backAccount;
        } else {
            multiSign[msg.sender].backAccount = msg.sender;
        }
        
        emit CreateMultiSign(msg.sender,_initPassScore,_backAccount, _initExpireDays);
        return true;
    }
    
    /// @notice check if MultiSign Account activated or not 
    /// @dev this function will clean previous MultiSign account if it is expired
    /// @param _multisign the keeper address of MultiSign Account
    /// @return activated true if activated
    function isMultiSignActivated(address _multisign) public returns (bool activated){
        uint score;
        uint length = multiSign[_multisign].approvers.length;
        if (multiSign[_multisign].expiration < block.timestamp && multiSign[_multisign].expiration != 0) { // if expired clean 
            clearMultiSign(_multisign); 
        }
        else{       //check if actived 
            for (uint i = 0; i < length; i++) {
                if(true == multiSign[_multisign].approvers[i].activated){
                    score += multiSign[_multisign].approvers[i].score;
                    if (score >= multiSign[_multisign].passScore) return true;
                }
            }
        }
        return false;
    }
    
    /// @notice check if msg.sender is an approver of MultiSign account 
    /// @param _multisign the keeper address of MultiSign Account
    /// @return presence true if msg.sender is approver
    function isApprover(address _multisign) public view returns (bool presence) {
        uint length = multiSign[_multisign].approvers.length;
        require(length > 0, "multiSign not found");
        for (uint i = 0; i < length; i++) {
            if (msg.sender == multiSign[_multisign].approvers[i].addr){
                return true;
            }
        }
        return false;
    }
    
    /// @notice activate an approver of MultiSign Account 
    /// @param _multisign the keeper address of MultiSign Account
    /// @return activated true if approver activated
    function activateApprover(address _multisign) public returns(bool activated) 
    {
        require(isApprover(_multisign),"approver only");
        uint length = multiSign[_multisign].approvers.length;
        for (uint i = 0; i < length; i++) {
            if (msg.sender == multiSign[_multisign].approvers[i].addr){
                if(false == multiSign[_multisign].approvers[i].activated){
                    multiSign[_multisign].approvers[i].activated = true;
                }
                activated = true;
            }
        }
        return activated;
    }
    
    /// @notice vote to agree on freeze or unfreeze keeper address balance   
    /// @dev the vote history of the option to which have just been voted and take effective will be cleaned after execution
    /// @param _multisign the keeper address of MultiSign Account
    /// @param _freeze true for freeze, false for unfreeze
    /// @return success true if transaction accomplished
    function freezeKeeper(address _multisign, bool _freeze) public returns(bool success) 
    {
        require(activateApprover(_multisign));
        vote[_multisign][msg.sender].holdBalance = _freeze;
        emit FreezeKeeper(msg.sender, _multisign, _freeze);

        uint length = multiSign[_multisign].approvers.length;
        uint score = 0;
        for (uint i = 0; i < length; i++) {                     //count score
            if (_freeze == vote[_multisign][multiSign[_multisign].approvers[i].addr].holdBalance) 
                score += multiSign[_multisign].approvers[i].score;            //count score by individual score weight
        }
        
        if (true == isMultiSignActivated(_multisign)
            && score >= multiSign[_multisign].passScore 
            && multiSign[_multisign].holdFlag != _freeze){           //check if reach passScore,and is necessary to update
            multiSign[_multisign].holdFlag = _freeze;                //update holdFlag
            emit HoldBalance(_multisign, _freeze);
        }
        
        return true;
    }
    
    /// @notice check if MultiSign account set to freeze keeper address balance or not  
    /// @param _multisign the keeper address of MultiSign Account
    /// @return flag the multiSign account holdFlag bool value
    function isMutltiSignHoldBalance(address _multisign) public view returns(bool flag){
        return multiSign[_multisign].holdFlag;
    }
    
    /// @notice vote to agree on tranfer from MultiSignBalance to an receiver address   
    /// @dev the vote history of the option to which have just been voted and take effective will be cleaned after execution
    /// @param _multisign the keeper address of MultiSign Account
    /// @param _to receiver address
    /// @param _value value to transfer
    /// @return success true if transaction accomplished
    function approveTransferTo(address _multisign, address _to, uint _value) public returns(bool success) 
    {
        require(address(0) != _to,"transfer to address 0");
        require(activateApprover(_multisign));

        vote[_multisign][msg.sender].approveTrans.to = _to;
        vote[_multisign][msg.sender].approveTrans.value = _value;
        emit ApproveTransferTo(msg.sender,_multisign, _to, _value);
        
        uint length = multiSign[_multisign].approvers.length;
        uint score = 0;
        for (uint i = 0; i < length; i++) {                                    //count score
            if (_to == vote[_multisign][multiSign[_multisign].approvers[i].addr].approveTrans.to
                && _value == vote[_multisign][multiSign[_multisign].approvers[i].addr].approveTrans.value) 
                score += multiSign[_multisign].approvers[i].score;             //count score by individual score weight
        }
        
        if (true == isMultiSignActivated(_multisign)
            && score >= multiSign[_multisign].passScore){//check if reach passScore, execute recall
            require(_value <= multiSign[_multisign].multiSignBalance,"insufficent MultiSign balance");
            //reset to prevent errorly repeat transfer trigger by more vote 
            for (uint i = 0; i < length; i++) {                                                                
                if (_to == vote[_multisign][multiSign[_multisign].approvers[i].addr].approveTrans.to
                    && _value == vote[_multisign][multiSign[_multisign].approvers[i].addr].approveTrans.value) 
                {   
                    vote[_multisign][multiSign[_multisign].approvers[i].addr].approveTrans.to = address(0);        //reset
                    vote[_multisign][multiSign[_multisign].approvers[i].addr].approveTrans.value = 0;              //reset
                }
            }
            
            multiSign[_multisign].multiSignBalance = multiSign[_multisign].multiSignBalance.safeSub(_value);     //reduce multiSignBalance
            balanceOf[_to] = balanceOf[_to].safeAdd(_value);                   //increase receiver balance
            emit MultiSignTransfer(_multisign, _to, _value);
            totalLocked = totalLocked.safeSub(_value);  //reduce totalLocked
            }
        
        return true;
    }
    
    /// @notice vote to agree on tranfer from keeper address balance to MultiSignBalances   
    /// @dev the vote history of the option to which have just been voted and take effective will be cleaned after execution
    /// @param _multisign the keeper address of MultiSign Account
    /// @param _value value to transfer
    /// @return success true if transaction accomplished
    function recallToMultiSign(address _multisign, uint _value) public returns(bool success) 
    {
        require(activateApprover(_multisign));
        require(0 <_value);
        
        vote[_multisign][msg.sender].recall = _value;         //vote recall
        emit RecallToMultiSign(msg.sender, _multisign, _value);
        
        uint length = multiSign[_multisign].approvers.length;
        uint score = 0;
        for (uint i = 0; i < length; i++) {                     //count score
            if (_value == vote[_multisign][multiSign[_multisign].approvers[i].addr].recall) 
                score += multiSign[_multisign].approvers[i].score;             //count score by individual score weight
        }

        if (true == isMultiSignActivated(_multisign)
            && score >= multiSign[_multisign].passScore
            && balanceOf[_multisign] >= theLockValue(_multisign).safeAdd(_value)){//check if reach passScore and have enough balance, execute recall
            //reset to prevent errorly repeat transfer trigger by more vote
            for (uint i = 0; i < length; i++) {                     
                if (_value == vote[_multisign][multiSign[_multisign].approvers[i].addr].recall) 
                    vote[_multisign][multiSign[_multisign].approvers[i].addr].recall = 0;             //reset
            }
            balanceOf[_multisign] = balanceOf[_multisign].safeSub(_value);                                   //reduce keeper's balance
            multiSign[_multisign].multiSignBalance = multiSign[_multisign].multiSignBalance.safeAdd(_value); //increase multiSignBalance
            emit MultiSignRecall(_multisign, _value);
            totalLocked = totalLocked.safeAdd(_value);                                                     //increase totalLocked
        }
        
        return true;
    }
    
    /// @notice vote to agree on update expiration time of MultiSign Account
    /// @dev the vote history of the option to which have just been voted and take effective will be cleaned after execution
    /// @param _multisign the keeper address of MultiSign Account
    /// @param _expireDays new expiration dayss
    /// @return success true if transaction accomplished
    function updateExpiration(address _multisign, uint _expireDays) public returns(bool success) 
    {
        require (activateApprover(_multisign));

        _expireDays = _expireDays.safeAdd(1);     //add vote guard
        
        vote[_multisign][msg.sender].expireDays = _expireDays.toUint64();     //vote expireDays
        emit UpdateExpiration(msg.sender, _multisign, _expireDays);
        
        uint length = multiSign[_multisign].approvers.length;
        uint score = 0;
        for (uint i = 0; i < length; i++) {                     //count score
            if (_expireDays == vote[_multisign][multiSign[_multisign].approvers[i].addr].expireDays) 
                score += multiSign[_multisign].approvers[i].score;            //count score by individual score weight
        }
        
        if (true == isMultiSignActivated(_multisign)
            && score >= multiSign[_multisign].passScore){                         //check if reach passScore,
            for (uint i = 0; i < length; i++) {
                vote[_multisign][multiSign[_multisign].approvers[i].addr].expireDays = 0;   //clear voted data
            }  
            _expireDays -= 1;   //clear vote guard
            multiSign[_multisign].expiration = (block.timestamp + (_expireDays) * 1 days).toUint64();             //update multisign expire
            emit MultiSignExpirationUpdated(_multisign, _expireDays);
        }
        
        return true;
    }
    
    /// @notice vote to agree on update back account of MultiSign Account
    /// @dev the vote history of the option to which have just been voted and take effective will be cleaned after execution
    /// @param _multisign the keeper address of MultiSign Account
    /// @param _newBackAccount new back account
    /// @return success true if transaction accomplished
    function updateBackAccount(address _multisign, address _newBackAccount) public returns(bool success)
    {
        require (address(0) != _newBackAccount,"invalid address");
        require (activateApprover(_multisign));
        vote[_multisign][msg.sender].backAccount = _newBackAccount;     //vote backAccount
        emit UpdateBackAccount(msg.sender, _multisign, _newBackAccount);
        
        uint length = multiSign[_multisign].approvers.length;
        uint score = 0;
        for (uint i = 0; i < length; i++) {                     //count score
            if (_newBackAccount == vote[_multisign][multiSign[_multisign].approvers[i].addr].backAccount) 
                score += multiSign[_multisign].approvers[i].score;            //count score by individual score weight
        }
        
        if (true == isMultiSignActivated(_multisign)
            && score >= multiSign[_multisign].passScore
            && multiSign[_multisign].backAccount != _newBackAccount){     //check if reach passScore,
            multiSign[_multisign].backAccount = _newBackAccount;             //update multisign backAccount
            emit MultiSignBackAccountUpdated(_multisign, _newBackAccount);
        }
        
        return true;
    }
    
    /// @notice clean all vote by msg.sender who is an approver of MultiSign Account
    /// @param _multisign the keeper address of MultiSign Account
    /// @return success true if transaction accomplished
    function cancelVote(address _multisign) public returns(bool success) 
    {
        require (activateApprover(_multisign));
        delete vote[_multisign][msg.sender];
        emit CancelVote(msg.sender,_multisign);
        return true;
    }
    
    /// @notice transfer tokens to MultiSign Account Balance if it is activated
    /// @param _multisign the keeper address of MultiSign Account
    /// @param _value token value to transfer
    /// @return success true if transaction accomplished
    function transferToMultiSign(address _multisign, uint _value) public returns(bool success) 
    {
        require (address(0) != _multisign,"transfer to address 0");
        require (balanceOf[msg.sender] >= theLockValue(msg.sender).safeAdd(_value),"insufficient balance or locked");
        require (isMultiSignActivated(_multisign),"multisign not activated");
        require (false == isMutltiSignHoldBalance(msg.sender), "multisign balance hold");

        balanceOf[msg.sender] = balanceOf[msg.sender].safeSub(_value);                                    //subtract from the sender
        multiSign[_multisign].multiSignBalance = multiSign[_multisign].multiSignBalance.safeAdd(_value);    //add to the multisignbalance
        emit TransferToMultiSign(msg.sender, _multisign, _value);
        totalLocked = totalLocked.safeAdd(_value);                                                     //increase totalLocked
        return true;
    }
    
    /// @notice get MultiSign account balance
    /// @param _multisign the keeper address of MultiSign Account
    /// @return balanceOfMultiSign value of balance
    function getBalanceOfMultiSign(address _multisign) public view returns(uint balanceOfMultiSign) 
    {
        return multiSign[_multisign].multiSignBalance;
    }
    
    /// @notice get MultiSign account approvers
    /// @param _multisign the keeper address of MultiSign Account
    /// @return approvers list
    function getApproversOfMultiSign(address _multisign) public view returns(Approver[] memory approvers) 
    {
        return multiSign[_multisign].approvers;
    }
    
    /// @notice clear MultiSign Account if it is not activated or expired
    /// @param _multisign the keeper address of MultiSign Account
    /// @return success true if transaction accomplished
    function clearMultiSign(address _multisign) public returns (bool success) {
        require(isApprover(_multisign) || msg.sender == _multisign);
        
        uint score;
        uint length = multiSign[_multisign].approvers.length;
        for (uint i = 0; i < length; i++) {
            if(true == multiSign[_multisign].approvers[i].activated){
                score += multiSign[_multisign].approvers[i].score;
            }
        }
        
        require(score < multiSign[_multisign].passScore || multiSign[_multisign].expiration < block.timestamp);
            
        for (uint i = 0; i < length; i++) {
            delete vote[_multisign][multiSign[_multisign].approvers[i].addr];   //clear votes
        }
           
        address bAccount = multiSign[_multisign].backAccount;
        uint value = multiSign[_multisign].multiSignBalance;
        if (address(0) != bAccount && 0 < value){                                 //transfer balance to backAccount
            balanceOf[bAccount] = balanceOf[bAccount].safeAdd(value); 
            totalLocked = totalLocked.safeSub(value);   //reduce totalLocked
        }

        delete multiSign[_multisign];                                           //remove multiSign
        emit ClearMutiSign(msg.sender,_multisign,bAccount,value);
        return true;
    }
    
    /// @notice Transfer tokens to multiple addresses
    /// @param _addresses the address list of token receivers
    /// @param _amounts the amount list one to one correspondence to the address list
    /// @return success true if transaction accomplished
    function transferForMultiAddresses(address[] memory _addresses, uint256[] memory _amounts) public returns (bool) {
        require(_addresses.length == _amounts.length,"arrays length mismatch");
        require (false == isMutltiSignHoldBalance(msg.sender), "multisign balance hold");

        for (uint i = 0; i < _addresses.length; i++) {
            require(_addresses[i] != address(0),"transfer to address 0");
            if (balanceOf[msg.sender] < theLockValue(msg.sender).safeAdd(_amounts[i])) revert("insufficient balance or locked");

            balanceOf[msg.sender] = balanceOf[msg.sender].safeSub(_amounts[i]);
            balanceOf[_addresses[i]] = balanceOf[_addresses[i]].safeAdd(_amounts[i]);
            emit Transfer(msg.sender, _addresses[i], _amounts[i]);
        }
        return true;
    }
    
    /// @notice token plain transfer to given address
    /// @param _to the receiver address of token
    /// @param _value the amount of token
    /// @return success true if transaction accomplished
    function transfer(address _to, uint256 _value) public returns (bool success){
        if (_to == address(0)) revert("transfert to address 0");
        require (false == isMutltiSignHoldBalance(msg.sender), "multisign balance hold");
        require (balanceOf[msg.sender] >= theLockValue(msg.sender).safeAdd(_value),"insufficient balance or locked");

        balanceOf[msg.sender] = balanceOf[msg.sender].safeSub(_value);
        balanceOf[_to] = balanceOf[_to].safeAdd(_value);
        emit Transfer(msg.sender, _to, _value);
        return true;
    }
    
    /// @notice approve another address to spend giben tokens on your behalf
    /// @param _spender the address would be given permission
    /// @param _value the amount of token
    /// @return success true if transaction accomplished
    function approve(address _spender, uint256 _value) public returns (bool success) {
        allowance[msg.sender][_spender] = _value;
        emit Approval(msg.sender, _spender, _value);
        return true;
    }
    
    /// @notice the permitted address spend the approved amount of tokens
    /// @param _from the address approved the spend
    /// @param _to the receiver address of token 
    /// @param _value the amount of token
    /// @return success true if transaction accomplished
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
        require (_to != address(0), "transfert to address 0");
        require (_value <= allowance[_from][msg.sender],"transfer more than allowance");
        require (false == isMutltiSignHoldBalance(_from), "multisign balance hold");
        require (balanceOf[_from] >= theLockValue(_from).safeAdd(_value),"insufficient balance or locked");

        allowance[_from][msg.sender] = allowance[_from][msg.sender].safeSub(_value);
        balanceOf[_from] = balanceOf[_from].safeSub(_value);
        balanceOf[_to] = balanceOf[_to].safeAdd(_value);

        emit Transfer(_from, _to, _value);
        return true;
    }
    
    /// @notice burn a given amount of token, unrecoverable
    /// @dev this would reduce _supplyCap
    /// @param _value the amount of token
    /// @return success true if transaction accomplished
    function burn(uint256 _value) public returns (bool success) {
        require (balanceOf[msg.sender] >= theLockValue(msg.sender).safeAdd(_value), "insufficient balance or locked");
        require (false == isMutltiSignHoldBalance(msg.sender), "multisign balance hold");

        balanceOf[msg.sender] = balanceOf[msg.sender].safeSub(_value);
        _supplyCap = _supplyCap.safeSub(_value);
        emit Burn(msg.sender, _value);
        return true;
    }
    
    /// @notice move given amount of token from balanceOf into freezeOf 
    /// @dev no size impact to _supplyCap
    /// @param _value the amount of token
    /// @return success true if transaction accomplished
    function freeze(uint256 _value) public returns (bool success) {
        if (balanceOf[msg.sender] < _value) revert("insufficient balance");

        balanceOf[msg.sender] = balanceOf[msg.sender].safeSub(_value);
        freezeOf[msg.sender] = freezeOf[msg.sender].safeAdd(_value);
        emit Freeze(msg.sender, _value);
        return true;
    }

    /// @notice move given amount of token from freezeOf into balanceOf
    /// @dev no size impact to _supplyCap
    /// @param _value the amount of token
    /// @return success true if transaction accomplished
    function unfreeze(uint256 _value) public returns (bool success) {
        if (freezeOf[msg.sender] < _value) revert("insufficient balance.");

        freezeOf[msg.sender] = freezeOf[msg.sender].safeSub(_value);
        balanceOf[msg.sender] = balanceOf[msg.sender].safeAdd(_value);
        emit Unfreeze(msg.sender, _value);
        return true;
    }

 }

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lockTime","type":"uint256"}],"name":"AcceptLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"bool","name":"allow","type":"bool"}],"name":"AllowUpdateLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"approver","type":"address"},{"indexed":true,"internalType":"address","name":"keeper","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"ApproveTransferTo","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"approver","type":"address"},{"indexed":true,"internalType":"address","name":"keeper","type":"address"}],"name":"CancelVote","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"keeper","type":"address"},{"indexed":true,"internalType":"address","name":"backAccount","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"ClearMutiSign","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"keeper","type":"address"},{"indexed":false,"internalType":"uint256","name":"passScore","type":"uint256"},{"indexed":false,"internalType":"address","name":"backAccount","type":"address"},{"indexed":false,"internalType":"uint256","name":"expiration","type":"uint256"}],"name":"CreateMultiSign","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Freeze","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"approver","type":"address"},{"indexed":true,"internalType":"address","name":"keeper","type":"address"},{"indexed":false,"internalType":"bool","name":"freeze","type":"bool"}],"name":"FreezeKeeper","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"keeper","type":"address"},{"indexed":false,"internalType":"bool","name":"_freeze","type":"bool"}],"name":"HoldBalance","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"keeper","type":"address"},{"indexed":true,"internalType":"address","name":"approver","type":"address"},{"indexed":false,"internalType":"uint256","name":"individualScore","type":"uint256"}],"name":"MultiSignApprover","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"keeper","type":"address"},{"indexed":false,"internalType":"address","name":"newBackAccount","type":"address"}],"name":"MultiSignBackAccountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"keeper","type":"address"},{"indexed":false,"internalType":"uint256","name":"expireDays","type":"uint256"}],"name":"MultiSignExpirationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"keeper","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"MultiSignRecall","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"keeper","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"MultiSignTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"approver","type":"address"},{"indexed":true,"internalType":"address","name":"keeper","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"RecallToMultiSign","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"ReduceLockValue","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"intLockDays","type":"uint256"}],"name":"RequestToLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"ReturnLockedTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"approver","type":"address"},{"indexed":true,"internalType":"address","name":"keeper","type":"address"},{"indexed":false,"internalType":"uint256","name":"valu","type":"uint256"}],"name":"TransferToMultiSign","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lockTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"initLockDays","type":"uint256"}],"name":"TransferWithLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Unfreeze","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"approver","type":"address"},{"indexed":true,"internalType":"address","name":"keeper","type":"address"},{"indexed":false,"internalType":"address","name":"newBackAccount","type":"address"}],"name":"UpdateBackAccount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"approver","type":"address"},{"indexed":true,"internalType":"address","name":"keeper","type":"address"},{"indexed":false,"internalType":"uint256","name":"expireDays","type":"uint256"}],"name":"UpdateExpiration","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"lockDays","type":"uint256"}],"name":"UpdateLockTime","type":"event"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"acceptLockReq","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_multisign","type":"address"}],"name":"activateApprover","outputs":[{"internalType":"bool","name":"activated","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_allow","type":"bool"}],"name":"allowUpdateLockTime","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_multisign","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approveTransferTo","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_initLockdays","type":"uint256"}],"name":"askToLock","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_multisign","type":"address"}],"name":"cancelVote","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_multisign","type":"address"}],"name":"clearMultiSign","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_approvers","type":"address[]"},{"internalType":"uint256[]","name":"_individualScores","type":"uint256[]"},{"internalType":"uint256","name":"_initPassScore","type":"uint256"},{"internalType":"address","name":"_backAccount","type":"address"},{"internalType":"uint256","name":"_initExpireDays","type":"uint256"}],"name":"createMultiSign","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"freeze","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_multisign","type":"address"},{"internalType":"bool","name":"_freeze","type":"bool"}],"name":"freezeKeeper","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freezeOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_multisign","type":"address"}],"name":"getApproversOfMultiSign","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"score","type":"uint64"},{"internalType":"bool","name":"activated","type":"bool"}],"internalType":"struct EPARA.Approver[]","name":"approvers","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_multisign","type":"address"}],"name":"getBalanceOfMultiSign","outputs":[{"internalType":"uint256","name":"balanceOfMultiSign","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"getLockRemainSeconds","outputs":[{"internalType":"uint256","name":"sec","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"getLockValue","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_multisign","type":"address"}],"name":"isApprover","outputs":[{"internalType":"bool","name":"presence","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_multisign","type":"address"}],"name":"isMultiSignActivated","outputs":[{"internalType":"bool","name":"activated","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_multisign","type":"address"}],"name":"isMutltiSignHoldBalance","outputs":[{"internalType":"bool","name":"flag","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lock","outputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"lockValue","type":"uint256"},{"internalType":"uint64","name":"lockTime","type":"uint64"},{"internalType":"bool","name":"allowLockTimeUpdate","type":"bool"},{"internalType":"uint64","name":"initAskTime","type":"uint64"},{"internalType":"uint256","name":"askToLock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"multiSign","outputs":[{"internalType":"uint256","name":"multiSignBalance","type":"uint256"},{"internalType":"uint64","name":"passScore","type":"uint64"},{"internalType":"uint64","name":"expiration","type":"uint64"},{"internalType":"bool","name":"holdFlag","type":"bool"},{"internalType":"address","name":"backAccount","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_multisign","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"recallToMultiSign","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"reduceLockValue","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resetLockReq","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"returnLockedTokens","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLocked","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":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"transferForMultiAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferMoreToLock","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_multisign","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferToMultiSign","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_initLockdays","type":"uint256"}],"name":"transferWithLockInit","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"unfreeze","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_multisign","type":"address"},{"internalType":"address","name":"_newBackAccount","type":"address"}],"name":"updateBackAccount","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_multisign","type":"address"},{"internalType":"uint256","name":"_expireDays","type":"uint256"}],"name":"updateExpiration","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint256","name":"_days","type":"uint256"}],"name":"updateLockTime","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"vote","outputs":[{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct EPARA.ApproveTrans","name":"approveTrans","type":"tuple"},{"internalType":"uint256","name":"recall","type":"uint256"},{"internalType":"address","name":"backAccount","type":"address"},{"internalType":"bool","name":"holdBalance","type":"bool"},{"internalType":"uint64","name":"expireDays","type":"uint64"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b506002805460ff1916600917905560408051808201909152600e8082526d506172616c69736d2d455041524160901b60209092019182526200005691600091620000ae565b5060408051808201909152600580825264455041524160d81b60209092019182526200008591600191620000ae565b506702ea11e32ad50000600381905560006004819055338152600560205260409020556200015a565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620000e6576000855562000131565b82601f106200010157805160ff191683800117855562000131565b8280016001018555821562000131579182015b828111156200013157825182559160200191906001019062000114565b506200013f92915062000143565b5090565b5b808211156200013f576000815560010162000144565b614425806200016a6000396000f3fe608060405234801561001057600080fd5b50600436106102745760003560e01c80635839fed211610151578063c9272717116100c3578063dbbcbda511610087578063dbbcbda514610575578063dd62ed3e14610588578063e5bd14691461059b578063e6fe32e7146105ae578063f435f5a7146105c1578063fd41f9a6146105e657610274565b8063c927271714610505578063cd4217c114610518578063d7a78db81461052b578063d7f631fa1461053e578063dafa23721461056257610274565b806370a082311161011557806370a082311461049e578063735609a0146104b15780637dfe330f146104c457806395d89b41146104d7578063a9059cbb146104df578063ba88d331146104f257610274565b80635839fed21461043f57806361b7cb5a14610452578063632660cb146104655780636623fc46146104785780636d218e481461048b57610274565b806323b872dd116101ea578063337827c3116101ae578063337827c3146103d85780633f7217ee146103eb57806342966c68146103fe57806352d18f2614610411578063568914121461042457806356c4e1c41461042c57610274565b806323b872dd146103775780632fa66c0d1461038a57806330da08d41461039d578063313ce567146103b057806331a0a9ab146103c557610274565b806312e3b3601161023c57806312e3b360146102f2578063138542851461030557806318160ddd146103185780631a0f73661461032d5780631afa74e514610340578063204009d21461036457610274565b80630339f0471461027957806306fdde031461029757806307532585146102ac578063095ea7b3146102bf578063096ed1b0146102d2575b600080fd5b6102816105f9565b60405161028e9190613d20565b60405180910390f35b61029f61062a565b60405161028e9190613d2b565b6102816102ba366004613c48565b6106b8565b6102816102cd366004613af1565b610869565b6102e56102e0366004613a41565b6108d4565b60405161028e9190613cb3565b610281610300366004613af1565b610979565b610281610313366004613af1565b610ae9565b610320610c1e565b60405161028e91906142fd565b61032061033b366004613a41565b610c28565b61035361034e366004613a5b565b610c43565b60405161028e9594939291906142b2565b610281610372366004613b4c565b610cb1565b610281610385366004613a8d565b610efc565b610281610398366004613a8d565b6110cd565b6102816103ab366004613af1565b6115b9565b6103b8611782565b60405161028e91906143a1565b6103206103d3366004613a41565b61178b565b6102816103e6366004613c2e565b6117e6565b6102816103f9366004613a41565b61184f565b61028161040c366004613c48565b6119b1565b61028161041f366004613af1565b611a80565b610320611b72565b61028161043a366004613af1565b611b78565b61028161044d366004613a41565b611bb2565b610281610460366004613bac565b611ec8565b610281610473366004613b1a565b6121f7565b610281610486366004613c48565b61235f565b610281610499366004613a41565b612412565b6103206104ac366004613a41565b6124ac565b6102816104bf366004613a5b565b6124be565b6102816104d2366004613a41565b61273b565b61029f6127ce565b6102816104ed366004613af1565b612828565b610281610500366004613a41565b612946565b610281610513366004613af1565b612a7a565b610320610526366004613a41565b612d86565b610281610539366004613c48565b612d98565b61055161054c366004613a41565b612e4b565b60405161028e959493929190614369565b610320610570366004613a41565b612e96565b610281610583366004613ac8565b612ef8565b610320610596366004613a5b565b613144565b6102816105a9366004613b1a565b613161565b6102816105bc366004613a41565b613426565b6105d46105cf366004613a41565b61344e565b60405161028e96959493929190613c74565b6102816105f4366004613af1565b6134a2565b3360009081526008602052604081206003810191909155600201805467ffffffffffffffff60481b19169055600190565b6000805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156106b05780601f10610685576101008083540402835291602001916106b0565b820191906000526020600020905b81548152906001019060200180831161069357829003601f168201915b505050505081565b3360008181526008602052604081205490916001600160a01b0390911690826106e08261380a565b90508060001061070b5760405162461bcd60e51b8152600401610702906140dc565b60405180910390fd5b8085111561072b5760405162461bcd60e51b81526004016107029061412f565b6001600160a01b0382166000908152600560205260409020548511156107635760405162461bcd60e51b815260040161070290614166565b6001600160a01b038216600090815260056020526040902054610786908661389e565b6001600160a01b0380841660009081526005602052604080822093909355908516815220546107b590866138c1565b6001600160a01b038085166000908152600560209081526040808320949094559185168152600890915220600101546107ee908661389e565b6001600160a01b038084166000818152600860205260409081902060010193909355915190851691907f1d090c58ebfa398dd3815a910162f3a2e5e4cfe699425e13bf773fe69f56b1ea906108449089906142fd565b60405180910390a3600454610859908661389e565b600455506001925050505b919050565b3360008181526006602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906108c29086906142fd565b60405180910390a35060015b92915050565b6001600160a01b0381166000908152600960209081526040808320600101805482518185028101850190935280835260609492939192909184015b8282101561096e57600084815260209081902060408051606081018252918501546001600160a01b0381168352600160a01b81046001600160401b031683850152600160e01b900460ff1615159082015282526001909201910161090f565b505050509050919050565b60006001600160a01b0383166109a15760405162461bcd60e51b815260040161070290614283565b6109b4826109ae3361380a565b906138c1565b3360009081526005602052604090205410156109e25760405162461bcd60e51b81526004016107029061424c565b6109eb8361184f565b610a075760405162461bcd60e51b815260040161070290614215565b610a1033613426565b15610a2d5760405162461bcd60e51b815260040161070290613e70565b33600090815260056020526040902054610a47908361389e565b336000908152600560209081526040808320939093556001600160a01b0386168252600990522054610a7990836138c1565b6001600160a01b0384166000818152600960205260409081902092909255905133907fac98be60c2a8422f9d9c3d538dc39506b39524fd7d9c33d2ae9a023a8203341190610ac89086906142fd565b60405180910390a3600454610add90836138c1565b60045550600192915050565b600080610af58461380a565b11610b125760405162461bcd60e51b8152600401610702906140dc565b6001600160a01b03838116600090815260086020526040902054163314610b4b5760405162461bcd60e51b8152600401610702906141e7565b6001600160a01b038316600090815260086020526040902060020154600160401b900460ff161515600114610b925760405162461bcd60e51b815260040161070290613ea0565b610ba9610ba4426201518085026138c1565b6138e4565b6001600160a01b03841660008181526008602052604090819020600201805467ffffffffffffffff19166001600160401b03949094169390931760ff60401b1916909255905133907fa15f5d852bb22466a7bf71497b333fc02eac977e473fb4ab166af591424cd3da906108c29086906142fd565b6004546003540390565b6001600160a01b031660009081526009602052604090205490565b600a602090815260009283526040808420825291835291819020815180830190925280546001600160a01b03908116835260018201549383019390935260028101546003909101549192909190811690600160a01b810460ff1690600160a81b90046001600160401b031685565b60008151835114610cd45760405162461bcd60e51b815260040161070290613f01565b610cdd33613426565b15610cfa5760405162461bcd60e51b815260040161070290613e70565b60005b8351811015610ef25760006001600160a01b0316848281518110610d1d57fe5b60200260200101516001600160a01b03161415610d4c5760405162461bcd60e51b815260040161070290614283565b610d6c838281518110610d5b57fe5b60200260200101516109ae3361380a565b336000908152600560205260409020541015610d9a5760405162461bcd60e51b81526004016107029061424c565b610dcc838281518110610da957fe5b60209081029190910181015133600090815260059092526040909120549061389e565b336000908152600560205260409020558251610e3d90849083908110610dee57fe5b602002602001015160056000878581518110610e0657fe5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020546138c190919063ffffffff16565b60056000868481518110610e4d57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550838181518110610e8557fe5b60200260200101516001600160a01b0316336001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef858481518110610ecd57fe5b6020026020010151604051610ee291906142fd565b60405180910390a3600101610cfd565b5060019392505050565b60006001600160a01b038316610f245760405162461bcd60e51b815260040161070290613f31565b6001600160a01b0384166000908152600660209081526040808320338452909152902054821115610f675760405162461bcd60e51b815260040161070290613fe5565b610f7084613426565b15610f8d5760405162461bcd60e51b815260040161070290613e70565b610f9a826109ae8661380a565b6001600160a01b0385166000908152600560205260409020541015610fd15760405162461bcd60e51b81526004016107029061424c565b6001600160a01b0384166000908152600660209081526040808320338452909152902054610fff908361389e565b6001600160a01b03851660008181526006602090815260408083203384528252808320949094559181526005909152205461103a908361389e565b6001600160a01b03808616600090815260056020526040808220939093559085168152205461106990836138c1565b6001600160a01b0380851660008181526005602052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906110bb9086906142fd565b60405180910390a35060019392505050565b60006001600160a01b0383166110f55760405162461bcd60e51b815260040161070290614283565b6110fe84612946565b61110757600080fd5b6001600160a01b038481166000818152600a602090815260408083203380855292529182902080546001600160a01b031916948816948517815560010186905590517f19cb7b37c7ec38fc7ad177531518d9c1355eb72d92074b8c3ffc1740bdfa6b36906111769087906142fd565b60405180910390a46001600160a01b03841660009081526009602052604081206001015490805b828110156112c5576001600160a01b0387166000908152600a60209081526040808320600990925282206001018054919291849081106111d957fe5b60009182526020808320909101546001600160a01b039081168452908301939093526040909101902054878216911614801561126f57506001600160a01b0387166000908152600a602090815260408083206009909252822060010180549192918490811061124457fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190206001015485145b156112bd576001600160a01b038716600090815260096020526040902060010180548290811061129b57fe5b600091825260209091200154600160a01b90046001600160401b031691909101905b60010161119d565b506112cf8661184f565b1515600114801561130457506001600160a01b0386166000908152600960205260409020600201546001600160401b03168110155b156115ad576001600160a01b0386166000908152600960205260409020548411156113415760405162461bcd60e51b8152600401610702906140a5565b60005b828110156114e8576001600160a01b0387166000908152600a602090815260408083206009909252822060010180549192918490811061138057fe5b60009182526020808320909101546001600160a01b039081168452908301939093526040909101902054878216911614801561141657506001600160a01b0387166000908152600a60209081526040808320600990925282206001018054919291849081106113eb57fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190206001015485145b156114e0576001600160a01b0387166000908152600a602090815260408083206009909252822060010180548391908590811061144f57fe5b6000918252602080832091909101546001600160a01b039081168452838201949094526040928301822080546001600160a01b03191695851695909517909455918a168252600a8352808220600990935281206001018054919291839190859081106114b757fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020600101555b600101611344565b506001600160a01b03861660009081526009602052604090205461150c908561389e565b6001600160a01b0380881660009081526009602090815260408083209490945591881681526005909152205461154290856138c1565b6001600160a01b0380871660008181526005602052604090819020939093559151908816907f2360e7c2c4c6c89a316ffd22919d2253861b6d40ee7c5ee663dd62c7ce6dc4b5906115949088906142fd565b60405180910390a36004546115a9908561389e565b6004555b50600195945050505050565b3360009081526008602052604081206003015482146115ea5760405162461bcd60e51b815260040161070290614045565b6115f7826109ae3361380a565b3360009081526005602052604090205410156116255760405162461bcd60e51b81526004016107029061424c565b336000908152600860205260409020546001600160a01b0384811691161461165f5760405162461bcd60e51b815260040161070290613ed7565b6116683361380a565b6116a1573360009081526008602052604090206002018054600160481b81046001600160401b031667ffffffffffffffff199091161790555b6116ae826109ae3361380a565b336000908152600860205260409020600101556004546116ce90836138c1565b60045533600090815260086020526040902060020154600160401b900460ff1615156001141561171657336000908152600860205260409020600201805460ff60401b191690555b33600081815260086020526040908190206002015490516001600160a01b03861692917fb36d118de22c7acb69bc047b64762b6bb4bfd16f0a7765011a71a2499250c959916117729187916001600160401b0390911690614333565b60405180910390a3610ef26105f9565b60025460ff1681565b6001600160a01b038116600090815260086020526040812060020154426001600160401b03909116116117c157506000806117e0565b506001600160a01b038116600090815260086020526040902060010154805b50919050565b33600081815260086020526040808220600201805460ff60401b1916600160401b86151502179055519091907feb641ae1a655a1fb471d5cfdb7cdc56938d44feeb0e3321696f1beb21a2059d79061183f908590613d20565b60405180910390a2506001919050565b6001600160a01b0381166000908152600960205260408120600181015460029091015482919042600160401b9091046001600160401b03161080156118be57506001600160a01b038416600090815260096020526040902060020154600160401b90046001600160401b031615155b156118d2576118cc84611bb2565b506119a7565b60005b818110156119a5576001600160a01b038516600090815260096020526040902060010180548290811061190457fe5b600091825260209091200154600160e01b900460ff1615156001141561199d576001600160a01b038516600090815260096020526040902060010180548290811061194b57fe5b60009182526020808320909101546001600160a01b038816835260099091526040909120600201546001600160401b03600160a01b9092048216949094019316831061199d5760019350505050610864565b6001016118d5565b505b5060009392505050565b60006119c0826109ae3361380a565b3360009081526005602052604090205410156119ee5760405162461bcd60e51b81526004016107029061424c565b6119f733613426565b15611a145760405162461bcd60e51b815260040161070290613e70565b33600090815260056020526040902054611a2e908361389e565b33600090815260056020526040902055600354611a4b908361389e565b60035560405133907fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59061183f9085906142fd565b6000611a8b8361380a565b821115611aaa5760405162461bcd60e51b81526004016107029061406e565b6001600160a01b03838116600090815260086020526040902054163314611ae35760405162461bcd60e51b8152600401610702906141e7565b6001600160a01b038316600090815260086020526040902060010154611b09908361389e565b6001600160a01b038416600090815260086020526040902060010155600454611b32908361389e565b6004556040516001600160a01b0384169033907f80ca9b8aea499357cfe61625f484af4b0c4d9ef357ee58c095095fd9ea7244e5906108c29086906142fd565b60045481565b6000611b838361380a565b611b9f5760405162461bcd60e51b8152600401610702906140dc565b611bab83836000613161565b9392505050565b6000611bbd82612412565b80611bd05750336001600160a01b038316145b611bd957600080fd5b6001600160a01b038216600090815260096020526040812060010154815b81811015611c97576001600160a01b0385166000908152600960205260409020600101805482908110611c2657fe5b600091825260209091200154600160e01b900460ff16151560011415611c8f576001600160a01b0385166000908152600960205260409020600101805482908110611c6d57fe5b600091825260209091200154600160a01b90046001600160401b031692909201915b600101611bf7565b506001600160a01b0384166000908152600960205260409020600201546001600160401b0316821080611cf557506001600160a01b03841660009081526009602052604090206002015442600160401b9091046001600160401b0316105b611cfe57600080fd5b60005b81811015611d96576001600160a01b0385166000908152600a6020908152604080832060099092528220600101805491929184908110611d3d57fe5b60009182526020808320909101546001600160a01b03168352820192909252604001812080546001600160a01b03191681556001818101839055600282019290925560030180546001600160e81b031916905501611d01565b506001600160a01b038085166000908152600960205260409020600381015490549116908115801590611dc95750806000105b15611e1b576001600160a01b038216600090815260056020526040902054611df190826138c1565b6001600160a01b038316600090815260056020526040902055600454611e17908261389e565b6004555b6001600160a01b038616600090815260096020526040812081815590611e44600183018261390d565b5060028101805470ffffffffffffffffffffffffffffffffff1916905560030180546001600160a01b03191690556040516001600160a01b03838116919088169033907f734e2c8646f451b124cb991a58434a3287759f10be55a3448caf175465978b5a90611eb49086906142fd565b60405180910390a450600195945050505050565b6000808411611ee95760405162461bcd60e51b815260040161070290613d7e565b611ef23361184f565b15611f0f5760405162461bcd60e51b815260040161070290613de1565b8551855114611f305760405162461bcd60e51b815260040161070290613f01565b3060009081526009602052604090206001015415611f5357611f5130611bb2565b505b60005b86518110156120bc5760006040518060600160405280898481518110611f7857fe5b60200260200101516001600160a01b03168152602001611faa898581518110611f9d57fe5b60200260200101516138e4565b6001600160401b0390811682526000602092830181905233815260098352604080822060019081018054918201815583529184902085519201805494860151918601511515600160e01b0260ff60e01b1992909416600160a01b0267ffffffffffffffff60a01b196001600160a01b03949094166001600160a01b031990961695909517929092169390931792909216179055885190915088908390811061204e57fe5b60200260200101516001600160a01b0316336001600160a01b03167fba4451fd657e058b3bf9176f547ff6adbc789dfa38e5b5aafcb41ffbc674019989858151811061209657fe5b60200260200101516040516120ab91906142fd565b60405180910390a350600101611f56565b506120c6846138e4565b336000908152600960205260409020600201805467ffffffffffffffff19166001600160401b039290921691909117905561210762015180830242016138e4565b33600090815260096020526040902060020180546001600160401b0392909216600160401b0267ffffffffffffffff60401b199092169190911790556001600160a01b038316156121825733600090815260096020526040902060030180546001600160a01b0319166001600160a01b0385161790556121a6565b33600081815260096020526040902060030180546001600160a01b03191690911790555b336001600160a01b03167f0a7cb3f1f04c1a9301d70c44c73940732ec85d9cf35a53a7546a56a4210ea9fa8585856040516121e393929190614306565b60405180910390a250600195945050505050565b6000612206836109ae8661380a565b6001600160a01b038516600090815260056020526040902054101561223d5760405162461bcd60e51b815260040161070290613e39565b6122468461380a565b156122a2576001600160a01b038481166000908152600860205260409020541633146122845760405162461bcd60e51b8152600401610702906141e7565b81156122a25760405162461bcd60e51b8152600401610702906141be565b6001600160a01b03841660009081526008602052604090206003018390556122d042620151808402016138e4565b6001600160a01b038516600081815260086020526040908190206002810180546001600160401b0395909516600160481b0267ffffffffffffffff60481b199095169490941790935582546001600160a01b03191633908117909355519091907fe36bbcd03647f896065e1afe76efd3e3c90bcdc93cd531ce71723cc1229003ab906110bb9087908790614325565b3360009081526007602052604081205482111561238e5760405162461bcd60e51b815260040161070290613f88565b336000908152600760205260409020546123a8908361389e565b336000908152600760209081526040808320939093556005905220546123ce90836138c1565b33600081815260056020526040908190209290925590517f2cfce4af01bcb9d6cf6c84ee1b7c491100b8695368264146a94d71e10a63083f9061183f9085906142fd565b6001600160a01b0381166000908152600960205260408120600101548061244b5760405162461bcd60e51b815260040161070290613e0c565b60005b818110156119a7576001600160a01b038416600090815260096020526040902060010180548290811061247d57fe5b6000918252602090912001546001600160a01b03163314156124a457600192505050610864565b60010161244e565b60056020526000908152604090205481565b60006001600160a01b0382166124e65760405162461bcd60e51b81526004016107029061401c565b6124ef83612946565b6124f857600080fd5b6001600160a01b038381166000818152600a602090815260408083203380855292529182902060030180546001600160a01b03191694871694909417909355519091907fdb4b5eb4d8317123717f2d0fde0e98db3d482da6b0f2339b700745b72da3f0b890612568908690613c60565b60405180910390a36001600160a01b03831660009081526009602052604081206001015490805b82811015612654576001600160a01b0386166000908152600a60209081526040808320600990925282206001018054919291849081106125cb57fe5b60009182526020808320909101546001600160a01b0390811684529083019390935260409091019020600301548682169116141561264c576001600160a01b038616600090815260096020526040902060010180548290811061262a57fe5b600091825260209091200154600160a01b90046001600160401b031691909101905b60010161258f565b5061265e8561184f565b1515600114801561269357506001600160a01b0385166000908152600960205260409020600201546001600160401b03168110155b80156126bf57506001600160a01b03858116600090815260096020526040902060030154811690851614155b15612730576001600160a01b038581166000818152600960205260409081902060030180546001600160a01b0319169388169390931790925590517f21ca3b8e58c4ec64366f3ee4951037b9c0c48291f1c8e6c1c382b54ae636ebdc90612727908790613c60565b60405180910390a25b506001949350505050565b600061274682612946565b61274f57600080fd5b6001600160a01b0382166000818152600a6020908152604080832033808552925280832080546001600160a01b0319168155600181018490556002810184905560030180546001600160e81b03191690555190917f5a125ddfc7e7622d1c640091f61b84a2ace648969b5a6c1877925a5187339b5091a3506001919050565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156106b05780601f10610685576101008083540402835291602001916106b0565b60006001600160a01b0383166128505760405162461bcd60e51b815260040161070290613f31565b61285933613426565b156128765760405162461bcd60e51b815260040161070290613e70565b612883826109ae3361380a565b3360009081526005602052604090205410156128b15760405162461bcd60e51b81526004016107029061424c565b336000908152600560205260409020546128cb908361389e565b33600090815260056020526040808220929092556001600160a01b038516815220546128f790836138c1565b6001600160a01b0384166000818152600560205260409081902092909255905133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906108c29086906142fd565b600061295182612412565b61296d5760405162461bcd60e51b815260040161070290613f61565b6001600160a01b038216600090815260096020526040812060010154905b81811015612a73576001600160a01b03841660009081526009602052604090206001018054829081106129ba57fe5b6000918252602090912001546001600160a01b0316331415612a6b576001600160a01b03841660009081526009602052604090206001018054829081106129fd57fe5b600091825260209091200154600160e01b900460ff16612a66576001600160a01b03841660009081526009602052604090206001908101805483908110612a4057fe5b60009182526020909120018054911515600160e01b0260ff60e01b199092169190911790555b600192505b60010161298b565b5050919050565b6000612a8583612946565b612a8e57600080fd5b612a998260016138c1565b9150612aa4826138e4565b6001600160a01b0384166000818152600a602090815260408083203380855292529182902060030180546001600160401b0395909516600160a81b0267ffffffffffffffff60a81b1990951694909417909355519091907f84ed0ea57bb0e1bea55cf4c6152c08bb79e18274b50ed1a9e1f3c74508ea846990612b289086906142fd565b60405180910390a36001600160a01b03831660009081526009602052604081206001015490805b82811015612c1c576001600160a01b0386166000908152600a6020908152604080832060099092528220600101805491929184908110612b8b57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020600301546001600160401b03600160a81b90910416851415612c14576001600160a01b0386166000908152600960205260409020600101805482908110612bf257fe5b600091825260209091200154600160a01b90046001600160401b031691909101905b600101612b4f565b50612c268561184f565b15156001148015612c5b57506001600160a01b0385166000908152600960205260409020600201546001600160401b03168110155b156127305760005b82811015612cf8576001600160a01b0386166000908152600a6020908152604080832060099092528220600101805483919085908110612c9f57fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902060030180546001600160401b0392909216600160a81b0267ffffffffffffffff60a81b19909216919091179055600101612c63565b50600184039350612d0f84620151800242016138e4565b6001600160a01b0386166000818152600960205260409081902060020180546001600160401b0394909416600160401b0267ffffffffffffffff60401b199094169390931790925590517f530b91532605e96483345fb9755f85ffb78cf4a00b35f64ee23f2ba5685b4d57906127279087906142fd565b60076020526000908152604090205481565b33600090815260056020526040812054821115612dc75760405162461bcd60e51b815260040161070290614166565b33600090815260056020526040902054612de1908361389e565b33600090815260056020908152604080832093909355600790522054612e0790836138c1565b33600081815260076020526040908190209290925590517ff97a274face0b5517365ad396b1fdba6f68bd3135ef603e44272adba3af5a1e09061183f9085906142fd565b60096020526000908152604090208054600282015460039092015490916001600160401b0380821692600160401b830490911691600160801b900460ff16906001600160a01b031685565b6001600160a01b038116600090815260086020526040812060020154426001600160401b0390911611612ecc57506000806117e0565b506001600160a01b0316600090815260086020526040902060020154426001600160401b039091160390565b6000612f0383612946565b612f0c57600080fd5b6001600160a01b0383166000818152600a6020908152604080832033808552925291829020600301805460ff60a01b1916600160a01b8715150217905590517f7c6a851a70d98819cbecee0bc3a9825f2c917fd0b8fbdfc2df51f3eb3c59b9ae90612f78908690613d20565b60405180910390a36001600160a01b03831660009081526009602052604081206001015490805b8281101561306a576001600160a01b0386166000908152600a6020908152604080832060099092528220600101805491929184908110612fdb57fe5b6000918252602080832091909101546001600160a01b03168352820192909252604001902060030154600160a01b900460ff1615158515151415613062576001600160a01b038616600090815260096020526040902060010180548290811061304057fe5b600091825260209091200154600160a01b90046001600160401b031691909101905b600101612f9f565b506130748561184f565b151560011480156130a957506001600160a01b0385166000908152600960205260409020600201546001600160401b03168110155b80156130df57506001600160a01b03851660009081526009602052604090206002015460ff600160801b90910416151584151514155b15612730576001600160a01b03851660008181526009602052604090819020600201805460ff60801b1916600160801b88151502179055517f3e9ce397004e4757863c69afa7fdf198b194f2a1e8cb997102898988d17feda990612727908790613d20565b600660209081526000928352604080842090915290825290205481565b60006001600160a01b0384166131895760405162461bcd60e51b815260040161070290614283565b61319233613426565b156131af5760405162461bcd60e51b815260040161070290613e70565b6131bc836109ae3361380a565b3360009081526005602052604090205410156131ea5760405162461bcd60e51b81526004016107029061424c565b6131f38461380a565b1561324f576001600160a01b038481166000908152600860205260409020541633146132315760405162461bcd60e51b8152600401610702906141e7565b811561324f5760405162461bcd60e51b815260040161070290613daa565b6132588461380a565b6132bd5761326e610ba4426201518085026138c1565b6001600160a01b03851660009081526008602052604090206002810180546001600160401b039390931667ffffffffffffffff199093169290921790915580546001600160a01b031916331790555b6001600160a01b0384166000908152600860205260409020600101546132e390846138c1565b6001600160a01b038516600090815260086020908152604080832060010193909355338252600590522054613318908461389e565b33600090815260056020526040808220929092556001600160a01b0386168152205461334490846138c1565b6001600160a01b038516600090815260056020908152604080832093909355600890522060020154600160401b900460ff161515600114156133a7576001600160a01b0384166000908152600860205260409020600201805460ff60401b191690555b6001600160a01b0384166000818152600860205260409081902060020154905133917fedadb96c0df8ee0afeb050e8ebfbb9dccf42efb52b951fa7e9eb5162bd810130916134049188916001600160401b0390911690889061434a565b60405180910390a360045461341990846138c1565b6004555060019392505050565b6001600160a01b0316600090815260096020526040902060020154600160801b900460ff1690565b60086020526000908152604090208054600182015460028301546003909301546001600160a01b039092169290916001600160401b038083169260ff600160401b82041692600160481b9091049091169086565b60006134ad83612946565b6134b657600080fd5b816000106134c357600080fd5b6001600160a01b0383166000818152600a602090815260408083203380855292529182902060020185905590517f1070ef5ae281072214ef1d519e93f835706545046d19cb56cc3966d9a9dfb0999061351d9086906142fd565b60405180910390a36001600160a01b03831660009081526009602052604081206001015490805b82811015613600576001600160a01b0386166000908152600a602090815260408083206009909252822060010180549192918490811061358057fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020600201548514156135f8576001600160a01b03861660009081526009602052604090206001018054829081106135d657fe5b600091825260209091200154600160a01b90046001600160401b031691909101905b600101613544565b5061360a8561184f565b1515600114801561363f57506001600160a01b0385166000908152600960205260409020600201546001600160401b03168110155b801561366f5750613653846109ae8761380a565b6001600160a01b03861660009081526005602052604090205410155b156127305760005b82811015613747576001600160a01b0386166000908152600a60209081526040808320600990925282206001018054919291849081106136b357fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190206002015485141561373f576001600160a01b0386166000908152600a602090815260408083206009909252822060010180548391908590811061371657fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020600201555b600101613677565b506001600160a01b03851660009081526005602052604090205461376b908561389e565b6001600160a01b03861660009081526005602090815260408083209390935560099052205461379a90856138c1565b6001600160a01b038616600081815260096020526040908190209290925590517f85b789edc26d812edf1210978b76e509a8fcbd0f81c4938e9e3aceb40b7e3290906137e79087906142fd565b60405180910390a26004546137fc90856138c1565b600455506001949350505050565b6001600160a01b038116600090815260086020526040812060020154426001600160401b039091161161387f576001600160a01b03821660009081526008602052604090206001015460045461385f9161389e565b6004556001600160a01b0382166000908152600860205260408120600101555b506001600160a01b031660009081526008602052604090206001015490565b808203828111156108ce5760405162461bcd60e51b815260040161070290614194565b808201828110156108ce5760405162461bcd60e51b815260040161070290614106565b6000600160401b82106139095760405162461bcd60e51b815260040161070290613fb7565b5090565b508054600082559060005260206000209081019061392b919061392e565b50565b5b808211156139095780546001600160e81b031916815560010161392f565b80356001600160a01b038116811461086457600080fd5b600082601f830112613974578081fd5b81356020613989613984836143d2565b6143af565b82815281810190858301838502870184018810156139a5578586fd5b855b858110156139ca576139b88261394d565b845292840192908401906001016139a7565b5090979650505050505050565b600082601f8301126139e7578081fd5b813560206139f7613984836143d2565b8281528181019085830183850287018401881015613a13578586fd5b855b858110156139ca57813584529284019290840190600101613a15565b8035801515811461086457600080fd5b600060208284031215613a52578081fd5b611bab8261394d565b60008060408385031215613a6d578081fd5b613a768361394d565b9150613a846020840161394d565b90509250929050565b600080600060608486031215613aa1578081fd5b613aaa8461394d565b9250613ab86020850161394d565b9150604084013590509250925092565b60008060408385031215613ada578182fd5b613ae38361394d565b9150613a8460208401613a31565b60008060408385031215613b03578182fd5b613b0c8361394d565b946020939093013593505050565b600080600060608486031215613b2e578283fd5b613b378461394d565b95602085013595506040909401359392505050565b60008060408385031215613b5e578182fd5b82356001600160401b0380821115613b74578384fd5b613b8086838701613964565b93506020850135915080821115613b95578283fd5b50613ba2858286016139d7565b9150509250929050565b600080600080600060a08688031215613bc3578081fd5b85356001600160401b0380821115613bd9578283fd5b613be589838a01613964565b96506020880135915080821115613bfa578283fd5b50613c07888289016139d7565b94505060408601359250613c1d6060870161394d565b949793965091946080013592915050565b600060208284031215613c3f578081fd5b611bab82613a31565b600060208284031215613c59578081fd5b5035919050565b6001600160a01b0391909116815260200190565b6001600160a01b0396909616865260208601949094526001600160401b039283166040860152901515606085015216608083015260a082015260c00190565b602080825282518282018190526000919060409081850190868401855b82811015613d1357815180516001600160a01b03168552868101516001600160401b03168786015285015115158585015260609093019290850190600101613cd0565b5091979650505050505050565b901515815260200190565b6000602080835283518082850152825b81811015613d5757858101830151858201604001528201613d3b565b81811115613d685783604083870101525b50601f01601f1916929092016040019392505050565b602080825260129082015271696e76616c696420706173732073636f726560701b604082015260600190565b60208082526018908201527f4c6f636b2064657465637465642c20696e6974206661696c0000000000000000604082015260600190565b6020808252601190820152701b5d5b1d1a54da59db88195e1a5cdd1959607a1b604082015260600190565b6020808252601390820152721b5d5b1d1a54da59db881b9bdd08199bdd5b99606a1b604082015260600190565b6020808252601c908201527f696e73756666696369656e742062616c616e636520746f206c6f636b00000000604082015260600190565b6020808252601690820152751b5d5b1d1a5cda59db8818985b185b98d9481a1bdb1960521b604082015260600190565b6020808252601c908201527f616c6c6f775570646174654c6f636b54696d652069732066616c736500000000604082015260600190565b60208082526010908201526f1cd95b99195c881a5b98dbdc9c9958dd60821b604082015260600190565b6020808252601690820152750c2e4e4c2f2e640d8cadccee8d040dad2e6dac2e8c6d60531b604082015260600190565b60208082526016908201527507472616e736665727420746f206164647265737320360541b604082015260600190565b6020808252600d908201526c617070726f766572206f6e6c7960981b604082015260600190565b60208082526015908201527434b739bab33334b1b4b2b73a103130b630b731b29760591b604082015260600190565b602080825260149082015273746f55696e7436342829206f766572666c6f772160601b604082015260600190565b6020808252601c908201527f7472616e73666572206d6f7265207468616e20616c6c6f77616e636500000000604082015260600190565b6020808252600f908201526e696e76616c6964206164647265737360881b604082015260600190565b6020808252600f908201526e1d985b1d59481a5b98dbdc9c9958dd608a1b604082015260600190565b60208082526019908201527f696e73756666696369656e74206c6f636b2062616c616e636500000000000000604082015260600190565b6020808252601d908201527f696e737566666963656e74204d756c74695369676e2062616c616e6365000000604082015260600190565b60208082526010908201526f1393c81b1bd8dac819195d1958dd195960821b604082015260600190565b6020808252600f908201526e6164642829206f766572666c6f772160881b604082015260600190565b60208082526017908201527f696e73756666696369656e74206c6f636b2076616c7565000000000000000000604082015260600190565b602080825260149082015273696e73756666696369656e742062616c616e636560601b604082015260600190565b60208082526010908201526f737562282920756e646572666c6f772160801b604082015260600190565b6020808252600f908201526e1b1bd8dac81d1a5b5948195e1a5cdd608a1b604082015260600190565b6020808252601490820152731bdd1a195c9cc81b1bd8dac819195d1958dd195960621b604082015260600190565b60208082526017908201527f6d756c74697369676e206e6f7420616374697661746564000000000000000000604082015260600190565b6020808252601e908201527f696e73756666696369656e742062616c616e6365206f72206c6f636b65640000604082015260600190565b60208082526015908201527407472616e7366657220746f2061646472657373203605c1b604082015260600190565b85516001600160a01b03908116825260209687015196820196909652604081019490945291909316606083015291151560808201526001600160401b0390911660a082015260c00190565b90815260200190565b9283526001600160a01b03919091166020830152604082015260600190565b918252602082015260400190565b9182526001600160401b0316602082015260400190565b9283526001600160401b03919091166020830152604082015260600190565b9485526001600160401b03938416602086015291909216604084015290151560608301526001600160a01b0316608082015260a00190565b60ff91909116815260200190565b6040518181016001600160401b03811182821017156143ca57fe5b604052919050565b60006001600160401b038211156143e557fe5b506020908102019056fea2646970667358221220b39c1d04092983b0274608ccd34ccb526629a9f80edbaaf51f84089b300a436c64736f6c63430007060033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102745760003560e01c80635839fed211610151578063c9272717116100c3578063dbbcbda511610087578063dbbcbda514610575578063dd62ed3e14610588578063e5bd14691461059b578063e6fe32e7146105ae578063f435f5a7146105c1578063fd41f9a6146105e657610274565b8063c927271714610505578063cd4217c114610518578063d7a78db81461052b578063d7f631fa1461053e578063dafa23721461056257610274565b806370a082311161011557806370a082311461049e578063735609a0146104b15780637dfe330f146104c457806395d89b41146104d7578063a9059cbb146104df578063ba88d331146104f257610274565b80635839fed21461043f57806361b7cb5a14610452578063632660cb146104655780636623fc46146104785780636d218e481461048b57610274565b806323b872dd116101ea578063337827c3116101ae578063337827c3146103d85780633f7217ee146103eb57806342966c68146103fe57806352d18f2614610411578063568914121461042457806356c4e1c41461042c57610274565b806323b872dd146103775780632fa66c0d1461038a57806330da08d41461039d578063313ce567146103b057806331a0a9ab146103c557610274565b806312e3b3601161023c57806312e3b360146102f2578063138542851461030557806318160ddd146103185780631a0f73661461032d5780631afa74e514610340578063204009d21461036457610274565b80630339f0471461027957806306fdde031461029757806307532585146102ac578063095ea7b3146102bf578063096ed1b0146102d2575b600080fd5b6102816105f9565b60405161028e9190613d20565b60405180910390f35b61029f61062a565b60405161028e9190613d2b565b6102816102ba366004613c48565b6106b8565b6102816102cd366004613af1565b610869565b6102e56102e0366004613a41565b6108d4565b60405161028e9190613cb3565b610281610300366004613af1565b610979565b610281610313366004613af1565b610ae9565b610320610c1e565b60405161028e91906142fd565b61032061033b366004613a41565b610c28565b61035361034e366004613a5b565b610c43565b60405161028e9594939291906142b2565b610281610372366004613b4c565b610cb1565b610281610385366004613a8d565b610efc565b610281610398366004613a8d565b6110cd565b6102816103ab366004613af1565b6115b9565b6103b8611782565b60405161028e91906143a1565b6103206103d3366004613a41565b61178b565b6102816103e6366004613c2e565b6117e6565b6102816103f9366004613a41565b61184f565b61028161040c366004613c48565b6119b1565b61028161041f366004613af1565b611a80565b610320611b72565b61028161043a366004613af1565b611b78565b61028161044d366004613a41565b611bb2565b610281610460366004613bac565b611ec8565b610281610473366004613b1a565b6121f7565b610281610486366004613c48565b61235f565b610281610499366004613a41565b612412565b6103206104ac366004613a41565b6124ac565b6102816104bf366004613a5b565b6124be565b6102816104d2366004613a41565b61273b565b61029f6127ce565b6102816104ed366004613af1565b612828565b610281610500366004613a41565b612946565b610281610513366004613af1565b612a7a565b610320610526366004613a41565b612d86565b610281610539366004613c48565b612d98565b61055161054c366004613a41565b612e4b565b60405161028e959493929190614369565b610320610570366004613a41565b612e96565b610281610583366004613ac8565b612ef8565b610320610596366004613a5b565b613144565b6102816105a9366004613b1a565b613161565b6102816105bc366004613a41565b613426565b6105d46105cf366004613a41565b61344e565b60405161028e96959493929190613c74565b6102816105f4366004613af1565b6134a2565b3360009081526008602052604081206003810191909155600201805467ffffffffffffffff60481b19169055600190565b6000805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156106b05780601f10610685576101008083540402835291602001916106b0565b820191906000526020600020905b81548152906001019060200180831161069357829003601f168201915b505050505081565b3360008181526008602052604081205490916001600160a01b0390911690826106e08261380a565b90508060001061070b5760405162461bcd60e51b8152600401610702906140dc565b60405180910390fd5b8085111561072b5760405162461bcd60e51b81526004016107029061412f565b6001600160a01b0382166000908152600560205260409020548511156107635760405162461bcd60e51b815260040161070290614166565b6001600160a01b038216600090815260056020526040902054610786908661389e565b6001600160a01b0380841660009081526005602052604080822093909355908516815220546107b590866138c1565b6001600160a01b038085166000908152600560209081526040808320949094559185168152600890915220600101546107ee908661389e565b6001600160a01b038084166000818152600860205260409081902060010193909355915190851691907f1d090c58ebfa398dd3815a910162f3a2e5e4cfe699425e13bf773fe69f56b1ea906108449089906142fd565b60405180910390a3600454610859908661389e565b600455506001925050505b919050565b3360008181526006602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906108c29086906142fd565b60405180910390a35060015b92915050565b6001600160a01b0381166000908152600960209081526040808320600101805482518185028101850190935280835260609492939192909184015b8282101561096e57600084815260209081902060408051606081018252918501546001600160a01b0381168352600160a01b81046001600160401b031683850152600160e01b900460ff1615159082015282526001909201910161090f565b505050509050919050565b60006001600160a01b0383166109a15760405162461bcd60e51b815260040161070290614283565b6109b4826109ae3361380a565b906138c1565b3360009081526005602052604090205410156109e25760405162461bcd60e51b81526004016107029061424c565b6109eb8361184f565b610a075760405162461bcd60e51b815260040161070290614215565b610a1033613426565b15610a2d5760405162461bcd60e51b815260040161070290613e70565b33600090815260056020526040902054610a47908361389e565b336000908152600560209081526040808320939093556001600160a01b0386168252600990522054610a7990836138c1565b6001600160a01b0384166000818152600960205260409081902092909255905133907fac98be60c2a8422f9d9c3d538dc39506b39524fd7d9c33d2ae9a023a8203341190610ac89086906142fd565b60405180910390a3600454610add90836138c1565b60045550600192915050565b600080610af58461380a565b11610b125760405162461bcd60e51b8152600401610702906140dc565b6001600160a01b03838116600090815260086020526040902054163314610b4b5760405162461bcd60e51b8152600401610702906141e7565b6001600160a01b038316600090815260086020526040902060020154600160401b900460ff161515600114610b925760405162461bcd60e51b815260040161070290613ea0565b610ba9610ba4426201518085026138c1565b6138e4565b6001600160a01b03841660008181526008602052604090819020600201805467ffffffffffffffff19166001600160401b03949094169390931760ff60401b1916909255905133907fa15f5d852bb22466a7bf71497b333fc02eac977e473fb4ab166af591424cd3da906108c29086906142fd565b6004546003540390565b6001600160a01b031660009081526009602052604090205490565b600a602090815260009283526040808420825291835291819020815180830190925280546001600160a01b03908116835260018201549383019390935260028101546003909101549192909190811690600160a01b810460ff1690600160a81b90046001600160401b031685565b60008151835114610cd45760405162461bcd60e51b815260040161070290613f01565b610cdd33613426565b15610cfa5760405162461bcd60e51b815260040161070290613e70565b60005b8351811015610ef25760006001600160a01b0316848281518110610d1d57fe5b60200260200101516001600160a01b03161415610d4c5760405162461bcd60e51b815260040161070290614283565b610d6c838281518110610d5b57fe5b60200260200101516109ae3361380a565b336000908152600560205260409020541015610d9a5760405162461bcd60e51b81526004016107029061424c565b610dcc838281518110610da957fe5b60209081029190910181015133600090815260059092526040909120549061389e565b336000908152600560205260409020558251610e3d90849083908110610dee57fe5b602002602001015160056000878581518110610e0657fe5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020546138c190919063ffffffff16565b60056000868481518110610e4d57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550838181518110610e8557fe5b60200260200101516001600160a01b0316336001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef858481518110610ecd57fe5b6020026020010151604051610ee291906142fd565b60405180910390a3600101610cfd565b5060019392505050565b60006001600160a01b038316610f245760405162461bcd60e51b815260040161070290613f31565b6001600160a01b0384166000908152600660209081526040808320338452909152902054821115610f675760405162461bcd60e51b815260040161070290613fe5565b610f7084613426565b15610f8d5760405162461bcd60e51b815260040161070290613e70565b610f9a826109ae8661380a565b6001600160a01b0385166000908152600560205260409020541015610fd15760405162461bcd60e51b81526004016107029061424c565b6001600160a01b0384166000908152600660209081526040808320338452909152902054610fff908361389e565b6001600160a01b03851660008181526006602090815260408083203384528252808320949094559181526005909152205461103a908361389e565b6001600160a01b03808616600090815260056020526040808220939093559085168152205461106990836138c1565b6001600160a01b0380851660008181526005602052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906110bb9086906142fd565b60405180910390a35060019392505050565b60006001600160a01b0383166110f55760405162461bcd60e51b815260040161070290614283565b6110fe84612946565b61110757600080fd5b6001600160a01b038481166000818152600a602090815260408083203380855292529182902080546001600160a01b031916948816948517815560010186905590517f19cb7b37c7ec38fc7ad177531518d9c1355eb72d92074b8c3ffc1740bdfa6b36906111769087906142fd565b60405180910390a46001600160a01b03841660009081526009602052604081206001015490805b828110156112c5576001600160a01b0387166000908152600a60209081526040808320600990925282206001018054919291849081106111d957fe5b60009182526020808320909101546001600160a01b039081168452908301939093526040909101902054878216911614801561126f57506001600160a01b0387166000908152600a602090815260408083206009909252822060010180549192918490811061124457fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190206001015485145b156112bd576001600160a01b038716600090815260096020526040902060010180548290811061129b57fe5b600091825260209091200154600160a01b90046001600160401b031691909101905b60010161119d565b506112cf8661184f565b1515600114801561130457506001600160a01b0386166000908152600960205260409020600201546001600160401b03168110155b156115ad576001600160a01b0386166000908152600960205260409020548411156113415760405162461bcd60e51b8152600401610702906140a5565b60005b828110156114e8576001600160a01b0387166000908152600a602090815260408083206009909252822060010180549192918490811061138057fe5b60009182526020808320909101546001600160a01b039081168452908301939093526040909101902054878216911614801561141657506001600160a01b0387166000908152600a60209081526040808320600990925282206001018054919291849081106113eb57fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190206001015485145b156114e0576001600160a01b0387166000908152600a602090815260408083206009909252822060010180548391908590811061144f57fe5b6000918252602080832091909101546001600160a01b039081168452838201949094526040928301822080546001600160a01b03191695851695909517909455918a168252600a8352808220600990935281206001018054919291839190859081106114b757fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020600101555b600101611344565b506001600160a01b03861660009081526009602052604090205461150c908561389e565b6001600160a01b0380881660009081526009602090815260408083209490945591881681526005909152205461154290856138c1565b6001600160a01b0380871660008181526005602052604090819020939093559151908816907f2360e7c2c4c6c89a316ffd22919d2253861b6d40ee7c5ee663dd62c7ce6dc4b5906115949088906142fd565b60405180910390a36004546115a9908561389e565b6004555b50600195945050505050565b3360009081526008602052604081206003015482146115ea5760405162461bcd60e51b815260040161070290614045565b6115f7826109ae3361380a565b3360009081526005602052604090205410156116255760405162461bcd60e51b81526004016107029061424c565b336000908152600860205260409020546001600160a01b0384811691161461165f5760405162461bcd60e51b815260040161070290613ed7565b6116683361380a565b6116a1573360009081526008602052604090206002018054600160481b81046001600160401b031667ffffffffffffffff199091161790555b6116ae826109ae3361380a565b336000908152600860205260409020600101556004546116ce90836138c1565b60045533600090815260086020526040902060020154600160401b900460ff1615156001141561171657336000908152600860205260409020600201805460ff60401b191690555b33600081815260086020526040908190206002015490516001600160a01b03861692917fb36d118de22c7acb69bc047b64762b6bb4bfd16f0a7765011a71a2499250c959916117729187916001600160401b0390911690614333565b60405180910390a3610ef26105f9565b60025460ff1681565b6001600160a01b038116600090815260086020526040812060020154426001600160401b03909116116117c157506000806117e0565b506001600160a01b038116600090815260086020526040902060010154805b50919050565b33600081815260086020526040808220600201805460ff60401b1916600160401b86151502179055519091907feb641ae1a655a1fb471d5cfdb7cdc56938d44feeb0e3321696f1beb21a2059d79061183f908590613d20565b60405180910390a2506001919050565b6001600160a01b0381166000908152600960205260408120600181015460029091015482919042600160401b9091046001600160401b03161080156118be57506001600160a01b038416600090815260096020526040902060020154600160401b90046001600160401b031615155b156118d2576118cc84611bb2565b506119a7565b60005b818110156119a5576001600160a01b038516600090815260096020526040902060010180548290811061190457fe5b600091825260209091200154600160e01b900460ff1615156001141561199d576001600160a01b038516600090815260096020526040902060010180548290811061194b57fe5b60009182526020808320909101546001600160a01b038816835260099091526040909120600201546001600160401b03600160a01b9092048216949094019316831061199d5760019350505050610864565b6001016118d5565b505b5060009392505050565b60006119c0826109ae3361380a565b3360009081526005602052604090205410156119ee5760405162461bcd60e51b81526004016107029061424c565b6119f733613426565b15611a145760405162461bcd60e51b815260040161070290613e70565b33600090815260056020526040902054611a2e908361389e565b33600090815260056020526040902055600354611a4b908361389e565b60035560405133907fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59061183f9085906142fd565b6000611a8b8361380a565b821115611aaa5760405162461bcd60e51b81526004016107029061406e565b6001600160a01b03838116600090815260086020526040902054163314611ae35760405162461bcd60e51b8152600401610702906141e7565b6001600160a01b038316600090815260086020526040902060010154611b09908361389e565b6001600160a01b038416600090815260086020526040902060010155600454611b32908361389e565b6004556040516001600160a01b0384169033907f80ca9b8aea499357cfe61625f484af4b0c4d9ef357ee58c095095fd9ea7244e5906108c29086906142fd565b60045481565b6000611b838361380a565b611b9f5760405162461bcd60e51b8152600401610702906140dc565b611bab83836000613161565b9392505050565b6000611bbd82612412565b80611bd05750336001600160a01b038316145b611bd957600080fd5b6001600160a01b038216600090815260096020526040812060010154815b81811015611c97576001600160a01b0385166000908152600960205260409020600101805482908110611c2657fe5b600091825260209091200154600160e01b900460ff16151560011415611c8f576001600160a01b0385166000908152600960205260409020600101805482908110611c6d57fe5b600091825260209091200154600160a01b90046001600160401b031692909201915b600101611bf7565b506001600160a01b0384166000908152600960205260409020600201546001600160401b0316821080611cf557506001600160a01b03841660009081526009602052604090206002015442600160401b9091046001600160401b0316105b611cfe57600080fd5b60005b81811015611d96576001600160a01b0385166000908152600a6020908152604080832060099092528220600101805491929184908110611d3d57fe5b60009182526020808320909101546001600160a01b03168352820192909252604001812080546001600160a01b03191681556001818101839055600282019290925560030180546001600160e81b031916905501611d01565b506001600160a01b038085166000908152600960205260409020600381015490549116908115801590611dc95750806000105b15611e1b576001600160a01b038216600090815260056020526040902054611df190826138c1565b6001600160a01b038316600090815260056020526040902055600454611e17908261389e565b6004555b6001600160a01b038616600090815260096020526040812081815590611e44600183018261390d565b5060028101805470ffffffffffffffffffffffffffffffffff1916905560030180546001600160a01b03191690556040516001600160a01b03838116919088169033907f734e2c8646f451b124cb991a58434a3287759f10be55a3448caf175465978b5a90611eb49086906142fd565b60405180910390a450600195945050505050565b6000808411611ee95760405162461bcd60e51b815260040161070290613d7e565b611ef23361184f565b15611f0f5760405162461bcd60e51b815260040161070290613de1565b8551855114611f305760405162461bcd60e51b815260040161070290613f01565b3060009081526009602052604090206001015415611f5357611f5130611bb2565b505b60005b86518110156120bc5760006040518060600160405280898481518110611f7857fe5b60200260200101516001600160a01b03168152602001611faa898581518110611f9d57fe5b60200260200101516138e4565b6001600160401b0390811682526000602092830181905233815260098352604080822060019081018054918201815583529184902085519201805494860151918601511515600160e01b0260ff60e01b1992909416600160a01b0267ffffffffffffffff60a01b196001600160a01b03949094166001600160a01b031990961695909517929092169390931792909216179055885190915088908390811061204e57fe5b60200260200101516001600160a01b0316336001600160a01b03167fba4451fd657e058b3bf9176f547ff6adbc789dfa38e5b5aafcb41ffbc674019989858151811061209657fe5b60200260200101516040516120ab91906142fd565b60405180910390a350600101611f56565b506120c6846138e4565b336000908152600960205260409020600201805467ffffffffffffffff19166001600160401b039290921691909117905561210762015180830242016138e4565b33600090815260096020526040902060020180546001600160401b0392909216600160401b0267ffffffffffffffff60401b199092169190911790556001600160a01b038316156121825733600090815260096020526040902060030180546001600160a01b0319166001600160a01b0385161790556121a6565b33600081815260096020526040902060030180546001600160a01b03191690911790555b336001600160a01b03167f0a7cb3f1f04c1a9301d70c44c73940732ec85d9cf35a53a7546a56a4210ea9fa8585856040516121e393929190614306565b60405180910390a250600195945050505050565b6000612206836109ae8661380a565b6001600160a01b038516600090815260056020526040902054101561223d5760405162461bcd60e51b815260040161070290613e39565b6122468461380a565b156122a2576001600160a01b038481166000908152600860205260409020541633146122845760405162461bcd60e51b8152600401610702906141e7565b81156122a25760405162461bcd60e51b8152600401610702906141be565b6001600160a01b03841660009081526008602052604090206003018390556122d042620151808402016138e4565b6001600160a01b038516600081815260086020526040908190206002810180546001600160401b0395909516600160481b0267ffffffffffffffff60481b199095169490941790935582546001600160a01b03191633908117909355519091907fe36bbcd03647f896065e1afe76efd3e3c90bcdc93cd531ce71723cc1229003ab906110bb9087908790614325565b3360009081526007602052604081205482111561238e5760405162461bcd60e51b815260040161070290613f88565b336000908152600760205260409020546123a8908361389e565b336000908152600760209081526040808320939093556005905220546123ce90836138c1565b33600081815260056020526040908190209290925590517f2cfce4af01bcb9d6cf6c84ee1b7c491100b8695368264146a94d71e10a63083f9061183f9085906142fd565b6001600160a01b0381166000908152600960205260408120600101548061244b5760405162461bcd60e51b815260040161070290613e0c565b60005b818110156119a7576001600160a01b038416600090815260096020526040902060010180548290811061247d57fe5b6000918252602090912001546001600160a01b03163314156124a457600192505050610864565b60010161244e565b60056020526000908152604090205481565b60006001600160a01b0382166124e65760405162461bcd60e51b81526004016107029061401c565b6124ef83612946565b6124f857600080fd5b6001600160a01b038381166000818152600a602090815260408083203380855292529182902060030180546001600160a01b03191694871694909417909355519091907fdb4b5eb4d8317123717f2d0fde0e98db3d482da6b0f2339b700745b72da3f0b890612568908690613c60565b60405180910390a36001600160a01b03831660009081526009602052604081206001015490805b82811015612654576001600160a01b0386166000908152600a60209081526040808320600990925282206001018054919291849081106125cb57fe5b60009182526020808320909101546001600160a01b0390811684529083019390935260409091019020600301548682169116141561264c576001600160a01b038616600090815260096020526040902060010180548290811061262a57fe5b600091825260209091200154600160a01b90046001600160401b031691909101905b60010161258f565b5061265e8561184f565b1515600114801561269357506001600160a01b0385166000908152600960205260409020600201546001600160401b03168110155b80156126bf57506001600160a01b03858116600090815260096020526040902060030154811690851614155b15612730576001600160a01b038581166000818152600960205260409081902060030180546001600160a01b0319169388169390931790925590517f21ca3b8e58c4ec64366f3ee4951037b9c0c48291f1c8e6c1c382b54ae636ebdc90612727908790613c60565b60405180910390a25b506001949350505050565b600061274682612946565b61274f57600080fd5b6001600160a01b0382166000818152600a6020908152604080832033808552925280832080546001600160a01b0319168155600181018490556002810184905560030180546001600160e81b03191690555190917f5a125ddfc7e7622d1c640091f61b84a2ace648969b5a6c1877925a5187339b5091a3506001919050565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156106b05780601f10610685576101008083540402835291602001916106b0565b60006001600160a01b0383166128505760405162461bcd60e51b815260040161070290613f31565b61285933613426565b156128765760405162461bcd60e51b815260040161070290613e70565b612883826109ae3361380a565b3360009081526005602052604090205410156128b15760405162461bcd60e51b81526004016107029061424c565b336000908152600560205260409020546128cb908361389e565b33600090815260056020526040808220929092556001600160a01b038516815220546128f790836138c1565b6001600160a01b0384166000818152600560205260409081902092909255905133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906108c29086906142fd565b600061295182612412565b61296d5760405162461bcd60e51b815260040161070290613f61565b6001600160a01b038216600090815260096020526040812060010154905b81811015612a73576001600160a01b03841660009081526009602052604090206001018054829081106129ba57fe5b6000918252602090912001546001600160a01b0316331415612a6b576001600160a01b03841660009081526009602052604090206001018054829081106129fd57fe5b600091825260209091200154600160e01b900460ff16612a66576001600160a01b03841660009081526009602052604090206001908101805483908110612a4057fe5b60009182526020909120018054911515600160e01b0260ff60e01b199092169190911790555b600192505b60010161298b565b5050919050565b6000612a8583612946565b612a8e57600080fd5b612a998260016138c1565b9150612aa4826138e4565b6001600160a01b0384166000818152600a602090815260408083203380855292529182902060030180546001600160401b0395909516600160a81b0267ffffffffffffffff60a81b1990951694909417909355519091907f84ed0ea57bb0e1bea55cf4c6152c08bb79e18274b50ed1a9e1f3c74508ea846990612b289086906142fd565b60405180910390a36001600160a01b03831660009081526009602052604081206001015490805b82811015612c1c576001600160a01b0386166000908152600a6020908152604080832060099092528220600101805491929184908110612b8b57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020600301546001600160401b03600160a81b90910416851415612c14576001600160a01b0386166000908152600960205260409020600101805482908110612bf257fe5b600091825260209091200154600160a01b90046001600160401b031691909101905b600101612b4f565b50612c268561184f565b15156001148015612c5b57506001600160a01b0385166000908152600960205260409020600201546001600160401b03168110155b156127305760005b82811015612cf8576001600160a01b0386166000908152600a6020908152604080832060099092528220600101805483919085908110612c9f57fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902060030180546001600160401b0392909216600160a81b0267ffffffffffffffff60a81b19909216919091179055600101612c63565b50600184039350612d0f84620151800242016138e4565b6001600160a01b0386166000818152600960205260409081902060020180546001600160401b0394909416600160401b0267ffffffffffffffff60401b199094169390931790925590517f530b91532605e96483345fb9755f85ffb78cf4a00b35f64ee23f2ba5685b4d57906127279087906142fd565b60076020526000908152604090205481565b33600090815260056020526040812054821115612dc75760405162461bcd60e51b815260040161070290614166565b33600090815260056020526040902054612de1908361389e565b33600090815260056020908152604080832093909355600790522054612e0790836138c1565b33600081815260076020526040908190209290925590517ff97a274face0b5517365ad396b1fdba6f68bd3135ef603e44272adba3af5a1e09061183f9085906142fd565b60096020526000908152604090208054600282015460039092015490916001600160401b0380821692600160401b830490911691600160801b900460ff16906001600160a01b031685565b6001600160a01b038116600090815260086020526040812060020154426001600160401b0390911611612ecc57506000806117e0565b506001600160a01b0316600090815260086020526040902060020154426001600160401b039091160390565b6000612f0383612946565b612f0c57600080fd5b6001600160a01b0383166000818152600a6020908152604080832033808552925291829020600301805460ff60a01b1916600160a01b8715150217905590517f7c6a851a70d98819cbecee0bc3a9825f2c917fd0b8fbdfc2df51f3eb3c59b9ae90612f78908690613d20565b60405180910390a36001600160a01b03831660009081526009602052604081206001015490805b8281101561306a576001600160a01b0386166000908152600a6020908152604080832060099092528220600101805491929184908110612fdb57fe5b6000918252602080832091909101546001600160a01b03168352820192909252604001902060030154600160a01b900460ff1615158515151415613062576001600160a01b038616600090815260096020526040902060010180548290811061304057fe5b600091825260209091200154600160a01b90046001600160401b031691909101905b600101612f9f565b506130748561184f565b151560011480156130a957506001600160a01b0385166000908152600960205260409020600201546001600160401b03168110155b80156130df57506001600160a01b03851660009081526009602052604090206002015460ff600160801b90910416151584151514155b15612730576001600160a01b03851660008181526009602052604090819020600201805460ff60801b1916600160801b88151502179055517f3e9ce397004e4757863c69afa7fdf198b194f2a1e8cb997102898988d17feda990612727908790613d20565b600660209081526000928352604080842090915290825290205481565b60006001600160a01b0384166131895760405162461bcd60e51b815260040161070290614283565b61319233613426565b156131af5760405162461bcd60e51b815260040161070290613e70565b6131bc836109ae3361380a565b3360009081526005602052604090205410156131ea5760405162461bcd60e51b81526004016107029061424c565b6131f38461380a565b1561324f576001600160a01b038481166000908152600860205260409020541633146132315760405162461bcd60e51b8152600401610702906141e7565b811561324f5760405162461bcd60e51b815260040161070290613daa565b6132588461380a565b6132bd5761326e610ba4426201518085026138c1565b6001600160a01b03851660009081526008602052604090206002810180546001600160401b039390931667ffffffffffffffff199093169290921790915580546001600160a01b031916331790555b6001600160a01b0384166000908152600860205260409020600101546132e390846138c1565b6001600160a01b038516600090815260086020908152604080832060010193909355338252600590522054613318908461389e565b33600090815260056020526040808220929092556001600160a01b0386168152205461334490846138c1565b6001600160a01b038516600090815260056020908152604080832093909355600890522060020154600160401b900460ff161515600114156133a7576001600160a01b0384166000908152600860205260409020600201805460ff60401b191690555b6001600160a01b0384166000818152600860205260409081902060020154905133917fedadb96c0df8ee0afeb050e8ebfbb9dccf42efb52b951fa7e9eb5162bd810130916134049188916001600160401b0390911690889061434a565b60405180910390a360045461341990846138c1565b6004555060019392505050565b6001600160a01b0316600090815260096020526040902060020154600160801b900460ff1690565b60086020526000908152604090208054600182015460028301546003909301546001600160a01b039092169290916001600160401b038083169260ff600160401b82041692600160481b9091049091169086565b60006134ad83612946565b6134b657600080fd5b816000106134c357600080fd5b6001600160a01b0383166000818152600a602090815260408083203380855292529182902060020185905590517f1070ef5ae281072214ef1d519e93f835706545046d19cb56cc3966d9a9dfb0999061351d9086906142fd565b60405180910390a36001600160a01b03831660009081526009602052604081206001015490805b82811015613600576001600160a01b0386166000908152600a602090815260408083206009909252822060010180549192918490811061358057fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020600201548514156135f8576001600160a01b03861660009081526009602052604090206001018054829081106135d657fe5b600091825260209091200154600160a01b90046001600160401b031691909101905b600101613544565b5061360a8561184f565b1515600114801561363f57506001600160a01b0385166000908152600960205260409020600201546001600160401b03168110155b801561366f5750613653846109ae8761380a565b6001600160a01b03861660009081526005602052604090205410155b156127305760005b82811015613747576001600160a01b0386166000908152600a60209081526040808320600990925282206001018054919291849081106136b357fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190206002015485141561373f576001600160a01b0386166000908152600a602090815260408083206009909252822060010180548391908590811061371657fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020600201555b600101613677565b506001600160a01b03851660009081526005602052604090205461376b908561389e565b6001600160a01b03861660009081526005602090815260408083209390935560099052205461379a90856138c1565b6001600160a01b038616600081815260096020526040908190209290925590517f85b789edc26d812edf1210978b76e509a8fcbd0f81c4938e9e3aceb40b7e3290906137e79087906142fd565b60405180910390a26004546137fc90856138c1565b600455506001949350505050565b6001600160a01b038116600090815260086020526040812060020154426001600160401b039091161161387f576001600160a01b03821660009081526008602052604090206001015460045461385f9161389e565b6004556001600160a01b0382166000908152600860205260408120600101555b506001600160a01b031660009081526008602052604090206001015490565b808203828111156108ce5760405162461bcd60e51b815260040161070290614194565b808201828110156108ce5760405162461bcd60e51b815260040161070290614106565b6000600160401b82106139095760405162461bcd60e51b815260040161070290613fb7565b5090565b508054600082559060005260206000209081019061392b919061392e565b50565b5b808211156139095780546001600160e81b031916815560010161392f565b80356001600160a01b038116811461086457600080fd5b600082601f830112613974578081fd5b81356020613989613984836143d2565b6143af565b82815281810190858301838502870184018810156139a5578586fd5b855b858110156139ca576139b88261394d565b845292840192908401906001016139a7565b5090979650505050505050565b600082601f8301126139e7578081fd5b813560206139f7613984836143d2565b8281528181019085830183850287018401881015613a13578586fd5b855b858110156139ca57813584529284019290840190600101613a15565b8035801515811461086457600080fd5b600060208284031215613a52578081fd5b611bab8261394d565b60008060408385031215613a6d578081fd5b613a768361394d565b9150613a846020840161394d565b90509250929050565b600080600060608486031215613aa1578081fd5b613aaa8461394d565b9250613ab86020850161394d565b9150604084013590509250925092565b60008060408385031215613ada578182fd5b613ae38361394d565b9150613a8460208401613a31565b60008060408385031215613b03578182fd5b613b0c8361394d565b946020939093013593505050565b600080600060608486031215613b2e578283fd5b613b378461394d565b95602085013595506040909401359392505050565b60008060408385031215613b5e578182fd5b82356001600160401b0380821115613b74578384fd5b613b8086838701613964565b93506020850135915080821115613b95578283fd5b50613ba2858286016139d7565b9150509250929050565b600080600080600060a08688031215613bc3578081fd5b85356001600160401b0380821115613bd9578283fd5b613be589838a01613964565b96506020880135915080821115613bfa578283fd5b50613c07888289016139d7565b94505060408601359250613c1d6060870161394d565b949793965091946080013592915050565b600060208284031215613c3f578081fd5b611bab82613a31565b600060208284031215613c59578081fd5b5035919050565b6001600160a01b0391909116815260200190565b6001600160a01b0396909616865260208601949094526001600160401b039283166040860152901515606085015216608083015260a082015260c00190565b602080825282518282018190526000919060409081850190868401855b82811015613d1357815180516001600160a01b03168552868101516001600160401b03168786015285015115158585015260609093019290850190600101613cd0565b5091979650505050505050565b901515815260200190565b6000602080835283518082850152825b81811015613d5757858101830151858201604001528201613d3b565b81811115613d685783604083870101525b50601f01601f1916929092016040019392505050565b602080825260129082015271696e76616c696420706173732073636f726560701b604082015260600190565b60208082526018908201527f4c6f636b2064657465637465642c20696e6974206661696c0000000000000000604082015260600190565b6020808252601190820152701b5d5b1d1a54da59db88195e1a5cdd1959607a1b604082015260600190565b6020808252601390820152721b5d5b1d1a54da59db881b9bdd08199bdd5b99606a1b604082015260600190565b6020808252601c908201527f696e73756666696369656e742062616c616e636520746f206c6f636b00000000604082015260600190565b6020808252601690820152751b5d5b1d1a5cda59db8818985b185b98d9481a1bdb1960521b604082015260600190565b6020808252601c908201527f616c6c6f775570646174654c6f636b54696d652069732066616c736500000000604082015260600190565b60208082526010908201526f1cd95b99195c881a5b98dbdc9c9958dd60821b604082015260600190565b6020808252601690820152750c2e4e4c2f2e640d8cadccee8d040dad2e6dac2e8c6d60531b604082015260600190565b60208082526016908201527507472616e736665727420746f206164647265737320360541b604082015260600190565b6020808252600d908201526c617070726f766572206f6e6c7960981b604082015260600190565b60208082526015908201527434b739bab33334b1b4b2b73a103130b630b731b29760591b604082015260600190565b602080825260149082015273746f55696e7436342829206f766572666c6f772160601b604082015260600190565b6020808252601c908201527f7472616e73666572206d6f7265207468616e20616c6c6f77616e636500000000604082015260600190565b6020808252600f908201526e696e76616c6964206164647265737360881b604082015260600190565b6020808252600f908201526e1d985b1d59481a5b98dbdc9c9958dd608a1b604082015260600190565b60208082526019908201527f696e73756666696369656e74206c6f636b2062616c616e636500000000000000604082015260600190565b6020808252601d908201527f696e737566666963656e74204d756c74695369676e2062616c616e6365000000604082015260600190565b60208082526010908201526f1393c81b1bd8dac819195d1958dd195960821b604082015260600190565b6020808252600f908201526e6164642829206f766572666c6f772160881b604082015260600190565b60208082526017908201527f696e73756666696369656e74206c6f636b2076616c7565000000000000000000604082015260600190565b602080825260149082015273696e73756666696369656e742062616c616e636560601b604082015260600190565b60208082526010908201526f737562282920756e646572666c6f772160801b604082015260600190565b6020808252600f908201526e1b1bd8dac81d1a5b5948195e1a5cdd608a1b604082015260600190565b6020808252601490820152731bdd1a195c9cc81b1bd8dac819195d1958dd195960621b604082015260600190565b60208082526017908201527f6d756c74697369676e206e6f7420616374697661746564000000000000000000604082015260600190565b6020808252601e908201527f696e73756666696369656e742062616c616e6365206f72206c6f636b65640000604082015260600190565b60208082526015908201527407472616e7366657220746f2061646472657373203605c1b604082015260600190565b85516001600160a01b03908116825260209687015196820196909652604081019490945291909316606083015291151560808201526001600160401b0390911660a082015260c00190565b90815260200190565b9283526001600160a01b03919091166020830152604082015260600190565b918252602082015260400190565b9182526001600160401b0316602082015260400190565b9283526001600160401b03919091166020830152604082015260600190565b9485526001600160401b03938416602086015291909216604084015290151560608301526001600160a01b0316608082015260a00190565b60ff91909116815260200190565b6040518181016001600160401b03811182821017156143ca57fe5b604052919050565b60006001600160401b038211156143e557fe5b506020908102019056fea2646970667358221220b39c1d04092983b0274608ccd34ccb526629a9f80edbaaf51f84089b300a436c64736f6c63430007060033

Deployed Bytecode Sourcemap

836:38936:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14665:167;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;890:18;;;:::i;:::-;;;;;;;:::i;11171:852::-;;;;;;:::i;:::-;;:::i;36678:216::-;;;;;;:::i;:::-;;:::i;32813:165::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;31354:954::-;;;;;;:::i;:::-;;:::i;9869:535::-;;;;;;:::i;:::-;;:::i;5430:102::-;;;:::i;:::-;;;;;;;:::i;32487:166::-;;;;;;:::i;:::-;;:::i;3645:57::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;34816:827::-;;;;;;:::i;:::-;;:::i;37186:729::-;;;;;;:::i;:::-;;:::i;22449:2383::-;;;;;;:::i;:::-;;:::i;13495:984::-;;;;;;:::i;:::-;;:::i;942:21::-;;;:::i;:::-;;;;;;;:::i;9026:176::-;;;;;;:::i;:::-;;:::i;10647:208::-;;;;;;:::i;:::-;;:::i;18019:740::-;;;;;;:::i;:::-;;:::i;38132:465::-;;;;;;:::i;:::-;;:::i;15144:464::-;;;;;;:::i;:::-;;:::i;1010:26::-;;;:::i;7979:211::-;;;;;;:::i;:::-;;:::i;33190:1351::-;;;;;;:::i;:::-;;:::i;16224:1526::-;;;;;;:::i;:::-;;:::i;12476:669::-;;;;;;:::i;:::-;;:::i;39407:359::-;;;;;;:::i;:::-;;:::i;18969:397::-;;;;;;:::i;:::-;;:::i;1045:45::-;;;;;;:::i;:::-;;:::i;29352:1265::-;;;;;;:::i;:::-;;:::i;30840:249::-;;;;;;:::i;:::-;;:::i;915:20::-;;;:::i;35861:563::-;;;;;;:::i;:::-;;:::i;19559:587::-;;;;;;:::i;:::-;;:::i;27492:1473::-;;;;;;:::i;:::-;;:::i;1170:44::-;;;;;;:::i;:::-;;:::i;38827:355::-;;;;;;:::i;:::-;;:::i;3147:47::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;9392:192::-;;;;;;:::i;:::-;;:::i;20548:1098::-;;;;;;:::i;:::-;;:::i;1097:66::-;;;;;;:::i;:::-;;:::i;6043:1649::-;;;;;;:::i;:::-;;:::i;21879:139::-;;;;;;:::i;:::-;;:::i;1774:47::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;25230:1872::-;;;;;;:::i;:::-;;:::i;14665:167::-;14734:10;14704:12;14729:16;;;:4;:16;;;;;:26;;;:30;;;;14770:28;;:32;;-1:-1:-1;;;;14770:32:0;;;-1:-1:-1;14665:167:0;:::o;890:18::-;;;;;;;;;;;;;;;-1:-1:-1;;890:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;11171:852::-;11280:10;11231:12;11275:16;;;:4;:16;;;;;:23;11231:12;;-1:-1:-1;;;;;11275:23:0;;;;11231:12;11374:25;11280:10;11374:12;:25::i;:::-;11354:45;;11422:9;11418:1;:13;11410:42;;;;-1:-1:-1;;;11410:42:0;;;;;;;:::i;:::-;;;;;;;;;11481:9;11471:6;:19;;11463:54;;;;-1:-1:-1;;;11463:54:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11536:22:0;;;;;;:9;:22;;;;;;:32;-1:-1:-1;11536:32:0;11528:64;;;;-1:-1:-1;;;11528:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11630:22:0;;;;;;:9;:22;;;;;;:38;;11661:6;11630:30;:38::i;:::-;-1:-1:-1;;;;;11605:22:0;;;;;;;:9;:22;;;;;;:63;;;;11702:20;;;;;;;:36;;11731:6;11702:28;:36::i;:::-;-1:-1:-1;;;;;11679:20:0;;;;;;;:9;:20;;;;;;;;:59;;;;11781:17;;;;;:4;:17;;;;:27;;;:43;;11817:6;11781:35;:43::i;:::-;-1:-1:-1;;;;;11751:17:0;;;;;;;:4;:17;;;;;;;:27;;:73;;;;11867:50;;;;;;11751:17;11867:50;;;;11910:6;;11867:50;:::i;:::-;;;;;;;;11944:11;;:27;;11964:6;11944:19;:27::i;:::-;11930:11;:41;-1:-1:-1;12011:4:0;;-1:-1:-1;;;11171:852:0;;;;:::o;36678:216::-;36780:10;36745:12;36770:21;;;:9;:21;;;;;;;;-1:-1:-1;;;;;36770:31:0;;;;;;;;;;:40;;;36826:38;36745:12;;36770:31;;36826:38;;;;36804:6;;36826:38;:::i;:::-;;;;;;;;-1:-1:-1;36882:4:0;36678:216;;;;;:::o;32813:165::-;-1:-1:-1;;;;;32939:21:0;;;;;;:9;:21;;;;;;;;:31;;32932:38;;;;;;;;;;;;;;;;;32886:27;;32932:38;;32939:31;;32932:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32932:38:0;;;;-1:-1:-1;;;32932:38:0;;-1:-1:-1;;;;;32932:38:0;;;;;-1:-1:-1;;;32932:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;32813:165;;;:::o;31354:954::-;31431:12;-1:-1:-1;;;;;31471:24:0;;31462:58;;;;-1:-1:-1;;;31462:58:0;;;;;;;:::i;:::-;31565:40;31598:6;31565:24;31578:10;31565:12;:24::i;:::-;:32;;:40::i;:::-;31550:10;31540:21;;;;:9;:21;;;;;;:65;;31531:108;;;;-1:-1:-1;;;31531:108:0;;;;;;;:::i;:::-;31659:32;31680:10;31659:20;:32::i;:::-;31650:68;;;;-1:-1:-1;;;31650:68:0;;;;;;;:::i;:::-;31747:35;31771:10;31747:23;:35::i;:::-;31738:44;31729:80;;;;-1:-1:-1;;;31729:80:0;;;;;;;:::i;:::-;31856:10;31846:21;;;;:9;:21;;;;;;:37;;31876:6;31846:29;:37::i;:::-;31832:10;31822:21;;;;:9;:21;;;;;;;;:61;;;;-1:-1:-1;;;;;31997:21:0;;;;:9;:21;;;:38;:54;;32044:6;31997:46;:54::i;:::-;-1:-1:-1;;;;;31956:21:0;;;;;;:9;:21;;;;;;;:95;;;;32100:51;;32120:10;;32100:51;;;;32144:6;;32100:51;:::i;:::-;;;;;;;;32176:11;;:27;;32196:6;32176:19;:27::i;:::-;32162:11;:41;-1:-1:-1;32296:4:0;31354:954;;;;:::o;9869:535::-;9938:12;9993:1;9971:19;9984:5;9971:12;:19::i;:::-;:23;9963:51;;;;-1:-1:-1;;;9963:51:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10047:11:0;;;;;;;:4;:11;;;;;:18;;10033:10;:32;10025:65;;;;-1:-1:-1;;;10025:65:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10117:11:0;;;;;;:4;:11;;;;;:31;;;-1:-1:-1;;;10117:31:0;;;;10109:39;;:4;:39;10101:79;;;;-1:-1:-1;;;10101:79:0;;;;;;;:::i;:::-;10216:52;10217:39;:15;10249:6;10241:14;;10217:23;:39::i;:::-;10216:50;:52::i;:::-;-1:-1:-1;;;;;10193:11:0;;;;;;:4;:11;;;;;;;:20;;:75;;-1:-1:-1;;10193:75:0;-1:-1:-1;;;;;10193:75:0;;;;;;;;-1:-1:-1;;;;10279:39:0;;;;10334:40;;10349:10;;10334:40;;;;10368:5;;10334:40;:::i;5430:102::-;5513:11;;5500:10;;:24;5430:102;:::o;32487:166::-;-1:-1:-1;;;;;32607:21:0;32558:23;32607:21;;;:9;:21;;;;;:38;;32487:166::o;3645:57::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3645:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;3645:57:0;;;;;-1:-1:-1;;;3645:57:0;;-1:-1:-1;;;;;3645:57:0;;:::o;34816:827::-;34923:4;34969:8;:15;34948:10;:17;:36;34940:70;;;;-1:-1:-1;;;34940:70:0;;;;;;;:::i;:::-;35039:35;35063:10;35039:23;:35::i;:::-;35030:44;35021:80;;;;-1:-1:-1;;;35021:80:0;;;;;;;:::i;:::-;35119:6;35114:500;35135:10;:17;35131:1;:21;35114:500;;;35207:1;-1:-1:-1;;;;;35182:27:0;:10;35193:1;35182:13;;;;;;;;;;;;;;-1:-1:-1;;;;;35182:27:0;;;35174:60;;;;-1:-1:-1;;;35174:60:0;;;;;;;:::i;:::-;35277:45;35310:8;35319:1;35310:11;;;;;;;;;;;;;;35277:24;35290:10;35277:12;:24::i;:45::-;35263:10;35253:21;;;;:9;:21;;;;;;:69;35249:115;;;35324:40;;-1:-1:-1;;;35324:40:0;;;;;;;:::i;35249:115::-;35405:42;35435:8;35444:1;35435:11;;;;;;;;;;;;;;;;;;;35415:10;35405:21;;;;:9;:21;;;;;;;;;:29;:42::i;:::-;35391:10;35381:21;;;;:9;:21;;;;;:66;35522:11;;35489:45;;35522:8;;35531:1;;35522:11;;;;;;;;;;;;35489:9;:24;35499:10;35510:1;35499:13;;;;;;;;;;;;;;-1:-1:-1;;;;;35489:24:0;-1:-1:-1;;;;;35489:24:0;;;;;;;;;;;;;:32;;:45;;;;:::i;:::-;35462:9;:24;35472:10;35483:1;35472:13;;;;;;;;;;;;;;-1:-1:-1;;;;;35462:24:0;-1:-1:-1;;;;;35462:24:0;;;;;;;;;;;;:72;;;;35575:10;35586:1;35575:13;;;;;;;;;;;;;;-1:-1:-1;;;;;35554:48:0;35563:10;-1:-1:-1;;;;;35554:48:0;;35590:8;35599:1;35590:11;;;;;;;;;;;;;;35554:48;;;;;;:::i;:::-;;;;;;;;35154:3;;35114:500;;;-1:-1:-1;35631:4:0;;34816:827;-1:-1:-1;;;34816:827:0:o;37186:729::-;37268:12;-1:-1:-1;;;;;37302:17:0;;37293:53;;;;-1:-1:-1;;;37293:53:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37376:16:0;;;;;;:9;:16;;;;;;;;37393:10;37376:28;;;;;;;;37366:38;;;37357:79;;;;-1:-1:-1;;;37357:79:0;;;;;;;:::i;:::-;37465:30;37489:5;37465:23;:30::i;:::-;37456:39;37447:75;;;;-1:-1:-1;;;37447:75:0;;;;;;;:::i;:::-;37562:35;37590:6;37562:19;37575:5;37562:12;:19::i;:35::-;-1:-1:-1;;;;;37542:16:0;;;;;;:9;:16;;;;;;:55;;37533:98;;;;-1:-1:-1;;;37533:98:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37675:16:0;;;;;;:9;:16;;;;;;;;37692:10;37675:28;;;;;;;;:44;;37712:6;37675:36;:44::i;:::-;-1:-1:-1;;;;;37644:16:0;;;;;;:9;:16;;;;;;;;37661:10;37644:28;;;;;;;:75;;;;37749:16;;;:9;:16;;;;;:32;;37774:6;37749:24;:32::i;:::-;-1:-1:-1;;;;;37730:16:0;;;;;;;:9;:16;;;;;;:51;;;;37809:14;;;;;;;:30;;37832:6;37809:22;:30::i;:::-;-1:-1:-1;;;;;37792:14:0;;;;;;;:9;:14;;;;;;;:47;;;;37857:28;;;;;;;;;;37878:6;;37857:28;:::i;:::-;;;;;;;;-1:-1:-1;37903:4:0;37186:729;;;;;:::o;22449:2383::-;22537:12;-1:-1:-1;;;;;22576:17:0;;22568:50;;;;-1:-1:-1;;;22568:50:0;;;;;;;:::i;:::-;22637:28;22654:10;22637:16;:28::i;:::-;22629:37;;;;;;-1:-1:-1;;;;;22679:16:0;;;;;;;:4;:16;;;;;;;;22696:10;22679:28;;;;;;;;;:50;;-1:-1:-1;;;;;;22679:50:0;;;;;;;;;-1:-1:-1;22740:47:0;:56;;;22812:53;;;;;;22740:56;;22812:53;:::i;:::-;;;;;;;;-1:-1:-1;;;;;22900:21:0;;22886:11;22900:21;;;:9;:21;;;;;:31;;:38;;22886:11;22974:423;22995:6;22991:1;:10;22974:423;;;-1:-1:-1;;;;;23083:16:0;;;;;;:4;:16;;;;;;;;23100:9;:21;;;;;:31;;:34;;23083:16;;;23132:1;;23100:34;;;;;;;;;;;;;;;;;:39;-1:-1:-1;;;;;23100:39:0;;;23083:57;;;;;;;;;;;;;;;:73;23076:80;;;23083:73;;23076:80;:187;;;;-1:-1:-1;;;;;;23187:16:0;;;;;;:4;:16;;;;;;;;23204:9;:21;;;;;:31;;:34;;23187:16;;;23236:1;;23204:34;;;;;;;;;;;;;;;;;:39;-1:-1:-1;;;;;23204:39:0;23187:57;;;;;;;;;;;;23204:39;23187:76;;23177:86;;23076:187;23072:260;;;-1:-1:-1;;;;;23292:21:0;;;;;;:9;:21;;;;;:31;;:34;;23324:1;;23292:34;;;;;;;;;;;;;;;:40;-1:-1:-1;;;23292:40:0;;-1:-1:-1;;;;;23292:40:0;23283:49;;;;;23072:260;23003:3;;22974:423;;;;23429:32;23450:10;23429:20;:32::i;:::-;23421:40;;:4;:40;:97;;;;-1:-1:-1;;;;;;23487:21:0;;;;;;:9;:21;;;;;:31;;;-1:-1:-1;;;;;23487:31:0;23478:40;;;23421:97;23417:1376;;;-1:-1:-1;;;;;23594:21:0;;;;;;:9;:21;;;;;:38;23584:48;;;23576:89;;;;-1:-1:-1;;;23576:89:0;;;;;;;:::i;:::-;23763:6;23758:618;23779:6;23775:1;:10;23758:618;;;-1:-1:-1;;;;;23886:16:0;;;;;;:4;:16;;;;;;;;23903:9;:21;;;;;:31;;:34;;23886:16;;;23935:1;;23903:34;;;;;;;;;;;;;;;;;:39;-1:-1:-1;;;;;23903:39:0;;;23886:57;;;;;;;;;;;;;;;:73;23879:80;;;23886:73;;23879:80;:191;;;;-1:-1:-1;;;;;;23994:16:0;;;;;;:4;:16;;;;;;;;24011:9;:21;;;;;:31;;:34;;23994:16;;;24043:1;;24011:34;;;;;;;;;;;;;;;;;:39;-1:-1:-1;;;;;24011:39:0;23994:57;;;;;;;;;;;;24011:39;23994:76;;23984:86;;23879:191;23875:486;;;-1:-1:-1;;;;;24116:16:0;;24200:1;24116:16;;;:4;:16;;;;;;;;24133:9;:21;;;;;:31;;:34;;24200:1;;24133:31;24165:1;;24133:34;;;;;;;;;;;;;;;;;;:39;-1:-1:-1;;;;;24133:39:0;;;24116:57;;;;;;;;;;;;;;;:86;;-1:-1:-1;;;;;;24116:86:0;;;;;;;;;;;24240:16;;;;;:4;:16;;;;;24257:9;:21;;;;;-1:-1:-1;24257:31:0;:34;;24133;;24240:16;24133:34;;24257:31;24289:1;;24257:34;;;;;;;;;;;;;;;;;:39;-1:-1:-1;;;;;24257:39:0;24240:57;;;;;;;;;;;;24257:39;24240:76;:80;23875:486;23787:3;;23758:618;;;-1:-1:-1;;;;;;24445:21:0;;;;;;:9;:21;;;;;:38;:54;;24492:6;24445:46;:54::i;:::-;-1:-1:-1;;;;;24404:21:0;;;;;;;:9;:21;;;;;;;;:95;;;;24561:14;;;;;:9;:14;;;;;:30;;24584:6;24561:22;:30::i;:::-;-1:-1:-1;;;;;24544:14:0;;;;;;;:9;:14;;;;;;;:47;;;;24657:42;;;;;;;;;;24692:6;;24657:42;:::i;:::-;;;;;;;;24728:11;;:27;;24748:6;24728:19;:27::i;:::-;24714:11;:41;23417:1376;-1:-1:-1;24820:4:0;;22449:2383;-1:-1:-1;;;;;22449:2383:0:o;13495:984::-;13604:10;13566:12;13599:16;;;:4;:16;;;;;:26;;;:36;;13591:63;;;;-1:-1:-1;;;13591:63:0;;;;;;;:::i;:::-;13698:40;13731:6;13698:24;13711:10;13698:12;:24::i;:40::-;13683:10;13673:21;;;;:9;:21;;;;;;:65;;13665:108;;;;-1:-1:-1;;;13665:108:0;;;;;;;:::i;:::-;13810:10;13805:16;;;;:4;:16;;;;;:23;-1:-1:-1;;;;;13794:34:0;;;13805:23;;13794:34;13786:62;;;;-1:-1:-1;;;13786:62:0;;;;;;;:::i;:::-;13869:24;13882:10;13869:12;:24::i;:::-;13861:117;;13943:10;13938:16;;;;:4;:16;;;;;:28;;;;-1:-1:-1;;;13938:28:0;;-1:-1:-1;;;;;13938:28:0;-1:-1:-1;;13910:56:0;;;;;;13861:117;14017:40;14050:6;14017:24;14030:10;14017:12;:24::i;:40::-;13993:10;13988:16;;;;:4;:16;;;;;:26;;:69;14082:11;;:27;;14102:6;14082:19;:27::i;:::-;14068:11;:41;14172:10;14167:16;;;;:4;:16;;;;;:36;;;-1:-1:-1;;;14167:36:0;;;;14160:43;;:4;:43;14156:107;;;14224:10;14258:5;14219:16;;;:4;:16;;;;;:36;;:44;;-1:-1:-1;;;;14219:44:0;;;14156:107;14369:10;14398:16;;;;:4;:16;;;;;;;:25;;;14358:66;;-1:-1:-1;;;;;14358:66:0;;;14369:10;14358:66;;;;14390:6;;-1:-1:-1;;;;;14398:25:0;;;;14358:66;:::i;:::-;;;;;;;;14435:14;:12;:14::i;942:21::-;;;;;;:::o;9026:176::-;-1:-1:-1;;;;;9110:11:0;;9084:14;9110:11;;;:4;:11;;;;;:20;;;9133:15;-1:-1:-1;;;;;9110:20:0;;;:38;:84;;-1:-1:-1;9193:1:0;;9110:84;;;-1:-1:-1;;;;;;9160:11:0;;;;;;:4;:11;;;;;:21;;;;9110:84;;9026:176;;;:::o;10647:208::-;10734:10;10705:12;10729:16;;;:4;:16;;;;;;:36;;:45;;-1:-1:-1;;;;10729:45:0;-1:-1:-1;;;10729:45:0;;;;;;;10790:35;10705:12;;10734:10;10790:35;;;;10729:45;;10790:35;:::i;:::-;;;;;;;;-1:-1:-1;10843:4:0;10647:208;;;:::o;18019:740::-;-1:-1:-1;;;;;18146:21:0;;18085:14;18146:21;;;:9;:21;;;;;:31;;;:38;18199:32;;;;;18085:14;;18146:38;18234:15;-1:-1:-1;;;18199:32:0;;;-1:-1:-1;;;;;18199:32:0;:50;:91;;;;-1:-1:-1;;;;;;18253:21:0;;;;;;:9;:21;;;;;:32;;;-1:-1:-1;;;18253:32:0;;-1:-1:-1;;;;;18253:32:0;:37;;18199:91;18195:534;;;18328:26;18343:10;18328:14;:26::i;:::-;;18195:534;;;18427:6;18422:296;18443:6;18439:1;:10;18422:296;;;-1:-1:-1;;;;;18486:21:0;;;;;;:9;:21;;;;;:31;;:34;;18518:1;;18486:34;;;;;;;;;;;;;;;:44;-1:-1:-1;;;18486:44:0;;;;18478:52;;:4;:52;18475:228;;;-1:-1:-1;;;;;18563:21:0;;;;;;:9;:21;;;;;:31;;:34;;18595:1;;18563:34;;;;;;;;;;;;;;;;;:40;-1:-1:-1;;;;;18639:21:0;;;;:9;:21;;;;;;;:31;;;-1:-1:-1;;;;;;;;18563:40:0;;;;;18554:49;;;;;18639:31;18630:40;;18626:57;;18679:4;18672:11;;;;;;;18626:57;18451:3;;18422:296;;;;18195:534;-1:-1:-1;18746:5:0;;18019:740;-1:-1:-1;;;18019:740:0:o;38132:465::-;38178:12;38237:40;38270:6;38237:24;38250:10;38237:12;:24::i;:40::-;38222:10;38212:21;;;;:9;:21;;;;;;:65;;38203:109;;;;-1:-1:-1;;;38203:109:0;;;;;;;:::i;:::-;38341:35;38365:10;38341:23;:35::i;:::-;38332:44;38323:80;;;;-1:-1:-1;;;38323:80:0;;;;;;;:::i;:::-;38450:10;38440:21;;;;:9;:21;;;;;;:37;;38470:6;38440:29;:37::i;:::-;38426:10;38416:21;;;;:9;:21;;;;;:61;38501:10;;:26;;38520:6;38501:18;:26::i;:::-;38488:10;:39;38543:24;;38548:10;;38543:24;;;;38560:6;;38543:24;:::i;15144:464::-;15213:12;15256:17;15269:3;15256:12;:17::i;:::-;15246:6;:27;;15238:65;;;;-1:-1:-1;;;15238:65:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15337:9:0;;;;;;;:4;:9;;;;;:16;;15323:10;:30;15314:63;;;;-1:-1:-1;;;15314:63:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15413:9:0;;;;;;:4;:9;;;;;:19;;;:35;;15441:6;15413:27;:35::i;:::-;-1:-1:-1;;;;;15391:9:0;;;;;;:4;:9;;;;;:19;;:57;15473:11;;:27;;15493:6;15473:19;:27::i;:::-;15459:11;:41;15538:40;;-1:-1:-1;;;;;15538:40:0;;;15554:10;;15538:40;;;;15571:6;;15538:40;:::i;1010:26::-;;;;:::o;7979:211::-;8052:12;8085:17;8098:3;8085:12;:17::i;:::-;8077:53;;8104:26;;-1:-1:-1;;;8104:26:0;;;;;;;:::i;8077:53::-;8148:34;8169:3;8173:6;8180:1;8148:20;:34::i;:::-;8141:41;7979:211;-1:-1:-1;;;7979:211:0:o;33190:1351::-;33250:12;33283:22;33294:10;33283;:22::i;:::-;:50;;;-1:-1:-1;33309:10:0;-1:-1:-1;;;;;33309:24:0;;;33283:50;33275:59;;;;;;-1:-1:-1;;;;;33390:21:0;;33355:10;33390:21;;;:9;:21;;;;;:31;;:38;33355:10;33439:200;33460:6;33456:1;:10;33439:200;;;-1:-1:-1;;;;;33499:21:0;;;;;;:9;:21;;;;;:31;;:34;;33531:1;;33499:34;;;;;;;;;;;;;;;:44;-1:-1:-1;;;33499:44:0;;;;33491:52;;:4;:52;33488:140;;;-1:-1:-1;;;;;33572:21:0;;;;;;:9;:21;;;;;:31;;:34;;33604:1;;33572:34;;;;;;;;;;;;;;;:40;-1:-1:-1;;;33572:40:0;;-1:-1:-1;;;;;33572:40:0;33563:49;;;;;33488:140;33468:3;;33439:200;;;-1:-1:-1;;;;;;33675:21:0;;;;;;:9;:21;;;;;:31;;;-1:-1:-1;;;;;33675:31:0;33667:39;;;:93;;-1:-1:-1;;;;;;33710:21:0;;;;;;:9;:21;;;;;:32;;;33745:15;-1:-1:-1;;;33710:32:0;;;-1:-1:-1;;;;;33710:32:0;:50;33667:93;33659:102;;;;;;33791:6;33786:141;33807:6;33803:1;:10;33786:141;;;-1:-1:-1;;;;;33842:16:0;;;;;;:4;:16;;;;;;;;33859:9;:21;;;;;:31;;:34;;33842:16;;;33891:1;;33859:34;;;;;;;;;;;;;;;;;:39;-1:-1:-1;;;;;33859:39:0;33842:57;;;;;;;;;;;;33835:64;;-1:-1:-1;;;;;;33835:64:0;;;33859:39;33835:64;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33835:64:0;;;33815:3;33786:141;;;-1:-1:-1;;;;;;33969:21:0;;;33950:16;33969:21;;;:9;:21;;;;;:33;;;;34026:38;;33969:33;;;34079:22;;;;;:35;;;34109:5;34105:1;:9;34079:35;34075:268;;;-1:-1:-1;;;;;34218:19:0;;;;;;:9;:19;;;;;;:34;;34246:5;34218:27;:34::i;:::-;-1:-1:-1;;;;;34196:19:0;;;;;;:9;:19;;;;;:56;34282:11;;:26;;34302:5;34282:19;:26::i;:::-;34268:11;:40;34075:268;-1:-1:-1;;;;;34362:21:0;;;;;;:9;:21;;;;;34355:28;;;34362:21;34355:28;;;;34362:21;34355:28;:::i;:::-;-1:-1:-1;34355:28:0;;;;;-1:-1:-1;;34355:28:0;;;;;;;-1:-1:-1;;;;;;34355:28:0;;;34460:51;;-1:-1:-1;;;;;34460:51:0;;;;;;;;34474:10;;34460:51;;;;34505:5;;34460:51;:::i;:::-;;;;;;;;-1:-1:-1;34529:4:0;;33190:1351;-1:-1:-1;;;;;33190:1351:0:o;16224:1526::-;16546:4;16594:1;16577:14;:18;16569:48;;;;-1:-1:-1;;;16569:48:0;;;;;;;:::i;:::-;16645:32;16666:10;16645:20;:32::i;:::-;16636:41;16628:71;;;;-1:-1:-1;;;16628:71:0;;;;;;;:::i;:::-;16746:10;:17;16718;:24;:45;16710:79;;;;-1:-1:-1;;;16710:79:0;;;;;;;:::i;:::-;16828:4;16810:24;;;;:9;:24;;;;;:34;;:41;16806:45;16802:80;;16853:29;16876:4;16853:14;:29::i;:::-;;16802:80;16963:6;16958:293;16979:10;:17;16975:1;:21;16958:293;;;17018:17;17038:61;;;;;;;;17047:10;17058:1;17047:13;;;;;;;;;;;;;;-1:-1:-1;;;;;17038:61:0;;;;;17061:31;:17;17079:1;17061:20;;;;;;;;;;;;;;:29;:31::i;:::-;-1:-1:-1;;;;;17038:61:0;;;;;17093:5;17038:61;;;;;;;17124:10;17114:21;;:9;:21;;;;;;17038:61;17114:31;;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17114:39:0;-1:-1:-1;;;;17114:39:0;;;;-1:-1:-1;;;17114:39:0;-1:-1:-1;;;;;;;;;17114:39:0;;;;-1:-1:-1;;;;;;17114:39:0;;;;;;;;;;;;;;;;;;;;;;17203:13;;17018:81;;-1:-1:-1;17203:10:0;;17214:1;;17203:13;;;;;;;;;;;;-1:-1:-1;;;;;17173:66:0;17191:10;-1:-1:-1;;;;;17173:66:0;;17218:17;17236:1;17218:20;;;;;;;;;;;;;;17173:66;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;16998:3:0;;16958:293;;;;17295:25;:14;:23;:25::i;:::-;17271:10;17261:21;;;;:9;:21;;;;;:31;;:59;;-1:-1:-1;;17261:59:0;-1:-1:-1;;;;;17261:59:0;;;;;;;;;;17366:51;17399:6;17383:22;;17367:15;:38;17366:49;:51::i;:::-;17341:10;17331:21;;;;:9;:21;;;;;:32;;:86;;-1:-1:-1;;;;;17331:86:0;;;;-1:-1:-1;;;17331:86:0;-1:-1:-1;;;;17331:86:0;;;;;;;;;-1:-1:-1;;;;;17442:26:0;;;17438:185;;17494:10;17484:21;;;;:9;:21;;;;;:33;;:48;;-1:-1:-1;;;;;;17484:48:0;-1:-1:-1;;;;;17484:48:0;;;;;17438:185;;;17601:10;17565:21;;;;:9;:21;;;;;:33;;:46;;-1:-1:-1;;;;;;17565:46:0;;;;;;17438:185;17664:10;-1:-1:-1;;;;;17648:72:0;;17675:14;17690:12;17704:15;17648:72;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;17738:4:0;16224:1526;;;;;;;:::o;12476:669::-;12562:12;12613:33;12639:6;12613:17;12626:3;12613:12;:17::i;:33::-;-1:-1:-1;;;;;12595:14:0;;;;;;:9;:14;;;;;;:51;;12587:92;;;;-1:-1:-1;;;12587:92:0;;;;;;;:::i;:::-;12698:17;12711:3;12698:12;:17::i;:::-;12694:21;12690:180;;-1:-1:-1;;;;;12755:9:0;;;;;;;:4;:9;;;;;:16;;12741:10;:30;12732:63;;;;-1:-1:-1;;;12732:63:0;;;;;;;:::i;:::-;12820:18;;12811:46;;;;-1:-1:-1;;;12811:46:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12880:9:0;;;;;;:4;:9;;;;;:19;;:28;;;12943:53;12944:15;12978:6;12962:22;;12944:40;12943:51;:53::i;:::-;-1:-1:-1;;;;;12919:9:0;;;;;;:4;:9;;;;;;;:21;;;:77;;-1:-1:-1;;;;;12919:77:0;;;;-1:-1:-1;;;12919:77:0;-1:-1:-1;;;;12919:77:0;;;;;;;;;;13007:29;;-1:-1:-1;;;;;;13007:29:0;13026:10;13007:29;;;;;;13062:53;12919:9;;13026:10;13062:53;;;;13093:6;;13101:13;;13062:53;:::i;39407:359::-;39495:10;39457:12;39486:20;;;:8;:20;;;;;;:29;-1:-1:-1;39482:66:0;;;39517:31;;-1:-1:-1;;;39517:31:0;;;;;;;:::i;39482:66::-;39593:10;39584:20;;;;:8;:20;;;;;;:36;;39613:6;39584:28;:36::i;:::-;39570:10;39561:20;;;;:8;:20;;;;;;;;:59;;;;39655:9;:21;;;;:37;;39685:6;39655:29;:37::i;:::-;39641:10;39631:21;;;;:9;:21;;;;;;;:61;;;;39708:28;;;;;;39729:6;;39708:28;:::i;18969:397::-;-1:-1:-1;;;;;19070:21:0;;19030:13;19070:21;;;:9;:21;;;;;:31;;:38;19127:10;19119:42;;;;-1:-1:-1;;;19119:42:0;;;;;;;:::i;:::-;19177:6;19172:164;19193:6;19189:1;:10;19172:164;;;-1:-1:-1;;;;;19239:21:0;;;;;;:9;:21;;;;;:31;;:34;;19271:1;;19239:34;;;;;;;;;;;;;;;:39;-1:-1:-1;;;;;19239:39:0;19225:10;:53;19221:104;;;19305:4;19298:11;;;;;;19221:104;19201:3;;19172:164;;1045:45;;;;;;;;;;;;;:::o;29352:1265::-;29439:12;-1:-1:-1;;;;;29478:29:0;;29469:57;;;;-1:-1:-1;;;29469:57:0;;;;;;;:::i;:::-;29546:28;29563:10;29546:16;:28::i;:::-;29537:38;;;;;;-1:-1:-1;;;;;29586:16:0;;;;;;;:4;:16;;;;;;;;29603:10;29586:28;;;;;;;;;:40;;:58;;-1:-1:-1;;;;;;29586:58:0;;;;;;;;;;;29683;29586:16;;29603:10;29683:58;;;;29586;;29683;:::i;:::-;;;;;;;;-1:-1:-1;;;;;29776:21:0;;29762:11;29776:21;;;:9;:21;;;;;:31;;:38;;29762:11;29850:308;29871:6;29867:1;:10;29850:308;;;-1:-1:-1;;;;;29956:16:0;;;;;;:4;:16;;;;;;;;29973:9;:21;;;;;:31;;:34;;29956:16;;;30005:1;;29973:34;;;;;;;;;;;;;;;;;:39;-1:-1:-1;;;;;29973:39:0;;;29956:57;;;;;;;;;;;;;;;:69;;;29937:88;;;29956:69;;29937:88;29933:161;;;-1:-1:-1;;;;;30054:21:0;;;;;;:9;:21;;;;;:31;;:34;;30086:1;;30054:34;;;;;;;;;;;;;;;:40;-1:-1:-1;;;30054:40:0;;-1:-1:-1;;;;;30054:40:0;30045:49;;;;;29933:161;29879:3;;29850:308;;;;30190:32;30211:10;30190:20;:32::i;:::-;30182:40;;:4;:40;:97;;;;-1:-1:-1;;;;;;30248:21:0;;;;;;:9;:21;;;;;:31;;;-1:-1:-1;;;;;30248:31:0;30239:40;;;30182:97;:166;;;;-1:-1:-1;;;;;;30296:21:0;;;;;;;:9;:21;;;;;:33;;;;;:52;;;;;30182:166;30178:400;;;-1:-1:-1;;;;;30396:21:0;;;;;;;:9;:21;;;;;;;:33;;:51;;-1:-1:-1;;;;;;30396:51:0;;;;;;;;;;;30510:56;;;;;;30396:51;;30510:56;:::i;:::-;;;;;;;;30178:400;-1:-1:-1;30605:4:0;;29352:1265;-1:-1:-1;;;;29352:1265:0:o;30840:249::-;30895:12;30935:28;30952:10;30935:16;:28::i;:::-;30926:38;;;;;;-1:-1:-1;;;;;30982:16:0;;;;;;:4;:16;;;;;;;;30999:10;30982:28;;;;;;;;30975:35;;-1:-1:-1;;;;;;30975:35:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30975:35:0;;;31026:33;30999:10;;31026:33;;;-1:-1:-1;31077:4:0;30840:249;;;:::o;915:20::-;;;;;;;;;;;;;;;-1:-1:-1;;915:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35861:563;35924:12;-1:-1:-1;;;;;35952:17:0;;35948:55;;35971:32;;-1:-1:-1;;;35971:32:0;;;;;;;:::i;35948:55::-;36032:35;36056:10;36032:23;:35::i;:::-;36023:44;36014:80;;;;-1:-1:-1;;;36014:80:0;;;;;;;:::i;:::-;36139:40;36172:6;36139:24;36152:10;36139:12;:24::i;:40::-;36124:10;36114:21;;;;:9;:21;;;;;;:65;;36105:108;;;;-1:-1:-1;;;36105:108:0;;;;;;;:::i;:::-;36260:10;36250:21;;;;:9;:21;;;;;;:37;;36280:6;36250:29;:37::i;:::-;36236:10;36226:21;;;;:9;:21;;;;;;:61;;;;-1:-1:-1;;;;;36315:14:0;;;;;;:30;;36338:6;36315:22;:30::i;:::-;-1:-1:-1;;;;;36298:14:0;;;;;;:9;:14;;;;;;;:47;;;;36361:33;;36370:10;;36361:33;;;;36387:6;;36361:33;:::i;19559:587::-;19620:14;19661:22;19672:10;19661;:22::i;:::-;19653:47;;;;-1:-1:-1;;;19653:47:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19725:21:0;;19711:11;19725:21;;;:9;:21;;;;;:31;;:38;;19774:338;19795:6;19791:1;:10;19774:338;;;-1:-1:-1;;;;;19841:21:0;;;;;;:9;:21;;;;;:31;;:34;;19873:1;;19841:34;;;;;;;;;;;;;;;:39;-1:-1:-1;;;;;19841:39:0;19827:10;:53;19823:278;;;-1:-1:-1;;;;;19912:21:0;;;;;;:9;:21;;;;;:31;;:34;;19944:1;;19912:34;;;;;;;;;;;;;;;:44;-1:-1:-1;;;19912:44:0;;;;19900:151;;-1:-1:-1;;;;;19980:21:0;;;;;;:9;:21;;;;;20027:4;19980:31;;;:34;;20012:1;;19980:34;;;;;;;;;;;;;;;:51;;;;;-1:-1:-1;;;19980:51:0;-1:-1:-1;;;;19980:51:0;;;;;;;;;19900:151;20081:4;20069:16;;19823:278;19803:3;;19774:338;;;;20122:16;19559:587;;;:::o;27492:1473::-;27571:12;27611:28;27628:10;27611:16;:28::i;:::-;27602:38;;;;;;27667:22;:11;27687:1;27667:19;:22::i;:::-;27653:36;;27773:22;:11;:20;:22::i;:::-;-1:-1:-1;;;;;27731:16:0;;;;;;:4;:16;;;;;;;;27748:10;27731:28;;;;;;;;;:39;;:64;;-1:-1:-1;;;;;27731:64:0;;;;-1:-1:-1;;;27731:64:0;-1:-1:-1;;;;27731:64:0;;;;;;;;;;27833:53;27731:16;;27748:10;27833:53;;;;27874:11;;27833:53;:::i;:::-;;;;;;;;-1:-1:-1;;;;;27921:21:0;;27907:11;27921:21;;;:9;:21;;;;;:31;;:38;;27907:11;27995:303;28016:6;28012:1;:10;27995:303;;;-1:-1:-1;;;;;28097:16:0;;;;;;:4;:16;;;;;;;;28114:9;:21;;;;;:31;;:34;;28097:16;;;28146:1;;28114:34;;;;;;;;;;;;;;;;;:39;-1:-1:-1;;;;;28114:39:0;28097:57;;;;;;;;;;;;:68;;;-1:-1:-1;;;;;;;;28097:68:0;;;;28082:83;;28078:156;;;-1:-1:-1;;;;;28194:21:0;;;;;;:9;:21;;;;;:31;;:34;;28226:1;;28194:34;;;;;;;;;;;;;;;:40;-1:-1:-1;;;28194:40:0;;-1:-1:-1;;;;;28194:40:0;28185:49;;;;;28078:156;28024:3;;27995:303;;;;28330:32;28351:10;28330:20;:32::i;:::-;28322:40;;:4;:40;:97;;;;-1:-1:-1;;;;;;28388:21:0;;;;;;:9;:21;;;;;:31;;;-1:-1:-1;;;;;28388:31:0;28379:40;;;28322:97;28318:608;;;28492:6;28487:162;28508:6;28504:1;:10;28487:162;;;-1:-1:-1;;;;;28540:16:0;;28611:1;28540:16;;;:4;:16;;;;;;;;28557:9;:21;;;;;:31;;:34;;28611:1;;28557:31;28589:1;;28557:34;;;;;;;;;;;;;;;;;:39;-1:-1:-1;;;;;28557:39:0;28540:57;;;;;;;;;;;;:68;;:72;;-1:-1:-1;;;;;28540:72:0;;;;-1:-1:-1;;;28540:72:0;-1:-1:-1;;;;28540:72:0;;;;;;;;;28557:39;28516:3;28487:162;;;;28680:1;28665:16;;;;28752:53;28772:11;28787:6;28771:22;28753:15;:40;28752:51;:53::i;:::-;-1:-1:-1;;;;;28717:21:0;;;;;;:9;:21;;;;;;;:32;;:88;;-1:-1:-1;;;;;28717:88:0;;;;-1:-1:-1;;;28717:88:0;-1:-1:-1;;;;28717:88:0;;;;;;;;;;28863:51;;;;;;28902:11;;28863:51;:::i;1170:44::-;;;;;;;;;;;;;:::o;38827:355::-;38914:10;38875:12;38904:21;;;:9;:21;;;;;;:30;-1:-1:-1;38900:66:0;;;38936:30;;-1:-1:-1;;;38936:30:0;;;;;;;:::i;38900:66::-;39013:10;39003:21;;;;:9;:21;;;;;;:37;;39033:6;39003:29;:37::i;:::-;38989:10;38979:21;;;;:9;:21;;;;;;;;:61;;;;39074:8;:20;;;;:36;;39103:6;39074:28;:36::i;:::-;39060:10;39051:20;;;;:8;:20;;;;;;;:59;;;;39126:26;;;;;;39145:6;;39126:26;:::i;3147:47::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3147:47:0;;;;-1:-1:-1;;;3147:47:0;;;;;;-1:-1:-1;;;3147:47:0;;;;;-1:-1:-1;;;;;3147:47:0;;:::o;9392:192::-;-1:-1:-1;;;;;9481:11:0;;9458;9481;;;:4;:11;;;;;:20;;;9504:15;-1:-1:-1;;;;;9481:20:0;;;:38;:95;;-1:-1:-1;9575:1:0;;9481:95;;;-1:-1:-1;;;;;;9528:11:0;;;;;:4;:11;;;;;:20;;;9551:15;-1:-1:-1;;;;;9528:20:0;;;:38;;9392:192::o;20548:1098::-;20619:12;20658:28;20675:10;20658:16;:28::i;:::-;20650:37;;;;;;-1:-1:-1;;;;;20698:16:0;;;;;;:4;:16;;;;;;;;20715:10;20698:28;;;;;;;;;:40;;:50;;-1:-1:-1;;;;20698:50:0;-1:-1:-1;;;20698:50:0;;;;;;;20764:45;;;;;;20698:50;;20764:45;:::i;:::-;;;;;;;;-1:-1:-1;;;;;20836:21:0;;20822:11;20836:21;;;:9;:21;;;;;:31;;:38;;20822:11;20910:300;20931:6;20927:1;:10;20910:300;;;-1:-1:-1;;;;;21008:16:0;;;;;;:4;:16;;;;;;;;21025:9;:21;;;;;:31;;:34;;21008:16;;;21057:1;;21025:34;;;;;;;;;;;;;;;;;;:39;-1:-1:-1;;;;;21025:39:0;21008:57;;;;;;;;;;;;:69;;;-1:-1:-1;;;21008:69:0;;;;20997:80;;;;;;20993:153;;;-1:-1:-1;;;;;21106:21:0;;;;;;:9;:21;;;;;:31;;:34;;21138:1;;21106:34;;;;;;;;;;;;;;;:40;-1:-1:-1;;;21106:40:0;;-1:-1:-1;;;;;21106:40:0;21097:49;;;;;20993:153;20939:3;;20910:300;;;;21242:32;21263:10;21242:20;:32::i;:::-;21234:40;;:4;:40;:97;;;;-1:-1:-1;;;;;;21300:21:0;;;;;;:9;:21;;;;;:31;;;-1:-1:-1;;;;;21300:31:0;21291:40;;;21234:97;:156;;;;-1:-1:-1;;;;;;21349:21:0;;;;;;:9;:21;;;;;:30;;;;-1:-1:-1;;;21349:30:0;;;;:41;;;;;;;21234:156;21230:377;;;-1:-1:-1;;;;;21470:21:0;;;;;;:9;:21;;;;;;;:30;;:40;;-1:-1:-1;;;;21470:40:0;-1:-1:-1;;;21470:40:0;;;;;;;21563:32;;;;;21470:40;;21563:32;:::i;1097:66::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;6043:1649::-;6141:12;-1:-1:-1;;;;;6175:17:0;;6166:51;;;;-1:-1:-1;;;6166:51:0;;;;;;;:::i;:::-;6246:35;6270:10;6246:23;:35::i;:::-;6237:44;6228:80;;;;-1:-1:-1;;;6228:80:0;;;;;;;:::i;:::-;6353:40;6386:6;6353:24;6366:10;6353:12;:24::i;:40::-;6338:10;6328:21;;;;:9;:21;;;;;;:65;;6319:108;;;;-1:-1:-1;;;6319:108:0;;;;;;;:::i;:::-;6448:17;6461:3;6448:12;:17::i;:::-;6444:21;6440:189;;-1:-1:-1;;;;;6505:9:0;;;;;;;:4;:9;;;;;:16;;6491:10;:30;6482:63;;;;-1:-1:-1;;;6482:63:0;;;;;;;:::i;:::-;6570:18;;6561:55;;;;-1:-1:-1;;;6561:55:0;;;;;;;:::i;:::-;6650:17;6663:3;6650:12;:17::i;:::-;6641:276;;6705:60;6706:47;:15;6746:6;6730:22;;6706:23;:47::i;6705:60::-;-1:-1:-1;;;;;6684:9:0;;;;;;:4;:9;;;;;:18;;;:81;;-1:-1:-1;;;;;6684:81:0;;;;-1:-1:-1;;6684:81:0;;;;;;;;;;6813:28;;-1:-1:-1;;;;;;6813:28:0;6831:10;6813:28;;;6641:276;-1:-1:-1;;;;;6951:9:0;;;;;;:4;:9;;;;;:19;;;:35;;6979:6;6951:27;:35::i;:::-;-1:-1:-1;;;;;6929:9:0;;;;;;:4;:9;;;;;;;;:19;;:57;;;;7073:10;7063:21;;:9;:21;;;;:37;;7093:6;7063:29;:37::i;:::-;7049:10;7039:21;;;;:9;:21;;;;;;:61;;;;-1:-1:-1;;;;;7176:14:0;;;;;;:30;;7199:6;7176:22;:30::i;:::-;-1:-1:-1;;;;;7159:14:0;;;;;;:9;:14;;;;;;;;:47;;;;7297:4;:9;;;:29;;;-1:-1:-1;;;7297:29:0;;;;7289:37;;:4;:37;7285:94;;;-1:-1:-1;;;;;7342:9:0;;7374:5;7342:9;;;:4;:9;;;;;:29;;:37;;-1:-1:-1;;;;7342:37:0;;;7285:94;-1:-1:-1;;;;;7505:77:0;;7547:9;;;;:4;:9;;;;;;;:18;;;7505:77;;7522:10;;7505:77;;;;7539:6;;-1:-1:-1;;;;;7547:18:0;;;;7568:13;;7505:77;:::i;:::-;;;;;;;;7609:11;;:27;;7629:6;7609:19;:27::i;:::-;7595:11;:41;-1:-1:-1;7680:4:0;6043:1649;;;;;:::o;21879:139::-;-1:-1:-1;;;;;21980:21:0;21952:9;21980:21;;;:9;:21;;;;;:30;;;-1:-1:-1;;;21980:30:0;;;;;21879:139::o;1774:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1774:47:0;;;;;;-1:-1:-1;;;;;1774:47:0;;;;;-1:-1:-1;;;1774:47:0;;;;-1:-1:-1;;;1774:47:0;;;;;;;;:::o;25230:1872::-;25305:12;25344:28;25361:10;25344:16;:28::i;:::-;25336:37;;;;;;25395:6;25392:1;:9;25384:18;;;;;;-1:-1:-1;;;;;25423:16:0;;;;;;:4;:16;;;;;;;;25440:10;25423:28;;;;;;;;;:35;;:44;;;25505:49;;;;;;25461:6;;25505:49;:::i;:::-;;;;;;;;-1:-1:-1;;;;;25589:21:0;;25575:11;25589:21;;;:9;:21;;;;;:31;;:38;;25575:11;25663:295;25684:6;25680:1;:10;25663:295;;;-1:-1:-1;;;;;25760:16:0;;;;;;:4;:16;;;;;;;;25777:9;:21;;;;;:31;;:34;;25760:16;;;25809:1;;25777:34;;;;;;;;;;;;;;;;;:39;-1:-1:-1;;;;;25777:39:0;25760:57;;;;;;;;;;;;:64;;;25750:74;;25746:147;;;-1:-1:-1;;;;;25853:21:0;;;;;;:9;:21;;;;;:31;;:34;;25885:1;;25853:34;;;;;;;;;;;;;;;:40;-1:-1:-1;;;25853:40:0;;-1:-1:-1;;;;;25853:40:0;25844:49;;;;;25746:147;25692:3;;25663:295;;;;25982:32;26003:10;25982:20;:32::i;:::-;25974:40;;:4;:40;:97;;;;-1:-1:-1;;;;;;26040:21:0;;;;;;:9;:21;;;;;:31;;;-1:-1:-1;;;;;26040:31:0;26031:40;;;25974:97;:179;;;;;26113:40;26146:6;26113:24;26126:10;26113:12;:24::i;:40::-;-1:-1:-1;;;;;26088:21:0;;;;;;:9;:21;;;;;;:65;;25974:179;25970:1093;;;26317:6;26312:280;26333:6;26329:1;:10;26312:280;;;-1:-1:-1;;;;;26400:16:0;;;;;;:4;:16;;;;;;;;26417:9;:21;;;;;:31;;:34;;26400:16;;;26449:1;;26417:34;;;;;;;;;;;;;;;;;:39;-1:-1:-1;;;;;26417:39:0;26400:57;;;;;;;;;;;;:64;;;26390:74;;26386:170;;;-1:-1:-1;;;;;26488:16:0;;26555:1;26488:16;;;:4;:16;;;;;;;;26505:9;:21;;;;;:31;;:34;;26555:1;;26505:31;26537:1;;26505:34;;;;;;;;;;;;;;;;;:39;-1:-1:-1;;;;;26505:39:0;26488:57;;;;;;;;;;;;:64;;:68;26386:170;26341:3;;26312:280;;;-1:-1:-1;;;;;;26630:21:0;;;;;;:9;:21;;;;;;:37;;26660:6;26630:29;:37::i;:::-;-1:-1:-1;;;;;26606:21:0;;;;;;:9;:21;;;;;;;;:61;;;;26783:9;:21;;;:38;:54;;26830:6;26783:46;:54::i;:::-;-1:-1:-1;;;;;26742:21:0;;;;;;:9;:21;;;;;;;:95;;;;26885:35;;;;;;26913:6;;26885:35;:::i;:::-;;;;;;;;26949:11;;:27;;26969:6;26949:19;:27::i;:::-;26935:11;:41;-1:-1:-1;27090:4:0;;25230:1872;-1:-1:-1;;;;25230:1872:0:o;8466:369::-;-1:-1:-1;;;;;8551:11:0;;8521:14;8551:11;;;:4;:11;;;;;:20;;;8575:15;-1:-1:-1;;;;;8551:20:0;;;:39;8547:242;;-1:-1:-1;;;;;8641:11:0;;;;;;:4;:11;;;;;:21;;;8621:11;;:42;;:19;:42::i;:::-;8607:11;:56;-1:-1:-1;;;;;8709:11:0;;8733:1;8709:11;;;:4;:11;;;;;:21;;:25;8547:242;-1:-1:-1;;;;;;8806:11:0;;;;;:4;:11;;;;;:21;;;;8466:369::o;360:137::-;457:5;;;452:16;;;;444:45;;;;-1:-1:-1;;;444:45:0;;;;;;;:::i;216:136::-;313:5;;;308:16;;;;300:44;;;;-1:-1:-1;;;300:44:0;;;;;;;:::i;509:164::-;566:8;-1:-1:-1;;;594:6:0;:14;586:47;;;;-1:-1:-1;;;586:47:0;;;;;;;:::i;:::-;-1:-1:-1;658:6:0;509:164::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;14:175:1;84:20;;-1:-1:-1;;;;;133:31:1;;123:42;;113:2;;179:1;176;169:12;194:713;;307:3;300:4;292:6;288:17;284:27;274:2;;329:5;322;315:20;274:2;369:6;356:20;395:4;419:65;434:49;480:2;434:49;:::i;:::-;419:65;:::i;:::-;518:15;;;549:12;;;;581:15;;;627:11;;;615:24;;611:33;;608:42;-1:-1:-1;605:2:1;;;667:5;660;653:20;605:2;693:5;707:171;721:2;718:1;715:9;707:171;;;778:25;799:3;778:25;:::i;:::-;766:38;;824:12;;;;856;;;;739:1;732:9;707:171;;;-1:-1:-1;896:5:1;;264:643;-1:-1:-1;;;;;;;264:643:1:o;912:705::-;;1025:3;1018:4;1010:6;1006:17;1002:27;992:2;;1047:5;1040;1033:20;992:2;1087:6;1074:20;1113:4;1137:65;1152:49;1198:2;1152:49;:::i;1137:65::-;1236:15;;;1267:12;;;;1299:15;;;1345:11;;;1333:24;;1329:33;;1326:42;-1:-1:-1;1323:2:1;;;1385:5;1378;1371:20;1323:2;1411:5;1425:163;1439:2;1436:1;1433:9;1425:163;;;1496:17;;1484:30;;1534:12;;;;1566;;;;1457:1;1450:9;1425:163;;1622:162;1689:20;;1745:13;;1738:21;1728:32;;1718:2;;1774:1;1771;1764:12;1789:198;;1901:2;1889:9;1880:7;1876:23;1872:32;1869:2;;;1922:6;1914;1907:22;1869:2;1950:31;1971:9;1950:31;:::i;1992:274::-;;;2121:2;2109:9;2100:7;2096:23;2092:32;2089:2;;;2142:6;2134;2127:22;2089:2;2170:31;2191:9;2170:31;:::i;:::-;2160:41;;2220:40;2256:2;2245:9;2241:18;2220:40;:::i;:::-;2210:50;;2079:187;;;;;:::o;2271:342::-;;;;2417:2;2405:9;2396:7;2392:23;2388:32;2385:2;;;2438:6;2430;2423:22;2385:2;2466:31;2487:9;2466:31;:::i;:::-;2456:41;;2516:40;2552:2;2541:9;2537:18;2516:40;:::i;:::-;2506:50;;2603:2;2592:9;2588:18;2575:32;2565:42;;2375:238;;;;;:::o;2618:268::-;;;2744:2;2732:9;2723:7;2719:23;2715:32;2712:2;;;2765:6;2757;2750:22;2712:2;2793:31;2814:9;2793:31;:::i;:::-;2783:41;;2843:37;2876:2;2865:9;2861:18;2843:37;:::i;2891:266::-;;;3020:2;3008:9;2999:7;2995:23;2991:32;2988:2;;;3041:6;3033;3026:22;2988:2;3069:31;3090:9;3069:31;:::i;:::-;3059:41;3147:2;3132:18;;;;3119:32;;-1:-1:-1;;;2978:179:1:o;3162:334::-;;;;3308:2;3296:9;3287:7;3283:23;3279:32;3276:2;;;3329:6;3321;3314:22;3276:2;3357:31;3378:9;3357:31;:::i;:::-;3347:41;3435:2;3420:18;;3407:32;;-1:-1:-1;3486:2:1;3471:18;;;3458:32;;3266:230;-1:-1:-1;;;3266:230:1:o;3501:637::-;;;3680:2;3668:9;3659:7;3655:23;3651:32;3648:2;;;3701:6;3693;3686:22;3648:2;3746:9;3733:23;-1:-1:-1;;;;;3816:2:1;3808:6;3805:14;3802:2;;;3837:6;3829;3822:22;3802:2;3865:67;3924:7;3915:6;3904:9;3900:22;3865:67;:::i;:::-;3855:77;;3985:2;3974:9;3970:18;3957:32;3941:48;;4014:2;4004:8;4001:16;3998:2;;;4035:6;4027;4020:22;3998:2;;4063:69;4124:7;4113:8;4102:9;4098:24;4063:69;:::i;:::-;4053:79;;;3638:500;;;;;:::o;4143:851::-;;;;;;4373:3;4361:9;4352:7;4348:23;4344:33;4341:2;;;4395:6;4387;4380:22;4341:2;4440:9;4427:23;-1:-1:-1;;;;;4510:2:1;4502:6;4499:14;4496:2;;;4531:6;4523;4516:22;4496:2;4559:67;4618:7;4609:6;4598:9;4594:22;4559:67;:::i;:::-;4549:77;;4679:2;4668:9;4664:18;4651:32;4635:48;;4708:2;4698:8;4695:16;4692:2;;;4729:6;4721;4714:22;4692:2;;4757:69;4818:7;4807:8;4796:9;4792:24;4757:69;:::i;:::-;4747:79;;;4873:2;4862:9;4858:18;4845:32;4835:42;;4896:40;4932:2;4921:9;4917:18;4896:40;:::i;:::-;4331:663;;;;-1:-1:-1;4331:663:1;;4983:3;4968:19;4955:33;;4331:663;-1:-1:-1;;4331:663:1:o;4999:192::-;;5108:2;5096:9;5087:7;5083:23;5079:32;5076:2;;;5129:6;5121;5114:22;5076:2;5157:28;5175:9;5157:28;:::i;5196:190::-;;5308:2;5296:9;5287:7;5283:23;5279:32;5276:2;;;5329:6;5321;5314:22;5276:2;-1:-1:-1;5357:23:1;;5266:120;-1:-1:-1;5266:120:1:o;5391:203::-;-1:-1:-1;;;;;5555:32:1;;;;5537:51;;5525:2;5510:18;;5492:102::o;5599:622::-;-1:-1:-1;;;;;5894:32:1;;;;5876:51;;5958:2;5943:18;;5936:34;;;;-1:-1:-1;;;;;6043:15:1;;;6038:2;6023:18;;6016:43;6102:14;;6095:22;6090:2;6075:18;;6068:50;6155:15;6149:3;6134:19;;6127:44;5914:3;6187:19;;6180:35;5863:3;5848:19;;5830:391::o;6226:913::-;6447:2;6499:21;;;6569:13;;6472:18;;;6591:22;;;6226:913;;6447:2;6632;;6650:18;;;;6691:15;;;6226:913;6737:376;6751:6;6748:1;6745:13;6737:376;;;6810:13;;6852:9;;-1:-1:-1;;;;;6848:35:1;6836:48;;6928:11;;;6922:18;-1:-1:-1;;;;;6918:43:1;6904:12;;;6897:65;7016:11;;7010:18;7003:26;6996:34;6982:12;;;6975:56;7060:4;7051:14;;;;7088:15;;;;6880:1;6766:9;6737:376;;;-1:-1:-1;7130:3:1;;6427:712;-1:-1:-1;;;;;;;6427:712:1:o;7144:187::-;7309:14;;7302:22;7284:41;;7272:2;7257:18;;7239:92::o;7336:603::-;;7477:2;7506;7495:9;7488:21;7538:6;7532:13;7581:6;7576:2;7565:9;7561:18;7554:34;7606:4;7619:140;7633:6;7630:1;7627:13;7619:140;;;7728:14;;;7724:23;;7718:30;7694:17;;;7713:2;7690:26;7683:66;7648:10;;7619:140;;;7777:6;7774:1;7771:13;7768:2;;;7847:4;7842:2;7833:6;7822:9;7818:22;7814:31;7807:45;7768:2;-1:-1:-1;7923:2:1;7902:15;-1:-1:-1;;7898:29:1;7883:45;;;;7930:2;7879:54;;7457:482;-1:-1:-1;;;7457:482:1:o;7944:342::-;8146:2;8128:21;;;8185:2;8165:18;;;8158:30;-1:-1:-1;;;8219:2:1;8204:18;;8197:48;8277:2;8262:18;;8118:168::o;8291:348::-;8493:2;8475:21;;;8532:2;8512:18;;;8505:30;8571:26;8566:2;8551:18;;8544:54;8630:2;8615:18;;8465:174::o;8644:341::-;8846:2;8828:21;;;8885:2;8865:18;;;8858:30;-1:-1:-1;;;8919:2:1;8904:18;;8897:47;8976:2;8961:18;;8818:167::o;8990:343::-;9192:2;9174:21;;;9231:2;9211:18;;;9204:30;-1:-1:-1;;;9265:2:1;9250:18;;9243:49;9324:2;9309:18;;9164:169::o;9338:352::-;9540:2;9522:21;;;9579:2;9559:18;;;9552:30;9618;9613:2;9598:18;;9591:58;9681:2;9666:18;;9512:178::o;9695:346::-;9897:2;9879:21;;;9936:2;9916:18;;;9909:30;-1:-1:-1;;;9970:2:1;9955:18;;9948:52;10032:2;10017:18;;9869:172::o;10046:352::-;10248:2;10230:21;;;10287:2;10267:18;;;10260:30;10326;10321:2;10306:18;;10299:58;10389:2;10374:18;;10220:178::o;10403:340::-;10605:2;10587:21;;;10644:2;10624:18;;;10617:30;-1:-1:-1;;;10678:2:1;10663:18;;10656:46;10734:2;10719:18;;10577:166::o;10748:346::-;10950:2;10932:21;;;10989:2;10969:18;;;10962:30;-1:-1:-1;;;11023:2:1;11008:18;;11001:52;11085:2;11070:18;;10922:172::o;11099:346::-;11301:2;11283:21;;;11340:2;11320:18;;;11313:30;-1:-1:-1;;;11374:2:1;11359:18;;11352:52;11436:2;11421:18;;11273:172::o;11450:337::-;11652:2;11634:21;;;11691:2;11671:18;;;11664:30;-1:-1:-1;;;11725:2:1;11710:18;;11703:43;11778:2;11763:18;;11624:163::o;11792:345::-;11994:2;11976:21;;;12033:2;12013:18;;;12006:30;-1:-1:-1;;;12067:2:1;12052:18;;12045:51;12128:2;12113:18;;11966:171::o;12142:344::-;12344:2;12326:21;;;12383:2;12363:18;;;12356:30;-1:-1:-1;;;12417:2:1;12402:18;;12395:50;12477:2;12462:18;;12316:170::o;12491:352::-;12693:2;12675:21;;;12732:2;12712:18;;;12705:30;12771;12766:2;12751:18;;12744:58;12834:2;12819:18;;12665:178::o;12848:339::-;13050:2;13032:21;;;13089:2;13069:18;;;13062:30;-1:-1:-1;;;13123:2:1;13108:18;;13101:45;13178:2;13163:18;;13022:165::o;13192:339::-;13394:2;13376:21;;;13433:2;13413:18;;;13406:30;-1:-1:-1;;;13467:2:1;13452:18;;13445:45;13522:2;13507:18;;13366:165::o;13536:349::-;13738:2;13720:21;;;13777:2;13757:18;;;13750:30;13816:27;13811:2;13796:18;;13789:55;13876:2;13861:18;;13710:175::o;13890:353::-;14092:2;14074:21;;;14131:2;14111:18;;;14104:30;14170:31;14165:2;14150:18;;14143:59;14234:2;14219:18;;14064:179::o;14248:340::-;14450:2;14432:21;;;14489:2;14469:18;;;14462:30;-1:-1:-1;;;14523:2:1;14508:18;;14501:46;14579:2;14564:18;;14422:166::o;14593:339::-;14795:2;14777:21;;;14834:2;14814:18;;;14807:30;-1:-1:-1;;;14868:2:1;14853:18;;14846:45;14923:2;14908:18;;14767:165::o;14937:347::-;15139:2;15121:21;;;15178:2;15158:18;;;15151:30;15217:25;15212:2;15197:18;;15190:53;15275:2;15260:18;;15111:173::o;15289:344::-;15491:2;15473:21;;;15530:2;15510:18;;;15503:30;-1:-1:-1;;;15564:2:1;15549:18;;15542:50;15624:2;15609:18;;15463:170::o;15638:340::-;15840:2;15822:21;;;15879:2;15859:18;;;15852:30;-1:-1:-1;;;15913:2:1;15898:18;;15891:46;15969:2;15954:18;;15812:166::o;15983:339::-;16185:2;16167:21;;;16224:2;16204:18;;;16197:30;-1:-1:-1;;;16258:2:1;16243:18;;16236:45;16313:2;16298:18;;16157:165::o;16327:344::-;16529:2;16511:21;;;16568:2;16548:18;;;16541:30;-1:-1:-1;;;16602:2:1;16587:18;;16580:50;16662:2;16647:18;;16501:170::o;16676:347::-;16878:2;16860:21;;;16917:2;16897:18;;;16890:30;16956:25;16951:2;16936:18;;16929:53;17014:2;16999:18;;16850:173::o;17028:354::-;17230:2;17212:21;;;17269:2;17249:18;;;17242:30;17308:32;17303:2;17288:18;;17281:60;17373:2;17358:18;;17202:180::o;17387:345::-;17589:2;17571:21;;;17628:2;17608:18;;;17601:30;-1:-1:-1;;;17662:2:1;17647:18;;17640:51;17723:2;17708:18;;17561:171::o;17737:681::-;18106:13;;-1:-1:-1;;;;;18102:22:1;;;18084:41;;18181:4;18169:17;;;18163:24;18141:20;;;18134:54;;;;18219:2;18204:18;;18197:34;;;;18267:15;;;;18262:2;18247:18;;18240:43;18327:14;;18320:22;18314:3;18299:19;;18292:51;-1:-1:-1;;;;;18380:31:1;;;18064:3;18359:19;;18352:60;18033:3;18018:19;;18000:418::o;18423:177::-;18569:25;;;18557:2;18542:18;;18524:76::o;18605:345::-;18807:25;;;-1:-1:-1;;;;;18868:32:1;;;;18863:2;18848:18;;18841:60;18932:2;18917:18;;18910:34;18795:2;18780:18;;18762:188::o;18955:248::-;19129:25;;;19185:2;19170:18;;19163:34;19117:2;19102:18;;19084:119::o;19208:272::-;19381:25;;;-1:-1:-1;;;;;19442:31:1;19437:2;19422:18;;19415:59;19369:2;19354:18;;19336:144::o;19485:343::-;19686:25;;;-1:-1:-1;;;;;19747:31:1;;;;19742:2;19727:18;;19720:59;19810:2;19795:18;;19788:34;19674:2;19659:18;;19641:187::o;19833:550::-;20082:25;;;-1:-1:-1;;;;;20180:15:1;;;20175:2;20160:18;;20153:43;20232:15;;;;20227:2;20212:18;;20205:43;20291:14;;20284:22;20279:2;20264:18;;20257:50;-1:-1:-1;;;;;20344:32:1;20338:3;20323:19;;20316:61;20069:3;20054:19;;20036:347::o;20388:184::-;20560:4;20548:17;;;;20530:36;;20518:2;20503:18;;20485:87::o;20577:242::-;20647:2;20641:9;20677:17;;;-1:-1:-1;;;;;20709:34:1;;20745:22;;;20706:62;20703:2;;;20771:9;20703:2;20798;20791:22;20621:198;;-1:-1:-1;20621:198:1:o;20824:183::-;;-1:-1:-1;;;;;20915:6:1;20912:30;20909:2;;;20945:9;20909:2;-1:-1:-1;20996:4:1;20977:17;;;20973:28;;20899:108::o

Swarm Source

ipfs://b39c1d04092983b0274608ccd34ccb526629a9f80edbaaf51f84089b300a436c
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.