ETH Price: $3,467.72 (+1.75%)
Gas: 7 Gwei

Token

ORANGE GANG (OG)
 

Overview

Max Total Supply

1,096 OG

Holders

426

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 OG
0xcaa92e89ba303884bcbc5bbb5e2ad821275d2305
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Oranges

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-06-21
*/

// SPDX-License-Identifier: MIT    

// 
//  ██████  ██████   █████  ███    ██  ██████  ███████ 
// ██    ██ ██   ██ ██   ██ ████   ██ ██       ██      
// ██    ██ ██████  ███████ ██ ██  ██ ██   ███ █████   
// ██    ██ ██   ██ ██   ██ ██  ██ ██ ██    ██ ██      
//  ██████  ██   ██ ██   ██ ██   ████  ██████  ███████ 
//                                                     
                                                    
pragma solidity ^0.8.0;
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

pragma solidity ^0.8.0;
abstract contract Ownable is Context {
    address private _owner;

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

    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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


    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

pragma solidity ^0.8.0;

abstract contract ReentrancyGuard {

    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {
        
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        _status = _ENTERED;

        _;

        _status = _NOT_ENTERED;
    }
}

pragma solidity ^0.8.0;

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    function toString(uint256 value) internal pure returns (string memory) {

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

pragma solidity ^0.8.0;


library EnumerableSet {


    struct Set {
        // Storage of set values
        bytes32[] _values;

        mapping(bytes32 => uint256) _indexes;
    }

    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);

            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    function _remove(Set storage set, bytes32 value) private returns (bool) {

        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastValue = set._values[lastIndex];

                set._values[toDeleteIndex] = lastValue;
                
                set._indexes[lastValue] = valueIndex; 
            }

            set._values.pop();

            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    struct Bytes32Set {
        Set _inner;
    }

    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        return _values(set._inner);
    }

    struct AddressSet {
        Set _inner;
    }

    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        assembly {
            result := store
        }

        return result;
    }

    struct UintSet {
        Set _inner;
    }

    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }
}

pragma solidity ^0.8.4;

interface IERC721A {

    error ApprovalCallerNotOwnerNorApproved();

    error ApprovalQueryForNonexistentToken();

    error BalanceQueryForZeroAddress();

    error MintToZeroAddress();

    error MintZeroQuantity();

    error OwnerQueryForNonexistentToken();

    error TransferCallerNotOwnerNorApproved();

    error TransferFromIncorrectOwner();

    error TransferToNonERC721ReceiverImplementer();

    error TransferToZeroAddress();

    error URIQueryForNonexistentToken();

    error MintERC2309QuantityExceedsLimit();

    error OwnershipNotInitializedForExtraData();

    struct TokenOwnership {

        address addr;

        uint64 startTimestamp;

        bool burned;

        uint24 extraData;
    }

    function totalSupply() external view returns (uint256);

    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    function balanceOf(address owner) external view returns (uint256 balance);

    function ownerOf(uint256 tokenId) external view returns (address owner);

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external payable;

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;

    function approve(address to, uint256 tokenId) external payable;

    function setApprovalForAll(address operator, bool _approved) external;

    function getApproved(uint256 tokenId) external view returns (address operator);

    function isApprovedForAll(address owner, address operator) external view returns (bool);

    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function tokenURI(uint256 tokenId) external view returns (string memory);

    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); 
}

pragma solidity ^0.8.4;

interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

contract ERC721A is IERC721A {

    struct TokenApprovalRef {
        address value;
    }

    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    uint256 private constant _BITPOS_NUMBER_MINTED = 64;

    uint256 private constant _BITPOS_NUMBER_BURNED = 128;

    uint256 private constant _BITPOS_AUX = 192;

    uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    uint256 private constant _BITPOS_START_TIMESTAMP = 160;

    uint256 private constant _BITMASK_BURNED = 1 << 224;

    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;

    uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;

    uint256 private constant _BITPOS_EXTRA_DATA = 232;

    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;

    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    uint256 private _currentIndex;

    uint256 private _burnCounter;

    string private _name;

    string private _symbol;

    mapping(uint256 => uint256) private _packedOwnerships;

    mapping(address => uint256) private _packedAddressData;

    mapping(uint256 => TokenApprovalRef) private _tokenApprovals;

    mapping(address => mapping(address => bool)) private _operatorApprovals;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

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

    function _nextTokenId() internal view virtual returns (uint256) {
        return _currentIndex;
    }

    function totalSupply() public view virtual override returns (uint256) {

        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    function _totalMinted() internal view virtual returns (uint256) {

        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    function _totalBurned() internal view virtual returns (uint256) {
        return _burnCounter;
    }

    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
    }

    function _setAux(address owner, uint64 aux) internal virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }


    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {

        return
            interfaceId == 0x01ffc9a7 || 
            interfaceId == 0x80ac58cd || 
            interfaceId == 0x5b5e139f; 
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
    }

    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    function _initializeOwnershipAt(uint256 index) internal virtual {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];

                    if (packed & _BITMASK_BURNED == 0) {

                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
           
            owner := and(owner, _BITMASK_ADDRESS)
           
            result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        
        assembly {
        
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    function approve(address to, uint256 tokenId) public payable virtual override {
        address owner = ownerOf(tokenId);

        if (_msgSenderERC721A() != owner)
            if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                revert ApprovalCallerNotOwnerNorApproved();
            }

        _tokenApprovals[tokenId].value = to;
        emit Approval(owner, to, tokenId);
    }

    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    function setApprovalForAll(address operator, bool approved) public virtual override {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && 
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; 
    }

    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {

            owner := and(owner, _BITMASK_ADDRESS)

            msgSender := and(msgSender, _BITMASK_ADDRESS)

            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];

        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        assembly {
            if approvedAddress {

                sstore(approvedAddressSlot, 0)
            }
        }

        unchecked {

            --_packedAddressData[from]; 
            ++_packedAddressData[to]; 

            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;

                if (_packedOwnerships[nextTokenId] == 0) {

                    if (nextTokenId != _currentIndex) {

                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public payable virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        unchecked {

            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            assembly {

                toMasked := and(to, _BITMASK_ADDRESS)

                log4(
                    0, 
                    0, 
                    _TRANSFER_EVENT_SIGNATURE, 
                    0, 
                    toMasked, 
                    startTokenId 
                )

                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {

                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

            _currentIndex = end;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        unchecked {

            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

            _currentIndex = startTokenId + quantity;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        _mint(to, quantity);

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

    function _safeMint(address to, uint256 quantity) internal virtual {
        _safeMint(to, quantity, '');
    }

    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        address from = address(uint160(prevOwnershipPacked));

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if (approvalCheck) {
            
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        assembly {
            if approvedAddress {
                
                sstore(approvedAddressSlot, 0)
            }
        }

        unchecked {

            _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;

            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;

                if (_packedOwnerships[nextTokenId] == 0) {

                    if (nextTokenId != _currentIndex) {

                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        unchecked {
            _burnCounter++;
        }
    }

    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }

    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {

            let m := add(mload(0x40), 0xa0)

            mstore(0x40, m)

            str := sub(m, 0x20)

            mstore(str, 0)

            let end := str

            for { let temp := value } 1 {} {
                str := sub(str, 1)

                mstore8(str, add(48, mod(temp, 10)))

                temp := div(temp, 10)

                if iszero(temp) { break }
            }

            let length := sub(end, str)

            str := sub(str, 0x20)

            mstore(str, length)
        }
    }
}

pragma solidity ^0.8.13;

contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant operatorFilterRegistry =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {

        if (address(operatorFilterRegistry).code.length > 0) {
            if (subscribe) {
                operatorFilterRegistry.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    operatorFilterRegistry.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    operatorFilterRegistry.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator() virtual {

        if (address(operatorFilterRegistry).code.length > 0) {
            if (!operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender)) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }
}

pragma solidity ^0.8.13;

contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

pragma solidity ^0.8.0;

interface IERC20 {

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(address indexed owner, address indexed spender, uint256 value);

    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address to, uint256 amount) external returns (bool);

    function allowance(address owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(address from, address to, uint256 amount) external returns (bool);
}


pragma solidity ^0.8.16;

contract Oranges is Ownable, ERC721A, ReentrancyGuard, DefaultOperatorFilterer{
    string public CONTRACT_URI = "";
    mapping(address => uint) public userHasMinted;
    bool public REVEALED;
    string public UNREVEALED_URI = "";
    string public BASE_URI = "";
    bool public isPublicMintEnabled = false;
    uint public COLLECTION_SIZE = 1096; 
    uint public FREE_SUPPLY_PER_WALLET = 1;

    address public token1address = 0xBAF07C6B271886B09E975ca990c7184D064E8cB0;
    address public token2address = 0xE3C783d9647d72F7f13ACe64892630e7E33BC968;

    constructor() ERC721A("ORANGE GANG", "OG") {}

    function Airdrop(uint256 quantity, address receiver) public onlyOwner {
        require(
            totalSupply() + quantity <= COLLECTION_SIZE,
            "No more Oranges in stock!"
        );
        
        _safeMint(receiver, quantity);
    }

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "The caller is another contract");
        _;
    }

    function mint(uint quantity)
        external
        callerIsUser 
        nonReentrant
    {

        uint token1 = IERC721A(token1address).balanceOf(msg.sender);
        uint token2 = IERC721A(token2address).balanceOf(msg.sender);

        require(token1 > 0 && token2 > 0);

        require(isPublicMintEnabled, "Mint not ready yet!");
        require(totalSupply() + quantity <= COLLECTION_SIZE, "No more Oranges left!");

        require(balanceOf(msg.sender) + quantity <= FREE_SUPPLY_PER_WALLET, "Tried to mint Oranges over limit");

        _safeMint(msg.sender, quantity);

    }

    function setPublicMintEnabled() public onlyOwner {
        isPublicMintEnabled = !isPublicMintEnabled;
    }

    function withdrawFunds() external onlyOwner nonReentrant {
        (bool success, ) = msg.sender.call{value: address(this).balance}("");
        require(success, "Transfer failed.");
    }

    function CollectionUrI(bool _revealed, string memory _baseURI) public onlyOwner {
        BASE_URI = _baseURI;
        REVEALED = _revealed;
    }

    function contractURI() public view returns (string memory) {
        return CONTRACT_URI;
    }

    function setContract(string memory _contractURI) public onlyOwner {
        CONTRACT_URI = _contractURI;
    }

    function ChangeFreePerWallet(uint256 _new) external onlyOwner {
        FREE_SUPPLY_PER_WALLET = _new;
    }

    function transferFrom(address from, address to, uint256 tokenId) public payable override (ERC721A) onlyAllowedOperator {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public payable override (ERC721A) onlyAllowedOperator {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public payable
        override (ERC721A)
        onlyAllowedOperator
    {
        super.safeTransferFrom(from, to, tokenId, data);
    }

    function tokenURI(uint256 _tokenId)
        public
        view
        override (ERC721A)
        returns (string memory)
    {
        if (REVEALED) {
            return
                string(abi.encodePacked(BASE_URI, Strings.toString(_tokenId)));
        } else {
            return UNREVEALED_URI;
        }
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"Airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"BASE_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COLLECTION_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CONTRACT_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new","type":"uint256"}],"name":"ChangeFreePerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_revealed","type":"bool"},{"internalType":"string","name":"_baseURI","type":"string"}],"name":"CollectionUrI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"FREE_SUPPLY_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REVEALED","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNREVEALED_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_contractURI","type":"string"}],"name":"setContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPublicMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token2address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userHasMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600a908162000024919062000774565b5060405180602001604052806000815250600d908162000045919062000774565b5060405180602001604052806000815250600e908162000066919062000774565b506000600f60006101000a81548160ff021916908315150217905550610448601055600160115573baf07c6b271886b09e975ca990c7184d064e8cb0601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073e3c783d9647d72f7f13ace64892630e7e33bc968601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200014457600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600b81526020017f4f52414e47452047414e470000000000000000000000000000000000000000008152506040518060400160405280600281526020017f4f47000000000000000000000000000000000000000000000000000000000000815250620001e8620001dc6200042960201b60201c565b6200043160201b60201c565b8160039081620001f9919062000774565b5080600490816200020b919062000774565b506200021c620004f560201b60201c565b6001819055505050600160098190555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111562000421578015620002e7576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620002ad929190620008a0565b600060405180830381600087803b158015620002c857600080fd5b505af1158015620002dd573d6000803e3d6000fd5b5050505062000420565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620003a1576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b815260040162000367929190620008a0565b600060405180830381600087803b1580156200038257600080fd5b505af115801562000397573d6000803e3d6000fd5b505050506200041f565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620003ea9190620008cd565b600060405180830381600087803b1580156200040557600080fd5b505af11580156200041a573d6000803e3d6000fd5b505050505b5b5b5050620008ea565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200057c57607f821691505b60208210810362000592576200059162000534565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005fc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620005bd565b620006088683620005bd565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620006556200064f620006498462000620565b6200062a565b62000620565b9050919050565b6000819050919050565b620006718362000634565b6200068962000680826200065c565b848454620005ca565b825550505050565b600090565b620006a062000691565b620006ad81848462000666565b505050565b5b81811015620006d557620006c960008262000696565b600181019050620006b3565b5050565b601f8211156200072457620006ee8162000598565b620006f984620005ad565b8101602085101562000709578190505b620007216200071885620005ad565b830182620006b2565b50505b505050565b600082821c905092915050565b6000620007496000198460080262000729565b1980831691505092915050565b600062000764838362000736565b9150826002028217905092915050565b6200077f82620004fa565b67ffffffffffffffff8111156200079b576200079a62000505565b5b620007a7825462000563565b620007b4828285620006d9565b600060209050601f831160018114620007ec5760008415620007d7578287015190505b620007e3858262000756565b86555062000853565b601f198416620007fc8662000598565b60005b828110156200082657848901518255600182019150602085019450602081019050620007ff565b8683101562000846578489015162000842601f89168262000736565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000888826200085b565b9050919050565b6200089a816200087b565b82525050565b6000604082019050620008b760008301856200088f565b620008c660208301846200088f565b9392505050565b6000602082019050620008e460008301846200088f565b92915050565b61398880620008fa6000396000f3fe6080604052600436106102045760003560e01c8063715018a611610118578063a4cdd719116100a0578063d8258d951161006f578063d8258d95146106fb578063dbddb26a14610726578063e8a3d48514610751578063e985e9c51461077c578063f2fde38b146107b957610204565b8063a4cdd71914610660578063a76a958714610677578063b88d4fde146106a2578063c87b56dd146106be57610204565b806395d89b41116100e757806395d89b411461058f57806396c1d05b146105ba578063a0712d68146105e5578063a1db246e1461060e578063a22cb4651461063757610204565b8063715018a6146104fb5780637304ff6c146105125780637871e1541461053b5780638da5cb5b1461056457610204565b806323b872dd1161019b578063507862d11161016a578063507862d11461040257806356b48d631461042d57806356b4f673146104565780636352211e1461048157806370a08231146104be57610204565b806323b872dd1461038857806324600fc3146103a457806342842e0e146103bb5780634366df0a146103d757610204565b8063095ea7b3116101d7578063095ea7b3146102d95780631422374f146102f557806318160ddd146103205780631d9857781461034b57610204565b80630116bc2d1461020957806301ffc9a71461023457806306fdde0314610271578063081812fc1461029c575b600080fd5b34801561021557600080fd5b5061021e6107e2565b60405161022b9190612705565b60405180910390f35b34801561024057600080fd5b5061025b6004803603810190610256919061278c565b6107f5565b6040516102689190612705565b60405180910390f35b34801561027d57600080fd5b50610286610887565b6040516102939190612849565b60405180910390f35b3480156102a857600080fd5b506102c360048036038101906102be91906128a1565b610919565b6040516102d0919061290f565b60405180910390f35b6102f360048036038101906102ee9190612956565b610998565b005b34801561030157600080fd5b5061030a610adc565b60405161031791906129a5565b60405180910390f35b34801561032c57600080fd5b50610335610ae2565b60405161034291906129a5565b60405180910390f35b34801561035757600080fd5b50610372600480360381019061036d91906129c0565b610af9565b60405161037f91906129a5565b60405180910390f35b6103a2600480360381019061039d91906129ed565b610b11565b005b3480156103b057600080fd5b506103b9610c1d565b005b6103d560048036038101906103d091906129ed565b610d29565b005b3480156103e357600080fd5b506103ec610e35565b6040516103f9919061290f565b60405180910390f35b34801561040e57600080fd5b50610417610e5b565b6040516104249190612849565b60405180910390f35b34801561043957600080fd5b50610454600480360381019061044f9190612b75565b610ee9565b005b34801561046257600080fd5b5061046b610f04565b6040516104789190612849565b60405180910390f35b34801561048d57600080fd5b506104a860048036038101906104a391906128a1565b610f92565b6040516104b5919061290f565b60405180910390f35b3480156104ca57600080fd5b506104e560048036038101906104e091906129c0565b610fa4565b6040516104f291906129a5565b60405180910390f35b34801561050757600080fd5b5061051061105c565b005b34801561051e57600080fd5b5061053960048036038101906105349190612bea565b611070565b005b34801561054757600080fd5b50610562600480360381019061055d9190612c46565b6110a6565b005b34801561057057600080fd5b50610579611113565b604051610586919061290f565b60405180910390f35b34801561059b57600080fd5b506105a461113c565b6040516105b19190612849565b60405180910390f35b3480156105c657600080fd5b506105cf6111ce565b6040516105dc919061290f565b60405180910390f35b3480156105f157600080fd5b5061060c600480360381019061060791906128a1565b6111f4565b005b34801561061a57600080fd5b50610635600480360381019061063091906128a1565b61151d565b005b34801561064357600080fd5b5061065e60048036038101906106599190612c86565b61152f565b005b34801561066c57600080fd5b5061067561163a565b005b34801561068357600080fd5b5061068c61166e565b6040516106999190612705565b60405180910390f35b6106bc60048036038101906106b79190612d67565b611681565b005b3480156106ca57600080fd5b506106e560048036038101906106e091906128a1565b61178f565b6040516106f29190612849565b60405180910390f35b34801561070757600080fd5b5061071061186b565b60405161071d91906129a5565b60405180910390f35b34801561073257600080fd5b5061073b611871565b6040516107489190612849565b60405180910390f35b34801561075d57600080fd5b506107666118ff565b6040516107739190612849565b60405180910390f35b34801561078857600080fd5b506107a3600480360381019061079e9190612dea565b611991565b6040516107b09190612705565b60405180910390f35b3480156107c557600080fd5b506107e060048036038101906107db91906129c0565b611a25565b005b600f60009054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061085057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108805750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606003805461089690612e59565b80601f01602080910402602001604051908101604052809291908181526020018280546108c290612e59565b801561090f5780601f106108e45761010080835404028352916020019161090f565b820191906000526020600020905b8154815290600101906020018083116108f257829003601f168201915b5050505050905090565b600061092482611aa8565b61095a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109a382610f92565b90508073ffffffffffffffffffffffffffffffffffffffff166109c4611b07565b73ffffffffffffffffffffffffffffffffffffffff1614610a27576109f0816109eb611b07565b611991565b610a26576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60115481565b6000610aec611b0f565b6002546001540303905090565b600b6020528060005260406000206000915090505481565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610c0d576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610b88929190612e8a565b6020604051808303816000875af1158015610ba7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bcb9190612ec8565b610c0c57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610c03919061290f565b60405180910390fd5b5b610c18838383611b14565b505050565b610c25611e36565b600260095403610c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6190612f41565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610c9890612f92565b60006040518083038185875af1925050503d8060008114610cd5576040519150601f19603f3d011682016040523d82523d6000602084013e610cda565b606091505b5050905080610d1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1590612ff3565b60405180910390fd5b506001600981905550565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610e25576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610da0929190612e8a565b6020604051808303816000875af1158015610dbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de39190612ec8565b610e2457336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610e1b919061290f565b60405180910390fd5b5b610e30838383611eb4565b505050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d8054610e6890612e59565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9490612e59565b8015610ee15780601f10610eb657610100808354040283529160200191610ee1565b820191906000526020600020905b815481529060010190602001808311610ec457829003601f168201915b505050505081565b610ef1611e36565b80600a9081610f0091906131bf565b5050565b600a8054610f1190612e59565b80601f0160208091040260200160405190810160405280929190818152602001828054610f3d90612e59565b8015610f8a5780601f10610f5f57610100808354040283529160200191610f8a565b820191906000526020600020905b815481529060010190602001808311610f6d57829003601f168201915b505050505081565b6000610f9d82611ed4565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361100b576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611064611e36565b61106e6000611fa0565b565b611078611e36565b80600e908161108791906131bf565b5081600c60006101000a81548160ff0219169083151502179055505050565b6110ae611e36565b601054826110ba610ae2565b6110c491906132c0565b1115611105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fc90613340565b60405180910390fd5b61110f8183612064565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461114b90612e59565b80601f016020809104026020016040519081016040528092919081815260200182805461117790612e59565b80156111c45780601f10611199576101008083540402835291602001916111c4565b820191906000526020600020905b8154815290600101906020018083116111a757829003601f168201915b5050505050905090565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611262576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611259906133ac565b60405180910390fd5b6002600954036112a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129e90612f41565b60405180910390fd5b60026009819055506000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161130c919061290f565b602060405180830381865afa158015611329573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134d91906133e1565b90506000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016113ac919061290f565b602060405180830381865afa1580156113c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ed91906133e1565b90506000821180156113ff5750600081115b61140857600080fd5b600f60009054906101000a900460ff16611457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144e9061345a565b60405180910390fd5b60105483611463610ae2565b61146d91906132c0565b11156114ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a5906134c6565b60405180910390fd5b601154836114bb33610fa4565b6114c591906132c0565b1115611506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fd90613532565b60405180910390fd5b6115103384612064565b5050600160098190555050565b611525611e36565b8060118190555050565b806008600061153c611b07565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115e9611b07565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161162e9190612705565b60405180910390a35050565b611642611e36565b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b600c60009054906101000a900460ff1681565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561177d576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016116f8929190612e8a565b6020604051808303816000875af1158015611717573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173b9190612ec8565b61177c57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611773919061290f565b60405180910390fd5b5b61178984848484612082565b50505050565b6060600c60009054906101000a900460ff16156117d857600e6117b1836120f5565b6040516020016117c2929190613611565b6040516020818303038152906040529050611866565b600d80546117e590612e59565b80601f016020809104026020016040519081016040528092919081815260200182805461181190612e59565b801561185e5780601f106118335761010080835404028352916020019161185e565b820191906000526020600020905b81548152906001019060200180831161184157829003601f168201915b505050505090505b919050565b60105481565b600e805461187e90612e59565b80601f01602080910402602001604051908101604052809291908181526020018280546118aa90612e59565b80156118f75780601f106118cc576101008083540402835291602001916118f7565b820191906000526020600020905b8154815290600101906020018083116118da57829003601f168201915b505050505081565b6060600a805461190e90612e59565b80601f016020809104026020016040519081016040528092919081815260200182805461193a90612e59565b80156119875780601f1061195c57610100808354040283529160200191611987565b820191906000526020600020905b81548152906001019060200180831161196a57829003601f168201915b5050505050905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a2d611e36565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a93906136a7565b60405180910390fd5b611aa581611fa0565b50565b600081611ab3611b0f565b11158015611ac2575060015482105b8015611b00575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b6000611b1f82611ed4565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611b86576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611b9284612255565b91509150611ba88187611ba3611b07565b61227c565b611bf457611bbd86611bb8611b07565b611991565b611bf3576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611c5a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c6786868660016122c0565b8015611c7257600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611d4085611d1c8888876122c6565b7c0200000000000000000000000000000000000000000000000000000000176122ee565b600560008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603611dc65760006001850190506000600560008381526020019081526020016000205403611dc4576001548114611dc3578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e2e8686866001612319565b505050505050565b611e3e61231f565b73ffffffffffffffffffffffffffffffffffffffff16611e5c611113565b73ffffffffffffffffffffffffffffffffffffffff1614611eb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea990613713565b60405180910390fd5b565b611ecf83838360405180602001604052806000815250611681565b505050565b60008082905080611ee3611b0f565b11611f6957600154811015611f685760006005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611f66575b60008103611f5c576005600083600190039350838152602001908152602001600020549050611f32565b8092505050611f9b565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61207e828260405180602001604052806000815250612327565b5050565b61208d848484610b11565b60008373ffffffffffffffffffffffffffffffffffffffff163b146120ef576120b8848484846123c5565b6120ee576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606000820361213c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612250565b600082905060005b6000821461216e57808061215790613733565b915050600a8261216791906137aa565b9150612144565b60008167ffffffffffffffff81111561218a57612189612a4a565b5b6040519080825280601f01601f1916602001820160405280156121bc5781602001600182028036833780820191505090505b5090505b60008514612249576001826121d591906137db565b9150600a856121e4919061380f565b60306121f091906132c0565b60f81b81838151811061220657612205613840565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561224291906137aa565b94506121c0565b8093505050505b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86122dd868684612515565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b612331838361251e565b60008373ffffffffffffffffffffffffffffffffffffffff163b146123c05760006001549050600083820390505b61237260008683806001019450866123c5565b6123a8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061235f5781600154146123bd57600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123eb611b07565b8786866040518563ffffffff1660e01b815260040161240d94939291906138c4565b6020604051808303816000875af192505050801561244957506040513d601f19601f820116820180604052508101906124469190613925565b60015b6124c2573d8060008114612479576040519150601f19603f3d011682016040523d82523d6000602084013e61247e565b606091505b5060008151036124ba576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b600060015490506000820361255f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61256c60008483856122c0565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506125e3836125d460008660006122c6565b6125dd856126da565b176122ee565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461268457808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612649565b50600082036126bf576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060018190555050506126d56000848385612319565b505050565b60006001821460e11b9050919050565b60008115159050919050565b6126ff816126ea565b82525050565b600060208201905061271a60008301846126f6565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61276981612734565b811461277457600080fd5b50565b60008135905061278681612760565b92915050565b6000602082840312156127a2576127a161272a565b5b60006127b084828501612777565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156127f35780820151818401526020810190506127d8565b60008484015250505050565b6000601f19601f8301169050919050565b600061281b826127b9565b61282581856127c4565b93506128358185602086016127d5565b61283e816127ff565b840191505092915050565b600060208201905081810360008301526128638184612810565b905092915050565b6000819050919050565b61287e8161286b565b811461288957600080fd5b50565b60008135905061289b81612875565b92915050565b6000602082840312156128b7576128b661272a565b5b60006128c58482850161288c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006128f9826128ce565b9050919050565b612909816128ee565b82525050565b60006020820190506129246000830184612900565b92915050565b612933816128ee565b811461293e57600080fd5b50565b6000813590506129508161292a565b92915050565b6000806040838503121561296d5761296c61272a565b5b600061297b85828601612941565b925050602061298c8582860161288c565b9150509250929050565b61299f8161286b565b82525050565b60006020820190506129ba6000830184612996565b92915050565b6000602082840312156129d6576129d561272a565b5b60006129e484828501612941565b91505092915050565b600080600060608486031215612a0657612a0561272a565b5b6000612a1486828701612941565b9350506020612a2586828701612941565b9250506040612a368682870161288c565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612a82826127ff565b810181811067ffffffffffffffff82111715612aa157612aa0612a4a565b5b80604052505050565b6000612ab4612720565b9050612ac08282612a79565b919050565b600067ffffffffffffffff821115612ae057612adf612a4a565b5b612ae9826127ff565b9050602081019050919050565b82818337600083830152505050565b6000612b18612b1384612ac5565b612aaa565b905082815260208101848484011115612b3457612b33612a45565b5b612b3f848285612af6565b509392505050565b600082601f830112612b5c57612b5b612a40565b5b8135612b6c848260208601612b05565b91505092915050565b600060208284031215612b8b57612b8a61272a565b5b600082013567ffffffffffffffff811115612ba957612ba861272f565b5b612bb584828501612b47565b91505092915050565b612bc7816126ea565b8114612bd257600080fd5b50565b600081359050612be481612bbe565b92915050565b60008060408385031215612c0157612c0061272a565b5b6000612c0f85828601612bd5565b925050602083013567ffffffffffffffff811115612c3057612c2f61272f565b5b612c3c85828601612b47565b9150509250929050565b60008060408385031215612c5d57612c5c61272a565b5b6000612c6b8582860161288c565b9250506020612c7c85828601612941565b9150509250929050565b60008060408385031215612c9d57612c9c61272a565b5b6000612cab85828601612941565b9250506020612cbc85828601612bd5565b9150509250929050565b600067ffffffffffffffff821115612ce157612ce0612a4a565b5b612cea826127ff565b9050602081019050919050565b6000612d0a612d0584612cc6565b612aaa565b905082815260208101848484011115612d2657612d25612a45565b5b612d31848285612af6565b509392505050565b600082601f830112612d4e57612d4d612a40565b5b8135612d5e848260208601612cf7565b91505092915050565b60008060008060808587031215612d8157612d8061272a565b5b6000612d8f87828801612941565b9450506020612da087828801612941565b9350506040612db18782880161288c565b925050606085013567ffffffffffffffff811115612dd257612dd161272f565b5b612dde87828801612d39565b91505092959194509250565b60008060408385031215612e0157612e0061272a565b5b6000612e0f85828601612941565b9250506020612e2085828601612941565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612e7157607f821691505b602082108103612e8457612e83612e2a565b5b50919050565b6000604082019050612e9f6000830185612900565b612eac6020830184612900565b9392505050565b600081519050612ec281612bbe565b92915050565b600060208284031215612ede57612edd61272a565b5b6000612eec84828501612eb3565b91505092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000612f2b601f836127c4565b9150612f3682612ef5565b602082019050919050565b60006020820190508181036000830152612f5a81612f1e565b9050919050565b600081905092915050565b50565b6000612f7c600083612f61565b9150612f8782612f6c565b600082019050919050565b6000612f9d82612f6f565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b6000612fdd6010836127c4565b9150612fe882612fa7565b602082019050919050565b6000602082019050818103600083015261300c81612fd0565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026130757fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613038565b61307f8683613038565b95508019841693508086168417925050509392505050565b6000819050919050565b60006130bc6130b76130b28461286b565b613097565b61286b565b9050919050565b6000819050919050565b6130d6836130a1565b6130ea6130e2826130c3565b848454613045565b825550505050565b600090565b6130ff6130f2565b61310a8184846130cd565b505050565b5b8181101561312e576131236000826130f7565b600181019050613110565b5050565b601f8211156131735761314481613013565b61314d84613028565b8101602085101561315c578190505b61317061316885613028565b83018261310f565b50505b505050565b600082821c905092915050565b600061319660001984600802613178565b1980831691505092915050565b60006131af8383613185565b9150826002028217905092915050565b6131c8826127b9565b67ffffffffffffffff8111156131e1576131e0612a4a565b5b6131eb8254612e59565b6131f6828285613132565b600060209050601f8311600181146132295760008415613217578287015190505b61322185826131a3565b865550613289565b601f19841661323786613013565b60005b8281101561325f5784890151825560018201915060208501945060208101905061323a565b8683101561327c5784890151613278601f891682613185565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006132cb8261286b565b91506132d68361286b565b92508282019050808211156132ee576132ed613291565b5b92915050565b7f4e6f206d6f7265204f72616e67657320696e2073746f636b2100000000000000600082015250565b600061332a6019836127c4565b9150613335826132f4565b602082019050919050565b600060208201905081810360008301526133598161331d565b9050919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b6000613396601e836127c4565b91506133a182613360565b602082019050919050565b600060208201905081810360008301526133c581613389565b9050919050565b6000815190506133db81612875565b92915050565b6000602082840312156133f7576133f661272a565b5b6000613405848285016133cc565b91505092915050565b7f4d696e74206e6f74207265616479207965742100000000000000000000000000600082015250565b60006134446013836127c4565b915061344f8261340e565b602082019050919050565b6000602082019050818103600083015261347381613437565b9050919050565b7f4e6f206d6f7265204f72616e676573206c656674210000000000000000000000600082015250565b60006134b06015836127c4565b91506134bb8261347a565b602082019050919050565b600060208201905081810360008301526134df816134a3565b9050919050565b7f547269656420746f206d696e74204f72616e676573206f766572206c696d6974600082015250565b600061351c6020836127c4565b9150613527826134e6565b602082019050919050565b6000602082019050818103600083015261354b8161350f565b9050919050565b600081905092915050565b6000815461356a81612e59565b6135748186613552565b9450600182166000811461358f57600181146135a4576135d7565b60ff19831686528115158202860193506135d7565b6135ad85613013565b60005b838110156135cf578154818901526001820191506020810190506135b0565b838801955050505b50505092915050565b60006135eb826127b9565b6135f58185613552565b93506136058185602086016127d5565b80840191505092915050565b600061361d828561355d565b915061362982846135e0565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006136916026836127c4565b915061369c82613635565b604082019050919050565b600060208201905081810360008301526136c081613684565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006136fd6020836127c4565b9150613708826136c7565b602082019050919050565b6000602082019050818103600083015261372c816136f0565b9050919050565b600061373e8261286b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036137705761376f613291565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006137b58261286b565b91506137c08361286b565b9250826137d0576137cf61377b565b5b828204905092915050565b60006137e68261286b565b91506137f18361286b565b925082820390508181111561380957613808613291565b5b92915050565b600061381a8261286b565b91506138258361286b565b9250826138355761383461377b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006138968261386f565b6138a0818561387a565b93506138b08185602086016127d5565b6138b9816127ff565b840191505092915050565b60006080820190506138d96000830187612900565b6138e66020830186612900565b6138f36040830185612996565b8181036060830152613905818461388b565b905095945050505050565b60008151905061391f81612760565b92915050565b60006020828403121561393b5761393a61272a565b5b600061394984828501613910565b9150509291505056fea2646970667358221220d185543ea7341348a749f4c9f5bde9ed979e4b5b5829c4113802a31facfc236f64736f6c63430008120033

Deployed Bytecode

0x6080604052600436106102045760003560e01c8063715018a611610118578063a4cdd719116100a0578063d8258d951161006f578063d8258d95146106fb578063dbddb26a14610726578063e8a3d48514610751578063e985e9c51461077c578063f2fde38b146107b957610204565b8063a4cdd71914610660578063a76a958714610677578063b88d4fde146106a2578063c87b56dd146106be57610204565b806395d89b41116100e757806395d89b411461058f57806396c1d05b146105ba578063a0712d68146105e5578063a1db246e1461060e578063a22cb4651461063757610204565b8063715018a6146104fb5780637304ff6c146105125780637871e1541461053b5780638da5cb5b1461056457610204565b806323b872dd1161019b578063507862d11161016a578063507862d11461040257806356b48d631461042d57806356b4f673146104565780636352211e1461048157806370a08231146104be57610204565b806323b872dd1461038857806324600fc3146103a457806342842e0e146103bb5780634366df0a146103d757610204565b8063095ea7b3116101d7578063095ea7b3146102d95780631422374f146102f557806318160ddd146103205780631d9857781461034b57610204565b80630116bc2d1461020957806301ffc9a71461023457806306fdde0314610271578063081812fc1461029c575b600080fd5b34801561021557600080fd5b5061021e6107e2565b60405161022b9190612705565b60405180910390f35b34801561024057600080fd5b5061025b6004803603810190610256919061278c565b6107f5565b6040516102689190612705565b60405180910390f35b34801561027d57600080fd5b50610286610887565b6040516102939190612849565b60405180910390f35b3480156102a857600080fd5b506102c360048036038101906102be91906128a1565b610919565b6040516102d0919061290f565b60405180910390f35b6102f360048036038101906102ee9190612956565b610998565b005b34801561030157600080fd5b5061030a610adc565b60405161031791906129a5565b60405180910390f35b34801561032c57600080fd5b50610335610ae2565b60405161034291906129a5565b60405180910390f35b34801561035757600080fd5b50610372600480360381019061036d91906129c0565b610af9565b60405161037f91906129a5565b60405180910390f35b6103a2600480360381019061039d91906129ed565b610b11565b005b3480156103b057600080fd5b506103b9610c1d565b005b6103d560048036038101906103d091906129ed565b610d29565b005b3480156103e357600080fd5b506103ec610e35565b6040516103f9919061290f565b60405180910390f35b34801561040e57600080fd5b50610417610e5b565b6040516104249190612849565b60405180910390f35b34801561043957600080fd5b50610454600480360381019061044f9190612b75565b610ee9565b005b34801561046257600080fd5b5061046b610f04565b6040516104789190612849565b60405180910390f35b34801561048d57600080fd5b506104a860048036038101906104a391906128a1565b610f92565b6040516104b5919061290f565b60405180910390f35b3480156104ca57600080fd5b506104e560048036038101906104e091906129c0565b610fa4565b6040516104f291906129a5565b60405180910390f35b34801561050757600080fd5b5061051061105c565b005b34801561051e57600080fd5b5061053960048036038101906105349190612bea565b611070565b005b34801561054757600080fd5b50610562600480360381019061055d9190612c46565b6110a6565b005b34801561057057600080fd5b50610579611113565b604051610586919061290f565b60405180910390f35b34801561059b57600080fd5b506105a461113c565b6040516105b19190612849565b60405180910390f35b3480156105c657600080fd5b506105cf6111ce565b6040516105dc919061290f565b60405180910390f35b3480156105f157600080fd5b5061060c600480360381019061060791906128a1565b6111f4565b005b34801561061a57600080fd5b50610635600480360381019061063091906128a1565b61151d565b005b34801561064357600080fd5b5061065e60048036038101906106599190612c86565b61152f565b005b34801561066c57600080fd5b5061067561163a565b005b34801561068357600080fd5b5061068c61166e565b6040516106999190612705565b60405180910390f35b6106bc60048036038101906106b79190612d67565b611681565b005b3480156106ca57600080fd5b506106e560048036038101906106e091906128a1565b61178f565b6040516106f29190612849565b60405180910390f35b34801561070757600080fd5b5061071061186b565b60405161071d91906129a5565b60405180910390f35b34801561073257600080fd5b5061073b611871565b6040516107489190612849565b60405180910390f35b34801561075d57600080fd5b506107666118ff565b6040516107739190612849565b60405180910390f35b34801561078857600080fd5b506107a3600480360381019061079e9190612dea565b611991565b6040516107b09190612705565b60405180910390f35b3480156107c557600080fd5b506107e060048036038101906107db91906129c0565b611a25565b005b600f60009054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061085057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108805750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606003805461089690612e59565b80601f01602080910402602001604051908101604052809291908181526020018280546108c290612e59565b801561090f5780601f106108e45761010080835404028352916020019161090f565b820191906000526020600020905b8154815290600101906020018083116108f257829003601f168201915b5050505050905090565b600061092482611aa8565b61095a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109a382610f92565b90508073ffffffffffffffffffffffffffffffffffffffff166109c4611b07565b73ffffffffffffffffffffffffffffffffffffffff1614610a27576109f0816109eb611b07565b611991565b610a26576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60115481565b6000610aec611b0f565b6002546001540303905090565b600b6020528060005260406000206000915090505481565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610c0d576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610b88929190612e8a565b6020604051808303816000875af1158015610ba7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bcb9190612ec8565b610c0c57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610c03919061290f565b60405180910390fd5b5b610c18838383611b14565b505050565b610c25611e36565b600260095403610c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6190612f41565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610c9890612f92565b60006040518083038185875af1925050503d8060008114610cd5576040519150601f19603f3d011682016040523d82523d6000602084013e610cda565b606091505b5050905080610d1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1590612ff3565b60405180910390fd5b506001600981905550565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610e25576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610da0929190612e8a565b6020604051808303816000875af1158015610dbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de39190612ec8565b610e2457336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610e1b919061290f565b60405180910390fd5b5b610e30838383611eb4565b505050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d8054610e6890612e59565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9490612e59565b8015610ee15780601f10610eb657610100808354040283529160200191610ee1565b820191906000526020600020905b815481529060010190602001808311610ec457829003601f168201915b505050505081565b610ef1611e36565b80600a9081610f0091906131bf565b5050565b600a8054610f1190612e59565b80601f0160208091040260200160405190810160405280929190818152602001828054610f3d90612e59565b8015610f8a5780601f10610f5f57610100808354040283529160200191610f8a565b820191906000526020600020905b815481529060010190602001808311610f6d57829003601f168201915b505050505081565b6000610f9d82611ed4565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361100b576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611064611e36565b61106e6000611fa0565b565b611078611e36565b80600e908161108791906131bf565b5081600c60006101000a81548160ff0219169083151502179055505050565b6110ae611e36565b601054826110ba610ae2565b6110c491906132c0565b1115611105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fc90613340565b60405180910390fd5b61110f8183612064565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461114b90612e59565b80601f016020809104026020016040519081016040528092919081815260200182805461117790612e59565b80156111c45780601f10611199576101008083540402835291602001916111c4565b820191906000526020600020905b8154815290600101906020018083116111a757829003601f168201915b5050505050905090565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611262576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611259906133ac565b60405180910390fd5b6002600954036112a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129e90612f41565b60405180910390fd5b60026009819055506000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161130c919061290f565b602060405180830381865afa158015611329573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134d91906133e1565b90506000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016113ac919061290f565b602060405180830381865afa1580156113c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ed91906133e1565b90506000821180156113ff5750600081115b61140857600080fd5b600f60009054906101000a900460ff16611457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144e9061345a565b60405180910390fd5b60105483611463610ae2565b61146d91906132c0565b11156114ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a5906134c6565b60405180910390fd5b601154836114bb33610fa4565b6114c591906132c0565b1115611506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fd90613532565b60405180910390fd5b6115103384612064565b5050600160098190555050565b611525611e36565b8060118190555050565b806008600061153c611b07565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115e9611b07565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161162e9190612705565b60405180910390a35050565b611642611e36565b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b600c60009054906101000a900460ff1681565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561177d576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016116f8929190612e8a565b6020604051808303816000875af1158015611717573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173b9190612ec8565b61177c57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611773919061290f565b60405180910390fd5b5b61178984848484612082565b50505050565b6060600c60009054906101000a900460ff16156117d857600e6117b1836120f5565b6040516020016117c2929190613611565b6040516020818303038152906040529050611866565b600d80546117e590612e59565b80601f016020809104026020016040519081016040528092919081815260200182805461181190612e59565b801561185e5780601f106118335761010080835404028352916020019161185e565b820191906000526020600020905b81548152906001019060200180831161184157829003601f168201915b505050505090505b919050565b60105481565b600e805461187e90612e59565b80601f01602080910402602001604051908101604052809291908181526020018280546118aa90612e59565b80156118f75780601f106118cc576101008083540402835291602001916118f7565b820191906000526020600020905b8154815290600101906020018083116118da57829003601f168201915b505050505081565b6060600a805461190e90612e59565b80601f016020809104026020016040519081016040528092919081815260200182805461193a90612e59565b80156119875780601f1061195c57610100808354040283529160200191611987565b820191906000526020600020905b81548152906001019060200180831161196a57829003601f168201915b5050505050905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a2d611e36565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a93906136a7565b60405180910390fd5b611aa581611fa0565b50565b600081611ab3611b0f565b11158015611ac2575060015482105b8015611b00575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b6000611b1f82611ed4565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611b86576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611b9284612255565b91509150611ba88187611ba3611b07565b61227c565b611bf457611bbd86611bb8611b07565b611991565b611bf3576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611c5a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c6786868660016122c0565b8015611c7257600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611d4085611d1c8888876122c6565b7c0200000000000000000000000000000000000000000000000000000000176122ee565b600560008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603611dc65760006001850190506000600560008381526020019081526020016000205403611dc4576001548114611dc3578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e2e8686866001612319565b505050505050565b611e3e61231f565b73ffffffffffffffffffffffffffffffffffffffff16611e5c611113565b73ffffffffffffffffffffffffffffffffffffffff1614611eb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea990613713565b60405180910390fd5b565b611ecf83838360405180602001604052806000815250611681565b505050565b60008082905080611ee3611b0f565b11611f6957600154811015611f685760006005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611f66575b60008103611f5c576005600083600190039350838152602001908152602001600020549050611f32565b8092505050611f9b565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61207e828260405180602001604052806000815250612327565b5050565b61208d848484610b11565b60008373ffffffffffffffffffffffffffffffffffffffff163b146120ef576120b8848484846123c5565b6120ee576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606000820361213c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612250565b600082905060005b6000821461216e57808061215790613733565b915050600a8261216791906137aa565b9150612144565b60008167ffffffffffffffff81111561218a57612189612a4a565b5b6040519080825280601f01601f1916602001820160405280156121bc5781602001600182028036833780820191505090505b5090505b60008514612249576001826121d591906137db565b9150600a856121e4919061380f565b60306121f091906132c0565b60f81b81838151811061220657612205613840565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561224291906137aa565b94506121c0565b8093505050505b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86122dd868684612515565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b612331838361251e565b60008373ffffffffffffffffffffffffffffffffffffffff163b146123c05760006001549050600083820390505b61237260008683806001019450866123c5565b6123a8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061235f5781600154146123bd57600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123eb611b07565b8786866040518563ffffffff1660e01b815260040161240d94939291906138c4565b6020604051808303816000875af192505050801561244957506040513d601f19601f820116820180604052508101906124469190613925565b60015b6124c2573d8060008114612479576040519150601f19603f3d011682016040523d82523d6000602084013e61247e565b606091505b5060008151036124ba576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b600060015490506000820361255f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61256c60008483856122c0565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506125e3836125d460008660006122c6565b6125dd856126da565b176122ee565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461268457808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612649565b50600082036126bf576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060018190555050506126d56000848385612319565b505050565b60006001821460e11b9050919050565b60008115159050919050565b6126ff816126ea565b82525050565b600060208201905061271a60008301846126f6565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61276981612734565b811461277457600080fd5b50565b60008135905061278681612760565b92915050565b6000602082840312156127a2576127a161272a565b5b60006127b084828501612777565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156127f35780820151818401526020810190506127d8565b60008484015250505050565b6000601f19601f8301169050919050565b600061281b826127b9565b61282581856127c4565b93506128358185602086016127d5565b61283e816127ff565b840191505092915050565b600060208201905081810360008301526128638184612810565b905092915050565b6000819050919050565b61287e8161286b565b811461288957600080fd5b50565b60008135905061289b81612875565b92915050565b6000602082840312156128b7576128b661272a565b5b60006128c58482850161288c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006128f9826128ce565b9050919050565b612909816128ee565b82525050565b60006020820190506129246000830184612900565b92915050565b612933816128ee565b811461293e57600080fd5b50565b6000813590506129508161292a565b92915050565b6000806040838503121561296d5761296c61272a565b5b600061297b85828601612941565b925050602061298c8582860161288c565b9150509250929050565b61299f8161286b565b82525050565b60006020820190506129ba6000830184612996565b92915050565b6000602082840312156129d6576129d561272a565b5b60006129e484828501612941565b91505092915050565b600080600060608486031215612a0657612a0561272a565b5b6000612a1486828701612941565b9350506020612a2586828701612941565b9250506040612a368682870161288c565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612a82826127ff565b810181811067ffffffffffffffff82111715612aa157612aa0612a4a565b5b80604052505050565b6000612ab4612720565b9050612ac08282612a79565b919050565b600067ffffffffffffffff821115612ae057612adf612a4a565b5b612ae9826127ff565b9050602081019050919050565b82818337600083830152505050565b6000612b18612b1384612ac5565b612aaa565b905082815260208101848484011115612b3457612b33612a45565b5b612b3f848285612af6565b509392505050565b600082601f830112612b5c57612b5b612a40565b5b8135612b6c848260208601612b05565b91505092915050565b600060208284031215612b8b57612b8a61272a565b5b600082013567ffffffffffffffff811115612ba957612ba861272f565b5b612bb584828501612b47565b91505092915050565b612bc7816126ea565b8114612bd257600080fd5b50565b600081359050612be481612bbe565b92915050565b60008060408385031215612c0157612c0061272a565b5b6000612c0f85828601612bd5565b925050602083013567ffffffffffffffff811115612c3057612c2f61272f565b5b612c3c85828601612b47565b9150509250929050565b60008060408385031215612c5d57612c5c61272a565b5b6000612c6b8582860161288c565b9250506020612c7c85828601612941565b9150509250929050565b60008060408385031215612c9d57612c9c61272a565b5b6000612cab85828601612941565b9250506020612cbc85828601612bd5565b9150509250929050565b600067ffffffffffffffff821115612ce157612ce0612a4a565b5b612cea826127ff565b9050602081019050919050565b6000612d0a612d0584612cc6565b612aaa565b905082815260208101848484011115612d2657612d25612a45565b5b612d31848285612af6565b509392505050565b600082601f830112612d4e57612d4d612a40565b5b8135612d5e848260208601612cf7565b91505092915050565b60008060008060808587031215612d8157612d8061272a565b5b6000612d8f87828801612941565b9450506020612da087828801612941565b9350506040612db18782880161288c565b925050606085013567ffffffffffffffff811115612dd257612dd161272f565b5b612dde87828801612d39565b91505092959194509250565b60008060408385031215612e0157612e0061272a565b5b6000612e0f85828601612941565b9250506020612e2085828601612941565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612e7157607f821691505b602082108103612e8457612e83612e2a565b5b50919050565b6000604082019050612e9f6000830185612900565b612eac6020830184612900565b9392505050565b600081519050612ec281612bbe565b92915050565b600060208284031215612ede57612edd61272a565b5b6000612eec84828501612eb3565b91505092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000612f2b601f836127c4565b9150612f3682612ef5565b602082019050919050565b60006020820190508181036000830152612f5a81612f1e565b9050919050565b600081905092915050565b50565b6000612f7c600083612f61565b9150612f8782612f6c565b600082019050919050565b6000612f9d82612f6f565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b6000612fdd6010836127c4565b9150612fe882612fa7565b602082019050919050565b6000602082019050818103600083015261300c81612fd0565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026130757fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613038565b61307f8683613038565b95508019841693508086168417925050509392505050565b6000819050919050565b60006130bc6130b76130b28461286b565b613097565b61286b565b9050919050565b6000819050919050565b6130d6836130a1565b6130ea6130e2826130c3565b848454613045565b825550505050565b600090565b6130ff6130f2565b61310a8184846130cd565b505050565b5b8181101561312e576131236000826130f7565b600181019050613110565b5050565b601f8211156131735761314481613013565b61314d84613028565b8101602085101561315c578190505b61317061316885613028565b83018261310f565b50505b505050565b600082821c905092915050565b600061319660001984600802613178565b1980831691505092915050565b60006131af8383613185565b9150826002028217905092915050565b6131c8826127b9565b67ffffffffffffffff8111156131e1576131e0612a4a565b5b6131eb8254612e59565b6131f6828285613132565b600060209050601f8311600181146132295760008415613217578287015190505b61322185826131a3565b865550613289565b601f19841661323786613013565b60005b8281101561325f5784890151825560018201915060208501945060208101905061323a565b8683101561327c5784890151613278601f891682613185565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006132cb8261286b565b91506132d68361286b565b92508282019050808211156132ee576132ed613291565b5b92915050565b7f4e6f206d6f7265204f72616e67657320696e2073746f636b2100000000000000600082015250565b600061332a6019836127c4565b9150613335826132f4565b602082019050919050565b600060208201905081810360008301526133598161331d565b9050919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b6000613396601e836127c4565b91506133a182613360565b602082019050919050565b600060208201905081810360008301526133c581613389565b9050919050565b6000815190506133db81612875565b92915050565b6000602082840312156133f7576133f661272a565b5b6000613405848285016133cc565b91505092915050565b7f4d696e74206e6f74207265616479207965742100000000000000000000000000600082015250565b60006134446013836127c4565b915061344f8261340e565b602082019050919050565b6000602082019050818103600083015261347381613437565b9050919050565b7f4e6f206d6f7265204f72616e676573206c656674210000000000000000000000600082015250565b60006134b06015836127c4565b91506134bb8261347a565b602082019050919050565b600060208201905081810360008301526134df816134a3565b9050919050565b7f547269656420746f206d696e74204f72616e676573206f766572206c696d6974600082015250565b600061351c6020836127c4565b9150613527826134e6565b602082019050919050565b6000602082019050818103600083015261354b8161350f565b9050919050565b600081905092915050565b6000815461356a81612e59565b6135748186613552565b9450600182166000811461358f57600181146135a4576135d7565b60ff19831686528115158202860193506135d7565b6135ad85613013565b60005b838110156135cf578154818901526001820191506020810190506135b0565b838801955050505b50505092915050565b60006135eb826127b9565b6135f58185613552565b93506136058185602086016127d5565b80840191505092915050565b600061361d828561355d565b915061362982846135e0565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006136916026836127c4565b915061369c82613635565b604082019050919050565b600060208201905081810360008301526136c081613684565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006136fd6020836127c4565b9150613708826136c7565b602082019050919050565b6000602082019050818103600083015261372c816136f0565b9050919050565b600061373e8261286b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036137705761376f613291565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006137b58261286b565b91506137c08361286b565b9250826137d0576137cf61377b565b5b828204905092915050565b60006137e68261286b565b91506137f18361286b565b925082820390508181111561380957613808613291565b5b92915050565b600061381a8261286b565b91506138258361286b565b9250826138355761383461377b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006138968261386f565b6138a0818561387a565b93506138b08185602086016127d5565b6138b9816127ff565b840191505092915050565b60006080820190506138d96000830187612900565b6138e66020830186612900565b6138f36040830185612996565b8181036060830152613905818461388b565b905095945050505050565b60008151905061391f81612760565b92915050565b60006020828403121561393b5761393a61272a565b5b600061394984828501613910565b9150509291505056fea2646970667358221220d185543ea7341348a749f4c9f5bde9ed979e4b5b5829c4113802a31facfc236f64736f6c63430008120033

Deployed Bytecode Sourcemap

34817:3410:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35093:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15222:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15474:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18790:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18374:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35181:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13585:180;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34940:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37269:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36570:191;;;;;;;;;;;;;:::i;:::-;;37452:183;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35308:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35019:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37031:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34902:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16122:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14050:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1579:103;;;;;;;;;;;;;:::i;:::-;;36769:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35443:257;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1344:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15582:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35228:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35837:607;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37151:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19016:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36452:110;;;;;;;;;;;;;:::i;:::-;;34992:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37643:240;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37891:331;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35139:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35059:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36926:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19258:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1692:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35093:39;;;;;;;;;;;;;:::o;15222:244::-;15307:4;15361:10;15346:25;;:11;:25;;;;:68;;;;15404:10;15389:25;;:11;:25;;;;15346:68;:111;;;;15447:10;15432:25;;:11;:25;;;;15346:111;15326:131;;15222:244;;;:::o;15474:100::-;15528:13;15561:5;15554:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15474:100;:::o;18790:218::-;18866:7;18891:16;18899:7;18891;:16::i;:::-;18886:64;;18916:34;;;;;;;;;;;;;;18886:64;18970:15;:24;18986:7;18970:24;;;;;;;;;;;:30;;;;;;;;;;;;18963:37;;18790:218;;;:::o;18374:408::-;18463:13;18479:16;18487:7;18479;:16::i;:::-;18463:32;;18535:5;18512:28;;:19;:17;:19::i;:::-;:28;;;18508:175;;18560:44;18577:5;18584:19;:17;:19::i;:::-;18560:16;:44::i;:::-;18555:128;;18632:35;;;;;;;;;;;;;;18555:128;18508:175;18728:2;18695:15;:24;18711:7;18695:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;18766:7;18762:2;18746:28;;18755:5;18746:28;;;;;;;;;;;;18452:330;18374:408;;:::o;35181:38::-;;;;:::o;13585:180::-;13646:7;13731:15;:13;:15::i;:::-;13716:12;;13700:13;;:28;:46;13693:53;;13585:180;:::o;34940:45::-;;;;;;;;;;;;;;;;;:::o;37269:175::-;31536:1;30747:42;31490:43;;;:47;31486:225;;;30747:42;31559:40;;;31608:4;31615:10;31559:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31554:146;;31673:10;31654:30;;;;;;;;;;;:::i;:::-;;;;;;;;31554:146;31486:225;37399:37:::1;37418:4;37424:2;37428:7;37399:18;:37::i;:::-;37269:175:::0;;;:::o;36570:191::-;1303:13;:11;:13::i;:::-;2253:1:::1;2411:7;;:19:::0;2403:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2253:1;2479:7;:18;;;;36639:12:::2;36657:10;:15;;36680:21;36657:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36638:68;;;36725:7;36717:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;36627:134;2209:1:::1;2524:7;:22;;;;36570:191::o:0;37452:183::-;31536:1;30747:42;31490:43;;;:47;31486:225;;;30747:42;31559:40;;;31608:4;31615:10;31559:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31554:146;;31673:10;31654:30;;;;;;;;;;;:::i;:::-;;;;;;;;31554:146;31486:225;37586:41:::1;37609:4;37615:2;37619:7;37586:22;:41::i;:::-;37452:183:::0;;;:::o;35308:73::-;;;;;;;;;;;;;:::o;35019:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37031:112::-;1303:13;:11;:13::i;:::-;37123:12:::1;37108;:27;;;;;;:::i;:::-;;37031:112:::0;:::o;34902:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;16122:152::-;16194:7;16237:27;16256:7;16237:18;:27::i;:::-;16214:52;;16122:152;;;:::o;14050:233::-;14122:7;14163:1;14146:19;;:5;:19;;;14142:60;;14174:28;;;;;;;;;;;;;;14142:60;11858:13;14220:18;:25;14239:5;14220:25;;;;;;;;;;;;;;;;:55;14213:62;;14050:233;;;:::o;1579:103::-;1303:13;:11;:13::i;:::-;1644:30:::1;1671:1;1644:18;:30::i;:::-;1579:103::o:0;36769:149::-;1303:13;:11;:13::i;:::-;36871:8:::1;36860;:19;;;;;;:::i;:::-;;36901:9;36890:8;;:20;;;;;;;;;;;;;;;;;;36769:149:::0;;:::o;35443:257::-;1303:13;:11;:13::i;:::-;35574:15:::1;;35562:8;35546:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:43;;35524:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;35663:29;35673:8;35683;35663:9;:29::i;:::-;35443:257:::0;;:::o;1344:87::-;1390:7;1417:6;;;;;;;;;;;1410:13;;1344:87;:::o;15582:104::-;15638:13;15671:7;15664:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15582:104;:::o;35228:73::-;;;;;;;;;;;;;:::o;35837:607::-;35764:10;35751:23;;:9;:23;;;35743:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;2253:1:::1;2411:7;;:19:::0;2403:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2253:1;2479:7;:18;;;;35947:11:::2;35970:13;;;;;;;;;;;35961:33;;;35995:10;35961:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35947:59;;36017:11;36040:13;;;;;;;;;;;36031:33;;;36065:10;36031:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36017:59;;36106:1;36097:6;:10;:24;;;;;36120:1;36111:6;:10;36097:24;36089:33;;;::::0;::::2;;36143:19;;;;;;;;;;;36135:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;36233:15;;36221:8;36205:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:43;;36197:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;36331:22;;36319:8;36295:21;36305:10;36295:9;:21::i;:::-;:32;;;;:::i;:::-;:58;;36287:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;36403:31;36413:10;36425:8;36403:9;:31::i;:::-;35934:510;;2209:1:::1;2524:7;:22;;;;35837:607:::0;:::o;37151:110::-;1303:13;:11;:13::i;:::-;37249:4:::1;37224:22;:29;;;;37151:110:::0;:::o;19016:234::-;19163:8;19111:18;:39;19130:19;:17;:19::i;:::-;19111:39;;;;;;;;;;;;;;;:49;19151:8;19111:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;19223:8;19187:55;;19202:19;:17;:19::i;:::-;19187:55;;;19233:8;19187:55;;;;;;:::i;:::-;;;;;;;;19016:234;;:::o;36452:110::-;1303:13;:11;:13::i;:::-;36535:19:::1;;;;;;;;;;;36534:20;36512:19;;:42;;;;;;;;;;;;;;;;;;36452:110::o:0;34992:20::-;;;;;;;;;;;;;:::o;37643:240::-;31536:1;30747:42;31490:43;;;:47;31486:225;;;30747:42;31559:40;;;31608:4;31615:10;31559:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31554:146;;31673:10;31654:30;;;;;;;;;;;:::i;:::-;;;;;;;;31554:146;31486:225;37828:47:::1;37851:4;37857:2;37861:7;37870:4;37828:22;:47::i;:::-;37643:240:::0;;;;:::o;37891:331::-;38003:13;38038:8;;;;;;;;;;;38034:181;;;38111:8;38121:26;38138:8;38121:16;:26::i;:::-;38094:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38063:86;;;;38034:181;38189:14;38182:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37891:331;;;;:::o;35139:34::-;;;;:::o;35059:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36926:97::-;36970:13;37003:12;36996:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36926:97;:::o;19258:164::-;19355:4;19379:18;:25;19398:5;19379:25;;;;;;;;;;;;;;;:35;19405:8;19379:35;;;;;;;;;;;;;;;;;;;;;;;;;19372:42;;19258:164;;;;:::o;1692:201::-;1303:13;:11;:13::i;:::-;1801:1:::1;1781:22;;:8;:22;;::::0;1773:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;1857:28;1876:8;1857:18;:28::i;:::-;1692:201:::0;:::o;19430:244::-;19495:4;19551:7;19532:15;:13;:15::i;:::-;:26;;:66;;;;;19585:13;;19575:7;:23;19532:66;:133;;;;;19664:1;12232:8;19616:17;:26;19634:7;19616:26;;;;;;;;;;;;:44;:49;19532:133;19512:153;;19430:244;;;:::o;29772:105::-;29832:7;29859:10;29852:17;;29772:105;:::o;13374:92::-;13430:7;13374:92;:::o;20487:1651::-;20629:27;20659;20678:7;20659:18;:27::i;:::-;20629:57;;20744:4;20703:45;;20719:19;20703:45;;;20699:86;;20757:28;;;;;;;;;;;;;;20699:86;20799:27;20828:23;20855:35;20882:7;20855:26;:35::i;:::-;20798:92;;;;20908:68;20933:15;20950:4;20956:19;:17;:19::i;:::-;20908:24;:68::i;:::-;20903:180;;20996:43;21013:4;21019:19;:17;:19::i;:::-;20996:16;:43::i;:::-;20991:92;;21048:35;;;;;;;;;;;;;;20991:92;20903:180;21114:1;21100:16;;:2;:16;;;21096:52;;21125:23;;;;;;;;;;;;;;21096:52;21161:43;21183:4;21189:2;21193:7;21202:1;21161:21;:43::i;:::-;21244:15;21241:85;;;21309:1;21288:19;21281:30;21241:85;21378:18;:24;21397:4;21378:24;;;;;;;;;;;;;;;;21376:26;;;;;;;;;;;;21420:18;:22;21439:2;21420:22;;;;;;;;;;;;;;;;21418:24;;;;;;;;;;;21489:146;21526:2;21575:45;21590:4;21596:2;21600:19;21575:14;:45::i;:::-;12366:8;21547:73;21489:18;:146::i;:::-;21460:17;:26;21478:7;21460:26;;;;;;;;;;;:175;;;;21707:1;12366:8;21656:19;:47;:52;21652:370;;21729:19;21761:1;21751:7;:11;21729:33;;21821:1;21787:17;:30;21805:11;21787:30;;;;;;;;;;;;:35;21783:224;;21868:13;;21853:11;:28;21849:139;;21945:19;21912:17;:30;21930:11;21912:30;;;;;;;;;;;:52;;;;21849:139;21783:224;21710:312;21652:370;22069:7;22065:2;22050:27;;22059:4;22050:27;;;;;;;;;;;;22088:42;22109:4;22115:2;22119:7;22128:1;22088:20;:42::i;:::-;20618:1520;;;20487:1651;;;:::o;1439:132::-;1514:12;:10;:12::i;:::-;1503:23;;:7;:5;:7::i;:::-;:23;;;1495:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1439:132::o;22146:193::-;22292:39;22309:4;22315:2;22319:7;22292:39;;;;;;;;;;;;:16;:39::i;:::-;22146:193;;;:::o;16829:633::-;16896:7;16916:12;16931:7;16916:22;;16999:4;16980:15;:13;:15::i;:::-;:23;16976:419;;17033:13;;17026:4;:20;17022:373;;;17071:14;17088:17;:23;17106:4;17088:23;;;;;;;;;;;;17071:40;;17168:1;12232:8;17140:6;:24;:29;17136:240;;17200:113;17217:1;17207:6;:11;17200:113;;17260:17;:25;17278:6;;;;;;;17260:25;;;;;;;;;;;;17251:34;;17200:113;;;17346:6;17339:13;;;;;;17136:240;17048:347;17022:373;16976:419;17423:31;;;;;;;;;;;;;;16829:633;;;;:::o;1901:191::-;1975:16;1994:6;;;;;;;;;;;1975:25;;2020:8;2011:6;;:17;;;;;;;;;;;;;;;;;;2075:8;2044:40;;2065:8;2044:40;;;;;;;;;;;;1964:128;1901:191;:::o;26925:112::-;27002:27;27012:2;27016:8;27002:27;;;;;;;;;;;;:9;:27::i;:::-;26925:112;;:::o;22347:407::-;22522:31;22535:4;22541:2;22545:7;22522:12;:31::i;:::-;22586:1;22568:2;:14;;;:19;22564:183;;22607:56;22638:4;22644:2;22648:7;22657:5;22607:30;:56::i;:::-;22602:145;;22691:40;;;;;;;;;;;;;;22602:145;22564:183;22347:407;;;;:::o;2728:534::-;2784:13;2825:1;2816:5;:10;2812:53;;2843:10;;;;;;;;;;;;;;;;;;;;;2812:53;2875:12;2890:5;2875:20;;2906:14;2931:78;2946:1;2938:4;:9;2931:78;;2964:8;;;;;:::i;:::-;;;;2995:2;2987:10;;;;;:::i;:::-;;;2931:78;;;3019:19;3051:6;3041:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3019:39;;3069:154;3085:1;3076:5;:10;3069:154;;3113:1;3103:11;;;;;:::i;:::-;;;3180:2;3172:5;:10;;;;:::i;:::-;3159:2;:24;;;;:::i;:::-;3146:39;;3129:6;3136;3129:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3209:2;3200:11;;;;;:::i;:::-;;;3069:154;;;3247:6;3233:21;;;;;2728:534;;;;:::o;20087:392::-;20189:27;20218:23;20259:38;20300:15;:24;20316:7;20300:24;;;;;;;;;;;20259:65;;20384:18;20361:41;;20441:19;20435:26;20416:45;;20346:126;20087:392;;;:::o;19682:397::-;19831:11;19901:16;19894:5;19890:28;19881:37;;19962:16;19951:9;19947:32;19934:45;;20044:15;20033:9;20030:30;20022:5;20011:9;20008:20;20005:56;19995:66;;19682:397;;;;;:::o;22762:159::-;;;;;:::o;29453:311::-;29588:7;29608:16;12429:3;29634:19;:41;;29608:68;;12429:3;29702:31;29713:4;29719:2;29723:9;29702:10;:31::i;:::-;29694:40;;:62;;29687:69;;;29453:311;;;;;:::o;17844:299::-;17924:14;18008:16;18001:5;17997:28;17988:37;;18118:5;18104:11;18079:23;18075:41;18072:52;18065:5;18062:63;18052:73;;17844:299;;;;:::o;22929:158::-;;;;;:::o;792:98::-;845:7;872:10;865:17;;792:98;:::o;26228:689::-;26359:19;26365:2;26369:8;26359:5;:19::i;:::-;26438:1;26420:2;:14;;;:19;26416:483;;26460:11;26474:13;;26460:27;;26506:13;26528:8;26522:3;:14;26506:30;;26555:233;26586:62;26625:1;26629:2;26633:7;;;;;;26642:5;26586:30;:62::i;:::-;26581:167;;26684:40;;;;;;;;;;;;;;26581:167;26783:3;26775:5;:11;26555:233;;26870:3;26853:13;;:20;26849:34;;26875:8;;;26849:34;26441:458;;26416:483;26228:689;;;:::o;23095:716::-;23258:4;23304:2;23279:45;;;23325:19;:17;:19::i;:::-;23346:4;23352:7;23361:5;23279:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;23275:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23579:1;23562:6;:13;:18;23558:235;;23608:40;;;;;;;;;;;;;;23558:235;23751:6;23745:13;23736:6;23732:2;23728:15;23721:38;23275:529;23448:54;;;23438:64;;;:6;:64;;;;23431:71;;;23095:716;;;;;;:::o;29298:147::-;29435:6;29298:147;;;;;:::o;23819:1442::-;23892:20;23915:13;;23892:36;;23955:1;23943:8;:13;23939:44;;23965:18;;;;;;;;;;;;;;23939:44;23996:61;24026:1;24030:2;24034:12;24048:8;23996:21;:61::i;:::-;24166:1;11929:2;24136:1;:26;;24135:32;24123:8;:45;24097:18;:22;24116:2;24097:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;24219:139;24256:2;24310:33;24333:1;24337:2;24341:1;24310:14;:33::i;:::-;24277:30;24298:8;24277:20;:30::i;:::-;:66;24219:18;:139::i;:::-;24185:17;:31;24203:12;24185:31;;;;;;;;;;;:173;;;;24375:16;24406:11;24435:8;24420:12;:23;24406:37;;24510:16;24506:2;24502:25;24490:37;;24730:12;24698:8;24673:1;24624:25;24599:1;24574;24547:215;24842:1;24828:12;24824:20;24782:279;24883:3;24874:7;24871:16;24782:279;;25034:7;25024:8;25021:1;24994:25;24991:1;24988;24983:59;24936:1;24927:7;24923:15;24912:26;;24782:279;;;24786:77;25106:1;25094:8;:13;25090:45;;25116:19;;;;;;;;;;;;;;25090:45;25168:3;25152:13;:19;;;;24070:1113;;25193:60;25222:1;25226:2;25230:12;25244:8;25193:20;:60::i;:::-;23881:1380;23819:1442;;:::o;18151:215::-;18221:14;18345:1;18335:8;18332:15;18306:24;18302:46;18292:56;;18151:215;;;:::o;7:90:1:-;41:7;84:5;77:13;70:21;59:32;;7:90;;;:::o;103:109::-;184:21;199:5;184:21;:::i;:::-;179:3;172:34;103:109;;:::o;218:210::-;305:4;343:2;332:9;328:18;320:26;;356:65;418:1;407:9;403:17;394:6;356:65;:::i;:::-;218:210;;;;:::o;434:75::-;467:6;500:2;494:9;484:19;;434:75;:::o;515:117::-;624:1;621;614:12;638:117;747:1;744;737:12;761:149;797:7;837:66;830:5;826:78;815:89;;761:149;;;:::o;916:120::-;988:23;1005:5;988:23;:::i;:::-;981:5;978:34;968:62;;1026:1;1023;1016:12;968:62;916:120;:::o;1042:137::-;1087:5;1125:6;1112:20;1103:29;;1141:32;1167:5;1141:32;:::i;:::-;1042:137;;;;:::o;1185:327::-;1243:6;1292:2;1280:9;1271:7;1267:23;1263:32;1260:119;;;1298:79;;:::i;:::-;1260:119;1418:1;1443:52;1487:7;1478:6;1467:9;1463:22;1443:52;:::i;:::-;1433:62;;1389:116;1185:327;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:329::-;5301:6;5350:2;5338:9;5329:7;5325:23;5321:32;5318:119;;;5356:79;;:::i;:::-;5318:119;5476:1;5501:53;5546:7;5537:6;5526:9;5522:22;5501:53;:::i;:::-;5491:63;;5447:117;5242:329;;;;:::o;5577:619::-;5654:6;5662;5670;5719:2;5707:9;5698:7;5694:23;5690:32;5687:119;;;5725:79;;:::i;:::-;5687:119;5845:1;5870:53;5915:7;5906:6;5895:9;5891:22;5870:53;:::i;:::-;5860:63;;5816:117;5972:2;5998:53;6043:7;6034:6;6023:9;6019:22;5998:53;:::i;:::-;5988:63;;5943:118;6100:2;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6071:118;5577:619;;;;;:::o;6202:117::-;6311:1;6308;6301:12;6325:117;6434:1;6431;6424:12;6448:180;6496:77;6493:1;6486:88;6593:4;6590:1;6583:15;6617:4;6614:1;6607:15;6634:281;6717:27;6739:4;6717:27;:::i;:::-;6709:6;6705:40;6847:6;6835:10;6832:22;6811:18;6799:10;6796:34;6793:62;6790:88;;;6858:18;;:::i;:::-;6790:88;6898:10;6894:2;6887:22;6677:238;6634:281;;:::o;6921:129::-;6955:6;6982:20;;:::i;:::-;6972:30;;7011:33;7039:4;7031:6;7011:33;:::i;:::-;6921:129;;;:::o;7056:308::-;7118:4;7208:18;7200:6;7197:30;7194:56;;;7230:18;;:::i;:::-;7194:56;7268:29;7290:6;7268:29;:::i;:::-;7260:37;;7352:4;7346;7342:15;7334:23;;7056:308;;;:::o;7370:146::-;7467:6;7462:3;7457;7444:30;7508:1;7499:6;7494:3;7490:16;7483:27;7370:146;;;:::o;7522:425::-;7600:5;7625:66;7641:49;7683:6;7641:49;:::i;:::-;7625:66;:::i;:::-;7616:75;;7714:6;7707:5;7700:21;7752:4;7745:5;7741:16;7790:3;7781:6;7776:3;7772:16;7769:25;7766:112;;;7797:79;;:::i;:::-;7766:112;7887:54;7934:6;7929:3;7924;7887:54;:::i;:::-;7606:341;7522:425;;;;;:::o;7967:340::-;8023:5;8072:3;8065:4;8057:6;8053:17;8049:27;8039:122;;8080:79;;:::i;:::-;8039:122;8197:6;8184:20;8222:79;8297:3;8289:6;8282:4;8274:6;8270:17;8222:79;:::i;:::-;8213:88;;8029:278;7967:340;;;;:::o;8313:509::-;8382:6;8431:2;8419:9;8410:7;8406:23;8402:32;8399:119;;;8437:79;;:::i;:::-;8399:119;8585:1;8574:9;8570:17;8557:31;8615:18;8607:6;8604:30;8601:117;;;8637:79;;:::i;:::-;8601:117;8742:63;8797:7;8788:6;8777:9;8773:22;8742:63;:::i;:::-;8732:73;;8528:287;8313:509;;;;:::o;8828:116::-;8898:21;8913:5;8898:21;:::i;:::-;8891:5;8888:32;8878:60;;8934:1;8931;8924:12;8878:60;8828:116;:::o;8950:133::-;8993:5;9031:6;9018:20;9009:29;;9047:30;9071:5;9047:30;:::i;:::-;8950:133;;;;:::o;9089:648::-;9164:6;9172;9221:2;9209:9;9200:7;9196:23;9192:32;9189:119;;;9227:79;;:::i;:::-;9189:119;9347:1;9372:50;9414:7;9405:6;9394:9;9390:22;9372:50;:::i;:::-;9362:60;;9318:114;9499:2;9488:9;9484:18;9471:32;9530:18;9522:6;9519:30;9516:117;;;9552:79;;:::i;:::-;9516:117;9657:63;9712:7;9703:6;9692:9;9688:22;9657:63;:::i;:::-;9647:73;;9442:288;9089:648;;;;;:::o;9743:474::-;9811:6;9819;9868:2;9856:9;9847:7;9843:23;9839:32;9836:119;;;9874:79;;:::i;:::-;9836:119;9994:1;10019:53;10064:7;10055:6;10044:9;10040:22;10019:53;:::i;:::-;10009:63;;9965:117;10121:2;10147:53;10192:7;10183:6;10172:9;10168:22;10147:53;:::i;:::-;10137:63;;10092:118;9743:474;;;;;:::o;10223:468::-;10288:6;10296;10345:2;10333:9;10324:7;10320:23;10316:32;10313:119;;;10351:79;;:::i;:::-;10313:119;10471:1;10496:53;10541:7;10532:6;10521:9;10517:22;10496:53;:::i;:::-;10486:63;;10442:117;10598:2;10624:50;10666:7;10657:6;10646:9;10642:22;10624:50;:::i;:::-;10614:60;;10569:115;10223:468;;;;;:::o;10697:307::-;10758:4;10848:18;10840:6;10837:30;10834:56;;;10870:18;;:::i;:::-;10834:56;10908:29;10930:6;10908:29;:::i;:::-;10900:37;;10992:4;10986;10982:15;10974:23;;10697:307;;;:::o;11010:423::-;11087:5;11112:65;11128:48;11169:6;11128:48;:::i;:::-;11112:65;:::i;:::-;11103:74;;11200:6;11193:5;11186:21;11238:4;11231:5;11227:16;11276:3;11267:6;11262:3;11258:16;11255:25;11252:112;;;11283:79;;:::i;:::-;11252:112;11373:54;11420:6;11415:3;11410;11373:54;:::i;:::-;11093:340;11010:423;;;;;:::o;11452:338::-;11507:5;11556:3;11549:4;11541:6;11537:17;11533:27;11523:122;;11564:79;;:::i;:::-;11523:122;11681:6;11668:20;11706:78;11780:3;11772:6;11765:4;11757:6;11753:17;11706:78;:::i;:::-;11697:87;;11513:277;11452:338;;;;:::o;11796:943::-;11891:6;11899;11907;11915;11964:3;11952:9;11943:7;11939:23;11935:33;11932:120;;;11971:79;;:::i;:::-;11932:120;12091:1;12116:53;12161:7;12152:6;12141:9;12137:22;12116:53;:::i;:::-;12106:63;;12062:117;12218:2;12244:53;12289:7;12280:6;12269:9;12265:22;12244:53;:::i;:::-;12234:63;;12189:118;12346:2;12372:53;12417:7;12408:6;12397:9;12393:22;12372:53;:::i;:::-;12362:63;;12317:118;12502:2;12491:9;12487:18;12474:32;12533:18;12525:6;12522:30;12519:117;;;12555:79;;:::i;:::-;12519:117;12660:62;12714:7;12705:6;12694:9;12690:22;12660:62;:::i;:::-;12650:72;;12445:287;11796:943;;;;;;;:::o;12745:474::-;12813:6;12821;12870:2;12858:9;12849:7;12845:23;12841:32;12838:119;;;12876:79;;:::i;:::-;12838:119;12996:1;13021:53;13066:7;13057:6;13046:9;13042:22;13021:53;:::i;:::-;13011:63;;12967:117;13123:2;13149:53;13194:7;13185:6;13174:9;13170:22;13149:53;:::i;:::-;13139:63;;13094:118;12745:474;;;;;:::o;13225:180::-;13273:77;13270:1;13263:88;13370:4;13367:1;13360:15;13394:4;13391:1;13384:15;13411:320;13455:6;13492:1;13486:4;13482:12;13472:22;;13539:1;13533:4;13529:12;13560:18;13550:81;;13616:4;13608:6;13604:17;13594:27;;13550:81;13678:2;13670:6;13667:14;13647:18;13644:38;13641:84;;13697:18;;:::i;:::-;13641:84;13462:269;13411:320;;;:::o;13737:332::-;13858:4;13896:2;13885:9;13881:18;13873:26;;13909:71;13977:1;13966:9;13962:17;13953:6;13909:71;:::i;:::-;13990:72;14058:2;14047:9;14043:18;14034:6;13990:72;:::i;:::-;13737:332;;;;;:::o;14075:137::-;14129:5;14160:6;14154:13;14145:22;;14176:30;14200:5;14176:30;:::i;:::-;14075:137;;;;:::o;14218:345::-;14285:6;14334:2;14322:9;14313:7;14309:23;14305:32;14302:119;;;14340:79;;:::i;:::-;14302:119;14460:1;14485:61;14538:7;14529:6;14518:9;14514:22;14485:61;:::i;:::-;14475:71;;14431:125;14218:345;;;;:::o;14569:181::-;14709:33;14705:1;14697:6;14693:14;14686:57;14569:181;:::o;14756:366::-;14898:3;14919:67;14983:2;14978:3;14919:67;:::i;:::-;14912:74;;14995:93;15084:3;14995:93;:::i;:::-;15113:2;15108:3;15104:12;15097:19;;14756:366;;;:::o;15128:419::-;15294:4;15332:2;15321:9;15317:18;15309:26;;15381:9;15375:4;15371:20;15367:1;15356:9;15352:17;15345:47;15409:131;15535:4;15409:131;:::i;:::-;15401:139;;15128:419;;;:::o;15553:147::-;15654:11;15691:3;15676:18;;15553:147;;;;:::o;15706:114::-;;:::o;15826:398::-;15985:3;16006:83;16087:1;16082:3;16006:83;:::i;:::-;15999:90;;16098:93;16187:3;16098:93;:::i;:::-;16216:1;16211:3;16207:11;16200:18;;15826:398;;;:::o;16230:379::-;16414:3;16436:147;16579:3;16436:147;:::i;:::-;16429:154;;16600:3;16593:10;;16230:379;;;:::o;16615:166::-;16755:18;16751:1;16743:6;16739:14;16732:42;16615:166;:::o;16787:366::-;16929:3;16950:67;17014:2;17009:3;16950:67;:::i;:::-;16943:74;;17026:93;17115:3;17026:93;:::i;:::-;17144:2;17139:3;17135:12;17128:19;;16787:366;;;:::o;17159:419::-;17325:4;17363:2;17352:9;17348:18;17340:26;;17412:9;17406:4;17402:20;17398:1;17387:9;17383:17;17376:47;17440:131;17566:4;17440:131;:::i;:::-;17432:139;;17159:419;;;:::o;17584:141::-;17633:4;17656:3;17648:11;;17679:3;17676:1;17669:14;17713:4;17710:1;17700:18;17692:26;;17584:141;;;:::o;17731:93::-;17768:6;17815:2;17810;17803:5;17799:14;17795:23;17785:33;;17731:93;;;:::o;17830:107::-;17874:8;17924:5;17918:4;17914:16;17893:37;;17830:107;;;;:::o;17943:393::-;18012:6;18062:1;18050:10;18046:18;18085:97;18115:66;18104:9;18085:97;:::i;:::-;18203:39;18233:8;18222:9;18203:39;:::i;:::-;18191:51;;18275:4;18271:9;18264:5;18260:21;18251:30;;18324:4;18314:8;18310:19;18303:5;18300:30;18290:40;;18019:317;;17943:393;;;;;:::o;18342:60::-;18370:3;18391:5;18384:12;;18342:60;;;:::o;18408:142::-;18458:9;18491:53;18509:34;18518:24;18536:5;18518:24;:::i;:::-;18509:34;:::i;:::-;18491:53;:::i;:::-;18478:66;;18408:142;;;:::o;18556:75::-;18599:3;18620:5;18613:12;;18556:75;;;:::o;18637:269::-;18747:39;18778:7;18747:39;:::i;:::-;18808:91;18857:41;18881:16;18857:41;:::i;:::-;18849:6;18842:4;18836:11;18808:91;:::i;:::-;18802:4;18795:105;18713:193;18637:269;;;:::o;18912:73::-;18957:3;18912:73;:::o;18991:189::-;19068:32;;:::i;:::-;19109:65;19167:6;19159;19153:4;19109:65;:::i;:::-;19044:136;18991:189;;:::o;19186:186::-;19246:120;19263:3;19256:5;19253:14;19246:120;;;19317:39;19354:1;19347:5;19317:39;:::i;:::-;19290:1;19283:5;19279:13;19270:22;;19246:120;;;19186:186;;:::o;19378:543::-;19479:2;19474:3;19471:11;19468:446;;;19513:38;19545:5;19513:38;:::i;:::-;19597:29;19615:10;19597:29;:::i;:::-;19587:8;19583:44;19780:2;19768:10;19765:18;19762:49;;;19801:8;19786:23;;19762:49;19824:80;19880:22;19898:3;19880:22;:::i;:::-;19870:8;19866:37;19853:11;19824:80;:::i;:::-;19483:431;;19468:446;19378:543;;;:::o;19927:117::-;19981:8;20031:5;20025:4;20021:16;20000:37;;19927:117;;;;:::o;20050:169::-;20094:6;20127:51;20175:1;20171:6;20163:5;20160:1;20156:13;20127:51;:::i;:::-;20123:56;20208:4;20202;20198:15;20188:25;;20101:118;20050:169;;;;:::o;20224:295::-;20300:4;20446:29;20471:3;20465:4;20446:29;:::i;:::-;20438:37;;20508:3;20505:1;20501:11;20495:4;20492:21;20484:29;;20224:295;;;;:::o;20524:1395::-;20641:37;20674:3;20641:37;:::i;:::-;20743:18;20735:6;20732:30;20729:56;;;20765:18;;:::i;:::-;20729:56;20809:38;20841:4;20835:11;20809:38;:::i;:::-;20894:67;20954:6;20946;20940:4;20894:67;:::i;:::-;20988:1;21012:4;20999:17;;21044:2;21036:6;21033:14;21061:1;21056:618;;;;21718:1;21735:6;21732:77;;;21784:9;21779:3;21775:19;21769:26;21760:35;;21732:77;21835:67;21895:6;21888:5;21835:67;:::i;:::-;21829:4;21822:81;21691:222;21026:887;;21056:618;21108:4;21104:9;21096:6;21092:22;21142:37;21174:4;21142:37;:::i;:::-;21201:1;21215:208;21229:7;21226:1;21223:14;21215:208;;;21308:9;21303:3;21299:19;21293:26;21285:6;21278:42;21359:1;21351:6;21347:14;21337:24;;21406:2;21395:9;21391:18;21378:31;;21252:4;21249:1;21245:12;21240:17;;21215:208;;;21451:6;21442:7;21439:19;21436:179;;;21509:9;21504:3;21500:19;21494:26;21552:48;21594:4;21586:6;21582:17;21571:9;21552:48;:::i;:::-;21544:6;21537:64;21459:156;21436:179;21661:1;21657;21649:6;21645:14;21641:22;21635:4;21628:36;21063:611;;;21026:887;;20616:1303;;;20524:1395;;:::o;21925:180::-;21973:77;21970:1;21963:88;22070:4;22067:1;22060:15;22094:4;22091:1;22084:15;22111:191;22151:3;22170:20;22188:1;22170:20;:::i;:::-;22165:25;;22204:20;22222:1;22204:20;:::i;:::-;22199:25;;22247:1;22244;22240:9;22233:16;;22268:3;22265:1;22262:10;22259:36;;;22275:18;;:::i;:::-;22259:36;22111:191;;;;:::o;22308:175::-;22448:27;22444:1;22436:6;22432:14;22425:51;22308:175;:::o;22489:366::-;22631:3;22652:67;22716:2;22711:3;22652:67;:::i;:::-;22645:74;;22728:93;22817:3;22728:93;:::i;:::-;22846:2;22841:3;22837:12;22830:19;;22489:366;;;:::o;22861:419::-;23027:4;23065:2;23054:9;23050:18;23042:26;;23114:9;23108:4;23104:20;23100:1;23089:9;23085:17;23078:47;23142:131;23268:4;23142:131;:::i;:::-;23134:139;;22861:419;;;:::o;23286:180::-;23426:32;23422:1;23414:6;23410:14;23403:56;23286:180;:::o;23472:366::-;23614:3;23635:67;23699:2;23694:3;23635:67;:::i;:::-;23628:74;;23711:93;23800:3;23711:93;:::i;:::-;23829:2;23824:3;23820:12;23813:19;;23472:366;;;:::o;23844:419::-;24010:4;24048:2;24037:9;24033:18;24025:26;;24097:9;24091:4;24087:20;24083:1;24072:9;24068:17;24061:47;24125:131;24251:4;24125:131;:::i;:::-;24117:139;;23844:419;;;:::o;24269:143::-;24326:5;24357:6;24351:13;24342:22;;24373:33;24400:5;24373:33;:::i;:::-;24269:143;;;;:::o;24418:351::-;24488:6;24537:2;24525:9;24516:7;24512:23;24508:32;24505:119;;;24543:79;;:::i;:::-;24505:119;24663:1;24688:64;24744:7;24735:6;24724:9;24720:22;24688:64;:::i;:::-;24678:74;;24634:128;24418:351;;;;:::o;24775:169::-;24915:21;24911:1;24903:6;24899:14;24892:45;24775:169;:::o;24950:366::-;25092:3;25113:67;25177:2;25172:3;25113:67;:::i;:::-;25106:74;;25189:93;25278:3;25189:93;:::i;:::-;25307:2;25302:3;25298:12;25291:19;;24950:366;;;:::o;25322:419::-;25488:4;25526:2;25515:9;25511:18;25503:26;;25575:9;25569:4;25565:20;25561:1;25550:9;25546:17;25539:47;25603:131;25729:4;25603:131;:::i;:::-;25595:139;;25322:419;;;:::o;25747:171::-;25887:23;25883:1;25875:6;25871:14;25864:47;25747:171;:::o;25924:366::-;26066:3;26087:67;26151:2;26146:3;26087:67;:::i;:::-;26080:74;;26163:93;26252:3;26163:93;:::i;:::-;26281:2;26276:3;26272:12;26265:19;;25924:366;;;:::o;26296:419::-;26462:4;26500:2;26489:9;26485:18;26477:26;;26549:9;26543:4;26539:20;26535:1;26524:9;26520:17;26513:47;26577:131;26703:4;26577:131;:::i;:::-;26569:139;;26296:419;;;:::o;26721:182::-;26861:34;26857:1;26849:6;26845:14;26838:58;26721:182;:::o;26909:366::-;27051:3;27072:67;27136:2;27131:3;27072:67;:::i;:::-;27065:74;;27148:93;27237:3;27148:93;:::i;:::-;27266:2;27261:3;27257:12;27250:19;;26909:366;;;:::o;27281:419::-;27447:4;27485:2;27474:9;27470:18;27462:26;;27534:9;27528:4;27524:20;27520:1;27509:9;27505:17;27498:47;27562:131;27688:4;27562:131;:::i;:::-;27554:139;;27281:419;;;:::o;27706:148::-;27808:11;27845:3;27830:18;;27706:148;;;;:::o;27884:874::-;27987:3;28024:5;28018:12;28053:36;28079:9;28053:36;:::i;:::-;28105:89;28187:6;28182:3;28105:89;:::i;:::-;28098:96;;28225:1;28214:9;28210:17;28241:1;28236:166;;;;28416:1;28411:341;;;;28203:549;;28236:166;28320:4;28316:9;28305;28301:25;28296:3;28289:38;28382:6;28375:14;28368:22;28360:6;28356:35;28351:3;28347:45;28340:52;;28236:166;;28411:341;28478:38;28510:5;28478:38;:::i;:::-;28538:1;28552:154;28566:6;28563:1;28560:13;28552:154;;;28640:7;28634:14;28630:1;28625:3;28621:11;28614:35;28690:1;28681:7;28677:15;28666:26;;28588:4;28585:1;28581:12;28576:17;;28552:154;;;28735:6;28730:3;28726:16;28719:23;;28418:334;;28203:549;;27991:767;;27884:874;;;;:::o;28764:390::-;28870:3;28898:39;28931:5;28898:39;:::i;:::-;28953:89;29035:6;29030:3;28953:89;:::i;:::-;28946:96;;29051:65;29109:6;29104:3;29097:4;29090:5;29086:16;29051:65;:::i;:::-;29141:6;29136:3;29132:16;29125:23;;28874:280;28764:390;;;;:::o;29160:429::-;29337:3;29359:92;29447:3;29438:6;29359:92;:::i;:::-;29352:99;;29468:95;29559:3;29550:6;29468:95;:::i;:::-;29461:102;;29580:3;29573:10;;29160:429;;;;;:::o;29595:225::-;29735:34;29731:1;29723:6;29719:14;29712:58;29804:8;29799:2;29791:6;29787:15;29780:33;29595:225;:::o;29826:366::-;29968:3;29989:67;30053:2;30048:3;29989:67;:::i;:::-;29982:74;;30065:93;30154:3;30065:93;:::i;:::-;30183:2;30178:3;30174:12;30167:19;;29826:366;;;:::o;30198:419::-;30364:4;30402:2;30391:9;30387:18;30379:26;;30451:9;30445:4;30441:20;30437:1;30426:9;30422:17;30415:47;30479:131;30605:4;30479:131;:::i;:::-;30471:139;;30198:419;;;:::o;30623:182::-;30763:34;30759:1;30751:6;30747:14;30740:58;30623:182;:::o;30811:366::-;30953:3;30974:67;31038:2;31033:3;30974:67;:::i;:::-;30967:74;;31050:93;31139:3;31050:93;:::i;:::-;31168:2;31163:3;31159:12;31152:19;;30811:366;;;:::o;31183:419::-;31349:4;31387:2;31376:9;31372:18;31364:26;;31436:9;31430:4;31426:20;31422:1;31411:9;31407:17;31400:47;31464:131;31590:4;31464:131;:::i;:::-;31456:139;;31183:419;;;:::o;31608:233::-;31647:3;31670:24;31688:5;31670:24;:::i;:::-;31661:33;;31716:66;31709:5;31706:77;31703:103;;31786:18;;:::i;:::-;31703:103;31833:1;31826:5;31822:13;31815:20;;31608:233;;;:::o;31847:180::-;31895:77;31892:1;31885:88;31992:4;31989:1;31982:15;32016:4;32013:1;32006:15;32033:185;32073:1;32090:20;32108:1;32090:20;:::i;:::-;32085:25;;32124:20;32142:1;32124:20;:::i;:::-;32119:25;;32163:1;32153:35;;32168:18;;:::i;:::-;32153:35;32210:1;32207;32203:9;32198:14;;32033:185;;;;:::o;32224:194::-;32264:4;32284:20;32302:1;32284:20;:::i;:::-;32279:25;;32318:20;32336:1;32318:20;:::i;:::-;32313:25;;32362:1;32359;32355:9;32347:17;;32386:1;32380:4;32377:11;32374:37;;;32391:18;;:::i;:::-;32374:37;32224:194;;;;:::o;32424:176::-;32456:1;32473:20;32491:1;32473:20;:::i;:::-;32468:25;;32507:20;32525:1;32507:20;:::i;:::-;32502:25;;32546:1;32536:35;;32551:18;;:::i;:::-;32536:35;32592:1;32589;32585:9;32580:14;;32424:176;;;;:::o;32606:180::-;32654:77;32651:1;32644:88;32751:4;32748:1;32741:15;32775:4;32772:1;32765:15;32792:98;32843:6;32877:5;32871:12;32861:22;;32792:98;;;:::o;32896:168::-;32979:11;33013:6;33008:3;33001:19;33053:4;33048:3;33044:14;33029:29;;32896:168;;;;:::o;33070:373::-;33156:3;33184:38;33216:5;33184:38;:::i;:::-;33238:70;33301:6;33296:3;33238:70;:::i;:::-;33231:77;;33317:65;33375:6;33370:3;33363:4;33356:5;33352:16;33317:65;:::i;:::-;33407:29;33429:6;33407:29;:::i;:::-;33402:3;33398:39;33391:46;;33160:283;33070:373;;;;:::o;33449:640::-;33644:4;33682:3;33671:9;33667:19;33659:27;;33696:71;33764:1;33753:9;33749:17;33740:6;33696:71;:::i;:::-;33777:72;33845:2;33834:9;33830:18;33821:6;33777:72;:::i;:::-;33859;33927:2;33916:9;33912:18;33903:6;33859:72;:::i;:::-;33978:9;33972:4;33968:20;33963:2;33952:9;33948:18;33941:48;34006:76;34077:4;34068:6;34006:76;:::i;:::-;33998:84;;33449:640;;;;;;;:::o;34095:141::-;34151:5;34182:6;34176:13;34167:22;;34198:32;34224:5;34198:32;:::i;:::-;34095:141;;;;:::o;34242:349::-;34311:6;34360:2;34348:9;34339:7;34335:23;34331:32;34328:119;;;34366:79;;:::i;:::-;34328:119;34486:1;34511:63;34566:7;34557:6;34546:9;34542:22;34511:63;:::i;:::-;34501:73;;34457:127;34242:349;;;;:::o

Swarm Source

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

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