ETH Price: $3,496.21 (+4.14%)
Gas: 3 Gwei

Contract

0x2202CB9c00487e7e8EF21e6d8E914B32e709f43d
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Register Delegat...202075442024-06-30 22:38:473 hrs ago1719787127IN
0x2202CB9c...2e709f43d
0 ETH0.000929743.98003886
Register Delegat...202075302024-06-30 22:35:593 hrs ago1719786959IN
0x2202CB9c...2e709f43d
0 ETH0.000874833.58618819
Register Delegat...202075192024-06-30 22:33:473 hrs ago1719786827IN
0x2202CB9c...2e709f43d
0 ETH0.00091434.03048609
Register Delegat...202075002024-06-30 22:29:593 hrs ago1719786599IN
0x2202CB9c...2e709f43d
0 ETH0.001045784.28695493
Register Delegat...202074172024-06-30 22:13:234 hrs ago1719785603IN
0x2202CB9c...2e709f43d
0 ETH0.000609982.50048391
Register Delegat...202036322024-06-30 9:33:3516 hrs ago1719740015IN
0x2202CB9c...2e709f43d
0 ETH0.000628332.40709024
Register Delegat...201974052024-06-29 12:40:5937 hrs ago1719664859IN
0x2202CB9c...2e709f43d
0 ETH0.000619032.53757697
Register Delegat...201653372024-06-25 1:12:236 days ago1719277943IN
0x2202CB9c...2e709f43d
0 ETH0.00080713.0919232
Register Delegat...201099012024-06-17 7:04:4713 days ago1718607887IN
0x2202CB9c...2e709f43d
0 ETH0.000692633.19920955
Register Delegat...201098722024-06-17 6:58:5913 days ago1718607539IN
0x2202CB9c...2e709f43d
0 ETH0.000814593.24928111
Register Delegat...201098352024-06-17 6:51:3513 days ago1718607095IN
0x2202CB9c...2e709f43d
0 ETH0.00076653.14210633
Register Delegat...201084952024-06-17 2:21:3514 days ago1718590895IN
0x2202CB9c...2e709f43d
0 ETH0.000831863.18665898
Register Delegat...201084082024-06-17 2:03:4714 days ago1718589827IN
0x2202CB9c...2e709f43d
0 ETH0.000788423.0202526
Register Delegat...201083932024-06-17 2:00:4714 days ago1718589647IN
0x2202CB9c...2e709f43d
0 ETH0.00075393.59458034
Register Delegat...201061272024-06-16 18:25:1114 days ago1718562311IN
0x2202CB9c...2e709f43d
0 ETH0.000842383.22710362
Revoke Delegatio...201061062024-06-16 18:20:5914 days ago1718562059IN
0x2202CB9c...2e709f43d
0 ETH0.000225853.28829096
Batch Revocation...201060652024-06-16 18:12:4714 days ago1718561567IN
0x2202CB9c...2e709f43d
0 ETH0.000605363.8754821
Register Delegat...200974572024-06-15 13:21:4715 days ago1718457707IN
0x2202CB9c...2e709f43d
0 ETH0.001213544.64920118
Register Delegat...200940002024-06-15 1:42:5916 days ago1718415779IN
0x2202CB9c...2e709f43d
0 ETH0.000794573.04380957
Revoke Delegatio...200937452024-06-15 0:51:5916 days ago1718412719IN
0x2202CB9c...2e709f43d
0 ETH0.000208152.92096725
Revoke Delegatio...200937242024-06-15 0:47:4716 days ago1718412467IN
0x2202CB9c...2e709f43d
0 ETH0.000238513.47210652
Register Delegat...200921062024-06-14 19:21:4716 days ago1718392907IN
0x2202CB9c...2e709f43d
0 ETH0.0029052411.12920776
Register Delegat...200920972024-06-14 19:19:5916 days ago1718392799IN
0x2202CB9c...2e709f43d
0 ETH0.0024656610.10738689
Register Delegat...200891812024-06-14 9:35:1116 days ago1718357711IN
0x2202CB9c...2e709f43d
0 ETH0.00189457.25732753
Register Delegat...200891762024-06-14 9:34:1116 days ago1718357651IN
0x2202CB9c...2e709f43d
0 ETH0.001935457.41420227
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DelegationManagementContract

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-04-24
*/

// SPDX-License-Identifier: MIT

//     _   ______________                                       
//    / | / / ____/_  __/                                       
//   /  |/ / /_    / /                                          
//  / /|  / __/   / /                                           
// /_/ |_/_/ ____/_/_    _______________  ______________  _   __
//    / __ \/ ____/ /   / ____/ ____/   |/_  __/  _/ __ \/ | / /
//   / / / / __/ / /   / __/ / / __/ /| | / /  / // / / /  |/ / 
//  / /_/ / /___/ /___/ /___/ /_/ / ___ |/ / _/ // /_/ / /|  /  
// /_____/_____/_____/_____/\____/_/  |_/_/ /___/\____/_/ |_/   
                                                             

/**
 *
 *  @title: NFTDelegation.com Management Contract
 *  @date: 20-Apr-2023 - 16:27
 *  @version: 5.20.15
 *  @notes: An advanced open-source trustless delegation and consolidation management contract.
 *  @author: 6529 team
 *  @contributors: https://github.com/6529-Collections/nftdelegation/graphs/contributors
 *
 */

pragma solidity ^0.8.18;

contract DelegationManagementContract {
    // Constant declarations
    address constant ALL_COLLECTIONS = 0x8888888888888888888888888888888888888888;
    uint256 constant USE_CASE_SUB_DELEGATION = 998;
    uint256 constant USE_CASE_CONSOLIDATION = 999;

    // Variable declarations
    uint256 public useCaseCounter;

    // Mapping declarations
    mapping(bytes32 => address[]) public delegatorHashes;
    mapping(bytes32 => address[]) public delegationAddressHashes;

    struct GlobalData {
        address delegatorAddress;
        address delegationAddress;
        uint256 registeredDate;
        uint256 expiryDate;
        bool allTokens;
        uint256 tokens;
    }

    // Mapping of GlobalData struct declaration
    mapping(bytes32 => GlobalData[]) public globalDelegationHashes;

    // Events declaration
    event RegisterDelegation(address indexed from, address indexed collectionAddress, address indexed delegationAddress, uint256 useCase, bool allTokens, uint256 _tokenId);
    event RegisterDelegationUsingSubDelegation(address indexed delegator, address from, address indexed collectionAddress, address indexed delegationAddress, uint256 useCase, bool allTokens, uint256 _tokenId);
    event RevokeDelegation(address indexed from, address indexed collectionAddress, address indexed delegationAddress, uint256 useCase);
    event RevokeDelegationUsingSubDelegation(address indexed delegator, address from, address indexed collectionAddress, address indexed delegationAddress, uint256 useCase);
    event UpdateDelegation(address indexed from, address indexed collectionAddress, address olddelegationAddress, address indexed newdelegationAddress, uint256 useCase, bool allTokens, uint256 _tokenId);

    // Locks declarations
    mapping(address => bool) public globalLock;
    mapping(bytes32 => bool) public collectionLock;
    mapping(bytes32 => bool) public collectionUsecaseLock;

    // Constructor
    constructor() {
        useCaseCounter = 999;
    }

    /**
     * @notice Delegator assigns a delegation address for a specific use case on a specific NFT collection for a certain duration
     * @notice _collectionAddress --> ALL_COLLECTIONS = Applies to all collections
     * @notice For all Tokens-- > _allTokens needs to be true, _tokenId does not matter
     */

    function registerDelegationAddress(address _collectionAddress, address _delegationAddress, uint256 _expiryDate, uint256 _useCase, bool _allTokens, uint256 _tokenId) public {
        require((_useCase > 0 && _useCase <= useCaseCounter));
        bytes32 delegatorHash;
        bytes32 delegationAddressHash;
        bytes32 globalHash;
        bytes32 collectionLockHash;
        bytes32 collectionUsecaseLockHash;
        bytes32 collectionUsecaseLockHashAll;
        // Locks
        collectionLockHash = keccak256(abi.encodePacked(_collectionAddress, _delegationAddress));
        collectionUsecaseLockHash = keccak256(abi.encodePacked(_collectionAddress, _delegationAddress, _useCase));
        collectionUsecaseLockHashAll = keccak256(abi.encodePacked(ALL_COLLECTIONS, _delegationAddress, _useCase));
        require(globalLock[_delegationAddress] == false);
        require(collectionLock[collectionLockHash] == false);
        require(collectionUsecaseLock[collectionUsecaseLockHash] == false);
        require(collectionUsecaseLock[collectionUsecaseLockHashAll] == false);
        // Push data to mappings
        globalHash = keccak256(abi.encodePacked(msg.sender, _collectionAddress, _delegationAddress, _useCase));
        delegatorHash = keccak256(abi.encodePacked(msg.sender, _collectionAddress, _useCase));
        // Stores delegation addresses on a delegator hash
        delegationAddressHash = keccak256(abi.encodePacked(_delegationAddress, _collectionAddress, _useCase));
        delegatorHashes[delegatorHash].push(_delegationAddress);
        // Stores delegators addresses on a delegation address hash
        delegationAddressHashes[delegationAddressHash].push(msg.sender);
        // Push additional data to the globalDelegationHashes mapping
        if (_allTokens == true) {
            GlobalData memory newdelegationGlobalData = GlobalData(msg.sender, _delegationAddress, block.timestamp, _expiryDate, true, 0);
            globalDelegationHashes[globalHash].push(newdelegationGlobalData);
        } else {
            GlobalData memory newdelegationGlobalData = GlobalData(msg.sender, _delegationAddress, block.timestamp, _expiryDate, false, _tokenId);
            globalDelegationHashes[globalHash].push(newdelegationGlobalData);
        }
        emit RegisterDelegation(msg.sender, _collectionAddress, _delegationAddress, _useCase, _allTokens, _tokenId);
    }

    /**
     * @notice Function to support subDelegation rights
     * @notice A delegation Address that has subDelegation rights given by a Delegator can register Delegations on behalf of Delegator
     */

    function registerDelegationAddressUsingSubDelegation(address _delegatorAddress, address _collectionAddress, address _delegationAddress, uint256 _expiryDate, uint256 _useCase, bool _allTokens, uint256 _tokenId) public {
        // Check subdelegation rights for the specific collection
        {
            bool subdelegationRightsCol;
            address[] memory allDelegators = retrieveDelegators(msg.sender, _collectionAddress, USE_CASE_SUB_DELEGATION);
            if (allDelegators.length > 0) {
                for (uint i = 0; i < allDelegators.length; ) {
                    if (_delegatorAddress == allDelegators[i]) {
                        subdelegationRightsCol = true;
                        break;
                    }

                    unchecked {
                        ++i;
                    }
                }
            }
            // Check subdelegation rights for All collections
            allDelegators = retrieveDelegators(msg.sender, ALL_COLLECTIONS, USE_CASE_SUB_DELEGATION);
            if (allDelegators.length > 0) {
                if (subdelegationRightsCol != true) {
                    for (uint i = 0; i < allDelegators.length; ) {
                        if (_delegatorAddress == allDelegators[i]) {
                            subdelegationRightsCol = true;
                            break;
                        }

                        unchecked {
                            ++i;
                        }
                    }
                }
            }
            // Allow to register
            require((subdelegationRightsCol == true));
        }
        // If check passed then register delegation address for Delegator
        require((_useCase > 0 && _useCase <= useCaseCounter));
        bytes32 delegatorHash;
        bytes32 delegationAddressHash;
        bytes32 globalHash;
        bytes32 collectionLockHash;
        bytes32 collectionUsecaseLockHash;
        bytes32 collectionUsecaseLockHashAll;
        // Locks
        collectionLockHash = keccak256(abi.encodePacked(_collectionAddress, _delegationAddress));
        collectionUsecaseLockHash = keccak256(abi.encodePacked(_collectionAddress, _delegationAddress, _useCase));
        collectionUsecaseLockHashAll = keccak256(abi.encodePacked(ALL_COLLECTIONS, _delegationAddress, _useCase));
        require(globalLock[_delegationAddress] == false);
        require(collectionLock[collectionLockHash] == false);
        require(collectionUsecaseLock[collectionUsecaseLockHash] == false);
        require(collectionUsecaseLock[collectionUsecaseLockHashAll] == false);
        // Push data to mappings
        globalHash = keccak256(abi.encodePacked(_delegatorAddress, _collectionAddress, _delegationAddress, _useCase));
        delegatorHash = keccak256(abi.encodePacked(_delegatorAddress, _collectionAddress, _useCase));
        // Stores delegation addresses on a delegator hash
        delegationAddressHash = keccak256(abi.encodePacked(_delegationAddress, _collectionAddress, _useCase));
        delegatorHashes[delegatorHash].push(_delegationAddress);
        // Stores delegators addresses on a delegation address hash
        delegationAddressHashes[delegationAddressHash].push(_delegatorAddress);
        // Push additional data to the globalDelegationHashes mapping
        if (_allTokens == true) {
            GlobalData memory newdelegationGlobalData = GlobalData(_delegatorAddress, _delegationAddress, block.timestamp, _expiryDate, true, 0);
            globalDelegationHashes[globalHash].push(newdelegationGlobalData);
        } else {
            GlobalData memory newdelegationGlobalData = GlobalData(_delegatorAddress, _delegationAddress, block.timestamp, _expiryDate, false, _tokenId);
            globalDelegationHashes[globalHash].push(newdelegationGlobalData);
        }
        emit RegisterDelegationUsingSubDelegation(_delegatorAddress, msg.sender, _collectionAddress, _delegationAddress, _useCase, _allTokens, _tokenId);
    }

    /**
     * @notice Delegator revokes delegation rights given to a delegation address on a specific use case on a specific NFT collection
     * @notice This function does not remove the delegation from the collectionsRegistered or useCaseRegistered as we want to track delegations history
     */

    function revokeDelegationAddress(address _collectionAddress, address _delegationAddress, uint256 _useCase) public {
        bytes32 delegatorHash;
        bytes32 delegationAddressHash;
        bytes32 globalHash;
        uint256 count;
        globalHash = keccak256(abi.encodePacked(msg.sender, _collectionAddress, _delegationAddress, _useCase));
        delegatorHash = keccak256(abi.encodePacked(msg.sender, _collectionAddress, _useCase));
        delegationAddressHash = keccak256(abi.encodePacked(_delegationAddress, _collectionAddress, _useCase));
        // Revoke delegation Address from the delegatorHashes mapping
        count = 0;
        if (delegatorHashes[delegatorHash].length > 0) {
            for (uint256 i = 0; i < delegatorHashes[delegatorHash].length; ) {
                if (_delegationAddress == delegatorHashes[delegatorHash][i]) {
                    count = count + 1;
                }

                unchecked {
                    ++i;
                }
            }
            uint256[] memory delegationsPerUser = new uint256[](count);
            uint256 count1 = 0;
            for (uint256 i = 0; i < delegatorHashes[delegatorHash].length; ) {
                if (_delegationAddress == delegatorHashes[delegatorHash][i]) {
                    delegationsPerUser[count1] = i;
                    count1 = count1 + 1;
                }

                unchecked {
                    ++i;
                }
            }

            if (count1 > 0) {
                for (uint256 j = 0; j < delegationsPerUser.length; ) {
                    uint256 temp1;
                    uint256 temp2;
                    temp1 = delegationsPerUser[delegationsPerUser.length - 1 - j];
                    temp2 = delegatorHashes[delegatorHash].length - 1;
                    delegatorHashes[delegatorHash][temp1] = delegatorHashes[delegatorHash][temp2];
                    delegatorHashes[delegatorHash].pop();

                    unchecked {
                        ++j;
                    }
                }                
            }
            // Revoke delegator Address from the delegationAddressHashes mapping
            uint256 countDA = 0;
            for (uint256 i = 0; i < delegationAddressHashes[delegationAddressHash].length; ) {
                if (msg.sender == delegationAddressHashes[delegationAddressHash][i]) {
                    countDA = countDA + 1;
                }

                unchecked {
                    ++i;
                }
            }
            uint256[] memory delegatorsPerUser = new uint256[](countDA);
            uint256 countDA1 = 0;
            for (uint256 i = 0; i < delegationAddressHashes[delegationAddressHash].length; ) {
                if (msg.sender == delegationAddressHashes[delegationAddressHash][i]) {
                    delegatorsPerUser[countDA1] = i;
                    countDA1 = countDA1 + 1;
                }

                unchecked {
                    ++i;
                }
            }
            if (countDA1 > 0) {
                for (uint256 j = 0; j < delegatorsPerUser.length; ) {
                    uint256 temp1;
                    uint256 temp2;
                    temp1 = delegatorsPerUser[delegatorsPerUser.length - 1 - j];
                    temp2 = delegationAddressHashes[delegationAddressHash].length - 1;
                    delegationAddressHashes[delegationAddressHash][temp1] = delegationAddressHashes[delegationAddressHash][temp2];
                    delegationAddressHashes[delegationAddressHash].pop();

                    unchecked {
                        ++j;
                    }
                }
            }
            // Delete global delegation data and emit event
            delete globalDelegationHashes[globalHash];
            emit RevokeDelegation(msg.sender, _collectionAddress, _delegationAddress, _useCase);
        }
    }

    /**
     * @notice This function supports the revoking of a Delegation Address using an address with Subdelegation rights
     */

    function revokeDelegationAddressUsingSubdelegation(address _delegatorAddress, address _collectionAddress, address _delegationAddress, uint256 _useCase) public {
        // Check subdelegation rights for the specific collection
        {
            bool subdelegationRightsCol;
            address[] memory allDelegators = retrieveDelegators(msg.sender, _collectionAddress, USE_CASE_SUB_DELEGATION);
            if (allDelegators.length > 0) {
                for (uint i = 0; i < allDelegators.length; ) {
                    if (_delegatorAddress == allDelegators[i]) {
                        subdelegationRightsCol = true;
                        break;
                    }

                    unchecked {
                        ++i;
                    }
                }     
            }
            // Check subdelegation rights for All collections
            allDelegators = retrieveDelegators(msg.sender, ALL_COLLECTIONS, USE_CASE_SUB_DELEGATION);
            if (allDelegators.length > 0) {
                if (subdelegationRightsCol != true) {
                    for (uint i = 0; i < allDelegators.length; ) {
                        if (_delegatorAddress == allDelegators[i]) {
                            subdelegationRightsCol = true;
                            break;
                        }

                        unchecked {
                            ++i;
                        }
                    }
                }
            }
            // Allow to revoke
            require((subdelegationRightsCol == true));
        }
        // If check passed then revoke delegation address for Delegator
        bytes32 delegatorHash = keccak256(abi.encodePacked(_delegatorAddress, _collectionAddress, _useCase));
        bytes32 delegationAddressHash = keccak256(abi.encodePacked(_delegationAddress, _collectionAddress, _useCase));
        bytes32 globalHash = keccak256(abi.encodePacked(_delegatorAddress, _collectionAddress, _delegationAddress, _useCase));
        uint256 count;
        count = 0;
        if (delegatorHashes[delegatorHash].length > 0) {
            for (uint256 i = 0; i < delegatorHashes[delegatorHash].length; ) {
                if (_delegationAddress == delegatorHashes[delegatorHash][i]) {
                    count = count + 1;
                }

                unchecked {
                    ++i;
                }
            }
            uint256[] memory delegationsPerUser = new uint256[](count);
            uint256 count1 = 0;
            for (uint256 i = 0; i < delegatorHashes[delegatorHash].length; ) {
                if (_delegationAddress == delegatorHashes[delegatorHash][i]) {
                    delegationsPerUser[count1] = i;
                    count1 = count1 + 1;
                }

                unchecked {
                    ++i;
                }
            }
            if (count1 > 0) {
                for (uint256 j = 0; j < delegationsPerUser.length; ) {
                    uint256 temp1;
                    uint256 temp2;
                    temp1 = delegationsPerUser[delegationsPerUser.length - 1 - j];
                    temp2 = delegatorHashes[delegatorHash].length - 1;
                    delegatorHashes[delegatorHash][temp1] = delegatorHashes[delegatorHash][temp2];
                    delegatorHashes[delegatorHash].pop();

                    unchecked {
                        ++j;
                    }
                }
            }
            // Revoke delegator Address from the delegationAddressHashes mapping
            uint256 countDA = 0;
            for (uint256 i = 0; i < delegationAddressHashes[delegationAddressHash].length; ) {
                if (_delegatorAddress == delegationAddressHashes[delegationAddressHash][i]) {
                    countDA = countDA + 1;
                }

                unchecked {
                    ++i;
                }
            }
            uint256[] memory delegatorsPerUser = new uint256[](countDA);
            uint256 countDA1 = 0;
            for (uint256 i = 0; i < delegationAddressHashes[delegationAddressHash].length; ) {
                if (_delegatorAddress == delegationAddressHashes[delegationAddressHash][i]) {
                    delegatorsPerUser[countDA1] = i;
                    countDA1 = countDA1 + 1;
                }

                unchecked {
                    ++i;
                }
            }
            if (countDA1 > 0) {
                for (uint256 j = 0; j < delegatorsPerUser.length; ) {
                    uint256 temp1;
                    uint256 temp2;
                    temp1 = delegatorsPerUser[delegatorsPerUser.length - 1 - j];
                    temp2 = delegationAddressHashes[delegationAddressHash].length - 1;
                    delegationAddressHashes[delegationAddressHash][temp1] = delegationAddressHashes[delegationAddressHash][temp2];
                    delegationAddressHashes[delegationAddressHash].pop();

                    unchecked {
                        ++j;
                    }
                }
            }
            // Delete global delegation data and emit event
            delete globalDelegationHashes[globalHash];
            emit RevokeDelegationUsingSubDelegation(_delegatorAddress, msg.sender, _collectionAddress, _delegationAddress, _useCase);
        }
    }

    /**
     * @notice Batch revoking (up to 5 delegation addresses)
     */

    function batchRevocations(address[] memory _collectionAddresses, address[] memory _delegationAddresses, uint256[] memory _useCases) public {
        require(_collectionAddresses.length < 6);
        for (uint256 i = 0; i < _collectionAddresses.length; ) {
            revokeDelegationAddress(_collectionAddresses[i], _delegationAddresses[i], _useCases[i]);

            unchecked {
                ++i;
            }
        }
    }

    /**
     * @notice Delegator updates a delegation address for a specific use case on a specific NFT collection for a certain duration
     */

    function updateDelegationAddress(address _collectionAddress, address _olddelegationAddress, address _newdelegationAddress, uint256 _expiryDate, uint256 _useCase, bool _allTokens, uint256 _tokenId) public {
        revokeDelegationAddress(_collectionAddress, _olddelegationAddress, _useCase);
        registerDelegationAddress(_collectionAddress, _newdelegationAddress, _expiryDate, _useCase, _allTokens, _tokenId);
        emit UpdateDelegation(msg.sender, _collectionAddress, _olddelegationAddress, _newdelegationAddress, _useCase, _allTokens, _tokenId);
    }

    /**
     * @notice Batch registrations function (up to 5 delegation addresses)
     */

    function batchDelegations(address[] memory _collectionAddresses, address[] memory _delegationAddresses, uint256[] memory _expiryDates, uint256[] memory _useCases, bool[] memory _allTokens, uint256[] memory _tokenIds) public {
        require(_collectionAddresses.length < 6);
        for (uint256 i = 0; i < _collectionAddresses.length; ) {
            registerDelegationAddress(_collectionAddresses[i], _delegationAddresses[i], _expiryDates[i], _useCases[i], _allTokens[i], _tokenIds[i]);

            unchecked {
                ++i;
            }
        }
    }

    /**
     * @notice Set global Lock status (hot wallet)
     */

    function setGlobalLock(bool _status) public {
        globalLock[msg.sender] = _status;
    }

    /**
     * @notice Set collection Lock status (hot wallet)
     */

    function setCollectionLock(address _collectionAddress, bool _status) public {
        if (_collectionAddress == ALL_COLLECTIONS) {
            setGlobalLock(_status);
        } else {
            bytes32 collectionLockHash = keccak256(abi.encodePacked(_collectionAddress, msg.sender));
            collectionLock[collectionLockHash] = _status;
        }
    }

    /**
     * @notice Set collection usecase Lock status (hot wallet)
     */

    function setCollectionUsecaseLock(address _collectionAddress, uint256 _useCase, bool _status) public {
        if (_useCase==1) {
            setCollectionLock(_collectionAddress, _status);
        } else {
            bytes32 collectionUsecaseLockHash = keccak256(abi.encodePacked(_collectionAddress, msg.sender, _useCase));
            collectionUsecaseLock[collectionUsecaseLockHash] = _status;
        }
    }

    /**
     * @notice This function updates the number of Use Cases in case more usecases are needed
     */

    function updateUseCaseCounter() public {
        useCaseCounter = useCaseCounter + 1;
    }

    // A full list of Available Getter functions

    /**
     * @notice Retrieve Global Lock Status
     */

    function retrieveGlobalLockStatus(address _delegationAddress) public view returns (bool) {
        return globalLock[_delegationAddress];
    }

    /**
     * @notice Retrieve Collection Lock Status
     */

    function retrieveCollectionLockStatus(address _collectionAddress, address _delegationAddress) public view returns (bool) {
        if (_collectionAddress == ALL_COLLECTIONS) {
            return retrieveGlobalLockStatus(_delegationAddress);
        } else {
            bytes32 collectionLockHash;
            collectionLockHash = keccak256(abi.encodePacked(_collectionAddress, _delegationAddress));
            return collectionLock[collectionLockHash];
        }
    }

    /**
     * @notice Retrieve Collection Use Case Lock Status
     */

    function retrieveCollectionUseCaseLockStatus(address _collectionAddress, address _delegationAddress, uint256 _useCase) public view returns (bool) {
        if (_useCase == 1) {
            return retrieveCollectionLockStatus(_collectionAddress, _delegationAddress);
        } else {
            bytes32 collectionUsecaseLockHash;
            collectionUsecaseLockHash = keccak256(abi.encodePacked(_collectionAddress, _delegationAddress, _useCase));
            return collectionUsecaseLock[collectionUsecaseLockHash];
        }
    }

    /**
     * @notice Retrieve Collection Use Case Lock Status for both specific colleciton and ALL_COLLECTIONS
     */

    function retrieveCollectionUseCaseLockStatusOneCall(address _collectionAddress, address _delegationAddress, uint256 _useCase) public view returns (bool) {
        if (_useCase == 1) {
            return retrieveCollectionLockStatus(_collectionAddress, _delegationAddress);
        } else {
            return retrieveCollectionUseCaseLockStatus(_collectionAddress, _delegationAddress, _useCase) || retrieveCollectionUseCaseLockStatus(ALL_COLLECTIONS, _delegationAddress, _useCase);
        }
    }

    /**
     * @notice Support function to retrieve the hash given specific parameters
     */

    function retrieveLocalHash(address _walletAddress, address _collectionAddress, uint256 _useCase) public pure returns (bytes32) {
        bytes32 hash;
        hash = keccak256(abi.encodePacked(_walletAddress, _collectionAddress, _useCase));
        return (hash);
    }

    /**
     * @notice Support function to retrieve the global hash given specific parameters
     */

    function retrieveGlobalHash(address _delegatorAddress, address _collectionAddress, address _delegationAddress, uint256 _useCase) public pure returns (bytes32) {
        bytes32 globalHash;
        globalHash = keccak256(abi.encodePacked(_delegatorAddress, _collectionAddress, _delegationAddress, _useCase));
        return (globalHash);
    }

    /**
     * @notice Returns an array of all delegation addresses (active AND inactive) assigned by a delegator for a specific use case on a specific NFT collection
     */

    function retrieveDelegationAddresses(address _delegatorAddress, address _collectionAddress, uint256 _useCase) public view returns (address[] memory) {
        bytes32 hash;
        hash = keccak256(abi.encodePacked(_delegatorAddress, _collectionAddress, _useCase));
        return (delegatorHashes[hash]);
    }

    /**
     * @notice Returns an array of all delegators (active AND inactive) that delegated to a delegationAddress for a specific use case on a specific NFT collection
     */

    function retrieveDelegators(address _delegationAddress, address _collectionAddress, uint256 _useCase) public view returns (address[] memory) {
        bytes32 hash;
        hash = keccak256(abi.encodePacked(_delegationAddress, _collectionAddress, _useCase));
        return (delegationAddressHashes[hash]);
    }

    /**
     * @notice Returns the status of a collection/delegation for a delegator (cold wallet)
     * @notice false means that the cold wallet did not register a delegation or the delegation was revoked from the delegatorHashes mapping
     */

    function retrieveDelegatorStatusOfDelegation(address _delegatorAddress, address _collectionAddress, uint256 _useCase) public view returns (bool) {
        bytes32 hash;
        hash = keccak256(abi.encodePacked(_delegatorAddress, _collectionAddress, _useCase));
        return delegatorHashes[hash].length > 0;
    }

    /**
     * @notice Returns the status of a collection/delegation given a delegation address (hot wallet)
     * @notice false means that a delegation address is not registered or it was revoked from the delegationAddressHashes mapping
     */

    function retrieveDelegationAddressStatusOfDelegation(address _delegationAddress, address _collectionAddress, uint256 _useCase) public view returns (bool) {
        bytes32 hash;
        hash = keccak256(abi.encodePacked(_delegationAddress, _collectionAddress, _useCase));
        return delegationAddressHashes[hash].length > 0;
    }

    /**
     * @notice Returns the status of a delegation given the delegator address as well as the delegation address
     */

    function retrieveGlobalStatusOfDelegation(address _delegatorAddress, address _collectionAddress, address _delegationAddress, uint256 _useCase) public view returns (bool) {
        bytes32 hash;
        hash = keccak256(abi.encodePacked(_delegatorAddress, _collectionAddress, _delegationAddress, _useCase));
        return globalDelegationHashes[hash].length > 0;
    }

    /**
     * @notice Returns the status of a delegation given the delegator address, the collection address, the delegation address as well as a specific token id
     */

    function retrieveTokenStatus(address _delegatorAddress, address _collectionAddress, address _delegationAddress, uint256 _useCase, uint256 _tokenId) public view returns (bool) {
        bytes32 hash;
        hash = keccak256(abi.encodePacked(_delegatorAddress, _collectionAddress, _delegationAddress, _useCase));
        bool status;
        if (globalDelegationHashes[hash].length > 0) {
            for (uint256 i = 0; i < globalDelegationHashes[hash].length; ) {
                if ((globalDelegationHashes[hash][i].allTokens == false) && (globalDelegationHashes[hash][i].tokens == _tokenId)) {
                    status = true;
                    break;
                } else {
                    status = false;
                }

                unchecked {
                    ++i;
                }
            }
            return status;
        } else {
            return false;
        }
    }

    /**
     * @notice Checks if the delegation address performing actions is the most recent delegated by the specific delegator
     */

    function retrieveStatusOfMostRecentDelegation(address _delegatorAddress, address _collectionAddress, address _delegationAddress, uint256 _useCase) public view returns (bool) {
        return _delegationAddress == retrieveMostRecentDelegation(_delegatorAddress, _collectionAddress, _useCase);
    }

    /**
     * @notice Checks if a delegator granted subdelegation status to an Address
     */

    function retrieveSubDelegationStatus(address _delegatorAddress, address _collectionAddress, address _delegationAddress) public view returns (bool) {
        bool subdelegationRights;
        address[] memory allDelegators = retrieveDelegators(_delegationAddress, _collectionAddress, USE_CASE_SUB_DELEGATION);
        if (allDelegators.length > 0) {
            for (uint i = 0; i < allDelegators.length; ) {
                if (_delegatorAddress == allDelegators[i]) {
                    subdelegationRights = true;
                    break;
                }

                unchecked {
                    ++i;
                }
            }
        }
        if (subdelegationRights == true) {
            return (true);
        } else {
            return (false);
        }
    }

    /**
     * @notice Checks the status of an active delegator for a delegation Address
     */

    function retrieveStatusOfActiveDelegator(address _delegatorAddress, address _collectionAddress, address _delegationAddress, uint256 _date, uint256 _useCase) public view returns (bool) {
        address[] memory allActiveDelegators = retrieveActiveDelegators(_delegationAddress, _collectionAddress, _date, _useCase);
        bool status;
        if (allActiveDelegators.length > 0) {
            for (uint256 i = 0; i < allActiveDelegators.length; ) {
                if (_delegatorAddress == allActiveDelegators[i]) {
                    status = true;
                    break;
                } else {
                    status = false;
                }

                unchecked {
                    ++i;
                }
            }
            return status;
        } else {
            return false;
        }
    }

    // Retrieve Delegations delegated by a Delegator
    // This set of functions is used to retrieve info for a Delegator (cold address)

    function retrieveDelegationAddressesTokensIDsandExpiredDates(address _delegatorAddress, address _collectionAddress, uint256 _useCase) public view returns (address[] memory, uint256[] memory, bool[] memory, uint256[] memory) {
        address[] memory allDelegations = retrieveDelegationAddresses(_delegatorAddress, _collectionAddress, _useCase);
        bytes32 globalHash;
        bytes32[] memory allGlobalHashes = new bytes32[](allDelegations.length);
        uint256 count1 = 0;
        uint256 count2 = 0;
        uint256 k = 0;
        if (allDelegations.length > 0) {
            for (uint256 i = 0; i < allDelegations.length; ) {
                globalHash = keccak256(abi.encodePacked(_delegatorAddress, _collectionAddress, allDelegations[i], _useCase));
                allGlobalHashes[count1] = globalHash;
                count1 = count1 + 1;

                unchecked {
                    ++i;
                }
            }
            //Removes duplicates
            for (uint256 i = 0; i < allGlobalHashes.length - 1; ) {
                for (uint256 j = i + 1; j < allGlobalHashes.length; ) {
                    if (allGlobalHashes[i] == allGlobalHashes[j]) {
                        delete allGlobalHashes[i];
                    }

                    unchecked {
                        ++j;
                    }
                }

                unchecked {
                    ++i;
                }
            }
            for (uint256 i = 0; i < allGlobalHashes.length; ) {
                k = globalDelegationHashes[allGlobalHashes[i]].length + k;

                unchecked {
                    ++i;
                }
            }
            //Declare local arrays
            address[] memory allDelegationAddresses = new address[](k);
            uint256[] memory tokensIDs = new uint256[](k);
            bool[] memory allTokens = new bool[](k);
            uint256[] memory allExpirations = new uint256[](k);
            for (uint256 y = 0; y < k; ) {
                if (globalDelegationHashes[allGlobalHashes[y]].length > 0) {
                    for (uint256 w = 0; w < globalDelegationHashes[allGlobalHashes[y]].length; ) {
                        allDelegationAddresses[count2] = globalDelegationHashes[allGlobalHashes[y]][w].delegationAddress;
                        allExpirations[count2] = globalDelegationHashes[allGlobalHashes[y]][w].expiryDate;
                        allTokens[count2] = globalDelegationHashes[allGlobalHashes[y]][w].allTokens;
                        tokensIDs[count2] = globalDelegationHashes[allGlobalHashes[y]][w].tokens;
                        count2 = count2 + 1;

                        unchecked {
                            ++w;
                        }
                    }
                }

                unchecked {
                    ++y;
                }
            }
            return (allDelegationAddresses, allExpirations, allTokens, tokensIDs);
        } else {
            address[] memory allDelegations1 = new address[](0);
            uint256[] memory tokensIDs = new uint256[](0);
            bool[] memory allTokens = new bool[](0);
            uint256[] memory allExpirations = new uint256[](0);
            return (allDelegations1, allExpirations, allTokens, tokensIDs);
        }
    }

    /**
     * @notice Returns an array of all active delegation addresses on a certain date for a specific use case on a specific NFT collection given a delegation Address
     */

    function retrieveActiveDelegations(address _delegatorAddress, address _collectionAddress, uint256 _date, uint256 _useCase) public view returns (address[] memory) {
        address[] memory allDelegations = retrieveDelegationAddresses(_delegatorAddress, _collectionAddress, _useCase);
        bytes32 globalHash;
        bytes32[] memory allGlobalHashes = new bytes32[](allDelegations.length);
        uint256 count1 = 0;
        uint256 count2 = 0;
        uint256 count3 = 0;
        uint256 k = 0;
        if (allDelegations.length > 0) {
            for (uint256 i = 0; i < allDelegations.length; ) {
                globalHash = keccak256(abi.encodePacked(_delegatorAddress, _collectionAddress, allDelegations[i], _useCase));
                allGlobalHashes[count1] = globalHash;
                count1 = count1 + 1;

                unchecked {
                    ++i;
                }
            }
            //Remove duplicates
            for (uint256 i = 0; i < allGlobalHashes.length - 1; ) {
                for (uint256 j = i + 1; j < allGlobalHashes.length; ) {
                    if (allGlobalHashes[i] == allGlobalHashes[j]) {
                        delete allGlobalHashes[i];
                    }

                    unchecked {
                        ++j;
                    }
                }

                unchecked {
                    ++i;
                }
            }
            for (uint256 i = 0; i < allGlobalHashes.length; ) {
                k = globalDelegationHashes[allGlobalHashes[i]].length + k;

                unchecked {
                    ++i;
                }
            }
            //Declare local arrays
            address[] memory allDelegationAddresses = new address[](k);
            uint256[] memory allExpirations = new uint256[](k);
            for (uint256 y = 0; y < k; ) {
                if (globalDelegationHashes[allGlobalHashes[y]].length > 0) {
                    for (uint256 w = 0; w < globalDelegationHashes[allGlobalHashes[y]].length; ) {
                        allDelegationAddresses[count2] = globalDelegationHashes[allGlobalHashes[y]][w].delegationAddress;
                        allExpirations[count2] = globalDelegationHashes[allGlobalHashes[y]][w].expiryDate;
                        count2 = count2 + 1;

                        unchecked {
                            ++w;
                        }
                    }
                }

                unchecked {
                    ++y;
                }
            }
            address[] memory allActive = new address[](allExpirations.length);
            for (uint256 y = 0; y < k; ) {
                if (allExpirations[y] > _date) {
                    allActive[count3] = allDelegationAddresses[y];
                    count3 = count3 + 1;
                }

                unchecked {
                    ++y;
                }
            }
            return (allActive);
        } else {
            address[] memory allActive = new address[](0);
            return (allActive);
        }
    }

    /**
     * @notice Returns the most recent delegation address delegated for a specific use case on a specific NFT collection
     */

    function retrieveMostRecentDelegation(address _delegatorAddress, address _collectionAddress, uint256 _useCase) public view returns (address) {
        address[] memory allDelegations = retrieveDelegationAddresses(_delegatorAddress, _collectionAddress, _useCase);
        bytes32 globalHash;
        bytes32[] memory allGlobalHashes = new bytes32[](allDelegations.length);
        uint256 count1 = 0;
        uint256 count2 = 0;
        uint256 k = 0;
        if (allDelegations.length > 0) {
            for (uint256 i = 0; i < allDelegations.length; ) {
                globalHash = keccak256(abi.encodePacked(_delegatorAddress, _collectionAddress, allDelegations[i], _useCase));
                allGlobalHashes[count1] = globalHash;
                count1 = count1 + 1;

                unchecked {
                    ++i;
                }
            }
            //Removes duplicates
            for (uint256 i = 0; i < allGlobalHashes.length - 1; ) {
                for (uint256 j = i + 1; j < allGlobalHashes.length; ) {
                    if (allGlobalHashes[i] == allGlobalHashes[j]) {
                        delete allGlobalHashes[i];
                    }

                    unchecked {
                        ++j;
                    }
                }

                unchecked {
                    ++i;
                }
            }
            for (uint256 i = 0; i < allGlobalHashes.length; ) {
                k = globalDelegationHashes[allGlobalHashes[i]].length + k;

                unchecked {
                    ++i;
                }
            }
            //Declare local arrays
            address[] memory allDelegationAddresses = new address[](k);
            uint256[] memory allRegistrations = new uint256[](k);
            for (uint256 y = 0; y < k; ) {
                if (globalDelegationHashes[allGlobalHashes[y]].length > 0) {
                    for (uint256 w = 0; w < globalDelegationHashes[allGlobalHashes[y]].length; ) {
                        allDelegationAddresses[count2] = globalDelegationHashes[allGlobalHashes[y]][w].delegationAddress;
                        allRegistrations[count2] = globalDelegationHashes[allGlobalHashes[y]][w].registeredDate;
                        count2 = count2 + 1;

                        unchecked {
                            ++w;
                        }
                    }
                }

                unchecked {
                    ++y;
                }
            }
            address recentDelegationAddress = allDelegationAddresses[0];
            uint256 time = allRegistrations[0];
            for (uint256 i = 0; i < allDelegationAddresses.length; ) {
                if (allRegistrations[i] >= time) {
                    time = allRegistrations[i];
                    recentDelegationAddress = allDelegationAddresses[i];
                }

                unchecked {
                    ++i;
                }
            }
            return (recentDelegationAddress);
        } else {
            return (0x0000000000000000000000000000000000000000);
        }
    }

    // Retrieve Delegators delegated to a hot wallet
    // This set of functions is used to retrieve info for a hot wallet

    /**
     * @notice Returns an array of all token ids delegated by a Delegator for a specific usecase on specific collection given a delegation Address
     */

    function retrieveDelegatorsTokensIDsandExpiredDates(address _delegationAddress, address _collectionAddress, uint256 _useCase) public view returns (address[] memory, uint256[] memory, bool[] memory, uint256[] memory) {
        address[] memory allDelegators = retrieveDelegators(_delegationAddress, _collectionAddress, _useCase);
        bytes32 globalHash;
        bytes32[] memory allGlobalHashes = new bytes32[](allDelegators.length);
        uint256 count1 = 0;
        uint256 count2 = 0;
        uint256 k = 0;
        if (allDelegators.length > 0) {
            for (uint256 i = 0; i < allDelegators.length; ) {
                globalHash = keccak256(abi.encodePacked(allDelegators[i], _collectionAddress, _delegationAddress, _useCase));
                allGlobalHashes[count1] = globalHash;
                count1 = count1 + 1;

                unchecked {
                    ++i;
                }
            }
            //Removes duplicates
            for (uint256 i = 0; i < allGlobalHashes.length - 1; ) {
                for (uint256 j = i + 1; j < allGlobalHashes.length; ) {
                    if (allGlobalHashes[i] == allGlobalHashes[j]) {
                        delete allGlobalHashes[i];
                    }

                    unchecked {
                        ++j;
                    }
                }

                unchecked {
                    ++i;
                }
            }
            for (uint256 i = 0; i < allGlobalHashes.length; ) {
                k = globalDelegationHashes[allGlobalHashes[i]].length + k;

                unchecked {
                    ++i;
                }
            }
            //Declare local arrays
            address[] memory allDelegatorsAddresses = new address[](k);
            uint256[] memory tokensIDs = new uint256[](k);
            bool[] memory allTokens = new bool[](k);
            uint256[] memory allExpirations = new uint256[](k);
            for (uint256 y = 0; y < k; ) {
                if (globalDelegationHashes[allGlobalHashes[y]].length > 0) {
                    for (uint256 w = 0; w < globalDelegationHashes[allGlobalHashes[y]].length; ) {
                        allDelegatorsAddresses[count2] = globalDelegationHashes[allGlobalHashes[y]][w].delegatorAddress;
                        allExpirations[count2] = globalDelegationHashes[allGlobalHashes[y]][w].expiryDate;
                        allTokens[count2] = globalDelegationHashes[allGlobalHashes[y]][w].allTokens;
                        tokensIDs[count2] = globalDelegationHashes[allGlobalHashes[y]][w].tokens;
                        count2 = count2 + 1;

                        unchecked {
                            ++w;
                        }
                    }
                }

                unchecked {
                    ++y;
                }
            }
            return (allDelegatorsAddresses, allExpirations, allTokens, tokensIDs);
        } else {
            address[] memory allDelegations1 = new address[](0);
            uint256[] memory tokensIDs = new uint256[](0);
            bool[] memory allTokens = new bool[](0);
            uint256[] memory allExpirations = new uint256[](0);
            return (allDelegations1, allExpirations, allTokens, tokensIDs);
        }
    }

    /**
     * @notice Returns an array of all active delegators on a certain date for a specific use case on a specific NFT collection given a delegation Address
     */

    function retrieveActiveDelegators(address _delegationAddress, address _collectionAddress, uint256 _date, uint256 _useCase) public view returns (address[] memory) {
        address[] memory allDelegators = retrieveDelegators(_delegationAddress, _collectionAddress, _useCase);
        bytes32 globalHash;
        bytes32[] memory allGlobalHashes = new bytes32[](allDelegators.length);
        uint256 count1 = 0;
        uint256 count2 = 0;
        uint256 count3 = 0;
        uint256 k = 0;
        if (allDelegators.length > 0) {
            for (uint256 i = 0; i < allDelegators.length; ) {
                globalHash = keccak256(abi.encodePacked(allDelegators[i], _collectionAddress, _delegationAddress, _useCase));
                allGlobalHashes[count1] = globalHash;
                count1 = count1 + 1;

                unchecked {
                    ++i;
                }
            }
            //Remove duplicates
            for (uint256 i = 0; i < allGlobalHashes.length - 1; ) {
                for (uint256 j = i + 1; j < allGlobalHashes.length; ) {
                    if (allGlobalHashes[i] == allGlobalHashes[j]) {
                        delete allGlobalHashes[i];
                    }

                    unchecked {
                        ++j;
                    }
                }

                unchecked {
                    ++i;
                }
            }
            for (uint256 i = 0; i < allGlobalHashes.length; ) {
                k = globalDelegationHashes[allGlobalHashes[i]].length + k;

                unchecked {
                    ++i;
                }
            }
            //Declare local arrays
            address[] memory allDelegatorsAddresses = new address[](k);
            uint256[] memory allExpirations = new uint256[](k);
            for (uint256 y = 0; y < k; ) {
                if (globalDelegationHashes[allGlobalHashes[y]].length > 0) {
                    for (uint256 w = 0; w < globalDelegationHashes[allGlobalHashes[y]].length; ) {
                        allDelegatorsAddresses[count2] = globalDelegationHashes[allGlobalHashes[y]][w].delegatorAddress;
                        allExpirations[count2] = globalDelegationHashes[allGlobalHashes[y]][w].expiryDate;
                        count2 = count2 + 1;

                        unchecked {
                            ++w;
                        }
                    }
                }

                unchecked {
                    ++y;
                }
            }
            address[] memory allActive = new address[](allExpirations.length);
            for (uint256 y = 0; y < k; ) {
                if (allExpirations[y] > _date) {
                    allActive[count3] = allDelegatorsAddresses[y];
                    count3 = count3 + 1;
                }

                unchecked {
                    ++y;
                }
            }
            return (allActive);
        } else {
            address[] memory allActive = new address[](0);
            return (allActive);
        }
    }

    /**
     * @notice Returns the most recent delegator for a specific use case on a specific NFT collection given a delegation Address
     */

    function retrieveMostRecentDelegator(address _delegationAddress, address _collectionAddress, uint256 _useCase) public view returns (address) {
        address[] memory allDelegators = retrieveDelegators(_delegationAddress, _collectionAddress, _useCase);
        bytes32 globalHash;
        bytes32[] memory allGlobalHashes = new bytes32[](allDelegators.length);
        uint256 count1 = 0;
        uint256 count2 = 0;
        uint256 k = 0;
        if (allDelegators.length > 0) {
            for (uint256 i = 0; i < allDelegators.length; ) {
                globalHash = keccak256(abi.encodePacked(allDelegators[i], _collectionAddress, _delegationAddress, _useCase));
                allGlobalHashes[count1] = globalHash;
                count1 = count1 + 1;

                unchecked {
                    ++i;
                }
            }
            //Removes duplicates
            for (uint256 i = 0; i < allGlobalHashes.length - 1; ) {
                for (uint256 j = i + 1; j < allGlobalHashes.length; ) {
                    if (allGlobalHashes[i] == allGlobalHashes[j]) {
                        delete allGlobalHashes[i];
                    }

                    unchecked {
                        ++j;
                    }
                }

                unchecked {
                    ++i;
                }
            }
            for (uint256 i = 0; i < allGlobalHashes.length; ) {
                k = globalDelegationHashes[allGlobalHashes[i]].length + k;

                unchecked {
                    ++i;
                }
            }
            //Declare local arrays
            address[] memory allDelegatorsAddresses = new address[](k);
            uint256[] memory allRegistrations = new uint256[](k);
            for (uint256 y = 0; y < k; ) {
                if (globalDelegationHashes[allGlobalHashes[y]].length > 0) {
                    for (uint256 w = 0; w < globalDelegationHashes[allGlobalHashes[y]].length; ) {
                        allDelegatorsAddresses[count2] = globalDelegationHashes[allGlobalHashes[y]][w].delegatorAddress;
                        allRegistrations[count2] = globalDelegationHashes[allGlobalHashes[y]][w].registeredDate;
                        count2 = count2 + 1;

                        unchecked {
                            ++w;
                        }
                    }
                }

                unchecked {
                    ++y;
                }
            }
            address recentDelegatorAddress = allDelegatorsAddresses[0];
            uint256 time = allRegistrations[0];
            for (uint256 i = 0; i < allDelegatorsAddresses.length; ) {
                if (allRegistrations[i] >= time) {
                    time = allRegistrations[i];
                    recentDelegatorAddress = allDelegatorsAddresses[i];
                }

                unchecked {
                    ++i;
                }
            }
            return (recentDelegatorAddress);
        } else {
            return (0x0000000000000000000000000000000000000000);
        }
    }

    /**
     * @notice This function checks the Consolidation status between 2 addresses
     */

    function checkConsolidationStatus(address _wallet1, address _wallet2, address _collectionAddress) public view returns (bool) {
        bool wallet1HasWallet2Consolidation = retrieveGlobalStatusOfDelegation(_wallet1, _collectionAddress, _wallet2, USE_CASE_CONSOLIDATION);
        bool wallet2HasWallet1Consolidation = retrieveGlobalStatusOfDelegation(_wallet2, _collectionAddress, _wallet1, USE_CASE_CONSOLIDATION);
        bool wallet1HasWallet2ConsolidationAll = retrieveGlobalStatusOfDelegation(_wallet1, ALL_COLLECTIONS, _wallet2, USE_CASE_CONSOLIDATION);
        bool wallet2HasWallet1ConsolidationAll = retrieveGlobalStatusOfDelegation(_wallet2, ALL_COLLECTIONS, _wallet1, USE_CASE_CONSOLIDATION);
        if (wallet1HasWallet2Consolidation == true && wallet2HasWallet1Consolidation == true) {
            return true;
        } else if (wallet1HasWallet2Consolidation == true && wallet2HasWallet1ConsolidationAll == true) {
            return true;
        } else if (wallet2HasWallet1Consolidation == true && wallet1HasWallet2ConsolidationAll == true) {
            return true;
        } else if (wallet1HasWallet2ConsolidationAll ==  true && wallet2HasWallet1ConsolidationAll == true) {
            return true;
        } else {
        return false;
        }
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"collectionAddress","type":"address"},{"indexed":true,"internalType":"address","name":"delegationAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"useCase","type":"uint256"},{"indexed":false,"internalType":"bool","name":"allTokens","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"RegisterDelegation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"collectionAddress","type":"address"},{"indexed":true,"internalType":"address","name":"delegationAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"useCase","type":"uint256"},{"indexed":false,"internalType":"bool","name":"allTokens","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"RegisterDelegationUsingSubDelegation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"collectionAddress","type":"address"},{"indexed":true,"internalType":"address","name":"delegationAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"useCase","type":"uint256"}],"name":"RevokeDelegation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"collectionAddress","type":"address"},{"indexed":true,"internalType":"address","name":"delegationAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"useCase","type":"uint256"}],"name":"RevokeDelegationUsingSubDelegation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"collectionAddress","type":"address"},{"indexed":false,"internalType":"address","name":"olddelegationAddress","type":"address"},{"indexed":true,"internalType":"address","name":"newdelegationAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"useCase","type":"uint256"},{"indexed":false,"internalType":"bool","name":"allTokens","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"UpdateDelegation","type":"event"},{"inputs":[{"internalType":"address[]","name":"_collectionAddresses","type":"address[]"},{"internalType":"address[]","name":"_delegationAddresses","type":"address[]"},{"internalType":"uint256[]","name":"_expiryDates","type":"uint256[]"},{"internalType":"uint256[]","name":"_useCases","type":"uint256[]"},{"internalType":"bool[]","name":"_allTokens","type":"bool[]"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"batchDelegations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_collectionAddresses","type":"address[]"},{"internalType":"address[]","name":"_delegationAddresses","type":"address[]"},{"internalType":"uint256[]","name":"_useCases","type":"uint256[]"}],"name":"batchRevocations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet1","type":"address"},{"internalType":"address","name":"_wallet2","type":"address"},{"internalType":"address","name":"_collectionAddress","type":"address"}],"name":"checkConsolidationStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"collectionLock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"collectionUsecaseLock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"delegationAddressHashes","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"delegatorHashes","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"globalDelegationHashes","outputs":[{"internalType":"address","name":"delegatorAddress","type":"address"},{"internalType":"address","name":"delegationAddress","type":"address"},{"internalType":"uint256","name":"registeredDate","type":"uint256"},{"internalType":"uint256","name":"expiryDate","type":"uint256"},{"internalType":"bool","name":"allTokens","type":"bool"},{"internalType":"uint256","name":"tokens","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"globalLock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_collectionAddress","type":"address"},{"internalType":"address","name":"_delegationAddress","type":"address"},{"internalType":"uint256","name":"_expiryDate","type":"uint256"},{"internalType":"uint256","name":"_useCase","type":"uint256"},{"internalType":"bool","name":"_allTokens","type":"bool"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"registerDelegationAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_delegatorAddress","type":"address"},{"internalType":"address","name":"_collectionAddress","type":"address"},{"internalType":"address","name":"_delegationAddress","type":"address"},{"internalType":"uint256","name":"_expiryDate","type":"uint256"},{"internalType":"uint256","name":"_useCase","type":"uint256"},{"internalType":"bool","name":"_allTokens","type":"bool"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"registerDelegationAddressUsingSubDelegation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_delegatorAddress","type":"address"},{"internalType":"address","name":"_collectionAddress","type":"address"},{"internalType":"uint256","name":"_date","type":"uint256"},{"internalType":"uint256","name":"_useCase","type":"uint256"}],"name":"retrieveActiveDelegations","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_delegationAddress","type":"address"},{"internalType":"address","name":"_collectionAddress","type":"address"},{"internalType":"uint256","name":"_date","type":"uint256"},{"internalType":"uint256","name":"_useCase","type":"uint256"}],"name":"retrieveActiveDelegators","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_collectionAddress","type":"address"},{"internalType":"address","name":"_delegationAddress","type":"address"}],"name":"retrieveCollectionLockStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_collectionAddress","type":"address"},{"internalType":"address","name":"_delegationAddress","type":"address"},{"internalType":"uint256","name":"_useCase","type":"uint256"}],"name":"retrieveCollectionUseCaseLockStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_collectionAddress","type":"address"},{"internalType":"address","name":"_delegationAddress","type":"address"},{"internalType":"uint256","name":"_useCase","type":"uint256"}],"name":"retrieveCollectionUseCaseLockStatusOneCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_delegationAddress","type":"address"},{"internalType":"address","name":"_collectionAddress","type":"address"},{"internalType":"uint256","name":"_useCase","type":"uint256"}],"name":"retrieveDelegationAddressStatusOfDelegation","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_delegatorAddress","type":"address"},{"internalType":"address","name":"_collectionAddress","type":"address"},{"internalType":"uint256","name":"_useCase","type":"uint256"}],"name":"retrieveDelegationAddresses","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_delegatorAddress","type":"address"},{"internalType":"address","name":"_collectionAddress","type":"address"},{"internalType":"uint256","name":"_useCase","type":"uint256"}],"name":"retrieveDelegationAddressesTokensIDsandExpiredDates","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bool[]","name":"","type":"bool[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_delegatorAddress","type":"address"},{"internalType":"address","name":"_collectionAddress","type":"address"},{"internalType":"uint256","name":"_useCase","type":"uint256"}],"name":"retrieveDelegatorStatusOfDelegation","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_delegationAddress","type":"address"},{"internalType":"address","name":"_collectionAddress","type":"address"},{"internalType":"uint256","name":"_useCase","type":"uint256"}],"name":"retrieveDelegators","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_delegationAddress","type":"address"},{"internalType":"address","name":"_collectionAddress","type":"address"},{"internalType":"uint256","name":"_useCase","type":"uint256"}],"name":"retrieveDelegatorsTokensIDsandExpiredDates","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bool[]","name":"","type":"bool[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_delegatorAddress","type":"address"},{"internalType":"address","name":"_collectionAddress","type":"address"},{"internalType":"address","name":"_delegationAddress","type":"address"},{"internalType":"uint256","name":"_useCase","type":"uint256"}],"name":"retrieveGlobalHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_delegationAddress","type":"address"}],"name":"retrieveGlobalLockStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_delegatorAddress","type":"address"},{"internalType":"address","name":"_collectionAddress","type":"address"},{"internalType":"address","name":"_delegationAddress","type":"address"},{"internalType":"uint256","name":"_useCase","type":"uint256"}],"name":"retrieveGlobalStatusOfDelegation","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_walletAddress","type":"address"},{"internalType":"address","name":"_collectionAddress","type":"address"},{"internalType":"uint256","name":"_useCase","type":"uint256"}],"name":"retrieveLocalHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_delegatorAddress","type":"address"},{"internalType":"address","name":"_collectionAddress","type":"address"},{"internalType":"uint256","name":"_useCase","type":"uint256"}],"name":"retrieveMostRecentDelegation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_delegationAddress","type":"address"},{"internalType":"address","name":"_collectionAddress","type":"address"},{"internalType":"uint256","name":"_useCase","type":"uint256"}],"name":"retrieveMostRecentDelegator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_delegatorAddress","type":"address"},{"internalType":"address","name":"_collectionAddress","type":"address"},{"internalType":"address","name":"_delegationAddress","type":"address"},{"internalType":"uint256","name":"_date","type":"uint256"},{"internalType":"uint256","name":"_useCase","type":"uint256"}],"name":"retrieveStatusOfActiveDelegator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_delegatorAddress","type":"address"},{"internalType":"address","name":"_collectionAddress","type":"address"},{"internalType":"address","name":"_delegationAddress","type":"address"},{"internalType":"uint256","name":"_useCase","type":"uint256"}],"name":"retrieveStatusOfMostRecentDelegation","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_delegatorAddress","type":"address"},{"internalType":"address","name":"_collectionAddress","type":"address"},{"internalType":"address","name":"_delegationAddress","type":"address"}],"name":"retrieveSubDelegationStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_delegatorAddress","type":"address"},{"internalType":"address","name":"_collectionAddress","type":"address"},{"internalType":"address","name":"_delegationAddress","type":"address"},{"internalType":"uint256","name":"_useCase","type":"uint256"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"retrieveTokenStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_collectionAddress","type":"address"},{"internalType":"address","name":"_delegationAddress","type":"address"},{"internalType":"uint256","name":"_useCase","type":"uint256"}],"name":"revokeDelegationAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_delegatorAddress","type":"address"},{"internalType":"address","name":"_collectionAddress","type":"address"},{"internalType":"address","name":"_delegationAddress","type":"address"},{"internalType":"uint256","name":"_useCase","type":"uint256"}],"name":"revokeDelegationAddressUsingSubdelegation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collectionAddress","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setCollectionLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collectionAddress","type":"address"},{"internalType":"uint256","name":"_useCase","type":"uint256"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setCollectionUsecaseLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setGlobalLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collectionAddress","type":"address"},{"internalType":"address","name":"_olddelegationAddress","type":"address"},{"internalType":"address","name":"_newdelegationAddress","type":"address"},{"internalType":"uint256","name":"_expiryDate","type":"uint256"},{"internalType":"uint256","name":"_useCase","type":"uint256"},{"internalType":"bool","name":"_allTokens","type":"bool"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"updateDelegationAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateUseCaseCounter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"useCaseCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

608060405234801561001057600080fd5b506103e760005561511e806100266000396000f3fe608060405234801561001057600080fd5b50600436106102485760003560e01c80637d20ab741161013b578063ccc4f4a4116100b8578063ea63eedc1161007c578063ea63eedc146105a0578063ec0c95ee146105b3578063ec699beb146105d6578063f5b986df14610602578063f793b96e1461061557600080fd5b8063ccc4f4a41461053c578063d141baae14610544578063d6a0a3d514610567578063d986ff6d1461057a578063db1432391461058d57600080fd5b80639bccd56c116100ff5780639bccd56c146104cd578063a4fa0303146104e0578063aa3e650a146104f3578063b2f60eec14610506578063c7cc4bb41461052957600080fd5b80637d20ab741461046a5780637ed01e121461048b5780637f1a2fdf1461049e578063850e8e06146104a75780638bb60cb6146104ba57600080fd5b806346edce67116101c957806366ff484d1161018d57806366ff484d1461040b5780636cfcae201461041e5780636ff565131461043157806373aedfff14610444578063782740d51461045757600080fd5b806346edce67146103625780634b1fe249146103af5780634b402f27146103d25780635d44c776146103e55780635e5b57a2146103f857600080fd5b80632c96e0d9116102105780632c96e0d9146102e8578063319a9395146102fb5780633465ef111461032957806336ddecfb1461033c5780633b9959521461034f57600080fd5b8063155424001461024d57806316eca9931461027d57806322b613ef146102a0578063234dd639146102c05780632a243ce7146102d3575b600080fd5b61026061025b366004614889565b610628565b6040516001600160a01b0390911681526020015b60405180910390f35b61029061028b3660046148c7565b610660565b6040519015158152602001610274565b6102b36102ae36600461491c565b61076b565b604051610274919061499c565b6102906102ce3660046148c7565b610805565b6102e66102e13660046149bf565b610874565b005b6102906102f636600461491c565b610d9b565b6102e6610309366004614a1e565b336000908152600460205260409020805460ff1916911515919091179055565b61026061033736600461491c565b610de3565b61029061034a36600461491c565b6112af565b61029061035d36600461491c565b6112fa565b610375610370366004614889565b611342565b604080516001600160a01b0397881681529690951660208701529385019290925260608401521515608083015260a082015260c001610274565b6103c26103bd36600461491c565b6113a5565b6040516102749493929190614a69565b6102e66103e0366004614ae7565b61197c565b6102906103f3366004614b58565b611fcf565b610290610406366004614b8b565b612064565b6102e661041936600461491c565b6120f1565b6102b361042c36600461491c565b612704565b61029061043f36600461491c565b61279b565b61026061045236600461491c565b6127f7565b610290610465366004614bce565b612ca7565b61047d61047836600461491c565b612cd3565b604051908152602001610274565b6102e6610499366004614bce565b612d0c565b61047d60005481565b6102e66104b5366004614ae7565b61343b565b6102906104c8366004614b8b565b6134b8565b6102e66104db366004614db1565b6135ce565b6102e66104ee366004614ea5565b613694565b6103c261050136600461491c565b6136fa565b610290610514366004614ed8565b60056020526000908152604090205460ff1681565b6102b3610537366004614ef1565b613c7c565b6102e661417b565b610290610552366004614ed8565b60066020526000908152604090205460ff1681565b6102e6610575366004614f33565b61418e565b610290610588366004614bce565b61421e565b61026061059b366004614889565b614269565b6102b36105ae366004614ef1565b614285565b6102906105c1366004614f5d565b60046020526000908152604090205460ff1681565b6102906105e4366004614f5d565b6001600160a01b031660009081526004602052604090205460ff1690565b61047d610610366004614bce565b61475a565b6102e6610623366004614f78565b614796565b6001602052816000526040600020818154811061064457600080fd5b6000918252602090912001546001600160a01b03169150829050565b6000808686868660405160200161067a9493929190614fff565b60408051601f19818403018152918152815160209283012060008181526003909352908220549092501561075b5760005b6000838152600360205260409020548110156107515760008381526003602052604090208054829081106106e1576106e1615035565b600091825260209091206004600690920201015460ff161580156107375750600083815260036020526040902080548691908390811061072357610723615035565b906000526020600020906006020160050154145b156107455760019150610751565b600091506001016106ab565b5091506107629050565b6000925050505b95945050505050565b606060008484846040516020016107849392919061504b565b60408051601f19818403018152828252805160209182012060008181526001835283902080548084028601840190945283855290945091908301828280156107f557602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116107d7575b50505050509150505b9392505050565b60008061081485878686613c7c565b90506000808251111561075b5760005b82518110156107515782818151811061083f5761083f615035565b60200260200101516001600160a01b0316896001600160a01b0316036108685760019150610751565b60009150600101610824565b60008311801561088657506000548311155b61088f57600080fd5b6000806000806000808b8b6040516020016108ab929190615074565b6040516020818303038152906040528051906020012092508b8b8a6040516020016108d89392919061504b565b6040516020818303038152906040528051906020012091507388888888888888888888888888888888888888888b8a6040516020016109199392919061504b565b60408051601f1981840301815291815281516020928301206001600160a01b038e166000908152600490935291205490915060ff161561095857600080fd5b60008381526005602052604090205460ff161561097457600080fd5b60008281526006602052604090205460ff161561099057600080fd5b60008181526006602052604090205460ff16156109ac57600080fd5b338c8c8b6040516020016109c39493929190614fff565b604051602081830303815290604052805190602001209350338c8a6040516020016109f09392919061504b565b6040516020818303038152906040528051906020012095508a8c8a604051602001610a1d9392919061504b565b604051602081830303815290604052805190602001209450600160008781526020019081526020016000208b9080600181540180825580915050600190039060005260206000200160009091909190916101000a8154816001600160a01b0302191690836001600160a01b0316021790555060026000868152602001908152602001600020339080600181540180825580915050600190039060005260206000200160009091909190916101000a8154816001600160a01b0302191690836001600160a01b031602179055508715156001151503610c195760006040518060c00160405280336001600160a01b031681526020018d6001600160a01b031681526020014281526020018c8152602001600115158152602001600081525090506003600086815260200190815260200160002081908060018154018082558091505060019003906000526020600020906006020160009091909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff02191690831515021790555060a08201518160050155505050610d38565b60006040518060c00160405280336001600160a01b031681526020018d6001600160a01b031681526020014281526020018c81526020016000151581526020018981525090506003600086815260200190815260200160002081908060018154018082558091505060019003906000526020600020906006020160009091909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff02191690831515021790555060a082015181600501555050505b604080518a815289151560208201529081018890526001600160a01b03808d1691908e169033907fcf23f2b40be0e08bb0a6b6d6bef575e6441f3137f93730338475a86920fd2217906060015b60405180910390a4505050505050505050505050565b600080848484604051602001610db39392919061504b565b60408051808303601f19018152918152815160209283012060009081526002909252902054151595945050505050565b600080610df1858585612704565b905060008082516001600160401b03811115610e0f57610e0f614c19565b604051908082528060200260200182016040528015610e38578160200160208202803683370190505b509050600080600080865111156112a05760005b8651811015610ed057868181518110610e6757610e67615035565b60200260200101518a8c8b604051602001610e859493929190614fff565b60405160208183030381529060405280519060200120955085858581518110610eb057610eb0615035565b6020908102919091010152610ec68460016150ac565b9350600101610e4c565b5060005b60018551610ee291906150bf565b811015610f6c576000610ef68260016150ac565b90505b8551811015610f6357858181518110610f1457610f14615035565b6020026020010151868381518110610f2e57610f2e615035565b602002602001015103610f5b57858281518110610f4d57610f4d615035565b600060209182029290920101525b600101610ef9565b50600101610ed4565b5060005b8451811015610fbe578160036000878481518110610f9057610f90615035565b6020026020010151815260200190815260200160002080549050610fb491906150ac565b9150600101610f70565b506000816001600160401b03811115610fd957610fd9614c19565b604051908082528060200260200182016040528015611002578160200160208202803683370190505b5090506000826001600160401b0381111561101f5761101f614c19565b604051908082528060200260200182016040528015611048578160200160208202803683370190505b50905060005b838110156111e15760006003600089848151811061106e5761106e615035565b602002602001015181526020019081526020016000208054905011156111d95760005b600360008984815181106110a7576110a7615035565b60200260200101518152602001908152602001600020805490508110156111d757600360008984815181106110de576110de615035565b60200260200101518152602001908152602001600020818154811061110557611105615035565b600091825260209091206006909102015484516001600160a01b039091169085908890811061113657611136615035565b60200260200101906001600160a01b031690816001600160a01b0316815250506003600089848151811061116c5761116c615035565b60200260200101518152602001908152602001600020818154811061119357611193615035565b9060005260206000209060060201600201548387815181106111b7576111b7615035565b60209081029190910101526111cd8660016150ac565b9550600101611091565b505b60010161104e565b506000826000815181106111f7576111f7615035565b6020026020010151905060008260008151811061121657611216615035565b6020026020010151905060005b845181101561128d578184828151811061123f5761123f615035565b6020026020010151106112855783818151811061125e5761125e615035565b6020026020010151915084818151811061127a5761127a615035565b602002602001015192505b600101611223565b50819a50505050505050505050506107fe565b600096505050505050506107fe565b6000816001036112ca576112c38484611fcf565b90506107fe565b6112d584848461279b565b806112c357506112c3738888888888888888888888888888888888888888848461279b565b6000808484846040516020016113129392919061504b565b60408051808303601f19018152918152815160209283012060009081526001909252902054151595945050505050565b6003602052816000526040600020818154811061135e57600080fd5b60009182526020909120600690910201805460018201546002830154600384015460048501546005909501546001600160a01b0394851697509290931694509260ff169086565b60608060608060006113b8888888612704565b905060008082516001600160401b038111156113d6576113d6614c19565b6040519080825280602002602001820160405280156113ff578160200160208202803683370190505b509050600080600080865111156119395760005b86518110156114975786818151811061142e5761142e615035565b60200260200101518d8f8e60405160200161144c9493929190614fff565b6040516020818303038152906040528051906020012095508585858151811061147757611477615035565b602090810291909101015261148d8460016150ac565b9350600101611413565b5060005b600185516114a991906150bf565b8110156115335760006114bd8260016150ac565b90505b855181101561152a578581815181106114db576114db615035565b60200260200101518683815181106114f5576114f5615035565b6020026020010151036115225785828151811061151457611514615035565b600060209182029290920101525b6001016114c0565b5060010161149b565b5060005b845181101561158557816003600087848151811061155757611557615035565b602002602001015181526020019081526020016000208054905061157b91906150ac565b9150600101611537565b506000816001600160401b038111156115a0576115a0614c19565b6040519080825280602002602001820160405280156115c9578160200160208202803683370190505b5090506000826001600160401b038111156115e6576115e6614c19565b60405190808252806020026020018201604052801561160f578160200160208202803683370190505b5090506000836001600160401b0381111561162c5761162c614c19565b604051908082528060200260200182016040528015611655578160200160208202803683370190505b5090506000846001600160401b0381111561167257611672614c19565b60405190808252806020026020018201604052801561169b578160200160208202803683370190505b50905060005b85811015611921576000600360008b84815181106116c1576116c1615035565b602002602001015181526020019081526020016000208054905011156119195760005b600360008b84815181106116fa576116fa615035565b602002602001015181526020019081526020016000208054905081101561191757600360008b848151811061173157611731615035565b60200260200101518152602001908152602001600020818154811061175857611758615035565b600091825260209091206006909102015486516001600160a01b039091169087908a90811061178957611789615035565b60200260200101906001600160a01b031690816001600160a01b031681525050600360008b84815181106117bf576117bf615035565b6020026020010151815260200190815260200160002081815481106117e6576117e6615035565b90600052602060002090600602016003015483898151811061180a5761180a615035565b602002602001018181525050600360008b848151811061182c5761182c615035565b60200260200101518152602001908152602001600020818154811061185357611853615035565b906000526020600020906006020160040160009054906101000a900460ff1684898151811061188457611884615035565b602002602001019015159081151581525050600360008b84815181106118ac576118ac615035565b6020026020010151815260200190815260200160002081815481106118d3576118d3615035565b9060005260206000209060060201600501548589815181106118f7576118f7615035565b602090810291909101015261190d8860016150ac565b97506001016116e4565b505b6001016116a1565b50929c50919a50909850965061197395505050505050565b5050604080516000808252602082018181528284018281526060840192835260808401909452919a50985090965094506119739350505050565b93509350935093565b60008061198c33896103e6612704565b8051909150156119e75760005b81518110156119e5578181815181106119b4576119b4615035565b60200260200101516001600160a01b03168a6001600160a01b0316036119dd57600192506119e5565b600101611999565b505b611a08337388888888888888888888888888888888888888886103e6612704565b805190915015611a6d57600182151514611a6d5760005b8151811015611a6b57818181518110611a3a57611a3a615035565b60200260200101516001600160a01b03168a6001600160a01b031603611a635760019250611a6b565b600101611a1f565b505b600182151514611a7c57600080fd5b5050600083118015611a9057506000548311155b611a9957600080fd5b6000806000806000808b8b604051602001611ab5929190615074565b6040516020818303038152906040528051906020012092508b8b8a604051602001611ae29392919061504b565b6040516020818303038152906040528051906020012091507388888888888888888888888888888888888888888b8a604051602001611b239392919061504b565b60408051601f1981840301815291815281516020928301206001600160a01b038e166000908152600490935291205490915060ff1615611b6257600080fd5b60008381526005602052604090205460ff1615611b7e57600080fd5b60008281526006602052604090205460ff1615611b9a57600080fd5b60008181526006602052604090205460ff1615611bb657600080fd5b8c8c8c8b604051602001611bcd9493929190614fff565b6040516020818303038152906040528051906020012093508c8c8a604051602001611bfa9392919061504b565b6040516020818303038152906040528051906020012095508a8c8a604051602001611c279392919061504b565b604051602081830303815290604052805190602001209450600160008781526020019081526020016000208b9080600181540180825580915050600190039060005260206000200160009091909190916101000a8154816001600160a01b0302191690836001600160a01b03160217905550600260008681526020019081526020016000208d9080600181540180825580915050600190039060005260206000200160009091909190916101000a8154816001600160a01b0302191690836001600160a01b031602179055508715156001151503611e235760006040518060c001604052808f6001600160a01b031681526020018d6001600160a01b031681526020014281526020018c8152602001600115158152602001600081525090506003600086815260200190815260200160002081908060018154018082558091505060019003906000526020600020906006020160009091909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff02191690831515021790555060a08201518160050155505050611f42565b60006040518060c001604052808f6001600160a01b031681526020018d6001600160a01b031681526020014281526020018c81526020016000151581526020018981525090506003600086815260200190815260200160002081908060018154018082558091505060019003906000526020600020906006020160009091909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff02191690831515021790555060a082015181600501555050505b8a6001600160a01b03168c6001600160a01b03168e6001600160a01b03167fbd5af040fa27449f00e35a368bb558ba6b619f0da43b8f35722fe7f8de754b5f338d8d8d604051611fb894939291906001600160a01b03949094168452602084019290925215156040830152606082015260800190565b60405180910390a450505050505050505050505050565b6000738888888888888888888888888888888888888887196001600160a01b0384160161201857506001600160a01b03811660009081526004602052604090205460ff1661205e565b6000838360405160200161202d929190615074565b60408051601f1981840301815291815281516020928301206000908152600590925290205460ff16915061205e9050565b92915050565b600080600061207684866103e6612704565b8051909150156120d15760005b81518110156120cf5781818151811061209e5761209e615035565b60200260200101516001600160a01b0316876001600160a01b0316036120c757600192506120cf565b600101612083565b505b8115156001036120e6576001925050506107fe565b6000925050506107fe565b6000806000803387878760405160200161210e9493929190614fff565b60405160208183030381529060405280519060200120915033878660405160200161213b9392919061504b565b6040516020818303038152906040528051906020012093508587866040516020016121689392919061504b565b60408051601f1981840301815291815281516020928301206000878152600190935290822054909450909150156126fb5760005b6000858152600160205260409020548110156122075760008581526001602052604090208054829081106121d2576121d2615035565b6000918252602090912001546001600160a01b03908116908816036121ff576121fc8260016150ac565b91505b60010161219c565b506000816001600160401b0381111561222257612222614c19565b60405190808252806020026020018201604052801561224b578160200160208202803683370190505b5090506000805b6000878152600160205260409020548110156122db57600087815260016020526040902080548290811061228857612288615035565b6000918252602090912001546001600160a01b03908116908a16036122d357808383815181106122ba576122ba615035565b60209081029190910101526122d08260016150ac565b91505b600101612252565b50801561241a5760005b82518110156124185760008084836001875161230191906150bf565b61230b91906150bf565b8151811061231b5761231b615035565b6020026020010151915060018060008b81526020019081526020016000208054905061234791906150bf565b60008a81526001602052604090208054919250908290811061236b5761236b615035565b60009182526020808320909101548b83526001909152604090912080546001600160a01b0390921691849081106123a4576123a4615035565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394909416939093179092558a81526001909152604090208054806123ec576123ec6150d2565b600082815260209020810160001990810180546001600160a01b031916905501905550506001016122e5565b505b6000805b60008781526002602052604090205481101561248557600087815260026020526040902080548290811061245457612454615035565b6000918252602090912001546001600160a01b0316330361247d5761247a8260016150ac565b91505b60010161241e565b506000816001600160401b038111156124a0576124a0614c19565b6040519080825280602002602001820160405280156124c9578160200160208202803683370190505b5090506000805b60008981526002602052604090205481101561255557600089815260026020526040902080548290811061250657612506615035565b6000918252602090912001546001600160a01b0316330361254d578083838151811061253457612534615035565b602090810291909101015261254a8260016150ac565b91505b6001016124d0565b5080156126955760005b82518110156126935760008084836001875161257b91906150bf565b61258591906150bf565b8151811061259557612595615035565b602002602001015191506001600260008d8152602001908152602001600020805490506125c291906150bf565b60008c8152600260205260409020805491925090829081106125e6576125e6615035565b60009182526020808320909101548d83526002909152604090912080546001600160a01b03909216918490811061261f5761261f615035565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394909416939093179092558c8152600290915260409020805480612667576126676150d2565b600082815260209020810160001990810180546001600160a01b0319169055019055505060010161255f565b505b60008781526003602052604081206126ac91614814565b8a6001600160a01b03168c6001600160a01b0316336001600160a01b03167feb2716ae908a1e27125f13f2a948ee7b067d22f92b1fc0152355e0085d80177e8d604051610d8591815260200190565b50505050505050565b6060600084848460405160200161271d9392919061504b565b60408051601f19818403018152828252805160209182012060008181526002835283902080548084028601840190945283855290945091908301828280156107f5576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116107d75750505050509150509392505050565b6000816001036127af576112c38484611fcf565b60008484846040516020016127c69392919061504b565b60408051601f1981840301815291815281516020928301206000908152600690925290205460ff1691506107fe9050565b60008061280585858561076b565b905060008082516001600160401b0381111561282357612823614c19565b60405190808252806020026020018201604052801561284c578160200160208202803683370190505b509050600080600080865111156112a05760005b86518110156128e4578a8a88838151811061287d5761287d615035565b60200260200101518b6040516020016128999493929190614fff565b604051602081830303815290604052805190602001209550858585815181106128c4576128c4615035565b60209081029190910101526128da8460016150ac565b9350600101612860565b5060005b600185516128f691906150bf565b81101561298057600061290a8260016150ac565b90505b85518110156129775785818151811061292857612928615035565b602002602001015186838151811061294257612942615035565b60200260200101510361296f5785828151811061296157612961615035565b600060209182029290920101525b60010161290d565b506001016128e8565b5060005b84518110156129d25781600360008784815181106129a4576129a4615035565b60200260200101518152602001908152602001600020805490506129c891906150ac565b9150600101612984565b506000816001600160401b038111156129ed576129ed614c19565b604051908082528060200260200182016040528015612a16578160200160208202803683370190505b5090506000826001600160401b03811115612a3357612a33614c19565b604051908082528060200260200182016040528015612a5c578160200160208202803683370190505b50905060005b83811015612bfb57600060036000898481518110612a8257612a82615035565b60200260200101518152602001908152602001600020805490501115612bf35760005b60036000898481518110612abb57612abb615035565b6020026020010151815260200190815260200160002080549050811015612bf15760036000898481518110612af257612af2615035565b602002602001015181526020019081526020016000208181548110612b1957612b19615035565b906000526020600020906006020160010160009054906101000a90046001600160a01b0316848781518110612b5057612b50615035565b60200260200101906001600160a01b031690816001600160a01b03168152505060036000898481518110612b8657612b86615035565b602002602001015181526020019081526020016000208181548110612bad57612bad615035565b906000526020600020906006020160020154838781518110612bd157612bd1615035565b6020908102919091010152612be78660016150ac565b9550600101612aa5565b505b600101612a62565b50600082600081518110612c1157612c11615035565b60200260200101519050600082600081518110612c3057612c30615035565b6020026020010151905060005b845181101561128d5781848281518110612c5957612c59615035565b602002602001015110612c9f57838181518110612c7857612c78615035565b60200260200101519150848181518110612c9457612c94615035565b602002602001015192505b600101612c3d565b6000612cb48585846127f7565b6001600160a01b0316836001600160a01b03161490505b949350505050565b600080848484604051602001612ceb9392919061504b565b60408051808303601f19018152919052805160209091012095945050505050565b600080612d1c33866103e6612704565b805190915015612d775760005b8151811015612d7557818181518110612d4457612d44615035565b60200260200101516001600160a01b0316876001600160a01b031603612d6d5760019250612d75565b600101612d29565b505b612d98337388888888888888888888888888888888888888886103e6612704565b805190915015612dfd57600182151514612dfd5760005b8151811015612dfb57818181518110612dca57612dca615035565b60200260200101516001600160a01b0316876001600160a01b031603612df35760019250612dfb565b600101612daf565b505b600182151514612e0c57600080fd5b50506000848483604051602001612e259392919061504b565b6040516020818303038152906040528051906020012090506000838584604051602001612e549392919061504b565b604051602081830303815290604052805190602001209050600086868686604051602001612e859493929190614fff565b60408051601f1981840301815291815281516020928301206000868152600190935290822054909250156134315760005b600085815260016020526040902054811015612f21576000858152600160205260409020805482908110612eec57612eec615035565b6000918252602090912001546001600160a01b0390811690881603612f1957612f168260016150ac565b91505b600101612eb6565b506000816001600160401b03811115612f3c57612f3c614c19565b604051908082528060200260200182016040528015612f65578160200160208202803683370190505b5090506000805b600087815260016020526040902054811015612ff5576000878152600160205260409020805482908110612fa257612fa2615035565b6000918252602090912001546001600160a01b03908116908a1603612fed5780838381518110612fd457612fd4615035565b6020908102919091010152612fea8260016150ac565b91505b600101612f6c565b5080156131345760005b82518110156131325760008084836001875161301b91906150bf565b61302591906150bf565b8151811061303557613035615035565b6020026020010151915060018060008b81526020019081526020016000208054905061306191906150bf565b60008a81526001602052604090208054919250908290811061308557613085615035565b60009182526020808320909101548b83526001909152604090912080546001600160a01b0390921691849081106130be576130be615035565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394909416939093179092558a8152600190915260409020805480613106576131066150d2565b600082815260209020810160001990810180546001600160a01b03191690550190555050600101612fff565b505b6000805b6000878152600260205260409020548110156131a357600087815260026020526040902080548290811061316e5761316e615035565b6000918252602090912001546001600160a01b03908116908d160361319b576131988260016150ac565b91505b600101613138565b506000816001600160401b038111156131be576131be614c19565b6040519080825280602002602001820160405280156131e7578160200160208202803683370190505b5090506000805b60008981526002602052604090205481101561327757600089815260026020526040902080548290811061322457613224615035565b6000918252602090912001546001600160a01b03908116908f160361326f578083838151811061325657613256615035565b602090810291909101015261326c8260016150ac565b91505b6001016131ee565b5080156133b75760005b82518110156133b55760008084836001875161329d91906150bf565b6132a791906150bf565b815181106132b7576132b7615035565b602002602001015191506001600260008d8152602001908152602001600020805490506132e491906150bf565b60008c81526002602052604090208054919250908290811061330857613308615035565b60009182526020808320909101548d83526002909152604090912080546001600160a01b03909216918490811061334157613341615035565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394909416939093179092558c8152600290915260409020805480613389576133896150d2565b600082815260209020810160001990810180546001600160a01b03191690550190555050600101613281565b505b60008781526003602052604081206133ce91614814565b8a6001600160a01b03168c6001600160a01b03168e6001600160a01b03167f3fc9853b549d505712a2e247960ed1ec823b23c592b38d4b438cc603c2c55d70338e604051611fb89291906001600160a01b03929092168252602082015260400190565b5050505050505050565b6134468787856120f1565b613454878686868686610874565b604080516001600160a01b0388811682526020820186905284151582840152606082018490529151878316928a169133917f3660f2984c57dfe2d77b6a3d25a5a622a20793c5264ac0fb4b7d1f9b3e38b7ca9181900360800190a450505050505050565b6000806134c98584866103e761421e565b905060006134db8585886103e761421e565b9050600061350187738888888888888888888888888888888888888888886103e761421e565b90506000613527877388888888888888888888888888888888888888888a6103e761421e565b9050600184151514801561353d57506001831515145b1561354f5760019450505050506107fe565b600184151514801561356357506001811515145b156135755760019450505050506107fe565b600183151514801561358957506001821515145b1561359b5760019450505050506107fe565b60018215151480156135af57506001811515145b156135c15760019450505050506107fe565b60009450505050506107fe565b60068651106135dc57600080fd5b60005b86518110156126fb5761368c8782815181106135fd576135fd615035565b602002602001015187838151811061361757613617615035565b602002602001015187848151811061363157613631615035565b602002602001015187858151811061364b5761364b615035565b602002602001015187868151811061366557613665615035565b602002602001015187878151811061367f5761367f615035565b6020026020010151610874565b6001016135df565b816001036136ab576136a6838261418e565b505050565b60008333846040516020016136c29392919061504b565b60408051601f198184030181529181528151602092830120600090815260069092529020805483151560ff1990911617905550505050565b606080606080600061370d88888861076b565b905060008082516001600160401b0381111561372b5761372b614c19565b604051908082528060200260200182016040528015613754578160200160208202803683370190505b509050600080600080865111156119395760005b86518110156137ec578d8d88838151811061378557613785615035565b60200260200101518e6040516020016137a19493929190614fff565b604051602081830303815290604052805190602001209550858585815181106137cc576137cc615035565b60209081029190910101526137e28460016150ac565b9350600101613768565b5060005b600185516137fe91906150bf565b8110156138885760006138128260016150ac565b90505b855181101561387f5785818151811061383057613830615035565b602002602001015186838151811061384a5761384a615035565b6020026020010151036138775785828151811061386957613869615035565b600060209182029290920101525b600101613815565b506001016137f0565b5060005b84518110156138da5781600360008784815181106138ac576138ac615035565b60200260200101518152602001908152602001600020805490506138d091906150ac565b915060010161388c565b506000816001600160401b038111156138f5576138f5614c19565b60405190808252806020026020018201604052801561391e578160200160208202803683370190505b5090506000826001600160401b0381111561393b5761393b614c19565b604051908082528060200260200182016040528015613964578160200160208202803683370190505b5090506000836001600160401b0381111561398157613981614c19565b6040519080825280602002602001820160405280156139aa578160200160208202803683370190505b5090506000846001600160401b038111156139c7576139c7614c19565b6040519080825280602002602001820160405280156139f0578160200160208202803683370190505b50905060005b85811015611921576000600360008b8481518110613a1657613a16615035565b60200260200101518152602001908152602001600020805490501115613c745760005b600360008b8481518110613a4f57613a4f615035565b6020026020010151815260200190815260200160002080549050811015613c7257600360008b8481518110613a8657613a86615035565b602002602001015181526020019081526020016000208181548110613aad57613aad615035565b906000526020600020906006020160010160009054906101000a90046001600160a01b0316868981518110613ae457613ae4615035565b60200260200101906001600160a01b031690816001600160a01b031681525050600360008b8481518110613b1a57613b1a615035565b602002602001015181526020019081526020016000208181548110613b4157613b41615035565b906000526020600020906006020160030154838981518110613b6557613b65615035565b602002602001018181525050600360008b8481518110613b8757613b87615035565b602002602001015181526020019081526020016000208181548110613bae57613bae615035565b906000526020600020906006020160040160009054906101000a900460ff16848981518110613bdf57613bdf615035565b602002602001019015159081151581525050600360008b8481518110613c0757613c07615035565b602002602001015181526020019081526020016000208181548110613c2e57613c2e615035565b906000526020600020906006020160050154858981518110613c5257613c52615035565b6020908102919091010152613c688860016150ac565b9750600101613a39565b505b6001016139f6565b60606000613c8b868685612704565b905060008082516001600160401b03811115613ca957613ca9614c19565b604051908082528060200260200182016040528015613cd2578160200160208202803683370190505b50905060008060008060008751111561415d5760005b8751811015613d6c57878181518110613d0357613d03615035565b60200260200101518c8e8c604051602001613d219493929190614fff565b60405160208183030381529060405280519060200120965086868681518110613d4c57613d4c615035565b6020908102919091010152613d628560016150ac565b9450600101613ce8565b5060005b60018651613d7e91906150bf565b811015613e08576000613d928260016150ac565b90505b8651811015613dff57868181518110613db057613db0615035565b6020026020010151878381518110613dca57613dca615035565b602002602001015103613df757868281518110613de957613de9615035565b600060209182029290920101525b600101613d95565b50600101613d70565b5060005b8551811015613e5a578160036000888481518110613e2c57613e2c615035565b6020026020010151815260200190815260200160002080549050613e5091906150ac565b9150600101613e0c565b506000816001600160401b03811115613e7557613e75614c19565b604051908082528060200260200182016040528015613e9e578160200160208202803683370190505b5090506000826001600160401b03811115613ebb57613ebb614c19565b604051908082528060200260200182016040528015613ee4578160200160208202803683370190505b50905060005b8381101561407d576000600360008a8481518110613f0a57613f0a615035565b602002602001015181526020019081526020016000208054905011156140755760005b600360008a8481518110613f4357613f43615035565b602002602001015181526020019081526020016000208054905081101561407357600360008a8481518110613f7a57613f7a615035565b602002602001015181526020019081526020016000208181548110613fa157613fa1615035565b600091825260209091206006909102015484516001600160a01b0390911690859089908110613fd257613fd2615035565b60200260200101906001600160a01b031690816001600160a01b031681525050600360008a848151811061400857614008615035565b60200260200101518152602001908152602001600020818154811061402f5761402f615035565b90600052602060002090600602016003015483888151811061405357614053615035565b60209081029190910101526140698760016150ac565b9650600101613f2d565b505b600101613eea565b50600081516001600160401b0381111561409957614099614c19565b6040519080825280602002602001820160405280156140c2578160200160208202803683370190505b50905060005b8481101561414b578d8382815181106140e3576140e3615035565b602002602001015111156141435783818151811061410357614103615035565b602002602001015182878151811061411d5761411d615035565b6001600160a01b03909216602092830291909101909101526141408660016150ac565b95505b6001016140c8565b509950612ccb98505050505050505050565b50506040805160008152602081019091529550612ccb945050505050565b6000546141899060016150ac565b600055565b738888888888888888888888888888888888888887196001600160a01b038316016141d257336000908152600460205260409020805460ff19168215151790555050565b600082336040516020016141e7929190615074565b60408051601f198184030181529181528151602092830120600090815260059092529020805483151560ff19909116179055505050565b600080858585856040516020016142389493929190614fff565b60408051808303601f1901815291815281516020928301206000908152600390925290205415159695505050505050565b6002602052816000526040600020818154811061064457600080fd5b6060600061429486868561076b565b905060008082516001600160401b038111156142b2576142b2614c19565b6040519080825280602002602001820160405280156142db578160200160208202803683370190505b50905060008060008060008751111561415d5760005b8751811015614375578c8c89838151811061430e5761430e615035565b60200260200101518c60405160200161432a9493929190614fff565b6040516020818303038152906040528051906020012096508686868151811061435557614355615035565b602090810291909101015261436b8560016150ac565b94506001016142f1565b5060005b6001865161438791906150bf565b81101561441157600061439b8260016150ac565b90505b8651811015614408578681815181106143b9576143b9615035565b60200260200101518783815181106143d3576143d3615035565b602002602001015103614400578682815181106143f2576143f2615035565b600060209182029290920101525b60010161439e565b50600101614379565b5060005b855181101561446357816003600088848151811061443557614435615035565b602002602001015181526020019081526020016000208054905061445991906150ac565b9150600101614415565b506000816001600160401b0381111561447e5761447e614c19565b6040519080825280602002602001820160405280156144a7578160200160208202803683370190505b5090506000826001600160401b038111156144c4576144c4614c19565b6040519080825280602002602001820160405280156144ed578160200160208202803683370190505b50905060005b8381101561468c576000600360008a848151811061451357614513615035565b602002602001015181526020019081526020016000208054905011156146845760005b600360008a848151811061454c5761454c615035565b602002602001015181526020019081526020016000208054905081101561468257600360008a848151811061458357614583615035565b6020026020010151815260200190815260200160002081815481106145aa576145aa615035565b906000526020600020906006020160010160009054906101000a90046001600160a01b03168488815181106145e1576145e1615035565b60200260200101906001600160a01b031690816001600160a01b031681525050600360008a848151811061461757614617615035565b60200260200101518152602001908152602001600020818154811061463e5761463e615035565b90600052602060002090600602016003015483888151811061466257614662615035565b60209081029190910101526146788760016150ac565b9650600101614536565b505b6001016144f3565b50600081516001600160401b038111156146a8576146a8614c19565b6040519080825280602002602001820160405280156146d1578160200160208202803683370190505b50905060005b8481101561414b578d8382815181106146f2576146f2615035565b602002602001015111156147525783818151811061471257614712615035565b602002602001015182878151811061472c5761472c615035565b6001600160a01b039092166020928302919091019091015261474f8660016150ac565b95505b6001016146d7565b600080858585856040516020016147749493929190614fff565b60408051808303601f1901815291905280516020909101209695505050505050565b60068351106147a457600080fd5b60005b835181101561480e576148068482815181106147c5576147c5615035565b60200260200101518483815181106147df576147df615035565b60200260200101518484815181106147f9576147f9615035565b60200260200101516120f1565b6001016147a7565b50505050565b50805460008255600602906000526020600020908101906148359190614838565b50565b5b808211156148855780546001600160a01b0319908116825560018201805490911690556000600282018190556003820181905560048201805460ff191690556005820155600601614839565b5090565b6000806040838503121561489c57600080fd5b50508035926020909101359150565b80356001600160a01b03811681146148c257600080fd5b919050565b600080600080600060a086880312156148df57600080fd5b6148e8866148ab565b94506148f6602087016148ab565b9350614904604087016148ab565b94979396509394606081013594506080013592915050565b60008060006060848603121561493157600080fd5b61493a846148ab565b9250614948602085016148ab565b9150604084013590509250925092565b600081518084526020808501945080840160005b838110156149915781516001600160a01b03168752958201959082019060010161496c565b509495945050505050565b6020815260006107fe6020830184614958565b803580151581146148c257600080fd5b60008060008060008060c087890312156149d857600080fd5b6149e1876148ab565b95506149ef602088016148ab565b94506040870135935060608701359250614a0b608088016149af565b915060a087013590509295509295509295565b600060208284031215614a3057600080fd5b6107fe826149af565b600081518084526020808501945080840160005b8381101561499157815187529582019590820190600101614a4d565b608081526000614a7c6080830187614958565b602083820381850152614a8f8288614a39565b8481036040860152865180825282880193509082019060005b81811015614ac6578451151583529383019391830191600101614aa8565b50508481036060860152614ada8187614a39565b9998505050505050505050565b600080600080600080600060e0888a031215614b0257600080fd5b614b0b886148ab565b9650614b19602089016148ab565b9550614b27604089016148ab565b94506060880135935060808801359250614b4360a089016149af565b915060c0880135905092959891949750929550565b60008060408385031215614b6b57600080fd5b614b74836148ab565b9150614b82602084016148ab565b90509250929050565b600080600060608486031215614ba057600080fd5b614ba9846148ab565b9250614bb7602085016148ab565b9150614bc5604085016148ab565b90509250925092565b60008060008060808587031215614be457600080fd5b614bed856148ab565b9350614bfb602086016148ab565b9250614c09604086016148ab565b9396929550929360600135925050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715614c5757614c57614c19565b604052919050565b60006001600160401b03821115614c7857614c78614c19565b5060051b60200190565b600082601f830112614c9357600080fd5b81356020614ca8614ca383614c5f565b614c2f565b82815260059290921b84018101918181019086841115614cc757600080fd5b8286015b84811015614ce957614cdc816148ab565b8352918301918301614ccb565b509695505050505050565b600082601f830112614d0557600080fd5b81356020614d15614ca383614c5f565b82815260059290921b84018101918181019086841115614d3457600080fd5b8286015b84811015614ce95780358352918301918301614d38565b600082601f830112614d6057600080fd5b81356020614d70614ca383614c5f565b82815260059290921b84018101918181019086841115614d8f57600080fd5b8286015b84811015614ce957614da4816149af565b8352918301918301614d93565b60008060008060008060c08789031215614dca57600080fd5b86356001600160401b0380821115614de157600080fd5b614ded8a838b01614c82565b97506020890135915080821115614e0357600080fd5b614e0f8a838b01614c82565b96506040890135915080821115614e2557600080fd5b614e318a838b01614cf4565b95506060890135915080821115614e4757600080fd5b614e538a838b01614cf4565b94506080890135915080821115614e6957600080fd5b614e758a838b01614d4f565b935060a0890135915080821115614e8b57600080fd5b50614e9889828a01614cf4565b9150509295509295509295565b600080600060608486031215614eba57600080fd5b614ec3846148ab565b925060208401359150614bc5604085016149af565b600060208284031215614eea57600080fd5b5035919050565b60008060008060808587031215614f0757600080fd5b614f10856148ab565b9350614f1e602086016148ab565b93969395505050506040820135916060013590565b60008060408385031215614f4657600080fd5b614f4f836148ab565b9150614b82602084016149af565b600060208284031215614f6f57600080fd5b6107fe826148ab565b600080600060608486031215614f8d57600080fd5b83356001600160401b0380821115614fa457600080fd5b614fb087838801614c82565b94506020860135915080821115614fc657600080fd5b614fd287838801614c82565b93506040860135915080821115614fe857600080fd5b50614ff586828701614cf4565b9150509250925092565b6001600160601b0319606095861b8116825293851b841660148201529190931b9091166028820152603c810191909152605c0190565b634e487b7160e01b600052603260045260246000fd5b6001600160601b0319606094851b811682529290931b9091166014830152602882015260480190565b6001600160601b0319606093841b811682529190921b16601482015260280190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561205e5761205e615096565b8181038181111561205e5761205e615096565b634e487b7160e01b600052603160045260246000fdfea26469706673582212206abdd81d490b6cf331d4d122475a7e118b81cc43bf5bf0aa5d00f909de3445aa64736f6c63430008120033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102485760003560e01c80637d20ab741161013b578063ccc4f4a4116100b8578063ea63eedc1161007c578063ea63eedc146105a0578063ec0c95ee146105b3578063ec699beb146105d6578063f5b986df14610602578063f793b96e1461061557600080fd5b8063ccc4f4a41461053c578063d141baae14610544578063d6a0a3d514610567578063d986ff6d1461057a578063db1432391461058d57600080fd5b80639bccd56c116100ff5780639bccd56c146104cd578063a4fa0303146104e0578063aa3e650a146104f3578063b2f60eec14610506578063c7cc4bb41461052957600080fd5b80637d20ab741461046a5780637ed01e121461048b5780637f1a2fdf1461049e578063850e8e06146104a75780638bb60cb6146104ba57600080fd5b806346edce67116101c957806366ff484d1161018d57806366ff484d1461040b5780636cfcae201461041e5780636ff565131461043157806373aedfff14610444578063782740d51461045757600080fd5b806346edce67146103625780634b1fe249146103af5780634b402f27146103d25780635d44c776146103e55780635e5b57a2146103f857600080fd5b80632c96e0d9116102105780632c96e0d9146102e8578063319a9395146102fb5780633465ef111461032957806336ddecfb1461033c5780633b9959521461034f57600080fd5b8063155424001461024d57806316eca9931461027d57806322b613ef146102a0578063234dd639146102c05780632a243ce7146102d3575b600080fd5b61026061025b366004614889565b610628565b6040516001600160a01b0390911681526020015b60405180910390f35b61029061028b3660046148c7565b610660565b6040519015158152602001610274565b6102b36102ae36600461491c565b61076b565b604051610274919061499c565b6102906102ce3660046148c7565b610805565b6102e66102e13660046149bf565b610874565b005b6102906102f636600461491c565b610d9b565b6102e6610309366004614a1e565b336000908152600460205260409020805460ff1916911515919091179055565b61026061033736600461491c565b610de3565b61029061034a36600461491c565b6112af565b61029061035d36600461491c565b6112fa565b610375610370366004614889565b611342565b604080516001600160a01b0397881681529690951660208701529385019290925260608401521515608083015260a082015260c001610274565b6103c26103bd36600461491c565b6113a5565b6040516102749493929190614a69565b6102e66103e0366004614ae7565b61197c565b6102906103f3366004614b58565b611fcf565b610290610406366004614b8b565b612064565b6102e661041936600461491c565b6120f1565b6102b361042c36600461491c565b612704565b61029061043f36600461491c565b61279b565b61026061045236600461491c565b6127f7565b610290610465366004614bce565b612ca7565b61047d61047836600461491c565b612cd3565b604051908152602001610274565b6102e6610499366004614bce565b612d0c565b61047d60005481565b6102e66104b5366004614ae7565b61343b565b6102906104c8366004614b8b565b6134b8565b6102e66104db366004614db1565b6135ce565b6102e66104ee366004614ea5565b613694565b6103c261050136600461491c565b6136fa565b610290610514366004614ed8565b60056020526000908152604090205460ff1681565b6102b3610537366004614ef1565b613c7c565b6102e661417b565b610290610552366004614ed8565b60066020526000908152604090205460ff1681565b6102e6610575366004614f33565b61418e565b610290610588366004614bce565b61421e565b61026061059b366004614889565b614269565b6102b36105ae366004614ef1565b614285565b6102906105c1366004614f5d565b60046020526000908152604090205460ff1681565b6102906105e4366004614f5d565b6001600160a01b031660009081526004602052604090205460ff1690565b61047d610610366004614bce565b61475a565b6102e6610623366004614f78565b614796565b6001602052816000526040600020818154811061064457600080fd5b6000918252602090912001546001600160a01b03169150829050565b6000808686868660405160200161067a9493929190614fff565b60408051601f19818403018152918152815160209283012060008181526003909352908220549092501561075b5760005b6000838152600360205260409020548110156107515760008381526003602052604090208054829081106106e1576106e1615035565b600091825260209091206004600690920201015460ff161580156107375750600083815260036020526040902080548691908390811061072357610723615035565b906000526020600020906006020160050154145b156107455760019150610751565b600091506001016106ab565b5091506107629050565b6000925050505b95945050505050565b606060008484846040516020016107849392919061504b565b60408051601f19818403018152828252805160209182012060008181526001835283902080548084028601840190945283855290945091908301828280156107f557602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116107d7575b50505050509150505b9392505050565b60008061081485878686613c7c565b90506000808251111561075b5760005b82518110156107515782818151811061083f5761083f615035565b60200260200101516001600160a01b0316896001600160a01b0316036108685760019150610751565b60009150600101610824565b60008311801561088657506000548311155b61088f57600080fd5b6000806000806000808b8b6040516020016108ab929190615074565b6040516020818303038152906040528051906020012092508b8b8a6040516020016108d89392919061504b565b6040516020818303038152906040528051906020012091507388888888888888888888888888888888888888888b8a6040516020016109199392919061504b565b60408051601f1981840301815291815281516020928301206001600160a01b038e166000908152600490935291205490915060ff161561095857600080fd5b60008381526005602052604090205460ff161561097457600080fd5b60008281526006602052604090205460ff161561099057600080fd5b60008181526006602052604090205460ff16156109ac57600080fd5b338c8c8b6040516020016109c39493929190614fff565b604051602081830303815290604052805190602001209350338c8a6040516020016109f09392919061504b565b6040516020818303038152906040528051906020012095508a8c8a604051602001610a1d9392919061504b565b604051602081830303815290604052805190602001209450600160008781526020019081526020016000208b9080600181540180825580915050600190039060005260206000200160009091909190916101000a8154816001600160a01b0302191690836001600160a01b0316021790555060026000868152602001908152602001600020339080600181540180825580915050600190039060005260206000200160009091909190916101000a8154816001600160a01b0302191690836001600160a01b031602179055508715156001151503610c195760006040518060c00160405280336001600160a01b031681526020018d6001600160a01b031681526020014281526020018c8152602001600115158152602001600081525090506003600086815260200190815260200160002081908060018154018082558091505060019003906000526020600020906006020160009091909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff02191690831515021790555060a08201518160050155505050610d38565b60006040518060c00160405280336001600160a01b031681526020018d6001600160a01b031681526020014281526020018c81526020016000151581526020018981525090506003600086815260200190815260200160002081908060018154018082558091505060019003906000526020600020906006020160009091909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff02191690831515021790555060a082015181600501555050505b604080518a815289151560208201529081018890526001600160a01b03808d1691908e169033907fcf23f2b40be0e08bb0a6b6d6bef575e6441f3137f93730338475a86920fd2217906060015b60405180910390a4505050505050505050505050565b600080848484604051602001610db39392919061504b565b60408051808303601f19018152918152815160209283012060009081526002909252902054151595945050505050565b600080610df1858585612704565b905060008082516001600160401b03811115610e0f57610e0f614c19565b604051908082528060200260200182016040528015610e38578160200160208202803683370190505b509050600080600080865111156112a05760005b8651811015610ed057868181518110610e6757610e67615035565b60200260200101518a8c8b604051602001610e859493929190614fff565b60405160208183030381529060405280519060200120955085858581518110610eb057610eb0615035565b6020908102919091010152610ec68460016150ac565b9350600101610e4c565b5060005b60018551610ee291906150bf565b811015610f6c576000610ef68260016150ac565b90505b8551811015610f6357858181518110610f1457610f14615035565b6020026020010151868381518110610f2e57610f2e615035565b602002602001015103610f5b57858281518110610f4d57610f4d615035565b600060209182029290920101525b600101610ef9565b50600101610ed4565b5060005b8451811015610fbe578160036000878481518110610f9057610f90615035565b6020026020010151815260200190815260200160002080549050610fb491906150ac565b9150600101610f70565b506000816001600160401b03811115610fd957610fd9614c19565b604051908082528060200260200182016040528015611002578160200160208202803683370190505b5090506000826001600160401b0381111561101f5761101f614c19565b604051908082528060200260200182016040528015611048578160200160208202803683370190505b50905060005b838110156111e15760006003600089848151811061106e5761106e615035565b602002602001015181526020019081526020016000208054905011156111d95760005b600360008984815181106110a7576110a7615035565b60200260200101518152602001908152602001600020805490508110156111d757600360008984815181106110de576110de615035565b60200260200101518152602001908152602001600020818154811061110557611105615035565b600091825260209091206006909102015484516001600160a01b039091169085908890811061113657611136615035565b60200260200101906001600160a01b031690816001600160a01b0316815250506003600089848151811061116c5761116c615035565b60200260200101518152602001908152602001600020818154811061119357611193615035565b9060005260206000209060060201600201548387815181106111b7576111b7615035565b60209081029190910101526111cd8660016150ac565b9550600101611091565b505b60010161104e565b506000826000815181106111f7576111f7615035565b6020026020010151905060008260008151811061121657611216615035565b6020026020010151905060005b845181101561128d578184828151811061123f5761123f615035565b6020026020010151106112855783818151811061125e5761125e615035565b6020026020010151915084818151811061127a5761127a615035565b602002602001015192505b600101611223565b50819a50505050505050505050506107fe565b600096505050505050506107fe565b6000816001036112ca576112c38484611fcf565b90506107fe565b6112d584848461279b565b806112c357506112c3738888888888888888888888888888888888888888848461279b565b6000808484846040516020016113129392919061504b565b60408051808303601f19018152918152815160209283012060009081526001909252902054151595945050505050565b6003602052816000526040600020818154811061135e57600080fd5b60009182526020909120600690910201805460018201546002830154600384015460048501546005909501546001600160a01b0394851697509290931694509260ff169086565b60608060608060006113b8888888612704565b905060008082516001600160401b038111156113d6576113d6614c19565b6040519080825280602002602001820160405280156113ff578160200160208202803683370190505b509050600080600080865111156119395760005b86518110156114975786818151811061142e5761142e615035565b60200260200101518d8f8e60405160200161144c9493929190614fff565b6040516020818303038152906040528051906020012095508585858151811061147757611477615035565b602090810291909101015261148d8460016150ac565b9350600101611413565b5060005b600185516114a991906150bf565b8110156115335760006114bd8260016150ac565b90505b855181101561152a578581815181106114db576114db615035565b60200260200101518683815181106114f5576114f5615035565b6020026020010151036115225785828151811061151457611514615035565b600060209182029290920101525b6001016114c0565b5060010161149b565b5060005b845181101561158557816003600087848151811061155757611557615035565b602002602001015181526020019081526020016000208054905061157b91906150ac565b9150600101611537565b506000816001600160401b038111156115a0576115a0614c19565b6040519080825280602002602001820160405280156115c9578160200160208202803683370190505b5090506000826001600160401b038111156115e6576115e6614c19565b60405190808252806020026020018201604052801561160f578160200160208202803683370190505b5090506000836001600160401b0381111561162c5761162c614c19565b604051908082528060200260200182016040528015611655578160200160208202803683370190505b5090506000846001600160401b0381111561167257611672614c19565b60405190808252806020026020018201604052801561169b578160200160208202803683370190505b50905060005b85811015611921576000600360008b84815181106116c1576116c1615035565b602002602001015181526020019081526020016000208054905011156119195760005b600360008b84815181106116fa576116fa615035565b602002602001015181526020019081526020016000208054905081101561191757600360008b848151811061173157611731615035565b60200260200101518152602001908152602001600020818154811061175857611758615035565b600091825260209091206006909102015486516001600160a01b039091169087908a90811061178957611789615035565b60200260200101906001600160a01b031690816001600160a01b031681525050600360008b84815181106117bf576117bf615035565b6020026020010151815260200190815260200160002081815481106117e6576117e6615035565b90600052602060002090600602016003015483898151811061180a5761180a615035565b602002602001018181525050600360008b848151811061182c5761182c615035565b60200260200101518152602001908152602001600020818154811061185357611853615035565b906000526020600020906006020160040160009054906101000a900460ff1684898151811061188457611884615035565b602002602001019015159081151581525050600360008b84815181106118ac576118ac615035565b6020026020010151815260200190815260200160002081815481106118d3576118d3615035565b9060005260206000209060060201600501548589815181106118f7576118f7615035565b602090810291909101015261190d8860016150ac565b97506001016116e4565b505b6001016116a1565b50929c50919a50909850965061197395505050505050565b5050604080516000808252602082018181528284018281526060840192835260808401909452919a50985090965094506119739350505050565b93509350935093565b60008061198c33896103e6612704565b8051909150156119e75760005b81518110156119e5578181815181106119b4576119b4615035565b60200260200101516001600160a01b03168a6001600160a01b0316036119dd57600192506119e5565b600101611999565b505b611a08337388888888888888888888888888888888888888886103e6612704565b805190915015611a6d57600182151514611a6d5760005b8151811015611a6b57818181518110611a3a57611a3a615035565b60200260200101516001600160a01b03168a6001600160a01b031603611a635760019250611a6b565b600101611a1f565b505b600182151514611a7c57600080fd5b5050600083118015611a9057506000548311155b611a9957600080fd5b6000806000806000808b8b604051602001611ab5929190615074565b6040516020818303038152906040528051906020012092508b8b8a604051602001611ae29392919061504b565b6040516020818303038152906040528051906020012091507388888888888888888888888888888888888888888b8a604051602001611b239392919061504b565b60408051601f1981840301815291815281516020928301206001600160a01b038e166000908152600490935291205490915060ff1615611b6257600080fd5b60008381526005602052604090205460ff1615611b7e57600080fd5b60008281526006602052604090205460ff1615611b9a57600080fd5b60008181526006602052604090205460ff1615611bb657600080fd5b8c8c8c8b604051602001611bcd9493929190614fff565b6040516020818303038152906040528051906020012093508c8c8a604051602001611bfa9392919061504b565b6040516020818303038152906040528051906020012095508a8c8a604051602001611c279392919061504b565b604051602081830303815290604052805190602001209450600160008781526020019081526020016000208b9080600181540180825580915050600190039060005260206000200160009091909190916101000a8154816001600160a01b0302191690836001600160a01b03160217905550600260008681526020019081526020016000208d9080600181540180825580915050600190039060005260206000200160009091909190916101000a8154816001600160a01b0302191690836001600160a01b031602179055508715156001151503611e235760006040518060c001604052808f6001600160a01b031681526020018d6001600160a01b031681526020014281526020018c8152602001600115158152602001600081525090506003600086815260200190815260200160002081908060018154018082558091505060019003906000526020600020906006020160009091909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff02191690831515021790555060a08201518160050155505050611f42565b60006040518060c001604052808f6001600160a01b031681526020018d6001600160a01b031681526020014281526020018c81526020016000151581526020018981525090506003600086815260200190815260200160002081908060018154018082558091505060019003906000526020600020906006020160009091909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff02191690831515021790555060a082015181600501555050505b8a6001600160a01b03168c6001600160a01b03168e6001600160a01b03167fbd5af040fa27449f00e35a368bb558ba6b619f0da43b8f35722fe7f8de754b5f338d8d8d604051611fb894939291906001600160a01b03949094168452602084019290925215156040830152606082015260800190565b60405180910390a450505050505050505050505050565b6000738888888888888888888888888888888888888887196001600160a01b0384160161201857506001600160a01b03811660009081526004602052604090205460ff1661205e565b6000838360405160200161202d929190615074565b60408051601f1981840301815291815281516020928301206000908152600590925290205460ff16915061205e9050565b92915050565b600080600061207684866103e6612704565b8051909150156120d15760005b81518110156120cf5781818151811061209e5761209e615035565b60200260200101516001600160a01b0316876001600160a01b0316036120c757600192506120cf565b600101612083565b505b8115156001036120e6576001925050506107fe565b6000925050506107fe565b6000806000803387878760405160200161210e9493929190614fff565b60405160208183030381529060405280519060200120915033878660405160200161213b9392919061504b565b6040516020818303038152906040528051906020012093508587866040516020016121689392919061504b565b60408051601f1981840301815291815281516020928301206000878152600190935290822054909450909150156126fb5760005b6000858152600160205260409020548110156122075760008581526001602052604090208054829081106121d2576121d2615035565b6000918252602090912001546001600160a01b03908116908816036121ff576121fc8260016150ac565b91505b60010161219c565b506000816001600160401b0381111561222257612222614c19565b60405190808252806020026020018201604052801561224b578160200160208202803683370190505b5090506000805b6000878152600160205260409020548110156122db57600087815260016020526040902080548290811061228857612288615035565b6000918252602090912001546001600160a01b03908116908a16036122d357808383815181106122ba576122ba615035565b60209081029190910101526122d08260016150ac565b91505b600101612252565b50801561241a5760005b82518110156124185760008084836001875161230191906150bf565b61230b91906150bf565b8151811061231b5761231b615035565b6020026020010151915060018060008b81526020019081526020016000208054905061234791906150bf565b60008a81526001602052604090208054919250908290811061236b5761236b615035565b60009182526020808320909101548b83526001909152604090912080546001600160a01b0390921691849081106123a4576123a4615035565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394909416939093179092558a81526001909152604090208054806123ec576123ec6150d2565b600082815260209020810160001990810180546001600160a01b031916905501905550506001016122e5565b505b6000805b60008781526002602052604090205481101561248557600087815260026020526040902080548290811061245457612454615035565b6000918252602090912001546001600160a01b0316330361247d5761247a8260016150ac565b91505b60010161241e565b506000816001600160401b038111156124a0576124a0614c19565b6040519080825280602002602001820160405280156124c9578160200160208202803683370190505b5090506000805b60008981526002602052604090205481101561255557600089815260026020526040902080548290811061250657612506615035565b6000918252602090912001546001600160a01b0316330361254d578083838151811061253457612534615035565b602090810291909101015261254a8260016150ac565b91505b6001016124d0565b5080156126955760005b82518110156126935760008084836001875161257b91906150bf565b61258591906150bf565b8151811061259557612595615035565b602002602001015191506001600260008d8152602001908152602001600020805490506125c291906150bf565b60008c8152600260205260409020805491925090829081106125e6576125e6615035565b60009182526020808320909101548d83526002909152604090912080546001600160a01b03909216918490811061261f5761261f615035565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394909416939093179092558c8152600290915260409020805480612667576126676150d2565b600082815260209020810160001990810180546001600160a01b0319169055019055505060010161255f565b505b60008781526003602052604081206126ac91614814565b8a6001600160a01b03168c6001600160a01b0316336001600160a01b03167feb2716ae908a1e27125f13f2a948ee7b067d22f92b1fc0152355e0085d80177e8d604051610d8591815260200190565b50505050505050565b6060600084848460405160200161271d9392919061504b565b60408051601f19818403018152828252805160209182012060008181526002835283902080548084028601840190945283855290945091908301828280156107f5576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116107d75750505050509150509392505050565b6000816001036127af576112c38484611fcf565b60008484846040516020016127c69392919061504b565b60408051601f1981840301815291815281516020928301206000908152600690925290205460ff1691506107fe9050565b60008061280585858561076b565b905060008082516001600160401b0381111561282357612823614c19565b60405190808252806020026020018201604052801561284c578160200160208202803683370190505b509050600080600080865111156112a05760005b86518110156128e4578a8a88838151811061287d5761287d615035565b60200260200101518b6040516020016128999493929190614fff565b604051602081830303815290604052805190602001209550858585815181106128c4576128c4615035565b60209081029190910101526128da8460016150ac565b9350600101612860565b5060005b600185516128f691906150bf565b81101561298057600061290a8260016150ac565b90505b85518110156129775785818151811061292857612928615035565b602002602001015186838151811061294257612942615035565b60200260200101510361296f5785828151811061296157612961615035565b600060209182029290920101525b60010161290d565b506001016128e8565b5060005b84518110156129d25781600360008784815181106129a4576129a4615035565b60200260200101518152602001908152602001600020805490506129c891906150ac565b9150600101612984565b506000816001600160401b038111156129ed576129ed614c19565b604051908082528060200260200182016040528015612a16578160200160208202803683370190505b5090506000826001600160401b03811115612a3357612a33614c19565b604051908082528060200260200182016040528015612a5c578160200160208202803683370190505b50905060005b83811015612bfb57600060036000898481518110612a8257612a82615035565b60200260200101518152602001908152602001600020805490501115612bf35760005b60036000898481518110612abb57612abb615035565b6020026020010151815260200190815260200160002080549050811015612bf15760036000898481518110612af257612af2615035565b602002602001015181526020019081526020016000208181548110612b1957612b19615035565b906000526020600020906006020160010160009054906101000a90046001600160a01b0316848781518110612b5057612b50615035565b60200260200101906001600160a01b031690816001600160a01b03168152505060036000898481518110612b8657612b86615035565b602002602001015181526020019081526020016000208181548110612bad57612bad615035565b906000526020600020906006020160020154838781518110612bd157612bd1615035565b6020908102919091010152612be78660016150ac565b9550600101612aa5565b505b600101612a62565b50600082600081518110612c1157612c11615035565b60200260200101519050600082600081518110612c3057612c30615035565b6020026020010151905060005b845181101561128d5781848281518110612c5957612c59615035565b602002602001015110612c9f57838181518110612c7857612c78615035565b60200260200101519150848181518110612c9457612c94615035565b602002602001015192505b600101612c3d565b6000612cb48585846127f7565b6001600160a01b0316836001600160a01b03161490505b949350505050565b600080848484604051602001612ceb9392919061504b565b60408051808303601f19018152919052805160209091012095945050505050565b600080612d1c33866103e6612704565b805190915015612d775760005b8151811015612d7557818181518110612d4457612d44615035565b60200260200101516001600160a01b0316876001600160a01b031603612d6d5760019250612d75565b600101612d29565b505b612d98337388888888888888888888888888888888888888886103e6612704565b805190915015612dfd57600182151514612dfd5760005b8151811015612dfb57818181518110612dca57612dca615035565b60200260200101516001600160a01b0316876001600160a01b031603612df35760019250612dfb565b600101612daf565b505b600182151514612e0c57600080fd5b50506000848483604051602001612e259392919061504b565b6040516020818303038152906040528051906020012090506000838584604051602001612e549392919061504b565b604051602081830303815290604052805190602001209050600086868686604051602001612e859493929190614fff565b60408051601f1981840301815291815281516020928301206000868152600190935290822054909250156134315760005b600085815260016020526040902054811015612f21576000858152600160205260409020805482908110612eec57612eec615035565b6000918252602090912001546001600160a01b0390811690881603612f1957612f168260016150ac565b91505b600101612eb6565b506000816001600160401b03811115612f3c57612f3c614c19565b604051908082528060200260200182016040528015612f65578160200160208202803683370190505b5090506000805b600087815260016020526040902054811015612ff5576000878152600160205260409020805482908110612fa257612fa2615035565b6000918252602090912001546001600160a01b03908116908a1603612fed5780838381518110612fd457612fd4615035565b6020908102919091010152612fea8260016150ac565b91505b600101612f6c565b5080156131345760005b82518110156131325760008084836001875161301b91906150bf565b61302591906150bf565b8151811061303557613035615035565b6020026020010151915060018060008b81526020019081526020016000208054905061306191906150bf565b60008a81526001602052604090208054919250908290811061308557613085615035565b60009182526020808320909101548b83526001909152604090912080546001600160a01b0390921691849081106130be576130be615035565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394909416939093179092558a8152600190915260409020805480613106576131066150d2565b600082815260209020810160001990810180546001600160a01b03191690550190555050600101612fff565b505b6000805b6000878152600260205260409020548110156131a357600087815260026020526040902080548290811061316e5761316e615035565b6000918252602090912001546001600160a01b03908116908d160361319b576131988260016150ac565b91505b600101613138565b506000816001600160401b038111156131be576131be614c19565b6040519080825280602002602001820160405280156131e7578160200160208202803683370190505b5090506000805b60008981526002602052604090205481101561327757600089815260026020526040902080548290811061322457613224615035565b6000918252602090912001546001600160a01b03908116908f160361326f578083838151811061325657613256615035565b602090810291909101015261326c8260016150ac565b91505b6001016131ee565b5080156133b75760005b82518110156133b55760008084836001875161329d91906150bf565b6132a791906150bf565b815181106132b7576132b7615035565b602002602001015191506001600260008d8152602001908152602001600020805490506132e491906150bf565b60008c81526002602052604090208054919250908290811061330857613308615035565b60009182526020808320909101548d83526002909152604090912080546001600160a01b03909216918490811061334157613341615035565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394909416939093179092558c8152600290915260409020805480613389576133896150d2565b600082815260209020810160001990810180546001600160a01b03191690550190555050600101613281565b505b60008781526003602052604081206133ce91614814565b8a6001600160a01b03168c6001600160a01b03168e6001600160a01b03167f3fc9853b549d505712a2e247960ed1ec823b23c592b38d4b438cc603c2c55d70338e604051611fb89291906001600160a01b03929092168252602082015260400190565b5050505050505050565b6134468787856120f1565b613454878686868686610874565b604080516001600160a01b0388811682526020820186905284151582840152606082018490529151878316928a169133917f3660f2984c57dfe2d77b6a3d25a5a622a20793c5264ac0fb4b7d1f9b3e38b7ca9181900360800190a450505050505050565b6000806134c98584866103e761421e565b905060006134db8585886103e761421e565b9050600061350187738888888888888888888888888888888888888888886103e761421e565b90506000613527877388888888888888888888888888888888888888888a6103e761421e565b9050600184151514801561353d57506001831515145b1561354f5760019450505050506107fe565b600184151514801561356357506001811515145b156135755760019450505050506107fe565b600183151514801561358957506001821515145b1561359b5760019450505050506107fe565b60018215151480156135af57506001811515145b156135c15760019450505050506107fe565b60009450505050506107fe565b60068651106135dc57600080fd5b60005b86518110156126fb5761368c8782815181106135fd576135fd615035565b602002602001015187838151811061361757613617615035565b602002602001015187848151811061363157613631615035565b602002602001015187858151811061364b5761364b615035565b602002602001015187868151811061366557613665615035565b602002602001015187878151811061367f5761367f615035565b6020026020010151610874565b6001016135df565b816001036136ab576136a6838261418e565b505050565b60008333846040516020016136c29392919061504b565b60408051601f198184030181529181528151602092830120600090815260069092529020805483151560ff1990911617905550505050565b606080606080600061370d88888861076b565b905060008082516001600160401b0381111561372b5761372b614c19565b604051908082528060200260200182016040528015613754578160200160208202803683370190505b509050600080600080865111156119395760005b86518110156137ec578d8d88838151811061378557613785615035565b60200260200101518e6040516020016137a19493929190614fff565b604051602081830303815290604052805190602001209550858585815181106137cc576137cc615035565b60209081029190910101526137e28460016150ac565b9350600101613768565b5060005b600185516137fe91906150bf565b8110156138885760006138128260016150ac565b90505b855181101561387f5785818151811061383057613830615035565b602002602001015186838151811061384a5761384a615035565b6020026020010151036138775785828151811061386957613869615035565b600060209182029290920101525b600101613815565b506001016137f0565b5060005b84518110156138da5781600360008784815181106138ac576138ac615035565b60200260200101518152602001908152602001600020805490506138d091906150ac565b915060010161388c565b506000816001600160401b038111156138f5576138f5614c19565b60405190808252806020026020018201604052801561391e578160200160208202803683370190505b5090506000826001600160401b0381111561393b5761393b614c19565b604051908082528060200260200182016040528015613964578160200160208202803683370190505b5090506000836001600160401b0381111561398157613981614c19565b6040519080825280602002602001820160405280156139aa578160200160208202803683370190505b5090506000846001600160401b038111156139c7576139c7614c19565b6040519080825280602002602001820160405280156139f0578160200160208202803683370190505b50905060005b85811015611921576000600360008b8481518110613a1657613a16615035565b60200260200101518152602001908152602001600020805490501115613c745760005b600360008b8481518110613a4f57613a4f615035565b6020026020010151815260200190815260200160002080549050811015613c7257600360008b8481518110613a8657613a86615035565b602002602001015181526020019081526020016000208181548110613aad57613aad615035565b906000526020600020906006020160010160009054906101000a90046001600160a01b0316868981518110613ae457613ae4615035565b60200260200101906001600160a01b031690816001600160a01b031681525050600360008b8481518110613b1a57613b1a615035565b602002602001015181526020019081526020016000208181548110613b4157613b41615035565b906000526020600020906006020160030154838981518110613b6557613b65615035565b602002602001018181525050600360008b8481518110613b8757613b87615035565b602002602001015181526020019081526020016000208181548110613bae57613bae615035565b906000526020600020906006020160040160009054906101000a900460ff16848981518110613bdf57613bdf615035565b602002602001019015159081151581525050600360008b8481518110613c0757613c07615035565b602002602001015181526020019081526020016000208181548110613c2e57613c2e615035565b906000526020600020906006020160050154858981518110613c5257613c52615035565b6020908102919091010152613c688860016150ac565b9750600101613a39565b505b6001016139f6565b60606000613c8b868685612704565b905060008082516001600160401b03811115613ca957613ca9614c19565b604051908082528060200260200182016040528015613cd2578160200160208202803683370190505b50905060008060008060008751111561415d5760005b8751811015613d6c57878181518110613d0357613d03615035565b60200260200101518c8e8c604051602001613d219493929190614fff565b60405160208183030381529060405280519060200120965086868681518110613d4c57613d4c615035565b6020908102919091010152613d628560016150ac565b9450600101613ce8565b5060005b60018651613d7e91906150bf565b811015613e08576000613d928260016150ac565b90505b8651811015613dff57868181518110613db057613db0615035565b6020026020010151878381518110613dca57613dca615035565b602002602001015103613df757868281518110613de957613de9615035565b600060209182029290920101525b600101613d95565b50600101613d70565b5060005b8551811015613e5a578160036000888481518110613e2c57613e2c615035565b6020026020010151815260200190815260200160002080549050613e5091906150ac565b9150600101613e0c565b506000816001600160401b03811115613e7557613e75614c19565b604051908082528060200260200182016040528015613e9e578160200160208202803683370190505b5090506000826001600160401b03811115613ebb57613ebb614c19565b604051908082528060200260200182016040528015613ee4578160200160208202803683370190505b50905060005b8381101561407d576000600360008a8481518110613f0a57613f0a615035565b602002602001015181526020019081526020016000208054905011156140755760005b600360008a8481518110613f4357613f43615035565b602002602001015181526020019081526020016000208054905081101561407357600360008a8481518110613f7a57613f7a615035565b602002602001015181526020019081526020016000208181548110613fa157613fa1615035565b600091825260209091206006909102015484516001600160a01b0390911690859089908110613fd257613fd2615035565b60200260200101906001600160a01b031690816001600160a01b031681525050600360008a848151811061400857614008615035565b60200260200101518152602001908152602001600020818154811061402f5761402f615035565b90600052602060002090600602016003015483888151811061405357614053615035565b60209081029190910101526140698760016150ac565b9650600101613f2d565b505b600101613eea565b50600081516001600160401b0381111561409957614099614c19565b6040519080825280602002602001820160405280156140c2578160200160208202803683370190505b50905060005b8481101561414b578d8382815181106140e3576140e3615035565b602002602001015111156141435783818151811061410357614103615035565b602002602001015182878151811061411d5761411d615035565b6001600160a01b03909216602092830291909101909101526141408660016150ac565b95505b6001016140c8565b509950612ccb98505050505050505050565b50506040805160008152602081019091529550612ccb945050505050565b6000546141899060016150ac565b600055565b738888888888888888888888888888888888888887196001600160a01b038316016141d257336000908152600460205260409020805460ff19168215151790555050565b600082336040516020016141e7929190615074565b60408051601f198184030181529181528151602092830120600090815260059092529020805483151560ff19909116179055505050565b600080858585856040516020016142389493929190614fff565b60408051808303601f1901815291815281516020928301206000908152600390925290205415159695505050505050565b6002602052816000526040600020818154811061064457600080fd5b6060600061429486868561076b565b905060008082516001600160401b038111156142b2576142b2614c19565b6040519080825280602002602001820160405280156142db578160200160208202803683370190505b50905060008060008060008751111561415d5760005b8751811015614375578c8c89838151811061430e5761430e615035565b60200260200101518c60405160200161432a9493929190614fff565b6040516020818303038152906040528051906020012096508686868151811061435557614355615035565b602090810291909101015261436b8560016150ac565b94506001016142f1565b5060005b6001865161438791906150bf565b81101561441157600061439b8260016150ac565b90505b8651811015614408578681815181106143b9576143b9615035565b60200260200101518783815181106143d3576143d3615035565b602002602001015103614400578682815181106143f2576143f2615035565b600060209182029290920101525b60010161439e565b50600101614379565b5060005b855181101561446357816003600088848151811061443557614435615035565b602002602001015181526020019081526020016000208054905061445991906150ac565b9150600101614415565b506000816001600160401b0381111561447e5761447e614c19565b6040519080825280602002602001820160405280156144a7578160200160208202803683370190505b5090506000826001600160401b038111156144c4576144c4614c19565b6040519080825280602002602001820160405280156144ed578160200160208202803683370190505b50905060005b8381101561468c576000600360008a848151811061451357614513615035565b602002602001015181526020019081526020016000208054905011156146845760005b600360008a848151811061454c5761454c615035565b602002602001015181526020019081526020016000208054905081101561468257600360008a848151811061458357614583615035565b6020026020010151815260200190815260200160002081815481106145aa576145aa615035565b906000526020600020906006020160010160009054906101000a90046001600160a01b03168488815181106145e1576145e1615035565b60200260200101906001600160a01b031690816001600160a01b031681525050600360008a848151811061461757614617615035565b60200260200101518152602001908152602001600020818154811061463e5761463e615035565b90600052602060002090600602016003015483888151811061466257614662615035565b60209081029190910101526146788760016150ac565b9650600101614536565b505b6001016144f3565b50600081516001600160401b038111156146a8576146a8614c19565b6040519080825280602002602001820160405280156146d1578160200160208202803683370190505b50905060005b8481101561414b578d8382815181106146f2576146f2615035565b602002602001015111156147525783818151811061471257614712615035565b602002602001015182878151811061472c5761472c615035565b6001600160a01b039092166020928302919091019091015261474f8660016150ac565b95505b6001016146d7565b600080858585856040516020016147749493929190614fff565b60408051808303601f1901815291905280516020909101209695505050505050565b60068351106147a457600080fd5b60005b835181101561480e576148068482815181106147c5576147c5615035565b60200260200101518483815181106147df576147df615035565b60200260200101518484815181106147f9576147f9615035565b60200260200101516120f1565b6001016147a7565b50505050565b50805460008255600602906000526020600020908101906148359190614838565b50565b5b808211156148855780546001600160a01b0319908116825560018201805490911690556000600282018190556003820181905560048201805460ff191690556005820155600601614839565b5090565b6000806040838503121561489c57600080fd5b50508035926020909101359150565b80356001600160a01b03811681146148c257600080fd5b919050565b600080600080600060a086880312156148df57600080fd5b6148e8866148ab565b94506148f6602087016148ab565b9350614904604087016148ab565b94979396509394606081013594506080013592915050565b60008060006060848603121561493157600080fd5b61493a846148ab565b9250614948602085016148ab565b9150604084013590509250925092565b600081518084526020808501945080840160005b838110156149915781516001600160a01b03168752958201959082019060010161496c565b509495945050505050565b6020815260006107fe6020830184614958565b803580151581146148c257600080fd5b60008060008060008060c087890312156149d857600080fd5b6149e1876148ab565b95506149ef602088016148ab565b94506040870135935060608701359250614a0b608088016149af565b915060a087013590509295509295509295565b600060208284031215614a3057600080fd5b6107fe826149af565b600081518084526020808501945080840160005b8381101561499157815187529582019590820190600101614a4d565b608081526000614a7c6080830187614958565b602083820381850152614a8f8288614a39565b8481036040860152865180825282880193509082019060005b81811015614ac6578451151583529383019391830191600101614aa8565b50508481036060860152614ada8187614a39565b9998505050505050505050565b600080600080600080600060e0888a031215614b0257600080fd5b614b0b886148ab565b9650614b19602089016148ab565b9550614b27604089016148ab565b94506060880135935060808801359250614b4360a089016149af565b915060c0880135905092959891949750929550565b60008060408385031215614b6b57600080fd5b614b74836148ab565b9150614b82602084016148ab565b90509250929050565b600080600060608486031215614ba057600080fd5b614ba9846148ab565b9250614bb7602085016148ab565b9150614bc5604085016148ab565b90509250925092565b60008060008060808587031215614be457600080fd5b614bed856148ab565b9350614bfb602086016148ab565b9250614c09604086016148ab565b9396929550929360600135925050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715614c5757614c57614c19565b604052919050565b60006001600160401b03821115614c7857614c78614c19565b5060051b60200190565b600082601f830112614c9357600080fd5b81356020614ca8614ca383614c5f565b614c2f565b82815260059290921b84018101918181019086841115614cc757600080fd5b8286015b84811015614ce957614cdc816148ab565b8352918301918301614ccb565b509695505050505050565b600082601f830112614d0557600080fd5b81356020614d15614ca383614c5f565b82815260059290921b84018101918181019086841115614d3457600080fd5b8286015b84811015614ce95780358352918301918301614d38565b600082601f830112614d6057600080fd5b81356020614d70614ca383614c5f565b82815260059290921b84018101918181019086841115614d8f57600080fd5b8286015b84811015614ce957614da4816149af565b8352918301918301614d93565b60008060008060008060c08789031215614dca57600080fd5b86356001600160401b0380821115614de157600080fd5b614ded8a838b01614c82565b97506020890135915080821115614e0357600080fd5b614e0f8a838b01614c82565b96506040890135915080821115614e2557600080fd5b614e318a838b01614cf4565b95506060890135915080821115614e4757600080fd5b614e538a838b01614cf4565b94506080890135915080821115614e6957600080fd5b614e758a838b01614d4f565b935060a0890135915080821115614e8b57600080fd5b50614e9889828a01614cf4565b9150509295509295509295565b600080600060608486031215614eba57600080fd5b614ec3846148ab565b925060208401359150614bc5604085016149af565b600060208284031215614eea57600080fd5b5035919050565b60008060008060808587031215614f0757600080fd5b614f10856148ab565b9350614f1e602086016148ab565b93969395505050506040820135916060013590565b60008060408385031215614f4657600080fd5b614f4f836148ab565b9150614b82602084016149af565b600060208284031215614f6f57600080fd5b6107fe826148ab565b600080600060608486031215614f8d57600080fd5b83356001600160401b0380821115614fa457600080fd5b614fb087838801614c82565b94506020860135915080821115614fc657600080fd5b614fd287838801614c82565b93506040860135915080821115614fe857600080fd5b50614ff586828701614cf4565b9150509250925092565b6001600160601b0319606095861b8116825293851b841660148201529190931b9091166028820152603c810191909152605c0190565b634e487b7160e01b600052603260045260246000fd5b6001600160601b0319606094851b811682529290931b9091166014830152602882015260480190565b6001600160601b0319606093841b811682529190921b16601482015260280190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561205e5761205e615096565b8181038181111561205e5761205e615096565b634e487b7160e01b600052603160045260246000fdfea26469706673582212206abdd81d490b6cf331d4d122475a7e118b81cc43bf5bf0aa5d00f909de3445aa64736f6c63430008120033

Deployed Bytecode Sourcemap

1059:53139:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1422:52;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;431:32:1;;;413:51;;401:2;386:18;1422:52:0;;;;;;;;29107:930;;;;;;:::i;:::-;;:::i;:::-;;;1295:14:1;;1288:22;1270:41;;1258:2;1243:18;29107:930:0;1130:187:1;26404:315:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;31514:850::-;;;;;;:::i;:::-;;:::i;3415:2424::-;;;;;;:::i;:::-;;:::i;:::-;;28070:338;;;;;;:::i;:::-;;:::i;22015:95::-;;;;;;:::i;:::-;22081:10;22070:22;;;;:10;:22;;;;;:32;;-1:-1:-1;;22070:32:0;;;;;;;;;;22015:95;49642:3150;;;;;;:::i;:::-;;:::i;24871:503::-;;;;;;:::i;:::-;;:::i;27489:320::-;;;;;;:::i;:::-;;:::i;1816:62::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3614:15:1;;;3596:34;;3666:15;;;;3661:2;3646:18;;3639:43;3698:18;;;3691:34;;;;3756:2;3741:18;;3734:34;3812:14;3805:22;3799:3;3784:19;;3777:51;3576:3;3844:19;;3837:35;3545:3;3530:19;1816:62:0;3277:601:1;42831:3348:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;6060:4052::-;;;;;;:::i;:::-;;:::i;23633:478::-;;;;;;:::i;:::-;;:::i;30596:808::-;;;;;;:::i;:::-;;:::i;10427:3986::-;;;;;;:::i;:::-;;:::i;26911:316::-;;;;;;:::i;:::-;;:::i;24196:541::-;;;;;;:::i;:::-;;:::i;39361:3166::-;;;;;;:::i;:::-;;:::i;30188:299::-;;;;;;:::i;:::-;;:::i;25482:273::-;;;;;;:::i;:::-;;:::i;:::-;;;7293:25:1;;;7281:2;7266:18;25482:273:0;7147:177:1;14560:5442:0;;;;;;:::i;:::-;;:::i;1355:29::-;;;;;;20692:565;;;;;;:::i;:::-;;:::i;52902:1291::-;;;;;;:::i;:::-;;:::i;21361:574::-;;;;;;:::i;:::-;;:::i;22652:420::-;;;;;;:::i;:::-;;:::i;32514:3369::-;;;;;;:::i;:::-;;:::i;2895:46::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;46363:3121;;;;;;:::i;:::-;;:::i;23195:93::-;;;:::i;2948:53::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;22194:366;;;;;;:::i;:::-;;:::i;28549:372::-;;;;;;:::i;:::-;;:::i;1481:60::-;;;;;;:::i;:::-;;:::i;36077:3134::-;;;;;;:::i;:::-;;:::i;2846:42::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;23412:145;;;;;;:::i;:::-;-1:-1:-1;;;;;23519:30:0;23495:4;23519:30;;;:10;:30;;;;;;;;;23412:145;25870:346;;;;;;:::i;:::-;;:::i;20092:441::-;;;;;;:::i;:::-;;:::i;1422:52::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1422:52:0;;-1:-1:-1;1422:52:0;;-1:-1:-1;1422:52:0:o;29107:930::-;29276:4;29293:12;29350:17;29369:18;29389;29409:8;29333:85;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;29333:85:0;;;;;;;;;29323:96;;29333:85;29323:96;;;;29430:11;29456:28;;;:22;:28;;;;;;:35;29323:96;;-1:-1:-1;29456:39:0;29452:578;;29517:9;29512:434;29536:28;;;;:22;:28;;;;;:35;29532:39;;29512:434;;;29599:28;;;;:22;:28;;;;;:31;;29628:1;;29599:31;;;;;;:::i;:::-;;;;;;;;;:41;:31;;;;;:41;;;;:50;;;29598:108;;-1:-1:-1;29655:28:0;;;;:22;:28;;;;;:31;;29697:8;;29655:28;29684:1;;29655:31;;;;;;:::i;:::-;;;;;;;;;;;:38;;;:50;29598:108;29594:261;;;29740:4;29731:13;;29767:5;;29594:261;29830:5;29821:14;;29908:3;;29512:434;;;-1:-1:-1;29967:6:0;-1:-1:-1;29960:13:0;;-1:-1:-1;29960:13:0;29452:578;30013:5;30006:12;;;;29107:930;;;;;;;;:::o;26404:315::-;26535:16;26564:12;26621:17;26640:18;26660:8;26604:65;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;26604:65:0;;;;;;;;;26594:76;;26604:65;26594:76;;;;26689:21;;;;:15;:21;;;;;26681:30;;;;;;;;;;;;;;;26594:76;;-1:-1:-1;26689:21:0;26681:30;;;26689:21;26681:30;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26681:30:0;;;;;;;;;;;;;;;;;;;;;;;;26404:315;;;;;;:::o;31514:850::-;31692:4;31709:36;31748:81;31773:18;31793;31813:5;31820:8;31748:24;:81::i;:::-;31709:120;;31840:11;31895:1;31866:19;:26;:30;31862:495;;;31918:9;31913:360;31937:19;:26;31933:1;:30;31913:360;;;32011:19;32031:1;32011:22;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;31990:43:0;:17;-1:-1:-1;;;;;31990:43:0;;31986:196;;32067:4;32058:13;;32094:5;;31986:196;32157:5;32148:14;;32235:3;;31913:360;;3415:2424;3618:1;3607:8;:12;:42;;;;;3635:14;;3623:8;:26;;3607:42;3598:53;;;;;;3662:21;3694:29;3734:18;3763:26;3800:33;3844:36;3957:18;3977;3940:56;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3930:67;;;;;;3909:88;;4063:18;4083;4103:8;4046:66;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4036:77;;;;;;4008:105;;1169:42;4199:18;4219:8;4165:63;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;4165:63:0;;;;;;;;;4155:74;;4165:63;4155:74;;;;-1:-1:-1;;;;;4248:30:0;;;;;;:10;:30;;;;;;4155:74;;-1:-1:-1;4248:30:0;;:39;4240:48;;;;;;4307:34;;;;:14;:34;;;;;;;;:43;4299:52;;;;;;4370:48;;;;:21;:48;;;;;;;;:57;4362:66;;;;;;4447:51;;;;:21;:51;;;;;;;;:60;4439:69;;;;;;4593:10;4605:18;4625;4645:8;4576:78;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4566:89;;;;;;4553:102;;4709:10;4721:18;4741:8;4692:58;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4682:69;;;;;;4666:85;;4873:18;4893;4913:8;4856:66;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4846:77;;;;;;4822:101;;4934:15;:30;4950:13;4934:30;;;;;;;;;;;4970:18;4934:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4934:55:0;;;;;-1:-1:-1;;;;;4934:55:0;;;;;;5069:23;:46;5093:21;5069:46;;;;;;;;;;;5121:10;5069:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5069:63:0;;;;;-1:-1:-1;;;;;5069:63:0;;;;;;5218:10;:18;;5232:4;5218:18;;;5214:500;;5253:41;5297:81;;;;;;;;5308:10;-1:-1:-1;;;;;5297:81:0;;;;;5320:18;-1:-1:-1;;;;;5297:81:0;;;;;5340:15;5297:81;;;;5357:11;5297:81;;;;5370:4;5297:81;;;;;;5376:1;5297:81;;;5253:125;;5393:22;:34;5416:10;5393:34;;;;;;;;;;;5433:23;5393:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5393:64:0;;;;;-1:-1:-1;;;;;5393:64:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5393:64:0;;;;;-1:-1:-1;;;;;5393:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5238:231;5214:500;;;5490:41;5534:89;;;;;;;;5545:10;-1:-1:-1;;;;;5534:89:0;;;;;5557:18;-1:-1:-1;;;;;5534:89:0;;;;;5577:15;5534:89;;;;5594:11;5534:89;;;;5607:5;5534:89;;;;;;5614:8;5534:89;;;5490:133;;5638:22;:34;5661:10;5638:34;;;;;;;;;;;5678:23;5638:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5638:64:0;;;;;-1:-1:-1;;;;;5638:64:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5638:64:0;;;;;-1:-1:-1;;;;;5638:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5475:239;5214:500;5729:102;;;15364:25:1;;;15432:14;;15425:22;15420:2;15405:18;;15398:50;15464:18;;;15457:34;;;-1:-1:-1;;;;;5729:102:0;;;;;;;;5748:10;;5729:102;;15352:2:1;15337:18;5729:102:0;;;;;;;;3587:2252;;;;;;3415:2424;;;;;;:::o;28070:338::-;28218:4;28235:12;28292:18;28312;28332:8;28275:66;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;28275:66:0;;;;;;28265:77;;28275:66;28265:77;;;;28399:1;28360:29;;;:23;:29;;;;;:36;:40;;;28070:338;-1:-1:-1;;;;;28070:338:0:o;49642:3150::-;49774:7;49794:30;49827:68;49846:18;49866;49886:8;49827:18;:68::i;:::-;49794:101;;49906:18;49935:32;49984:13;:20;-1:-1:-1;;;;;49970:35:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49970:35:0;;49935:70;;50016:14;50045;50074:9;50125:1;50102:13;:20;:24;50098:2687;;;50148:9;50143:360;50167:13;:20;50163:1;:24;50143:360;;;50250:13;50264:1;50250:16;;;;;;;;:::i;:::-;;;;;;;50268:18;50288;50308:8;50233:84;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50223:95;;;;;;50210:108;;50363:10;50337:15;50353:6;50337:23;;;;;;;;:::i;:::-;;;;;;;;;;:36;50401:10;:6;50410:1;50401:10;:::i;:::-;50392:19;-1:-1:-1;50465:3:0;;50143:360;;;;50556:9;50551:470;50600:1;50575:15;:22;:26;;;;:::i;:::-;50571:1;:30;50551:470;;;50629:9;50641:5;:1;50645;50641:5;:::i;:::-;50629:17;;50624:306;50652:15;:22;50648:1;:26;50624:306;;;50727:15;50743:1;50727:18;;;;;;;;:::i;:::-;;;;;;;50705:15;50721:1;50705:18;;;;;;;;:::i;:::-;;;;;;;:40;50701:122;;50781:15;50797:1;50781:18;;;;;;;;:::i;:::-;50774:25;50781:18;;;;;;;;;50774:25;50701:122;50884:3;;50624:306;;;-1:-1:-1;50983:3:0;;50551:470;;;;51040:9;51035:218;51059:15;:22;51055:1;:26;51035:218;;;51160:1;51108:22;:42;51131:15;51147:1;51131:18;;;;;;;;:::i;:::-;;;;;;;51108:42;;;;;;;;;;;:49;;;;:53;;;;:::i;:::-;51104:57;-1:-1:-1;51215:3:0;;51035:218;;;;51303:39;51359:1;-1:-1:-1;;;;;51345:16:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51345:16:0;;51303:58;;51376:33;51426:1;-1:-1:-1;;;;;51412:16:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51412:16:0;;51376:52;;51448:9;51443:723;51467:1;51463;:5;51443:723;;;51547:1;51495:22;:42;51518:15;51534:1;51518:18;;;;;;;;:::i;:::-;;;;;;;51495:42;;;;;;;;;;;:49;;;;:53;51491:584;;;51578:9;51573:483;51597:22;:42;51620:15;51636:1;51620:18;;;;;;;;:::i;:::-;;;;;;;51597:42;;;;;;;;;;;:49;;;;51593:1;:53;51573:483;;;51710:22;:42;51733:15;51749:1;51733:18;;;;;;;;:::i;:::-;;;;;;;51710:42;;;;;;;;;;;51753:1;51710:45;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:62;51677:30;;-1:-1:-1;;;;;51710:62:0;;;;51677:22;;51700:6;;51677:30;;;;;;:::i;:::-;;;;;;:95;-1:-1:-1;;;;;51677:95:0;;;-1:-1:-1;;;;;51677:95:0;;;;;51826:22;:42;51849:15;51865:1;51849:18;;;;;;;;:::i;:::-;;;;;;;51826:42;;;;;;;;;;;51869:1;51826:45;;;;;;;;:::i;:::-;;;;;;;;;;;:60;;;51799:16;51816:6;51799:24;;;;;;;;:::i;:::-;;;;;;;;;;:87;51922:10;:6;51931:1;51922:10;:::i;:::-;51913:19;-1:-1:-1;52002:3:0;;51573:483;;;;51491:584;52128:3;;51443:723;;;;52180:30;52213:22;52236:1;52213:25;;;;;;;;:::i;:::-;;;;;;;52180:58;;52253:12;52268:16;52285:1;52268:19;;;;;;;;:::i;:::-;;;;;;;52253:34;;52307:9;52302:342;52326:22;:29;52322:1;:33;52302:342;;;52405:4;52382:16;52399:1;52382:19;;;;;;;;:::i;:::-;;;;;;;:27;52378:175;;52441:16;52458:1;52441:19;;;;;;;;:::i;:::-;;;;;;;52434:26;;52508:22;52531:1;52508:25;;;;;;;;:::i;:::-;;;;;;;52483:50;;52378:175;52606:3;;52302:342;;;;52666:22;52658:31;;;;;;;;;;;;;;50098:2687;52730:42;52722:51;;;;;;;;;;24871:503;25018:4;25039:8;25051:1;25039:13;25035:332;;25076:68;25105:18;25125;25076:28;:68::i;:::-;25069:75;;;;25035:332;25184:85;25220:18;25240;25260:8;25184:35;:85::i;:::-;:171;;;;25273:82;1169:42;25326:18;25346:8;25273:35;:82::i;27489:320::-;27628:4;27645:12;27702:17;27721:18;27741:8;27685:65;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;27685:65:0;;;;;;27675:76;;27685:65;27675:76;;;;27800:1;27769:21;;;:15;:21;;;;;:28;:32;;;27489:320;-1:-1:-1;;;;;27489:320:0:o;1816:62::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1816:62:0;;;;-1:-1:-1;1816:62:0;;;;;-1:-1:-1;1816:62:0;;;;;:::o;42831:3348::-;42978:16;42996;43014:13;43029:16;43058:30;43091:68;43110:18;43130;43150:8;43091:18;:68::i;:::-;43058:101;;43170:18;43199:32;43248:13;:20;-1:-1:-1;;;;;43234:35:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43234:35:0;;43199:70;;43280:14;43309;43338:9;43389:1;43366:13;:20;:24;43362:2810;;;43412:9;43407:360;43431:13;:20;43427:1;:24;43407:360;;;43514:13;43528:1;43514:16;;;;;;;;:::i;:::-;;;;;;;43532:18;43552;43572:8;43497:84;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43487:95;;;;;;43474:108;;43627:10;43601:15;43617:6;43601:23;;;;;;;;:::i;:::-;;;;;;;;;;:36;43665:10;:6;43674:1;43665:10;:::i;:::-;43656:19;-1:-1:-1;43729:3:0;;43407:360;;;;43820:9;43815:470;43864:1;43839:15;:22;:26;;;;:::i;:::-;43835:1;:30;43815:470;;;43893:9;43905:5;:1;43909;43905:5;:::i;:::-;43893:17;;43888:306;43916:15;:22;43912:1;:26;43888:306;;;43991:15;44007:1;43991:18;;;;;;;;:::i;:::-;;;;;;;43969:15;43985:1;43969:18;;;;;;;;:::i;:::-;;;;;;;:40;43965:122;;44045:15;44061:1;44045:18;;;;;;;;:::i;:::-;44038:25;44045:18;;;;;;;;;44038:25;43965:122;44148:3;;43888:306;;;-1:-1:-1;44247:3:0;;43815:470;;;;44304:9;44299:218;44323:15;:22;44319:1;:26;44299:218;;;44424:1;44372:22;:42;44395:15;44411:1;44395:18;;;;;;;;:::i;:::-;;;;;;;44372:42;;;;;;;;;;;:49;;;;:53;;;;:::i;:::-;44368:57;-1:-1:-1;44479:3:0;;44299:218;;;;44567:39;44623:1;-1:-1:-1;;;;;44609:16:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44609:16:0;;44567:58;;44640:26;44683:1;-1:-1:-1;;;;;44669:16:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44669:16:0;;44640:45;;44700:23;44737:1;-1:-1:-1;;;;;44726:13:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44726:13:0;;44700:39;;44754:31;44802:1;-1:-1:-1;;;;;44788:16:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44788:16:0;;44754:50;;44824:9;44819:918;44843:1;44839;:5;44819:918;;;44923:1;44871:22;:42;44894:15;44910:1;44894:18;;;;;;;;:::i;:::-;;;;;;;44871:42;;;;;;;;;;;:49;;;;:53;44867:779;;;44954:9;44949:678;44973:22;:42;44996:15;45012:1;44996:18;;;;;;;;:::i;:::-;;;;;;;44973:42;;;;;;;;;;;:49;;;;44969:1;:53;44949:678;;;45086:22;:42;45109:15;45125:1;45109:18;;;;;;;;:::i;:::-;;;;;;;45086:42;;;;;;;;;;;45129:1;45086:45;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:62;45053:30;;-1:-1:-1;;;;;45086:62:0;;;;45053:22;;45076:6;;45053:30;;;;;;:::i;:::-;;;;;;:95;-1:-1:-1;;;;;45053:95:0;;;-1:-1:-1;;;;;45053:95:0;;;;;45200:22;:42;45223:15;45239:1;45223:18;;;;;;;;:::i;:::-;;;;;;;45200:42;;;;;;;;;;;45243:1;45200:45;;;;;;;;:::i;:::-;;;;;;;;;;;:56;;;45175:14;45190:6;45175:22;;;;;;;;:::i;:::-;;;;;;:81;;;;;45303:22;:42;45326:15;45342:1;45326:18;;;;;;;;:::i;:::-;;;;;;;45303:42;;;;;;;;;;;45346:1;45303:45;;;;;;;;:::i;:::-;;;;;;;;;;;:55;;;;;;;;;;;;45283:9;45293:6;45283:17;;;;;;;;:::i;:::-;;;;;;:75;;;;;;;;;;;45405:22;:42;45428:15;45444:1;45428:18;;;;;;;;:::i;:::-;;;;;;;45405:42;;;;;;;;;;;45448:1;45405:45;;;;;;;;:::i;:::-;;;;;;;;;;;:52;;;45385:9;45395:6;45385:17;;;;;;;;:::i;:::-;;;;;;;;;;:72;45493:10;:6;45502:1;45493:10;:::i;:::-;45484:19;-1:-1:-1;45573:3:0;;44949:678;;;;44867:779;45699:3;;44819:918;;;-1:-1:-1;45759:22:0;;-1:-1:-1;45783:14:0;;-1:-1:-1;45799:9:0;;-1:-1:-1;45810:9:0;-1:-1:-1;45751:69:0;;-1:-1:-1;;;;;;45751:69:0;43362:2810;-1:-1:-1;;45888:16:0;;;45853:32;45888:16;;;;;;45948;;;;;;46005:13;;;;;;46067:16;;;;;;;;;45888;;-1:-1:-1;46005:13:0;-1:-1:-1;45948:16:0;;-1:-1:-1;45888:16:0;-1:-1:-1;46098:62:0;;-1:-1:-1;;;;46098:62:0;42831:3348;;;;;;;;:::o;6060:4052::-;6370:27;6412:30;6445:75;6464:10;6476:18;1261:3;6445:18;:75::i;:::-;6539:20;;6412:108;;-1:-1:-1;6539:24:0;6535:394;;6589:6;6584:330;6605:13;:20;6601:1;:24;6584:330;;;6677:13;6691:1;6677:16;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;6656:37:0;:17;-1:-1:-1;;;;;6656:37:0;;6652:155;;6747:4;6722:29;;6778:5;;6652:155;6868:3;;6584:330;;;;6535:394;7022:72;7041:10;1169:42;1261:3;7022:18;:72::i;:::-;7113:20;;7006:88;;-1:-1:-1;7113:24:0;7109:504;;7188:4;7162:30;;;;7158:440;;7222:6;7217:362;7238:13;:20;7234:1;:24;7217:362;;;7314:13;7328:1;7314:16;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;7293:37:0;:17;-1:-1:-1;;;;;7293:37:0;;7289:167;;7388:4;7363:29;;7423:5;;7289:167;7525:3;;7217:362;;;;7158:440;7696:4;7670:30;;;;7661:41;;;;;;6355:1359;;7819:1;7808:8;:12;:42;;;;;7836:14;;7824:8;:26;;7808:42;7799:53;;;;;;7863:21;7895:29;7935:18;7964:26;8001:33;8045:36;8158:18;8178;8141:56;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8131:67;;;;;;8110:88;;8264:18;8284;8304:8;8247:66;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8237:77;;;;;;8209:105;;1169:42;8400:18;8420:8;8366:63;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;8366:63:0;;;;;;;;;8356:74;;8366:63;8356:74;;;;-1:-1:-1;;;;;8449:30:0;;;;;;:10;:30;;;;;;8356:74;;-1:-1:-1;8449:30:0;;:39;8441:48;;;;;;8508:34;;;;:14;:34;;;;;;;;:43;8500:52;;;;;;8571:48;;;;:21;:48;;;;;;;;:57;8563:66;;;;;;8648:51;;;;:21;:51;;;;;;;;:60;8640:69;;;;;;8794:17;8813:18;8833;8853:8;8777:85;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8767:96;;;;;;8754:109;;8917:17;8936:18;8956:8;8900:65;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8890:76;;;;;;8874:92;;9088:18;9108;9128:8;9071:66;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;9061:77;;;;;;9037:101;;9149:15;:30;9165:13;9149:30;;;;;;;;;;;9185:18;9149:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9149:55:0;;;;;-1:-1:-1;;;;;9149:55:0;;;;;;9284:23;:46;9308:21;9284:46;;;;;;;;;;;9336:17;9284:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9284:70:0;;;;;-1:-1:-1;;;;;9284:70:0;;;;;;9440:10;:18;;9454:4;9440:18;;;9436:514;;9475:41;9519:88;;;;;;;;9530:17;-1:-1:-1;;;;;9519:88:0;;;;;9549:18;-1:-1:-1;;;;;9519:88:0;;;;;9569:15;9519:88;;;;9586:11;9519:88;;;;9599:4;9519:88;;;;;;9605:1;9519:88;;;9475:132;;9622:22;:34;9645:10;9622:34;;;;;;;;;;;9662:23;9622:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9622:64:0;;;;;-1:-1:-1;;;;;9622:64:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9622:64:0;;;;;-1:-1:-1;;;;;9622:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9460:238;9436:514;;;9719:41;9763:96;;;;;;;;9774:17;-1:-1:-1;;;;;9763:96:0;;;;;9793:18;-1:-1:-1;;;;;9763:96:0;;;;;9813:15;9763:96;;;;9830:11;9763:96;;;;9843:5;9763:96;;;;;;9850:8;9763:96;;;9719:140;;9874:22;:34;9897:10;9874:34;;;;;;;;;;;9914:23;9874:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9874:64:0;;;;;-1:-1:-1;;;;;9874:64:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9874:64:0;;;;;-1:-1:-1;;;;;9874:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9704:246;9436:514;10053:18;-1:-1:-1;;;;;9965:139:0;10033:18;-1:-1:-1;;;;;9965:139:0;10002:17;-1:-1:-1;;;;;9965:139:0;;10021:10;10073:8;10083:10;10095:8;9965:139;;;;;;;;-1:-1:-1;;;;;16140:32:1;;;;16122:51;;16204:2;16189:18;;16182:34;;;;16259:14;16252:22;16247:2;16232:18;;16225:50;16306:2;16291:18;;16284:34;16109:3;16094:19;;15897:427;9965:139:0;;;;;;;;6277:3835;;;;;;6060:4052;;;;;;;:::o;23633:478::-;23748:4;-1:-1:-1;;;;;;;23769:37:0;;;23765:339;;-1:-1:-1;;;;;;23519:30:0;;23495:4;23519:30;;;:10;:30;;;;;;;;23823:51;;23765:339;23907:26;23996:18;24016;23979:56;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;23979:56:0;;;;;;;;;23969:67;;23979:56;23969:67;;;;24058:34;;;;:14;:34;;;;;;;;;-1:-1:-1;24051:41:0;;-1:-1:-1;24051:41:0;23765:339;23633:478;;;;:::o;30596:808::-;30737:4;30754:24;30789:30;30822:83;30841:18;30861;1261:3;30822:18;:83::i;:::-;30920:20;;30789:116;;-1:-1:-1;30920:24:0;30916:351;;30966:6;30961:295;30982:13;:20;30978:1;:24;30961:295;;;31050:13;31064:1;31050:16;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;31029:37:0;:17;-1:-1:-1;;;;;31029:37:0;;31025:140;;31113:4;31091:26;;31140:5;;31025:140;31218:3;;30961:295;;;;30916:351;31281:27;;;31304:4;31281:27;31277:120;;31333:4;31325:13;;;;;;31277:120;31379:5;31371:14;;;;;;10427:3986;10552:21;10584:29;10624:18;10653:13;10717:10;10729:18;10749;10769:8;10700:78;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10690:89;;;;;;10677:102;;10833:10;10845:18;10865:8;10816:58;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10806:69;;;;;;10790:85;;10937:18;10957;10977:8;10920:66;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;10920:66:0;;;;;;;;;10910:77;;10920:66;10910:77;;;;11077:1;11093:30;;;:15;:30;;;;;;:37;10910:77;;-1:-1:-1;11077:1:0;;-1:-1:-1;11093:41:0;11089:3317;;11156:9;11151:296;11175:30;;;;:15;:30;;;;;:37;11171:41;;11151:296;;;11261:30;;;;:15;:30;;;;;:33;;11292:1;;11261:33;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;11261:33:0;;;11239:55;;;;11235:121;;11327:9;:5;11335:1;11327:9;:::i;:::-;11319:17;;11235:121;11409:3;;11151:296;;;;11461:35;11513:5;-1:-1:-1;;;;;11499:20:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11499:20:0;;11461:58;;11534:14;11572:9;11567:351;11591:30;;;;:15;:30;;;;;:37;11587:41;;11567:351;;;11677:30;;;;:15;:30;;;;;:33;;11708:1;;11677:33;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;11677:33:0;;;11655:55;;;;11651:176;;11764:1;11735:18;11754:6;11735:26;;;;;;;;:::i;:::-;;;;;;;;;;:30;11797:10;:6;11806:1;11797:10;:::i;:::-;11788:19;;11651:176;11880:3;;11567:351;;;-1:-1:-1;11938:10:0;;11934:614;;11974:9;11969:548;11993:18;:25;11989:1;:29;11969:548;;;12045:13;12081;12125:18;12176:1;12172;12144:18;:25;:29;;;;:::i;:::-;:33;;;;:::i;:::-;12125:53;;;;;;;;:::i;:::-;;;;;;;12117:61;;12249:1;12209:15;:30;12225:13;12209:30;;;;;;;;;;;:37;;;;:41;;;;:::i;:::-;12313:30;;;;:15;:30;;;;;:37;;12201:49;;-1:-1:-1;12313:30:0;12201:49;;12313:37;;;;;;:::i;:::-;;;;;;;;;;;;;12273:30;;;12313:37;12273:30;;;;;;;:37;;-1:-1:-1;;;;;12313:37:0;;;;12304:5;;12273:37;;;;;;:::i;:::-;;;;;;;;;;;;;:77;;-1:-1:-1;;;;;;12273:77:0;-1:-1:-1;;;;;12273:77:0;;;;;;;;;;;12373:30;;;-1:-1:-1;12373:30:0;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;12373:36:0;;;;;-1:-1:-1;;;;;;12373:36:0;;;;;;-1:-1:-1;;12373:36:0;12471:3;11969:548;;;;11934:614;12644:15;12683:9;12678:324;12702:46;;;;:23;:46;;;;;:53;12698:57;;12678:324;;;12796:46;;;;:23;:46;;;;;:49;;12843:1;;12796:49;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;12796:49:0;12782:10;:63;12778:133;;12880:11;:7;12890:1;12880:11;:::i;:::-;12870:21;;12778:133;12964:3;;12678:324;;;;13016:34;13067:7;-1:-1:-1;;;;;13053:22:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13053:22:0;;13016:59;;13090:16;13130:9;13125:380;13149:46;;;;:23;:46;;;;;:53;13145:57;;13125:380;;;13243:46;;;;:23;:46;;;;;:49;;13290:1;;13243:49;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;13243:49:0;13229:10;:63;13225:189;;13347:1;13317:17;13335:8;13317:27;;;;;;;;:::i;:::-;;;;;;;;;;:31;13382:12;:8;13393:1;13382:12;:::i;:::-;13371:23;;13225:189;13467:3;;13125:380;;;-1:-1:-1;13523:12:0;;13519:661;;13561:9;13556:609;13580:17;:24;13576:1;:28;13556:609;;;13631:13;13667;13711:17;13760:1;13756;13729:17;:24;:28;;;;:::i;:::-;:32;;;;:::i;:::-;13711:51;;;;;;;;:::i;:::-;;;;;;;13703:59;;13849:1;13793:23;:46;13817:21;13793:46;;;;;;;;;;;:53;;;;:57;;;;:::i;:::-;13929:46;;;;:23;:46;;;;;:53;;13785:65;;-1:-1:-1;13929:46:0;13785:65;;13929:53;;;;;;:::i;:::-;;;;;;;;;;;;;13873:46;;;:23;:46;;;;;;;:53;;-1:-1:-1;;;;;13929:53:0;;;;13920:5;;13873:53;;;;;;:::i;:::-;;;;;;;;;;;;;:109;;-1:-1:-1;;;;;;13873:109:0;-1:-1:-1;;;;;13873:109:0;;;;;;;;;;;14005:46;;;:23;:46;;;;;;:52;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;14005:52:0;;;;;-1:-1:-1;;;;;;14005:52:0;;;;;;-1:-1:-1;;14005:52:0;14119:3;13556:609;;;;13519:661;14262:34;;;;:22;:34;;;;;14255:41;;;:::i;:::-;14365:18;-1:-1:-1;;;;;14316:78:0;14345:18;-1:-1:-1;;;;;14316:78:0;14333:10;-1:-1:-1;;;;;14316:78:0;;14385:8;14316:78;;;;7293:25:1;;7281:2;7266:18;;7147:177;11089:3317:0;10541:3872;;;;10427:3986;;;:::o;26911:316::-;27034:16;27063:12;27120:18;27140;27160:8;27103:66;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;27103:66:0;;;;;;;;;27093:77;;27103:66;27093:77;;;;27189:29;;;;:23;:29;;;;;27181:38;;;;;;;;;;;;;;;27093:77;;-1:-1:-1;27189:29:0;27181:38;;;27189:29;27181:38;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27181:38:0;;;;;;;;;;;;;;;;;;;;;;;26911:316;;;;;:::o;24196:541::-;24336:4;24357:8;24369:1;24357:13;24353:377;;24394:68;24423:18;24443;24394:28;:68::i;24353:377::-;24495:33;24598:18;24618;24638:8;24581:66;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;24581:66:0;;;;;;;;;24571:77;;24581:66;24571:77;;;;24670:48;;;;:21;:48;;;;;;;;;-1:-1:-1;24663:55:0;;-1:-1:-1;24663:55:0;39361:3166;39493:7;39513:31;39547:76;39575:17;39594:18;39614:8;39547:27;:76::i;:::-;39513:110;;39634:18;39663:32;39712:14;:21;-1:-1:-1;;;;;39698:36:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39698:36:0;;39663:71;;39745:14;39774;39803:9;39855:1;39831:14;:21;:25;39827:2693;;;39878:9;39873:361;39897:14;:21;39893:1;:25;39873:361;;;39981:17;40000:18;40020:14;40035:1;40020:17;;;;;;;;:::i;:::-;;;;;;;40039:8;39964:84;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39954:95;;;;;;39941:108;;40094:10;40068:15;40084:6;40068:23;;;;;;;;:::i;:::-;;;;;;;;;;:36;40132:10;:6;40141:1;40132:10;:::i;:::-;40123:19;-1:-1:-1;40196:3:0;;39873:361;;;;40287:9;40282:470;40331:1;40306:15;:22;:26;;;;:::i;:::-;40302:1;:30;40282:470;;;40360:9;40372:5;:1;40376;40372:5;:::i;:::-;40360:17;;40355:306;40383:15;:22;40379:1;:26;40355:306;;;40458:15;40474:1;40458:18;;;;;;;;:::i;:::-;;;;;;;40436:15;40452:1;40436:18;;;;;;;;:::i;:::-;;;;;;;:40;40432:122;;40512:15;40528:1;40512:18;;;;;;;;:::i;:::-;40505:25;40512:18;;;;;;;;;40505:25;40432:122;40615:3;;40355:306;;;-1:-1:-1;40714:3:0;;40282:470;;;;40771:9;40766:218;40790:15;:22;40786:1;:26;40766:218;;;40891:1;40839:22;:42;40862:15;40878:1;40862:18;;;;;;;;:::i;:::-;;;;;;;40839:42;;;;;;;;;;;:49;;;;:53;;;;:::i;:::-;40835:57;-1:-1:-1;40946:3:0;;40766:218;;;;41034:39;41090:1;-1:-1:-1;;;;;41076:16:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41076:16:0;;41034:58;;41107:33;41157:1;-1:-1:-1;;;;;41143:16:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41143:16:0;;41107:52;;41179:9;41174:724;41198:1;41194;:5;41174:724;;;41278:1;41226:22;:42;41249:15;41265:1;41249:18;;;;;;;;:::i;:::-;;;;;;;41226:42;;;;;;;;;;;:49;;;;:53;41222:585;;;41309:9;41304:484;41328:22;:42;41351:15;41367:1;41351:18;;;;;;;;:::i;:::-;;;;;;;41328:42;;;;;;;;;;;:49;;;;41324:1;:53;41304:484;;;41441:22;:42;41464:15;41480:1;41464:18;;;;;;;;:::i;:::-;;;;;;;41441:42;;;;;;;;;;;41484:1;41441:45;;;;;;;;:::i;:::-;;;;;;;;;;;:63;;;;;;;;;;-1:-1:-1;;;;;41441:63:0;41408:22;41431:6;41408:30;;;;;;;;:::i;:::-;;;;;;:96;-1:-1:-1;;;;;41408:96:0;;;-1:-1:-1;;;;;41408:96:0;;;;;41558:22;:42;41581:15;41597:1;41581:18;;;;;;;;:::i;:::-;;;;;;;41558:42;;;;;;;;;;;41601:1;41558:45;;;;;;;;:::i;:::-;;;;;;;;;;;:60;;;41531:16;41548:6;41531:24;;;;;;;;:::i;:::-;;;;;;;;;;:87;41654:10;:6;41663:1;41654:10;:::i;:::-;41645:19;-1:-1:-1;41734:3:0;;41304:484;;;;41222:585;41860:3;;41174:724;;;;41912:31;41946:22;41969:1;41946:25;;;;;;;;:::i;:::-;;;;;;;41912:59;;41986:12;42001:16;42018:1;42001:19;;;;;;;;:::i;:::-;;;;;;;41986:34;;42040:9;42035:343;42059:22;:29;42055:1;:33;42035:343;;;42138:4;42115:16;42132:1;42115:19;;;;;;;;:::i;:::-;;;;;;;:27;42111:176;;42174:16;42191:1;42174:19;;;;;;;;:::i;:::-;;;;;;;42167:26;;42242:22;42265:1;42242:25;;;;;;;;:::i;:::-;;;;;;;42216:51;;42111:176;42340:3;;42035:343;;30188:299;30356:4;30402:77;30431:17;30450:18;30470:8;30402:28;:77::i;:::-;-1:-1:-1;;;;;30380:99:0;:18;-1:-1:-1;;;;;30380:99:0;;30373:106;;30188:299;;;;;;;:::o;25482:273::-;25600:7;25620:12;25677:14;25693:18;25713:8;25660:62;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;25660:62:0;;;;;;25650:73;;25660:62;25650:73;;;;;25482:273;-1:-1:-1;;;;;25482:273:0:o;14560:5442::-;14812:27;14854:30;14887:75;14906:10;14918:18;1261:3;14887:18;:75::i;:::-;14981:20;;14854:108;;-1:-1:-1;14981:24:0;14977:399;;15031:6;15026:330;15047:13;:20;15043:1;:24;15026:330;;;15119:13;15133:1;15119:16;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;15098:37:0;:17;-1:-1:-1;;;;;15098:37:0;;15094:155;;15189:4;15164:29;;15220:5;;15094:155;15310:3;;15026:330;;;;14977:399;15469:72;15488:10;1169:42;1261:3;15469:18;:72::i;:::-;15560:20;;15453:88;;-1:-1:-1;15560:24:0;15556:504;;15635:4;15609:30;;;;15605:440;;15669:6;15664:362;15685:13;:20;15681:1;:24;15664:362;;;15761:13;15775:1;15761:16;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;15740:37:0;:17;-1:-1:-1;;;;;15740:37:0;;15736:167;;15835:4;15810:29;;15870:5;;15736:167;15972:3;;15664:362;;;;15605:440;16141:4;16115:30;;;;16106:41;;;;;;14797:1362;;16242:21;16293:17;16312:18;16332:8;16276:65;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;16266:76;;;;;;16242:100;;16353:29;16412:18;16432;16452:8;16395:66;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;16385:77;;;;;;16353:109;;16473:18;16521:17;16540:18;16560;16580:8;16504:85;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;16504:85:0;;;;;;;;;16494:96;;16504:85;16494:96;;;;16601:13;16649:30;;;:15;:30;;;;;;:37;16494:96;;-1:-1:-1;16649:41:0;16645:3350;;16712:9;16707:296;16731:30;;;;:15;:30;;;;;:37;16727:41;;16707:296;;;16817:30;;;;:15;:30;;;;;:33;;16848:1;;16817:33;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;16817:33:0;;;16795:55;;;;16791:121;;16883:9;:5;16891:1;16883:9;:::i;:::-;16875:17;;16791:121;16965:3;;16707:296;;;;17017:35;17069:5;-1:-1:-1;;;;;17055:20:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17055:20:0;;17017:58;;17090:14;17128:9;17123:351;17147:30;;;;:15;:30;;;;;:37;17143:41;;17123:351;;;17233:30;;;;:15;:30;;;;;:33;;17264:1;;17233:33;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;17233:33:0;;;17211:55;;;;17207:176;;17320:1;17291:18;17310:6;17291:26;;;;;;;;:::i;:::-;;;;;;;;;;:30;17353:10;:6;17362:1;17353:10;:::i;:::-;17344:19;;17207:176;17436:3;;17123:351;;;-1:-1:-1;17492:10:0;;17488:598;;17528:9;17523:548;17547:18;:25;17543:1;:29;17523:548;;;17599:13;17635;17679:18;17730:1;17726;17698:18;:25;:29;;;;:::i;:::-;:33;;;;:::i;:::-;17679:53;;;;;;;;:::i;:::-;;;;;;;17671:61;;17803:1;17763:15;:30;17779:13;17763:30;;;;;;;;;;;:37;;;;:41;;;;:::i;:::-;17867:30;;;;:15;:30;;;;;:37;;17755:49;;-1:-1:-1;17867:30:0;17755:49;;17867:37;;;;;;:::i;:::-;;;;;;;;;;;;;17827:30;;;17867:37;17827:30;;;;;;;:37;;-1:-1:-1;;;;;17867:37:0;;;;17858:5;;17827:37;;;;;;:::i;:::-;;;;;;;;;;;;;:77;;-1:-1:-1;;;;;;17827:77:0;-1:-1:-1;;;;;17827:77:0;;;;;;;;;;;17927:30;;;-1:-1:-1;17927:30:0;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;17927:36:0;;;;;-1:-1:-1;;;;;;17927:36:0;;;;;;-1:-1:-1;;17927:36:0;18025:3;17523:548;;;;17488:598;18182:15;18221:9;18216:331;18240:46;;;;:23;:46;;;;;:53;18236:57;;18216:331;;;18341:46;;;;:23;:46;;;;;:49;;18388:1;;18341:49;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;18341:49:0;;;18320:70;;;;18316:140;;18425:11;:7;18435:1;18425:11;:::i;:::-;18415:21;;18316:140;18509:3;;18216:331;;;;18561:34;18612:7;-1:-1:-1;;;;;18598:22:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18598:22:0;;18561:59;;18635:16;18675:9;18670:387;18694:46;;;;:23;:46;;;;;:53;18690:57;;18670:387;;;18795:46;;;;:23;:46;;;;;:49;;18842:1;;18795:49;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;18795:49:0;;;18774:70;;;;18770:196;;18899:1;18869:17;18887:8;18869:27;;;;;;;;:::i;:::-;;;;;;;;;;:31;18934:12;:8;18945:1;18934:12;:::i;:::-;18923:23;;18770:196;19019:3;;18670:387;;;-1:-1:-1;19075:12:0;;19071:661;;19113:9;19108:609;19132:17;:24;19128:1;:28;19108:609;;;19183:13;19219;19263:17;19312:1;19308;19281:17;:24;:28;;;;:::i;:::-;:32;;;;:::i;:::-;19263:51;;;;;;;;:::i;:::-;;;;;;;19255:59;;19401:1;19345:23;:46;19369:21;19345:46;;;;;;;;;;;:53;;;;:57;;;;:::i;:::-;19481:46;;;;:23;:46;;;;;:53;;19337:65;;-1:-1:-1;19481:46:0;19337:65;;19481:53;;;;;;:::i;:::-;;;;;;;;;;;;;19425:46;;;:23;:46;;;;;;;:53;;-1:-1:-1;;;;;19481:53:0;;;;19472:5;;19425:53;;;;;;:::i;:::-;;;;;;;;;;;;;:109;;-1:-1:-1;;;;;;19425:109:0;-1:-1:-1;;;;;19425:109:0;;;;;;;;;;;19557:46;;;:23;:46;;;;;;:52;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;19557:52:0;;;;;-1:-1:-1;;;;;;19557:52:0;;;;;;-1:-1:-1;;19557:52:0;19671:3;19108:609;;;;19071:661;19814:34;;;;:22;:34;;;;;19807:41;;;:::i;:::-;19954:18;-1:-1:-1;;;;;19868:115:0;19934:18;-1:-1:-1;;;;;19868:115:0;19903:17;-1:-1:-1;;;;;19868:115:0;;19922:10;19974:8;19868:115;;;;;;-1:-1:-1;;;;;16653:32:1;;;;16635:51;;16717:2;16702:18;;16695:34;16623:2;16608:18;;16461:274;16645:3350:0;14719:5283;;;;14560:5442;;;;:::o;20692:565::-;20907:76;20931:18;20951:21;20974:8;20907:23;:76::i;:::-;20994:113;21020:18;21040:21;21063:11;21076:8;21086:10;21098:8;20994:25;:113::i;:::-;21123:126;;;-1:-1:-1;;;;;16140:32:1;;;16122:51;;16204:2;16189:18;;16182:34;;;16259:14;;16252:22;16232:18;;;16225:50;16306:2;16291:18;;16284:34;;;21123:126:0;;;;;;;;;21140:10;;21123:126;;;;;16109:3:1;21123:126:0;;;20692:565;;;;;;;:::o;52902:1291::-;53021:4;53038:35;53076:96;53109:8;53119:18;53139:8;1313:3;53076:32;:96::i;:::-;53038:134;;53183:35;53221:96;53254:8;53264:18;53284:8;1313:3;53221:32;:96::i;:::-;53183:134;;53328:38;53369:93;53402:8;1169:42;53429:8;1313:3;53369:32;:93::i;:::-;53328:134;;53473:38;53514:93;53547:8;1169:42;53574:8;1313:3;53514:32;:93::i;:::-;53473:134;-1:-1:-1;53656:4:0;53622:38;;;;:80;;;;-1:-1:-1;53698:4:0;53664:38;;;;53622:80;53618:568;;;53726:4;53719:11;;;;;;;;53618:568;53786:4;53752:38;;;;:83;;;;-1:-1:-1;53831:4:0;53794:41;;;;53752:83;53748:438;;;53859:4;53852:11;;;;;;;;53748:438;53919:4;53885:38;;;;:83;;;;-1:-1:-1;53964:4:0;53927:41;;;;53885:83;53881:305;;;53992:4;53985:11;;;;;;;;53881:305;54056:4;54018:42;;;;:87;;;;-1:-1:-1;54101:4:0;54064:41;;;;54018:87;54014:172;;;54129:4;54122:11;;;;;;;;54014:172;54169:5;54162:12;;;;;;;;21361:574;21634:1;21604:20;:27;:31;21596:40;;;;;;21652:9;21647:281;21671:20;:27;21667:1;:31;21647:281;;;21717:135;21743:20;21764:1;21743:23;;;;;;;;:::i;:::-;;;;;;;21768:20;21789:1;21768:23;;;;;;;;:::i;:::-;;;;;;;21793:12;21806:1;21793:15;;;;;;;;:::i;:::-;;;;;;;21810:9;21820:1;21810:12;;;;;;;;:::i;:::-;;;;;;;21824:10;21835:1;21824:13;;;;;;;;:::i;:::-;;;;;;;21839:9;21849:1;21839:12;;;;;;;;:::i;:::-;;;;;;;21717:25;:135::i;:::-;21898:3;;21647:281;;22652:420;22768:8;22778:1;22768:11;22764:301;;22796:46;22814:18;22834:7;22796:17;:46::i;:::-;22652:420;;;:::o;22764:301::-;22875:33;22938:18;22958:10;22970:8;22921:58;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;22921:58:0;;;;;;;;;22911:69;;22921:58;22911:69;;;;22995:48;;;;:21;:48;;;;;:58;;;;;-1:-1:-1;;22995:58:0;;;;;;-1:-1:-1;22652:420:0;;;:::o;32514:3369::-;32669:16;32687;32705:13;32720:16;32749:31;32783:76;32811:17;32830:18;32850:8;32783:27;:76::i;:::-;32749:110;;32870:18;32899:32;32948:14;:21;-1:-1:-1;;;;;32934:36:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32934:36:0;;32899:71;;32981:14;33010;33039:9;33091:1;33067:14;:21;:25;33063:2813;;;33114:9;33109:361;33133:14;:21;33129:1;:25;33109:361;;;33217:17;33236:18;33256:14;33271:1;33256:17;;;;;;;;:::i;:::-;;;;;;;33275:8;33200:84;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33190:95;;;;;;33177:108;;33330:10;33304:15;33320:6;33304:23;;;;;;;;:::i;:::-;;;;;;;;;;:36;33368:10;:6;33377:1;33368:10;:::i;:::-;33359:19;-1:-1:-1;33432:3:0;;33109:361;;;;33523:9;33518:470;33567:1;33542:15;:22;:26;;;;:::i;:::-;33538:1;:30;33518:470;;;33596:9;33608:5;:1;33612;33608:5;:::i;:::-;33596:17;;33591:306;33619:15;:22;33615:1;:26;33591:306;;;33694:15;33710:1;33694:18;;;;;;;;:::i;:::-;;;;;;;33672:15;33688:1;33672:18;;;;;;;;:::i;:::-;;;;;;;:40;33668:122;;33748:15;33764:1;33748:18;;;;;;;;:::i;:::-;33741:25;33748:18;;;;;;;;;33741:25;33668:122;33851:3;;33591:306;;;-1:-1:-1;33950:3:0;;33518:470;;;;34007:9;34002:218;34026:15;:22;34022:1;:26;34002:218;;;34127:1;34075:22;:42;34098:15;34114:1;34098:18;;;;;;;;:::i;:::-;;;;;;;34075:42;;;;;;;;;;;:49;;;;:53;;;;:::i;:::-;34071:57;-1:-1:-1;34182:3:0;;34002:218;;;;34270:39;34326:1;-1:-1:-1;;;;;34312:16:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34312:16:0;;34270:58;;34343:26;34386:1;-1:-1:-1;;;;;34372:16:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34372:16:0;;34343:45;;34403:23;34440:1;-1:-1:-1;;;;;34429:13:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34429:13:0;;34403:39;;34457:31;34505:1;-1:-1:-1;;;;;34491:16:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34491:16:0;;34457:50;;34527:9;34522:919;34546:1;34542;:5;34522:919;;;34626:1;34574:22;:42;34597:15;34613:1;34597:18;;;;;;;;:::i;:::-;;;;;;;34574:42;;;;;;;;;;;:49;;;;:53;34570:780;;;34657:9;34652:679;34676:22;:42;34699:15;34715:1;34699:18;;;;;;;;:::i;:::-;;;;;;;34676:42;;;;;;;;;;;:49;;;;34672:1;:53;34652:679;;;34789:22;:42;34812:15;34828:1;34812:18;;;;;;;;:::i;:::-;;;;;;;34789:42;;;;;;;;;;;34832:1;34789:45;;;;;;;;:::i;:::-;;;;;;;;;;;:63;;;;;;;;;;-1:-1:-1;;;;;34789:63:0;34756:22;34779:6;34756:30;;;;;;;;:::i;:::-;;;;;;:96;-1:-1:-1;;;;;34756:96:0;;;-1:-1:-1;;;;;34756:96:0;;;;;34904:22;:42;34927:15;34943:1;34927:18;;;;;;;;:::i;:::-;;;;;;;34904:42;;;;;;;;;;;34947:1;34904:45;;;;;;;;:::i;:::-;;;;;;;;;;;:56;;;34879:14;34894:6;34879:22;;;;;;;;:::i;:::-;;;;;;:81;;;;;35007:22;:42;35030:15;35046:1;35030:18;;;;;;;;:::i;:::-;;;;;;;35007:42;;;;;;;;;;;35050:1;35007:45;;;;;;;;:::i;:::-;;;;;;;;;;;:55;;;;;;;;;;;;34987:9;34997:6;34987:17;;;;;;;;:::i;:::-;;;;;;:75;;;;;;;;;;;35109:22;:42;35132:15;35148:1;35132:18;;;;;;;;:::i;:::-;;;;;;;35109:42;;;;;;;;;;;35152:1;35109:45;;;;;;;;:::i;:::-;;;;;;;;;;;:52;;;35089:9;35099:6;35089:17;;;;;;;;:::i;:::-;;;;;;;;;;:72;35197:10;:6;35206:1;35197:10;:::i;:::-;35188:19;-1:-1:-1;35277:3:0;;34652:679;;;;34570:780;35403:3;;34522:919;;46363:3121;46507:16;46536:30;46569:68;46588:18;46608;46628:8;46569:18;:68::i;:::-;46536:101;;46648:18;46677:32;46726:13;:20;-1:-1:-1;;;;;46712:35:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46712:35:0;;46677:70;;46758:14;46787;46816;46845:9;46896:1;46873:13;:20;:24;46869:2608;;;46919:9;46914:360;46938:13;:20;46934:1;:24;46914:360;;;47021:13;47035:1;47021:16;;;;;;;;:::i;:::-;;;;;;;47039:18;47059;47079:8;47004:84;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46994:95;;;;;;46981:108;;47134:10;47108:15;47124:6;47108:23;;;;;;;;:::i;:::-;;;;;;;;;;:36;47172:10;:6;47181:1;47172:10;:::i;:::-;47163:19;-1:-1:-1;47236:3:0;;46914:360;;;;47326:9;47321:470;47370:1;47345:15;:22;:26;;;;:::i;:::-;47341:1;:30;47321:470;;;47399:9;47411:5;:1;47415;47411:5;:::i;:::-;47399:17;;47394:306;47422:15;:22;47418:1;:26;47394:306;;;47497:15;47513:1;47497:18;;;;;;;;:::i;:::-;;;;;;;47475:15;47491:1;47475:18;;;;;;;;:::i;:::-;;;;;;;:40;47471:122;;47551:15;47567:1;47551:18;;;;;;;;:::i;:::-;47544:25;47551:18;;;;;;;;;47544:25;47471:122;47654:3;;47394:306;;;-1:-1:-1;47753:3:0;;47321:470;;;;47810:9;47805:218;47829:15;:22;47825:1;:26;47805:218;;;47930:1;47878:22;:42;47901:15;47917:1;47901:18;;;;;;;;:::i;:::-;;;;;;;47878:42;;;;;;;;;;;:49;;;;:53;;;;:::i;:::-;47874:57;-1:-1:-1;47985:3:0;;47805:218;;;;48073:39;48129:1;-1:-1:-1;;;;;48115:16:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48115:16:0;;48073:58;;48146:31;48194:1;-1:-1:-1;;;;;48180:16:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48180:16:0;;48146:50;;48216:9;48211:717;48235:1;48231;:5;48211:717;;;48315:1;48263:22;:42;48286:15;48302:1;48286:18;;;;;;;;:::i;:::-;;;;;;;48263:42;;;;;;;;;;;:49;;;;:53;48259:578;;;48346:9;48341:477;48365:22;:42;48388:15;48404:1;48388:18;;;;;;;;:::i;:::-;;;;;;;48365:42;;;;;;;;;;;:49;;;;48361:1;:53;48341:477;;;48478:22;:42;48501:15;48517:1;48501:18;;;;;;;;:::i;:::-;;;;;;;48478:42;;;;;;;;;;;48521:1;48478:45;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:62;48445:30;;-1:-1:-1;;;;;48478:62:0;;;;48445:22;;48468:6;;48445:30;;;;;;:::i;:::-;;;;;;:95;-1:-1:-1;;;;;48445:95:0;;;-1:-1:-1;;;;;48445:95:0;;;;;48592:22;:42;48615:15;48631:1;48615:18;;;;;;;;:::i;:::-;;;;;;;48592:42;;;;;;;;;;;48635:1;48592:45;;;;;;;;:::i;:::-;;;;;;;;;;;:56;;;48567:14;48582:6;48567:22;;;;;;;;:::i;:::-;;;;;;;;;;:81;48684:10;:6;48693:1;48684:10;:::i;:::-;48675:19;-1:-1:-1;48764:3:0;;48341:477;;;;48259:578;48890:3;;48211:717;;;;48942:26;48985:14;:21;-1:-1:-1;;;;;48971:36:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48971:36:0;;48942:65;;49027:9;49022:300;49046:1;49042;:5;49022:300;;;49094:5;49074:14;49089:1;49074:17;;;;;;;;:::i;:::-;;;;;;;:25;49070:161;;;49144:22;49167:1;49144:25;;;;;;;;:::i;:::-;;;;;;;49124:9;49134:6;49124:17;;;;;;;;:::i;:::-;-1:-1:-1;;;;;49124:45:0;;;:17;;;;;;;;;;;:45;49201:10;:6;49210:1;49201:10;:::i;:::-;49192:19;;49070:161;49284:3;;49022:300;;;-1:-1:-1;49344:9:0;-1:-1:-1;49336:18:0;;-1:-1:-1;;;;;;;;;49336:18:0;46869:2608;-1:-1:-1;;49416:16:0;;;49387:26;49416:16;;;;;;;;;-1:-1:-1;49447:18:0;;-1:-1:-1;;;;;49447:18:0;23195:93;23262:14;;:18;;23279:1;23262:18;:::i;:::-;23245:14;:35;23195:93::o;22194:366::-;-1:-1:-1;;;;;;;22285:37:0;;;22281:272;;22081:10;22070:22;;;;:10;:22;;;;;:32;;-1:-1:-1;;22070:32:0;;;;;;;22194:366;;:::o;22281:272::-;22394:26;22450:18;22470:10;22433:48;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;22433:48:0;;;;;;;;;22423:59;;22433:48;22423:59;;;;22497:34;;;;:14;:34;;;;;:44;;;;;-1:-1:-1;;22497:44:0;;;;;;-1:-1:-1;22194:366:0;;:::o;28549:372::-;28713:4;28730:12;28787:17;28806:18;28826;28846:8;28770:85;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;28770:85:0;;;;;;28760:96;;28770:85;28760:96;;;;28912:1;28874:28;;;:22;:28;;;;;:35;:39;;;28549:372;-1:-1:-1;;;;;;28549:372:0:o;1481:60::-;;;;;;;;;;;;;;;;;;;;36077:3134;36221:16;36250:31;36284:76;36312:17;36331:18;36351:8;36284:27;:76::i;:::-;36250:110;;36371:18;36400:32;36449:14;:21;-1:-1:-1;;;;;36435:36:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36435:36:0;;36400:71;;36482:14;36511;36540;36569:9;36621:1;36597:14;:21;:25;36593:2611;;;36644:9;36639:361;36663:14;:21;36659:1;:25;36639:361;;;36747:17;36766:18;36786:14;36801:1;36786:17;;;;;;;;:::i;:::-;;;;;;;36805:8;36730:84;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36720:95;;;;;;36707:108;;36860:10;36834:15;36850:6;36834:23;;;;;;;;:::i;:::-;;;;;;;;;;:36;36898:10;:6;36907:1;36898:10;:::i;:::-;36889:19;-1:-1:-1;36962:3:0;;36639:361;;;;37052:9;37047:470;37096:1;37071:15;:22;:26;;;;:::i;:::-;37067:1;:30;37047:470;;;37125:9;37137:5;:1;37141;37137:5;:::i;:::-;37125:17;;37120:306;37148:15;:22;37144:1;:26;37120:306;;;37223:15;37239:1;37223:18;;;;;;;;:::i;:::-;;;;;;;37201:15;37217:1;37201:18;;;;;;;;:::i;:::-;;;;;;;:40;37197:122;;37277:15;37293:1;37277:18;;;;;;;;:::i;:::-;37270:25;37277:18;;;;;;;;;37270:25;37197:122;37380:3;;37120:306;;;-1:-1:-1;37479:3:0;;37047:470;;;;37536:9;37531:218;37555:15;:22;37551:1;:26;37531:218;;;37656:1;37604:22;:42;37627:15;37643:1;37627:18;;;;;;;;:::i;:::-;;;;;;;37604:42;;;;;;;;;;;:49;;;;:53;;;;:::i;:::-;37600:57;-1:-1:-1;37711:3:0;;37531:218;;;;37799:39;37855:1;-1:-1:-1;;;;;37841:16:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37841:16:0;;37799:58;;37872:31;37920:1;-1:-1:-1;;;;;37906:16:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37906:16:0;;37872:50;;37942:9;37937:718;37961:1;37957;:5;37937:718;;;38041:1;37989:22;:42;38012:15;38028:1;38012:18;;;;;;;;:::i;:::-;;;;;;;37989:42;;;;;;;;;;;:49;;;;:53;37985:579;;;38072:9;38067:478;38091:22;:42;38114:15;38130:1;38114:18;;;;;;;;:::i;:::-;;;;;;;38091:42;;;;;;;;;;;:49;;;;38087:1;:53;38067:478;;;38204:22;:42;38227:15;38243:1;38227:18;;;;;;;;:::i;:::-;;;;;;;38204:42;;;;;;;;;;;38247:1;38204:45;;;;;;;;:::i;:::-;;;;;;;;;;;:63;;;;;;;;;;-1:-1:-1;;;;;38204:63:0;38171:22;38194:6;38171:30;;;;;;;;:::i;:::-;;;;;;:96;-1:-1:-1;;;;;38171:96:0;;;-1:-1:-1;;;;;38171:96:0;;;;;38319:22;:42;38342:15;38358:1;38342:18;;;;;;;;:::i;:::-;;;;;;;38319:42;;;;;;;;;;;38362:1;38319:45;;;;;;;;:::i;:::-;;;;;;;;;;;:56;;;38294:14;38309:6;38294:22;;;;;;;;:::i;:::-;;;;;;;;;;:81;38411:10;:6;38420:1;38411:10;:::i;:::-;38402:19;-1:-1:-1;38491:3:0;;38067:478;;;;37985:579;38617:3;;37937:718;;;;38669:26;38712:14;:21;-1:-1:-1;;;;;38698:36:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38698:36:0;;38669:65;;38754:9;38749:300;38773:1;38769;:5;38749:300;;;38821:5;38801:14;38816:1;38801:17;;;;;;;;:::i;:::-;;;;;;;:25;38797:161;;;38871:22;38894:1;38871:25;;;;;;;;:::i;:::-;;;;;;;38851:9;38861:6;38851:17;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38851:45:0;;;:17;;;;;;;;;;;:45;38928:10;:6;38937:1;38928:10;:::i;:::-;38919:19;;38797:161;39011:3;;38749:300;;25870:346;26020:7;26040:18;26109:17;26128:18;26148;26168:8;26092:85;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;26092:85:0;;;;;;26082:96;;26092:85;26082:96;;;;;25870:346;-1:-1:-1;;;;;;25870:346:0:o;20092:441::-;20280:1;20250:20;:27;:31;20242:40;;;;;;20298:9;20293:233;20317:20;:27;20313:1;:31;20293:233;;;20363:87;20387:20;20408:1;20387:23;;;;;;;;:::i;:::-;;;;;;;20412:20;20433:1;20412:23;;;;;;;;:::i;:::-;;;;;;;20437:9;20447:1;20437:12;;;;;;;;:::i;:::-;;;;;;;20363:23;:87::i;:::-;20496:3;;20293:233;;;;20092:441;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:248:1:-;82:6;90;143:2;131:9;122:7;118:23;114:32;111:52;;;159:1;156;149:12;111:52;-1:-1:-1;;182:23:1;;;252:2;237:18;;;224:32;;-1:-1:-1;14:248:1:o;475:173::-;543:20;;-1:-1:-1;;;;;592:31:1;;582:42;;572:70;;638:1;635;628:12;572:70;475:173;;;:::o;653:472::-;748:6;756;764;772;780;833:3;821:9;812:7;808:23;804:33;801:53;;;850:1;847;840:12;801:53;873:29;892:9;873:29;:::i;:::-;863:39;;921:38;955:2;944:9;940:18;921:38;:::i;:::-;911:48;;978:38;1012:2;1001:9;997:18;978:38;:::i;:::-;653:472;;;;-1:-1:-1;968:48:1;;1063:2;1048:18;;1035:32;;-1:-1:-1;1114:3:1;1099:19;1086:33;;653:472;-1:-1:-1;;653:472:1:o;1322:328::-;1399:6;1407;1415;1468:2;1456:9;1447:7;1443:23;1439:32;1436:52;;;1484:1;1481;1474:12;1436:52;1507:29;1526:9;1507:29;:::i;:::-;1497:39;;1555:38;1589:2;1578:9;1574:18;1555:38;:::i;:::-;1545:48;;1640:2;1629:9;1625:18;1612:32;1602:42;;1322:328;;;;;:::o;1655:461::-;1708:3;1746:5;1740:12;1773:6;1768:3;1761:19;1799:4;1828:2;1823:3;1819:12;1812:19;;1865:2;1858:5;1854:14;1886:1;1896:195;1910:6;1907:1;1904:13;1896:195;;;1975:13;;-1:-1:-1;;;;;1971:39:1;1959:52;;2031:12;;;;2066:15;;;;2007:1;1925:9;1896:195;;;-1:-1:-1;2107:3:1;;1655:461;-1:-1:-1;;;;;1655:461:1:o;2121:261::-;2300:2;2289:9;2282:21;2263:4;2320:56;2372:2;2361:9;2357:18;2349:6;2320:56;:::i;2387:160::-;2452:20;;2508:13;;2501:21;2491:32;;2481:60;;2537:1;2534;2527:12;2552:535;2653:6;2661;2669;2677;2685;2693;2746:3;2734:9;2725:7;2721:23;2717:33;2714:53;;;2763:1;2760;2753:12;2714:53;2786:29;2805:9;2786:29;:::i;:::-;2776:39;;2834:38;2868:2;2857:9;2853:18;2834:38;:::i;:::-;2824:48;;2919:2;2908:9;2904:18;2891:32;2881:42;;2970:2;2959:9;2955:18;2942:32;2932:42;;2993:36;3024:3;3013:9;3009:19;2993:36;:::i;:::-;2983:46;;3076:3;3065:9;3061:19;3048:33;3038:43;;2552:535;;;;;;;;:::o;3092:180::-;3148:6;3201:2;3189:9;3180:7;3176:23;3172:32;3169:52;;;3217:1;3214;3207:12;3169:52;3240:26;3256:9;3240:26;:::i;3883:435::-;3936:3;3974:5;3968:12;4001:6;3996:3;3989:19;4027:4;4056:2;4051:3;4047:12;4040:19;;4093:2;4086:5;4082:14;4114:1;4124:169;4138:6;4135:1;4132:13;4124:169;;;4199:13;;4187:26;;4233:12;;;;4268:15;;;;4160:1;4153:9;4124:169;;4323:1192;4730:3;4719:9;4712:22;4693:4;4757:57;4809:3;4798:9;4794:19;4786:6;4757:57;:::i;:::-;4833:2;4883:9;4875:6;4871:22;4866:2;4855:9;4851:18;4844:50;4917:44;4954:6;4946;4917:44;:::i;:::-;4997:22;;;4992:2;4977:18;;4970:50;5069:13;;5091:22;;;5167:15;;;;-1:-1:-1;5129:15:1;;;;5200:1;5210:185;5224:6;5221:1;5218:13;5210:185;;;5299:13;;5292:21;5285:29;5273:42;;5370:15;;;;5335:12;;;;5246:1;5239:9;5210:185;;;5214:3;;5440:9;5435:3;5431:19;5426:2;5415:9;5411:18;5404:47;5468:41;5505:3;5497:6;5468:41;:::i;:::-;5460:49;4323:1192;-1:-1:-1;;;;;;;;;4323:1192:1:o;5520:610::-;5630:6;5638;5646;5654;5662;5670;5678;5731:3;5719:9;5710:7;5706:23;5702:33;5699:53;;;5748:1;5745;5738:12;5699:53;5771:29;5790:9;5771:29;:::i;:::-;5761:39;;5819:38;5853:2;5842:9;5838:18;5819:38;:::i;:::-;5809:48;;5876:38;5910:2;5899:9;5895:18;5876:38;:::i;:::-;5866:48;;5961:2;5950:9;5946:18;5933:32;5923:42;;6012:3;6001:9;5997:19;5984:33;5974:43;;6036:36;6067:3;6056:9;6052:19;6036:36;:::i;:::-;6026:46;;6119:3;6108:9;6104:19;6091:33;6081:43;;5520:610;;;;;;;;;;:::o;6135:260::-;6203:6;6211;6264:2;6252:9;6243:7;6239:23;6235:32;6232:52;;;6280:1;6277;6270:12;6232:52;6303:29;6322:9;6303:29;:::i;:::-;6293:39;;6351:38;6385:2;6374:9;6370:18;6351:38;:::i;:::-;6341:48;;6135:260;;;;;:::o;6400:334::-;6477:6;6485;6493;6546:2;6534:9;6525:7;6521:23;6517:32;6514:52;;;6562:1;6559;6552:12;6514:52;6585:29;6604:9;6585:29;:::i;:::-;6575:39;;6633:38;6667:2;6656:9;6652:18;6633:38;:::i;:::-;6623:48;;6690:38;6724:2;6713:9;6709:18;6690:38;:::i;:::-;6680:48;;6400:334;;;;;:::o;6739:403::-;6825:6;6833;6841;6849;6902:3;6890:9;6881:7;6877:23;6873:33;6870:53;;;6919:1;6916;6909:12;6870:53;6942:29;6961:9;6942:29;:::i;:::-;6932:39;;6990:38;7024:2;7013:9;7009:18;6990:38;:::i;:::-;6980:48;;7047:38;7081:2;7070:9;7066:18;7047:38;:::i;:::-;6739:403;;;;-1:-1:-1;7037:48:1;;7132:2;7117:18;7104:32;;-1:-1:-1;;6739:403:1:o;7511:127::-;7572:10;7567:3;7563:20;7560:1;7553:31;7603:4;7600:1;7593:15;7627:4;7624:1;7617:15;7643:275;7714:2;7708:9;7779:2;7760:13;;-1:-1:-1;;7756:27:1;7744:40;;-1:-1:-1;;;;;7799:34:1;;7835:22;;;7796:62;7793:88;;;7861:18;;:::i;:::-;7897:2;7890:22;7643:275;;-1:-1:-1;7643:275:1:o;7923:183::-;7983:4;-1:-1:-1;;;;;8008:6:1;8005:30;8002:56;;;8038:18;;:::i;:::-;-1:-1:-1;8083:1:1;8079:14;8095:4;8075:25;;7923:183::o;8111:668::-;8165:5;8218:3;8211:4;8203:6;8199:17;8195:27;8185:55;;8236:1;8233;8226:12;8185:55;8272:6;8259:20;8298:4;8322:60;8338:43;8378:2;8338:43;:::i;:::-;8322:60;:::i;:::-;8416:15;;;8502:1;8498:10;;;;8486:23;;8482:32;;;8447:12;;;;8526:15;;;8523:35;;;8554:1;8551;8544:12;8523:35;8590:2;8582:6;8578:15;8602:148;8618:6;8613:3;8610:15;8602:148;;;8684:23;8703:3;8684:23;:::i;:::-;8672:36;;8728:12;;;;8635;;8602:148;;;-1:-1:-1;8768:5:1;8111:668;-1:-1:-1;;;;;;8111:668:1:o;8784:662::-;8838:5;8891:3;8884:4;8876:6;8872:17;8868:27;8858:55;;8909:1;8906;8899:12;8858:55;8945:6;8932:20;8971:4;8995:60;9011:43;9051:2;9011:43;:::i;8995:60::-;9089:15;;;9175:1;9171:10;;;;9159:23;;9155:32;;;9120:12;;;;9199:15;;;9196:35;;;9227:1;9224;9217:12;9196:35;9263:2;9255:6;9251:15;9275:142;9291:6;9286:3;9283:15;9275:142;;;9357:17;;9345:30;;9395:12;;;;9308;;9275:142;;9451:662;9502:5;9555:3;9548:4;9540:6;9536:17;9532:27;9522:55;;9573:1;9570;9563:12;9522:55;9609:6;9596:20;9635:4;9659:60;9675:43;9715:2;9675:43;:::i;9659:60::-;9753:15;;;9839:1;9835:10;;;;9823:23;;9819:32;;;9784:12;;;;9863:15;;;9860:35;;;9891:1;9888;9881:12;9860:35;9927:2;9919:6;9915:15;9939:145;9955:6;9950:3;9947:15;9939:145;;;10021:20;10037:3;10021:20;:::i;:::-;10009:33;;10062:12;;;;9972;;9939:145;;10118:1496;10369:6;10377;10385;10393;10401;10409;10462:3;10450:9;10441:7;10437:23;10433:33;10430:53;;;10479:1;10476;10469:12;10430:53;10519:9;10506:23;-1:-1:-1;;;;;10589:2:1;10581:6;10578:14;10575:34;;;10605:1;10602;10595:12;10575:34;10628:61;10681:7;10672:6;10661:9;10657:22;10628:61;:::i;:::-;10618:71;;10742:2;10731:9;10727:18;10714:32;10698:48;;10771:2;10761:8;10758:16;10755:36;;;10787:1;10784;10777:12;10755:36;10810:63;10865:7;10854:8;10843:9;10839:24;10810:63;:::i;:::-;10800:73;;10926:2;10915:9;10911:18;10898:32;10882:48;;10955:2;10945:8;10942:16;10939:36;;;10971:1;10968;10961:12;10939:36;10994:63;11049:7;11038:8;11027:9;11023:24;10994:63;:::i;:::-;10984:73;;11110:2;11099:9;11095:18;11082:32;11066:48;;11139:2;11129:8;11126:16;11123:36;;;11155:1;11152;11145:12;11123:36;11178:63;11233:7;11222:8;11211:9;11207:24;11178:63;:::i;:::-;11168:73;;11294:3;11283:9;11279:19;11266:33;11250:49;;11324:2;11314:8;11311:16;11308:36;;;11340:1;11337;11330:12;11308:36;11363:60;11415:7;11404:8;11393:9;11389:24;11363:60;:::i;:::-;11353:70;;11476:3;11465:9;11461:19;11448:33;11432:49;;11506:2;11496:8;11493:16;11490:36;;;11522:1;11519;11512:12;11490:36;;11545:63;11600:7;11589:8;11578:9;11574:24;11545:63;:::i;:::-;11535:73;;;10118:1496;;;;;;;;:::o;11619:322::-;11693:6;11701;11709;11762:2;11750:9;11741:7;11737:23;11733:32;11730:52;;;11778:1;11775;11768:12;11730:52;11801:29;11820:9;11801:29;:::i;:::-;11791:39;;11877:2;11866:9;11862:18;11849:32;11839:42;;11900:35;11931:2;11920:9;11916:18;11900:35;:::i;11946:180::-;12005:6;12058:2;12046:9;12037:7;12033:23;12029:32;12026:52;;;12074:1;12071;12064:12;12026:52;-1:-1:-1;12097:23:1;;11946:180;-1:-1:-1;11946:180:1:o;12131:397::-;12217:6;12225;12233;12241;12294:3;12282:9;12273:7;12269:23;12265:33;12262:53;;;12311:1;12308;12301:12;12262:53;12334:29;12353:9;12334:29;:::i;:::-;12324:39;;12382:38;12416:2;12405:9;12401:18;12382:38;:::i;:::-;12131:397;;12372:48;;-1:-1:-1;;;;12467:2:1;12452:18;;12439:32;;12518:2;12503:18;12490:32;;12131:397::o;12533:254::-;12598:6;12606;12659:2;12647:9;12638:7;12634:23;12630:32;12627:52;;;12675:1;12672;12665:12;12627:52;12698:29;12717:9;12698:29;:::i;:::-;12688:39;;12746:35;12777:2;12766:9;12762:18;12746:35;:::i;12792:186::-;12851:6;12904:2;12892:9;12883:7;12879:23;12875:32;12872:52;;;12920:1;12917;12910:12;12872:52;12943:29;12962:9;12943:29;:::i;12983:821::-;13135:6;13143;13151;13204:2;13192:9;13183:7;13179:23;13175:32;13172:52;;;13220:1;13217;13210:12;13172:52;13260:9;13247:23;-1:-1:-1;;;;;13330:2:1;13322:6;13319:14;13316:34;;;13346:1;13343;13336:12;13316:34;13369:61;13422:7;13413:6;13402:9;13398:22;13369:61;:::i;:::-;13359:71;;13483:2;13472:9;13468:18;13455:32;13439:48;;13512:2;13502:8;13499:16;13496:36;;;13528:1;13525;13518:12;13496:36;13551:63;13606:7;13595:8;13584:9;13580:24;13551:63;:::i;:::-;13541:73;;13667:2;13656:9;13652:18;13639:32;13623:48;;13696:2;13686:8;13683:16;13680:36;;;13712:1;13709;13702:12;13680:36;;13735:63;13790:7;13779:8;13768:9;13764:24;13735:63;:::i;:::-;13725:73;;;12983:821;;;;;:::o;13809:481::-;-1:-1:-1;;;;;;14092:2:1;14088:15;;;14084:24;;14072:37;;14143:15;;;14139:24;;14134:2;14125:12;;14118:46;14198:15;;;;14194:24;;;14189:2;14180:12;;14173:46;14244:2;14235:12;;14228:28;;;;14281:2;14272:12;;13809:481::o;14295:127::-;14356:10;14351:3;14347:20;14344:1;14337:31;14387:4;14384:1;14377:15;14411:4;14408:1;14401:15;14427:398;-1:-1:-1;;;;;;14682:2:1;14678:15;;;14674:24;;14662:37;;14733:15;;;;14729:24;;;14724:2;14715:12;;14708:46;14779:2;14770:12;;14763:28;14816:2;14807:12;;14427:398::o;14830:333::-;-1:-1:-1;;;;;;15057:2:1;15053:15;;;15049:24;;15037:37;;15108:15;;;;15104:24;15099:2;15090:12;;15083:46;15154:2;15145:12;;14830:333::o;15502:127::-;15563:10;15558:3;15554:20;15551:1;15544:31;15594:4;15591:1;15584:15;15618:4;15615:1;15608:15;15634:125;15699:9;;;15720:10;;;15717:36;;;15733:18;;:::i;15764:128::-;15831:9;;;15852:11;;;15849:37;;;15866:18;;:::i;16329:127::-;16390:10;16385:3;16381:20;16378:1;16371:31;16421:4;16418:1;16411:15;16445:4;16442:1;16435:15

Swarm Source

ipfs://6abdd81d490b6cf331d4d122475a7e118b81cc43bf5bf0aa5d00f909de3445aa

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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