Token The Easy Club

 

Overview ERC-721

Total Supply:
2,308 EASY

Holders:
247 addresses

Transfers:
-

Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x6F7E5e195Ed0594Ac526010ce988c0cDC3B7E45E

Contract Name:
EasyAvatars

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-02
*/

// SPDX-License-Identifier: MIT

//    //   / /                                 //   ) )
//   //____     ___      ___                  //___/ /  //  ___      ___     / ___
//  / ____    //   ) ) ((   ) ) //   / /     / __  (   // //   ) ) //   ) ) //\ \
// //        //   / /   \ \    ((___/ /     //    ) ) // //   / / //       //  \ \
////____/ / ((___( ( //   ) )      / /     //____/ / // ((___/ / ((____   //    \ \
// Developed by Dogu Deniz UGUR (https://github.com/DoguD)

pragma solidity ^0.8.0;

interface IERC165 {

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

}

interface IERC721 is IERC165 {

    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
    ) external;

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

    function approve(address to, uint256 tokenId) external;
    function getApproved(uint256 tokenId) external view returns (address operator);
    function setApprovalForAll(address operator, bool _approved) external;
    function isApprovedForAll(address owner, address operator) external view returns (bool);

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

library Strings {

    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    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);
    }

}

abstract contract Context {

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

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

}

abstract contract Ownable is Context {

    address private _owner;

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

    constructor() {
        _setOwner(_msgSender());
    }

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

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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;

    }

}

interface IERC721Receiver {

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

}

interface IERC721Metadata is IERC721 {

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

}

library Address {

    function isContract(address account) internal view returns (bool) {

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

abstract contract ERC165 is IERC165 {

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

}

contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {

    using Address for address;
    using Strings for uint256;

    string private _name;
    string private _symbol;

    mapping(uint256 => address) private _owners;
    mapping(address => uint256) private _balances;
    mapping(uint256 => address) private _tokenApprovals;
    mapping(address => mapping(address => bool)) private _operatorApprovals;

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

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    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) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

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

    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

interface IERC721Enumerable is IERC721 {

    function totalSupply() external view returns (uint256);
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);
    function tokenByIndex(uint256 index) external view returns (uint256);

}

abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {

    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;
    mapping(uint256 => uint256) private _ownedTokensIndex;

    uint256[] private _allTokens;

    mapping(uint256 => uint256) private _allTokensIndex;

    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId;
            _ownedTokensIndex[lastTokenId] = tokenIndex;
        }

        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId;
        _allTokensIndex[lastTokenId] = tokenIndex;

        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// EasyBlock Interfaces START
interface EasyAvatarsRewards {
    function setNFTIndex(uint256 _tokenId) external;

    function getSingleReward(uint256 _tokenId) external view returns(uint256);
}

interface EasyBlock {
    function shareCount(address _target) external view returns(uint256);

    function decreaseShareCount(address _target, uint256 _amount) external;
}

interface EasyAvatarsSVG {
    function skinToneNames(uint) external view returns(string memory);
    function skinToneLayers(uint) external view returns(string memory);

    function eyeColorNames(uint) external view returns(string memory);
    function eyeColorLayers(uint) external view returns(string memory);

    function glassesNames(uint) external view returns(string memory);
    function glassesLayers(uint) external view returns(string memory);

    function mouthNames(uint) external view returns(string memory);
    function mouthLayers(uint) external view returns(string memory);

    function mouthPieceNames(uint) external view returns(string memory);
    function mouthPieceLayers(uint) external view returns(string memory);
}
// EasyBlock Interfaces END


contract EasyAvatars is ERC721Enumerable, ReentrancyGuard, Ownable {

    uint256 public maxSupply = 5000;
    uint256 public price = 20 ether;
    uint256 public maxMint = 20;
    uint256 public numTokensMinted;
    bool public isFTMMintable = true;
    // Reward Related
    bool private showClaimableReward = true;
    bool private showShareCount = true;
    uint256 public priceFtm = 100 ether;
    uint256 public numTokensMintedFtm;
    mapping(uint256 => bool) public tokenIncludesShare;

    EasyAvatarsRewards easyAvatarsRewardsContract;
    function setEasyAvatarsRewardsContract(address _target) external onlyOwner{
        easyAvatarsRewardsContract = EasyAvatarsRewards(_target);
    }

    EasyBlock easyBlockContract;
    function setEasyBlockContract(address _target) external onlyOwner{
        easyBlockContract = EasyBlock(_target);
    }

    EasyAvatarsSVG easyAvatarsSVGContract;
    function setEasyAvatarsSVGContract(address _target) external onlyOwner{
        easyAvatarsSVGContract = EasyAvatarsSVG(_target);
    }

    struct EasyAvatarObject {
        uint256 skinTone;
        uint256 eyeColor;
        uint256 glasses;
        uint256 mouth;
        uint256 mouthPiece;
    }

    function randomEasyAvatar(uint256 tokenId) internal view returns (EasyAvatarObject memory) {
        
        EasyAvatarObject memory easyAvatar;

        easyAvatar.skinTone = getSkinTone(tokenId);
        easyAvatar.eyeColor = getEyeColor(tokenId);
        easyAvatar.glasses = getGlasses(tokenId);
        easyAvatar.mouth = getMouth(tokenId);
        easyAvatar.mouthPiece = getMouthPiece(tokenId, easyAvatar.mouth);

        return easyAvatar;
    }
    
    function getTraits(EasyAvatarObject memory easyAvatar, uint256 tokenId) internal view returns (string memory) {
        
        string[26] memory parts;
        
        parts[0] = ', "attributes": [';
        parts[1] = '{"trait_type": "Skin Tone","value": "';
        parts[2] = easyAvatarsSVGContract.skinToneNames(easyAvatar.skinTone);
        parts[3] = '"}, {"trait_type": "Eye Color","value": "';
        parts[4] = easyAvatarsSVGContract.eyeColorNames(easyAvatar.eyeColor);
        parts[5] = '"}, {"trait_type": "Glasses","value": "';
        parts[6] = easyAvatarsSVGContract.glassesNames(easyAvatar.glasses);
        parts[7] = '"}, {"trait_type": "Mouth","value": "';
        parts[8] = easyAvatarsSVGContract.mouthNames(easyAvatar.mouth);
        parts[9] = '"}, {"trait_type": "Accessory","value": "';
        parts[10] = easyAvatarsSVGContract.mouthPieceNames(easyAvatar.mouthPiece);
        // TYPES
        // Invisible
        parts[11] = '"}, {"trait_type": "Type: Invisible","value": "';
        if(easyAvatar.skinTone == 16) {
            parts[12] = 'Yes';
        } else {
            parts[12] = 'No';
        }
        // Zombie
        parts[13] = '"}, {"trait_type": "Type: Zombie","value": "';
        if(easyAvatar.skinTone == 18 || easyAvatar.mouth == 6) {
            parts[14] = 'Yes';
        } else {
            parts[14] = 'No';
        }
        // Alien
        parts[15] = '"}, {"trait_type": "Type: Alien","value": "';
        if (easyAvatar.skinTone == 17 || easyAvatar.eyeColor == 14) {
            parts[16] = "Yes";
        } else {
            parts[16] = "No";
        }
        // Vampire
        parts[17] = '"}, {"trait_type": "Type: Vampire","value": "';
        if(easyAvatar.eyeColor == 15 || easyAvatar.mouth == 7) {
            parts[18] = 'Yes';
        } else {
            parts[18] = "No";
        }
        // GENERATIONS
        parts[19] = '"}, {"trait_type": "Generation","value": "';
        if (tokenId < 101) {
            parts[20] = "0";
        } else {
            parts[20] = toString(tokenId / 1001 + 1);
        }
        // Reward related info
        if(tokenIncludesShare[tokenId]) {
            if(showClaimableReward) {
                parts[21] = '"}, {"trait_type": "Claimable Reward","value": "';
                parts [22] = getClaimableReward(tokenId);
            }
            if(showShareCount) {
                parts[23] = '"}, {"trait_type": "EasyBlock Strong Shares Included","value": "';
                if(tokenIncludesShare[tokenId]) {
                    parts[24] = '50';
                } else {
                    parts[24] = '0';
                }
            }
        }
        parts[25] = '"}], ';
        
        
        
        
        string memory output = string(abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6], parts[7]));
                      output = string(abi.encodePacked(output, parts[8], parts[9], parts[10], parts[11], parts[12], parts[13], parts[14]));
                      output = string(abi.encodePacked(output, parts[15], parts[16], parts[17], parts[18], parts[19], parts[20]));
                      output = string(abi.encodePacked(output, parts[21], parts[22], parts[23], parts[24], parts[25]));
        return output;
    }

    function getClaimableReward(uint256 _tokenId) internal view returns (string memory) {
        string[4] memory parts;
        uint256 _reward = easyAvatarsRewardsContract.getSingleReward(_tokenId);
        parts[0] = toString(_reward/1000000);
        parts[1] = '.';
        parts[2] = toString(_reward % 1000000);
        parts[3] = ' $USDC';
        string memory output = string(abi.encodePacked(parts[0], parts[1], parts[2], parts[3]));
        return output;
    }

    function random(string memory input) internal pure returns (uint256) {
        return uint256(keccak256(abi.encodePacked(input)));
    }

    function getSkinTone(uint256 tokenId) internal pure returns (uint256) { // 5
        uint256 rand = random(string(abi.encodePacked("SKIN TONE", toString(tokenId))));

        uint256 rn = rand % 1000;
        // Specials (50% chance)
        if (rn>= 500) {return rn % 19;}
        // Normal
        else {return rn % 16;}
    }

    function getEyeColor(uint256 tokenId) internal pure returns (uint256) { //4
        uint256 rand = random(string(abi.encodePacked("EYE COLOR", toString(tokenId))));

        uint256 rn = rand % 1000;
        // Specials (50% chance)
        if(rn >=500) {return rn % 16;}
        else {return rn % 14;}
    }

    function getGlasses(uint256 tokenId) internal pure returns (uint256) { // 2
        uint256 rand = random(string(abi.encodePacked("GLASSES", toString(tokenId))));

        uint256 rn = rand % 1000;
        // Specials (50% chance)
        if (rn >= 500) {return rn % 10; }// Includes the glasses
        else {return 0; }// No glasses
    }

    function getMouth(uint256 tokenId) internal pure returns (uint256) { // 4
        uint256 rand = random(string(abi.encodePacked("MOUTH", toString(tokenId))));

        uint256 rn = rand % 1000;
        // With Special (50% chance)
        if(rn >= 500) {return rn % 8;}
        else {return rn % 6;}
    }

    function getMouthPiece(uint256 tokenId, uint256 mouthType) internal pure returns(uint256) {
        if(mouthType == 1 || mouthType == 2 || mouthType == 3) {
            return 0;
        }
        uint256 rand = random(string(abi.encodePacked("MOUTH PIECE", toString(tokenId))));

        uint256 rn = rand % 1000;
        // With Special (50% chance)
        if(rn >= 900) {return rn % 4;}
        else {return 0;}
    }

    function getSVG(EasyAvatarObject memory easyAvatar) internal view returns (string memory) {
        string[13] memory parts;

        parts[0] = '<svg id="x" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 30 30">';

        // Skin Tone
        if(easyAvatar.skinTone > 15) {
            parts[1] = easyAvatarsSVGContract.skinToneLayers(easyAvatar.skinTone);
        }
        else {
            parts[1] = '<path d="M4 4h22v22H4z" fill="';
            parts[2] = easyAvatarsSVGContract.skinToneLayers(easyAvatar.skinTone);
            parts[3] = '"/>';
        }
        // Outline
        parts[4] = '<path d="M4 4.5h1m5 0h1m5 0h1m5 0h1m-19 1h1m20 1h1m-22 2h1m-1 1h1m20 1h1m-1 2h1m-22 1h1m20 0h1m-1 2h1m-1 1h1m-22 1h1m-1 2h1m-1 1h1m20 0h1m-1 1h1m-22 1h1m-1 1h1m-1 1h1m2 1h1m2 0h1m2 0h1m8 0h1m2 0h1M5 4.5h1m2 0h1m6 0h1m-10 21h1m5 0h1m5 0h1m5 0h1M6 4.5h1m2 0h1m8 0h1m2 21h1M7 4.5h1m4 0h2m5 0h3m1 0h3m-1 1h1m-22 1h1m-1 1h1m20 0h1m-1 1h1m-1 1h1m-22 1h1m-1 1h1m20 0h1m-22 1h1m-1 2h1m20 0h1m-22 1h1m-1 1h1m20 1h1m-22 1h1m20 0h1m-1 1h1m-22 2h1m20 1h1m-1 1h1m-1 1h1m-22 1h2m3 0h1m4 0h3m2 0h1m3 0h1m-13-21h1m2 0h1m2 0h1m-10 21h1m2 0h1m5 0h1m2 0h1" stroke="#000"/>';
        // Eye Color
        parts[5] = '<path d="M8 10h3v3H8zm11 0h3v3h-3z" fill="';
        parts[6] = easyAvatarsSVGContract.eyeColorLayers(easyAvatar.eyeColor);
        parts[7] = '"/>';
        // Pupil
        parts[8] = '<path fill="#000" d="M9 11h1v1H9zm11 0h1v1h-1z"/>';
        parts[9] = easyAvatarsSVGContract.glassesLayers(easyAvatar.glasses);
        parts[10] = easyAvatarsSVGContract.mouthLayers(easyAvatar.mouth);
        parts[11] = easyAvatarsSVGContract.mouthPieceLayers(easyAvatar.mouthPiece);
        parts[12] = '<style>#x{shape-rendering: crispedges;}</style></svg>';

        string memory output = string(abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6], parts[7]));
                      output = string(abi.encodePacked(output, parts[8],parts[9],parts[10], parts[11], parts[12]));

        return output;
    }

    function tokenURI(uint256 tokenId) override public view returns (string memory) {
        require(tokenId <= numTokensMinted);
        EasyAvatarObject memory easyAvatar = randomEasyAvatar(tokenId);
        string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "The Easy Club #', toString(tokenId), '", "description": "Official EasyBlock Genesis NFTs | 5000 Limited. All artwork and metadata are fully on-chain and randomly generated at mint. Each NFT grants many communal and financial benefits under the EasyBlock ecosystem."', getTraits(easyAvatar, tokenId), '"image": "data:image/svg+xml;base64,', Base64.encode(bytes(getSVG(easyAvatar))), '"}'))));
        json = string(abi.encodePacked('data:application/json;base64,', json));
        return json;
    }

    function mint(address destination, uint256 amountOfTokens, uint256 targetShareCount) private {
        require(totalSupply() < maxSupply, "All tokens have been minted");
        require(totalSupply() + amountOfTokens <= maxSupply, "Minting would exceed max supply");

        require(amountOfTokens <= maxMint, "Cannot purchase this many tokens in a transaction");
        require(amountOfTokens > 0, "Must mint at least one token");
        require(price * amountOfTokens == msg.value, "ETH amount is incorrect");

        for (uint256 i = 0; i < amountOfTokens; i++) {
            uint256 tokenId = numTokensMinted + 1;
            _safeMint(destination, tokenId);
            numTokensMinted += 1;
            tokenIncludesShare[tokenId] = true;
            // Set reward index
            easyAvatarsRewardsContract.setNFTIndex(tokenId);
            // Decrease Share Count
            easyBlockContract.decreaseShareCount(_msgSender(), 5000);
        }
        // Safety check for share count
        require(easyBlockContract.shareCount(_msgSender()) == targetShareCount, "Share count is not true.");
    }

    function mintWithFTM(address destination, uint256 amountOfTokens) private {
        require(totalSupply() < maxSupply, "All tokens have been minted");
        require(totalSupply() + amountOfTokens <= maxSupply, "Minting would exceed max supply");

        require(amountOfTokens <= maxMint, "Cannot purchase this many tokens in a transaction");
        require(amountOfTokens > 0, "Must mint at least one token");
        require(priceFtm * amountOfTokens == msg.value, "ETH amount is incorrect");

        for (uint256 i = 0; i < amountOfTokens; i++) {
            uint256 tokenId = numTokensMinted + 1;
            _safeMint(destination, tokenId);
            numTokensMinted += 1;
            numTokensMintedFtm += 1;
        }
    }

    function mintForSelf(uint256 amountOfTokens) public payable virtual {
        require(amountOfTokens * 5000 <= easyBlockContract.shareCount(_msgSender()), "Not enough shares");
        mint(_msgSender(),amountOfTokens, easyBlockContract.shareCount(_msgSender())-amountOfTokens*5000);
    }

    function mintForFriend(address walletAddress, uint256 amountOfTokens) public payable virtual {
        require(amountOfTokens * 5000 <= easyBlockContract.shareCount(_msgSender()), "Not enough shares");
        mint(walletAddress,amountOfTokens, easyBlockContract.shareCount(_msgSender())-amountOfTokens*5000);
    }

    function mintForSelfFtm(uint256 amountOfTokens) public payable virtual {
        require(isFTMMintable, "Can't mint with FTM.");
        mintWithFTM(_msgSender(), amountOfTokens);
    }

    function setPrice(uint256 newPrice) public onlyOwner {
        price = newPrice;
    }

    function setPriceFtm(uint256 newPrice) public onlyOwner {
        priceFtm = newPrice;
    }

    function setMaxMint(uint256 newMaxMint) public onlyOwner {
        maxMint = newMaxMint;
    }

    function setFTMMintable(bool newFTMMintable) public onlyOwner {
        isFTMMintable = newFTMMintable;
    }

    function setShowClaimableReward(bool newShowClaimableReward) public onlyOwner {
        showClaimableReward = newShowClaimableReward;
    }

    function setShowShareCount(bool newShowShareCount) public onlyOwner {
        showShareCount = newShowShareCount;
    }

    function withdrawAll() public payable onlyOwner {
        require(payable(_msgSender()).send(address(this).balance));
    }

    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);
    }
    
    constructor() ERC721("The Easy Club", "EASY") Ownable() {}
}

library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

        uint256 encodedLen = 4 * ((len + 2) / 3);

        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"isFTMMintable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"walletAddress","type":"address"},{"internalType":"uint256","name":"amountOfTokens","type":"uint256"}],"name":"mintForFriend","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOfTokens","type":"uint256"}],"name":"mintForSelf","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOfTokens","type":"uint256"}],"name":"mintForSelfFtm","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokensMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokensMintedFtm","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceFtm","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"nonpayable","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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"}],"name":"setEasyAvatarsRewardsContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"}],"name":"setEasyAvatarsSVGContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"}],"name":"setEasyBlockContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newFTMMintable","type":"bool"}],"name":"setFTMMintable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxMint","type":"uint256"}],"name":"setMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPriceFtm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newShowClaimableReward","type":"bool"}],"name":"setShowClaimableReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newShowShareCount","type":"bool"}],"name":"setShowShareCount","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":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIncludesShare","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

6080604052611388600c556801158e460913d00000600d556014600e556010805462ffffff19166201010117905568056bc75e2d631000006011553480156200004757600080fd5b50604080518082018252600d81526c2a34329022b0b9bc9021b63ab160991b6020808301918252835180850190945260048452634541535960e01b90840152815191929162000099916000916200011a565b508051620000af9060019060208401906200011a565b50506001600a5550620000c233620000c8565b620001fd565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200012890620001c0565b90600052602060002090601f0160209004810192826200014c576000855562000197565b82601f106200016757805160ff191683800117855562000197565b8280016001018555821562000197579182015b82811115620001975782518255916020019190600101906200017a565b50620001a5929150620001a9565b5090565b5b80821115620001a55760008155600101620001aa565b600181811c90821680620001d557607f821691505b60208210811415620001f757634e487b7160e01b600052602260045260246000fd5b50919050565b614693806200020d6000396000f3fe60806040526004361061023b5760003560e01c80637501f7411161012e578063a22cb465116100ab578063ca5e927b1161006f578063ca5e927b14610651578063d5abeb0114610671578063e985e9c514610687578063f2fde38b146106d0578063f53919e8146106f057600080fd5b8063a22cb465146105c8578063a511d4d9146105e8578063b88d4fde146105fe578063c49b3d541461061e578063c87b56dd1461063157600080fd5b806391b7f5ed116100f257806391b7f5ed1461054a57806395d89b411461056a57806397ebd40b1461057f578063a035b1fe1461059f578063a108f529146105b557600080fd5b80637501f741146104db5780637c114471146104f1578063853828b614610511578063898d5b30146105195780638da5cb5b1461052c57600080fd5b80634230baee116101bc57806352229a991161018057806352229a9914610450578063547520fe146104665780636352211e1461048657806370a08231146104a6578063715018a6146104c657600080fd5b80634230baee146103ba57806342842e0e146103d057806344e04c44146103f05780634c1a8642146104105780634f6ccce71461043057600080fd5b806318160ddd1161020357806318160ddd1461032157806318515d3f1461034057806323b872dd1461035a5780632b8059ae1461037a5780632f745c591461039a57600080fd5b806301ffc9a71461024057806306fdde0314610275578063081812fc14610297578063095ea7b3146102cf5780630c5b170a146102f1575b600080fd5b34801561024c57600080fd5b5061026061025b366004613770565b610710565b60405190151581526020015b60405180910390f35b34801561028157600080fd5b5061028a61073b565b60405161026c9190613ddc565b3480156102a357600080fd5b506102b76102b2366004613821565b6107cd565b6040516001600160a01b03909116815260200161026c565b3480156102db57600080fd5b506102ef6102ea36600461372b565b610867565b005b3480156102fd57600080fd5b5061026061030c366004613821565b60136020526000908152604090205460ff1681565b34801561032d57600080fd5b506008545b60405190815260200161026c565b34801561034c57600080fd5b506010546102609060ff1681565b34801561036657600080fd5b506102ef61037536600461361a565b61097d565b34801561038657600080fd5b506102ef6103953660046135c5565b6109ae565b3480156103a657600080fd5b506103326103b536600461372b565b6109fa565b3480156103c657600080fd5b50610332600f5481565b3480156103dc57600080fd5b506102ef6103eb36600461361a565b610a90565b3480156103fc57600080fd5b506102ef61040b366004613755565b610aab565b34801561041c57600080fd5b506102ef61042b366004613821565b610ae8565b34801561043c57600080fd5b5061033261044b366004613821565b610b17565b34801561045c57600080fd5b5061033260125481565b34801561047257600080fd5b506102ef610481366004613821565b610baa565b34801561049257600080fd5b506102b76104a1366004613821565b610bd9565b3480156104b257600080fd5b506103326104c13660046135c5565b610c50565b3480156104d257600080fd5b506102ef610cd7565b3480156104e757600080fd5b50610332600e5481565b3480156104fd57600080fd5b506102ef61050c3660046135c5565b610d0d565b6102ef610d59565b6102ef610527366004613821565b610da7565b34801561053857600080fd5b50600b546001600160a01b03166102b7565b34801561055657600080fd5b506102ef610565366004613821565b610dfd565b34801561057657600080fd5b5061028a610e2c565b34801561058b57600080fd5b506102ef61059a366004613755565b610e3b565b3480156105ab57600080fd5b50610332600d5481565b6102ef6105c336600461372b565b610e7f565b3480156105d457600080fd5b506102ef6105e3366004613701565b611003565b3480156105f457600080fd5b5061033260115481565b34801561060a57600080fd5b506102ef610619366004613656565b6110c8565b6102ef61062c366004613821565b611100565b34801561063d57600080fd5b5061028a61064c366004613821565b6111e8565b34801561065d57600080fd5b506102ef61066c366004613755565b611280565b34801561067d57600080fd5b50610332600c5481565b34801561069357600080fd5b506102606106a23660046135e7565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106dc57600080fd5b506102ef6106eb3660046135c5565b6112c6565b3480156106fc57600080fd5b506102ef61070b3660046135c5565b61135e565b60006001600160e01b0319821663780e9d6360e01b14806107355750610735826113aa565b92915050565b60606000805461074a90613fff565b80601f016020809104026020016040519081016040528092919081815260200182805461077690613fff565b80156107c35780601f10610798576101008083540402835291602001916107c3565b820191906000526020600020905b8154815290600101906020018083116107a657829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661084b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061087282610bd9565b9050806001600160a01b0316836001600160a01b031614156108e05760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610842565b336001600160a01b03821614806108fc57506108fc81336106a2565b61096e5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610842565b61097883836113fa565b505050565b6109873382611468565b6109a35760405162461bcd60e51b815260040161084290613ec7565b61097883838361155f565b600b546001600160a01b031633146109d85760405162461bcd60e51b815260040161084290613e92565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b6000610a0583610c50565b8210610a675760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610842565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610978838383604051806020016040528060008152506110c8565b600b546001600160a01b03163314610ad55760405162461bcd60e51b815260040161084290613e92565b6010805460ff1916911515919091179055565b600b546001600160a01b03163314610b125760405162461bcd60e51b815260040161084290613e92565b601155565b6000610b2260085490565b8210610b855760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610842565b60088281548110610b9857610b986140ab565b90600052602060002001549050919050565b600b546001600160a01b03163314610bd45760405162461bcd60e51b815260040161084290613e92565b600e55565b6000818152600260205260408120546001600160a01b0316806107355760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610842565b60006001600160a01b038216610cbb5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610842565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b03163314610d015760405162461bcd60e51b815260040161084290613e92565b610d0b600061170a565b565b600b546001600160a01b03163314610d375760405162461bcd60e51b815260040161084290613e92565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b600b546001600160a01b03163314610d835760405162461bcd60e51b815260040161084290613e92565b60405133904780156108fc02916000818181858888f19350505050610d0b57600080fd5b60105460ff16610df05760405162461bcd60e51b815260206004820152601460248201527321b0b713ba1036b4b73a103bb4ba3410232a269760611b6044820152606401610842565b610dfa338261175c565b50565b600b546001600160a01b03163314610e275760405162461bcd60e51b815260040161084290613e92565b600d55565b60606001805461074a90613fff565b600b546001600160a01b03163314610e655760405162461bcd60e51b815260040161084290613e92565b601080549115156101000261ff0019909216919091179055565b6015546001600160a01b031663c2bd1871336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015610ed057600080fd5b505afa158015610ee4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f08919061383a565b610f1482611388613f9d565b1115610f565760405162461bcd60e51b81526020600482015260116024820152704e6f7420656e6f7567682073686172657360781b6044820152606401610842565b610fff8282610f6781611388613f9d565b6015546001600160a01b031663c2bd1871336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015610fb857600080fd5b505afa158015610fcc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff0919061383a565b610ffa9190613fbc565b61194b565b5050565b6001600160a01b03821633141561105c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610842565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6110d23383611468565b6110ee5760405162461bcd60e51b815260040161084290613ec7565b6110fa84848484611ce5565b50505050565b6015546001600160a01b031663c2bd1871336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561115157600080fd5b505afa158015611165573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611189919061383a565b61119582611388613f9d565b11156111d75760405162461bcd60e51b81526020600482015260116024820152704e6f7420656e6f7567682073686172657360781b6044820152606401610842565b610dfa3382610f6781611388613f9d565b6060600f548211156111f957600080fd5b600061120483611d18565b9050600061125561121485611dc9565b61121e8487611ec7565b61122f61122a866126c9565b612bb3565b60405160200161124193929190613bba565b604051602081830303815290604052612bb3565b9050806040516020016112689190613b75565b60408051601f19818403018152919052949350505050565b600b546001600160a01b031633146112aa5760405162461bcd60e51b815260040161084290613e92565b60108054911515620100000262ff000019909216919091179055565b600b546001600160a01b031633146112f05760405162461bcd60e51b815260040161084290613e92565b6001600160a01b0381166113555760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610842565b610dfa8161170a565b600b546001600160a01b031633146113885760405162461bcd60e51b815260040161084290613e92565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b031982166380ac58cd60e01b14806113db57506001600160e01b03198216635b5e139f60e01b145b8061073557506301ffc9a760e01b6001600160e01b0319831614610735565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061142f82610bd9565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166114e15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610842565b60006114ec83610bd9565b9050806001600160a01b0316846001600160a01b031614806115275750836001600160a01b031661151c846107cd565b6001600160a01b0316145b8061155757506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661157282610bd9565b6001600160a01b0316146115da5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610842565b6001600160a01b03821661163c5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610842565b611647838383612d19565b6116526000826113fa565b6001600160a01b038316600090815260036020526040812080546001929061167b908490613fbc565b90915550506001600160a01b03821660009081526003602052604081208054600192906116a9908490613f71565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600c54600854106117af5760405162461bcd60e51b815260206004820152601b60248201527f416c6c20746f6b656e732068617665206265656e206d696e74656400000000006044820152606401610842565b600c54816117bc60085490565b6117c69190613f71565b11156118145760405162461bcd60e51b815260206004820152601f60248201527f4d696e74696e6720776f756c6420657863656564206d617820737570706c79006044820152606401610842565b600e548111156118365760405162461bcd60e51b815260040161084290613e41565b600081116118865760405162461bcd60e51b815260206004820152601c60248201527f4d757374206d696e74206174206c65617374206f6e6520746f6b656e000000006044820152606401610842565b34816011546118959190613f9d565b146118dc5760405162461bcd60e51b815260206004820152601760248201527611551208185b5bdd5b9d081a5cc81a5b98dbdc9c9958dd604a1b6044820152606401610842565b60005b81811015610978576000600f5460016118f89190613f71565b90506119048482612dd1565b6001600f60008282546119179190613f71565b925050819055506001601260008282546119319190613f71565b9091555082915061194390508161403a565b9150506118df565b600c546008541061199e5760405162461bcd60e51b815260206004820152601b60248201527f416c6c20746f6b656e732068617665206265656e206d696e74656400000000006044820152606401610842565b600c54826119ab60085490565b6119b59190613f71565b1115611a035760405162461bcd60e51b815260206004820152601f60248201527f4d696e74696e6720776f756c6420657863656564206d617820737570706c79006044820152606401610842565b600e54821115611a255760405162461bcd60e51b815260040161084290613e41565b60008211611a755760405162461bcd60e51b815260206004820152601c60248201527f4d757374206d696e74206174206c65617374206f6e6520746f6b656e000000006044820152606401610842565b3482600d54611a849190613f9d565b14611acb5760405162461bcd60e51b815260206004820152601760248201527611551208185b5bdd5b9d081a5cc81a5b98dbdc9c9958dd604a1b6044820152606401610842565b60005b82811015611c0c576000600f546001611ae79190613f71565b9050611af38582612dd1565b6001600f6000828254611b069190613f71565b909155505060008181526013602052604090819020805460ff191660011790556014549051637f7407c360e11b8152600481018390526001600160a01b039091169063fee80f8690602401600060405180830381600087803b158015611b6b57600080fd5b505af1158015611b7f573d6000803e3d6000fd5b50506015546001600160a01b031691506340c8b2d19050336040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526113886024820152604401600060405180830381600087803b158015611be057600080fd5b505af1158015611bf4573d6000803e3d6000fd5b50505050508080611c049061403a565b915050611ace565b5060155481906001600160a01b031663c2bd1871336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015611c6057600080fd5b505afa158015611c74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c98919061383a565b146109785760405162461bcd60e51b815260206004820152601860248201527f536861726520636f756e74206973206e6f7420747275652e00000000000000006044820152606401610842565b611cf084848461155f565b611cfc84848484612deb565b6110fa5760405162461bcd60e51b815260040161084290613def565b611d4a6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b611d7c6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b611d8583612ef8565b8152611d9083612f5c565b6020820152611d9e83612fac565b6040820152611dac83612ffb565b60608201819052611dbe90849061304b565b608082015292915050565b606081611ded5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611e175780611e018161403a565b9150611e109050600a83613f89565b9150611df1565b60008167ffffffffffffffff811115611e3257611e326140c1565b6040519080825280601f01601f191660200182016040528015611e5c576020820181803683370190505b5090505b841561155757611e71600183613fbc565b9150611e7e600a86614055565b611e89906030613f71565b60f81b818381518110611e9e57611e9e6140ab565b60200101906001600160f81b031916908160001a905350611ec0600a86613f89565b9450611e60565b6060611ed161353c565b60408051808201825260118152702c202261747472696275746573223a205b60781b602080830191909152908352815160608101909252602580835290614639908301396020820152601654845160405163260bb06160e01b815260048101919091526001600160a01b039091169063260bb0619060240160006040518083038186803b158015611f6157600080fd5b505afa158015611f75573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f9d91908101906137aa565b60408083019190915280516060810190915260298082526145216020830139606082015260165460208501516040516394a064d760e01b815260048101919091526001600160a01b03909116906394a064d79060240160006040518083038186803b15801561200b57600080fd5b505afa15801561201f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261204791908101906137aa565b6080820152604080516060810190915260278082526144d5602083013960a082015260165460408581015190516313e14fbd60e21b815260048101919091526001600160a01b0390911690634f853ef49060240160006040518083038186803b1580156120b357600080fd5b505afa1580156120c7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526120ef91908101906137aa565b60c0820152604080516060810190915260258082526144fc602083013960e08201526016546060850151604051634d6c432160e11b815260048101919091526001600160a01b0390911690639ad886429060240160006040518083038186803b15801561215b57600080fd5b505afa15801561216f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261219791908101906137aa565b6101008201526040805160608101909152602980825261437360208301396101208201526016546080850151604051639420d55d60e01b815260048101919091526001600160a01b0390911690639420d55d9060240160006040518083038186803b15801561220557600080fd5b505afa158015612219573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261224191908101906137aa565b6101408201526040805160608101909152602f8082526140ee60208301396101608201528351601014156122945760408051808201909152600381526259657360e81b60208201526101808201526122b4565b6040805180820190915260028152614e6f60f01b60208201526101808201525b6040518060600160405280602c815260200161460d602c91396101a08201528351601214806122e7575083606001516006145b156123115760408051808201909152600381526259657360e81b60208201526101c0820152612331565b6040805180820190915260028152614e6f60f01b60208201526101c08201525b6040518060600160405280602b815260200161454a602b91396101e082015283516011148061236457508360200151600e145b1561238e5760408051808201909152600381526259657360e81b60208201526102008201526123ae565b6040805180820190915260028152614e6f60f01b60208201526102008201525b6040518060600160405280602d8152602001614346602d91396102208201526020840151600f14806123e4575083606001516007145b1561240e5760408051808201909152600381526259657360e81b602082015261024082015261242e565b6040805180820190915260028152614e6f60f01b60208201526102408201525b6040518060600160405280602a815260200161446b602a91396102608201526065831015612479576040805180820190915260018152600360fc1b602082015261028082015261249f565b6124986124886103e985613f89565b612493906001613f71565b611dc9565b6102808201525b60008381526013602052604090205460ff161561257f57601054610100900460ff16156124f5576040518060600160405280603081526020016143fb603091396102a08201526124ee836130cc565b6102c08201525b60105462010000900460ff161561257f57604051806060016040528060408152602001614495604091396102e082015260008381526013602052604090205460ff161561256057604080518082019091526002815261035360f41b602082015261030082015261257f565b6040805180820190915260018152600360fc1b60208201526103008201525b60408051808201825260058152640113eae96160dd1b602080830191909152610320840191909152825183820151848401516060860151608087015160a088015160c089015160e08a015198516000996125db99909101613a1f565b60408051808303601f19018152908290526101008401516101208501516101408601516101608701516101808801516101a08901516101c08a015196985061262897899790602001613a1f565b60408051808303601f19018152908290526101e084015161020085015161022086015161024087015161026088015161028089015195975061266f9688969060200161398d565b60408051808303601f19018152908290526102a08401516102c08501516102e08601516103008701516103208801519496506126b09587959060200161390e565b60408051808303601f1901815291905295945050505050565b60606126d3613564565b6040518060a00160405280606781526020016145a66067913981528251600f101561278957601654835160405162a0573b60e61b81526001600160a01b0390921691632815cec09161272b9160040190815260200190565b60006040518083038186803b15801561274357600080fd5b505afa158015612757573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261277f91908101906137aa565b6020820152612869565b604080518082018252601e81527f3c7061746820643d224d34203468323276323248347a222066696c6c3d2200006020808301919091528301526016548451915162a0573b60e61b815260048101929092526001600160a01b031690632815cec09060240160006040518083038186803b15801561280657600080fd5b505afa15801561281a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261284291908101906137aa565b6040828101919091528051808201909152600381526211179f60e91b602082015260608201525b604051806102600160405280610229815260200161411d610229913960808201526040805160608101909152602a80825261439c602083013960a08201526016546020840151604051636bd030d160e11b815260048101919091526001600160a01b039091169063d7a061a29060240160006040518083038186803b1580156128f157600080fd5b505afa158015612905573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261292d91908101906137aa565b60c082015260408051808201909152600381526211179f60e91b6020820152816007602002018190525060405180606001604052806031815260200161457560319139610100820152601654604084810151905163bd2a6b0160e01b815260048101919091526001600160a01b039091169063bd2a6b019060240160006040518083038186803b1580156129c057600080fd5b505afa1580156129d4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526129fc91908101906137aa565b6101208201526016546060840151604051637267e6ff60e01b815260048101919091526001600160a01b0390911690637267e6ff9060240160006040518083038186803b158015612a4c57600080fd5b505afa158015612a60573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612a8891908101906137aa565b6101408201526016546080840151604051633c7a278560e21b815260048101919091526001600160a01b039091169063f1e89e149060240160006040518083038186803b158015612ad857600080fd5b505afa158015612aec573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612b1491908101906137aa565b610160820152604080516060810190915260358082526143c6602083013961018082015280516020808301516040808501516060860151608087015160a088015160c089015160e08a01519551600099612b72999098979101613a1f565b60408051808303601f19018152908290526101008401516101208501516101408601516101608701516101808801519496506112689587959060200161390e565b805160609080612bd3575050604080516020810190915260008152919050565b60006003612be2836002613f71565b612bec9190613f89565b612bf7906004613f9d565b90506000612c06826020613f71565b67ffffffffffffffff811115612c1e57612c1e6140c1565b6040519080825280601f01601f191660200182016040528015612c48576020820181803683370190505b509050600060405180606001604052806040815260200161442b604091399050600181016020830160005b86811015612cd4576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101612c73565b506003860660018114612cee5760028114612cff57612d0b565b613d3d60f01b600119830152612d0b565b603d60f81b6000198301525b505050918152949350505050565b6001600160a01b038316612d7457612d6f81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612d97565b816001600160a01b0316836001600160a01b031614612d9757612d9783826131fa565b6001600160a01b038216612dae5761097881613297565b826001600160a01b0316826001600160a01b031614610978576109788282613346565b610fff82826040518060200160405280600081525061338a565b60006001600160a01b0384163b15612eed57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612e2f903390899088908890600401613da9565b602060405180830381600087803b158015612e4957600080fd5b505af1925050508015612e79575060408051601f3d908101601f19168201909252612e769181019061378d565b60015b612ed3573d808015612ea7576040519150601f19603f3d011682016040523d82523d6000602084013e612eac565b606091505b508051612ecb5760405162461bcd60e51b815260040161084290613def565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611557565b506001949350505050565b600080612f2b612f0784611dc9565b604051602001612f179190613af1565b6040516020818303038152906040526133bd565b90506000612f3b6103e883614055565b90506101f48110612f5157611557601382614055565b611557601082614055565b600080612f7b612f6b84611dc9565b604051602001612f179190613b22565b90506000612f8b6103e883614055565b90506101f48110612fa157611557601082614055565b611557600e82614055565b600080612fcb612fbb84611dc9565b604051602001612f179190613b46565b90506000612fdb6103e883614055565b90506101f48110612ff157611557600a82614055565b5060009392505050565b60008061301a61300a84611dc9565b604051602001612f179190613ac4565b9050600061302a6103e883614055565b90506101f4811061304057611557600882614055565b611557600682614055565b6000816001148061305c5750816002145b806130675750816003145b1561307457506000610735565b600061309261308285611dc9565b604051602001612f179190613d76565b905060006130a26103e883614055565b905061038481106130c1576130b8600482614055565b92505050610735565b600092505050610735565b60606130d661357f565b601454604051636ef1461160e11b8152600481018590526000916001600160a01b03169063dde28c229060240160206040518083038186803b15801561311b57600080fd5b505afa15801561312f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613153919061383a565b9050613165612493620f424083613f89565b8252604080518082019091526001808252601760f91b602083015283906020020152613197612493620f424083614055565b604083810191825280518082018252600681526520245553444360d01b60208083019190915260608601829052855181870151945193516000956131e195929490939091016138b7565b60408051601f1981840301815291905295945050505050565b6000600161320784610c50565b6132119190613fbc565b600083815260076020526040902054909150808214613264576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906132a990600190613fbc565b600083815260096020526040812054600880549394509092849081106132d1576132d16140ab565b9060005260206000200154905080600883815481106132f2576132f26140ab565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061332a5761332a614095565b6001900381819060005260206000200160009055905550505050565b600061335183610c50565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b61339483836133ee565b6133a16000848484612deb565b6109785760405162461bcd60e51b815260040161084290613def565b6000816040516020016133d0919061389b565b60408051601f19818403018152919052805160209091012092915050565b6001600160a01b0382166134445760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610842565b6000818152600260205260409020546001600160a01b0316156134a95760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610842565b6134b560008383612d19565b6001600160a01b03821660009081526003602052604081208054600192906134de908490613f71565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b604051806103400160405280601a905b606081526020019060019003908161354c5790505090565b604080516101a0810190915260608152600c6020820161354c565b60408051608081019091526060815260036020820161354c565b80356001600160a01b03811681146135b057600080fd5b919050565b803580151581146135b057600080fd5b6000602082840312156135d757600080fd5b6135e082613599565b9392505050565b600080604083850312156135fa57600080fd5b61360383613599565b915061361160208401613599565b90509250929050565b60008060006060848603121561362f57600080fd5b61363884613599565b925061364660208501613599565b9150604084013590509250925092565b6000806000806080858703121561366c57600080fd5b61367585613599565b935061368360208601613599565b925060408501359150606085013567ffffffffffffffff8111156136a657600080fd5b8501601f810187136136b757600080fd5b80356136ca6136c582613f49565b613f18565b8181528860208385010111156136df57600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b6000806040838503121561371457600080fd5b61371d83613599565b9150613611602084016135b5565b6000806040838503121561373e57600080fd5b61374783613599565b946020939093013593505050565b60006020828403121561376757600080fd5b6135e0826135b5565b60006020828403121561378257600080fd5b81356135e0816140d7565b60006020828403121561379f57600080fd5b81516135e0816140d7565b6000602082840312156137bc57600080fd5b815167ffffffffffffffff8111156137d357600080fd5b8201601f810184136137e457600080fd5b80516137f26136c582613f49565b81815285602083850101111561380757600080fd5b613818826020830160208601613fd3565b95945050505050565b60006020828403121561383357600080fd5b5035919050565b60006020828403121561384c57600080fd5b5051919050565b6000815180845261386b816020860160208601613fd3565b601f01601f19169290920160200192915050565b60008151613891818560208601613fd3565b9290920192915050565b600082516138ad818460208701613fd3565b9190910192915050565b600085516138c9818460208a01613fd3565b8551908301906138dd818360208a01613fd3565b85519101906138f0818360208901613fd3565b8451910190613903818360208801613fd3565b019695505050505050565b6000875160206139218285838d01613fd3565b8851918401916139348184848d01613fd3565b88519201916139468184848c01613fd3565b87519201916139588184848b01613fd3565b865192019161396a8184848a01613fd3565b855192019161397c8184848901613fd3565b919091019998505050505050505050565b6000885160206139a08285838e01613fd3565b8951918401916139b38184848e01613fd3565b89519201916139c58184848d01613fd3565b88519201916139d78184848c01613fd3565b87519201916139e98184848b01613fd3565b86519201916139fb8184848a01613fd3565b8551920191613a0d8184848901613fd3565b919091019a9950505050505050505050565b600089516020613a328285838f01613fd3565b8a5191840191613a458184848f01613fd3565b8a51920191613a578184848e01613fd3565b8951920191613a698184848d01613fd3565b8851920191613a7b8184848c01613fd3565b8751920191613a8d8184848b01613fd3565b8651920191613a9f8184848a01613fd3565b8551920191613ab18184848901613fd3565b919091019b9a5050505050505050505050565b6409a9eaaa8960db1b815260008251613ae4816005850160208701613fd3565b9190910160050192915050565b68534b494e20544f4e4560b81b815260008251613b15816009850160208701613fd3565b9190910160090192915050565b6822aca29021a7a627a960b91b815260008251613b15816009850160208701613fd3565b66474c415353455360c81b815260008251613b68816007850160208701613fd3565b9190910160070192915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251613bad81601d850160208701613fd3565b91909101601d0192915050565b7f7b226e616d65223a2022546865204561737920436c7562202300000000000000815260008451613bf2816019850160208901613fd3565b7f222c20226465736372697074696f6e223a20224f6666696369616c20456173796019918401918201527f426c6f636b2047656e65736973204e465473207c2035303030204c696d69746560398201527f642e20416c6c20617274776f726b20616e64206d65746164617461206172652060598201527f66756c6c79206f6e2d636861696e20616e642072616e646f6d6c792067656e6560798201527f7261746564206174206d696e742e2045616368204e4654206772616e7473206d60998201527f616e7920636f6d6d756e616c20616e642066696e616e6369616c2062656e656660b98201527f69747320756e646572207468652045617379426c6f636b2065636f737973746560d98201526236971160e91b60f9820152613d6c613d5e613d58613d2260fc85018961387f565b7f22696d616765223a2022646174613a696d6167652f7376672b786d6c3b626173815263194d8d0b60e21b602082015260240190565b8661387f565b61227d60f01b815260020190565b9695505050505050565b6a4d4f55544820504945434560a81b815260008251613d9c81600b850160208701613fd3565b91909101600b0192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613d6c90830184613853565b6020815260006135e06020830184613853565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526031908201527f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e736040820152701034b71030903a3930b739b0b1ba34b7b760791b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715613f4157613f416140c1565b604052919050565b600067ffffffffffffffff821115613f6357613f636140c1565b50601f01601f191660200190565b60008219821115613f8457613f84614069565b500190565b600082613f9857613f9861407f565b500490565b6000816000190483118215151615613fb757613fb7614069565b500290565b600082821015613fce57613fce614069565b500390565b60005b83811015613fee578181015183820152602001613fd6565b838111156110fa5750506000910152565b600181811c9082168061401357607f821691505b6020821081141561403457634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561404e5761404e614069565b5060010190565b6000826140645761406461407f565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610dfa57600080fdfe227d2c207b2274726169745f74797065223a2022547970653a20496e76697369626c65222c2276616c7565223a20223c7061746820643d224d3420342e3568316d35203068316d35203068316d35203068316d2d3139203168316d3230203168316d2d3232203268316d2d31203168316d3230203168316d2d31203268316d2d3232203168316d3230203068316d2d31203268316d2d31203168316d2d3232203168316d2d31203268316d2d31203168316d3230203068316d2d31203168316d2d3232203168316d2d31203168316d2d31203168316d32203168316d32203068316d32203068316d38203068316d32203068314d3520342e3568316d32203068316d36203068316d2d313020323168316d35203068316d35203068316d35203068314d3620342e3568316d32203068316d38203068316d3220323168314d3720342e3568316d34203068326d35203068336d31203068336d2d31203168316d2d3232203168316d2d31203168316d3230203068316d2d31203168316d2d31203168316d2d3232203168316d2d31203168316d3230203068316d2d3232203168316d2d31203268316d3230203068316d2d3232203168316d2d31203168316d3230203168316d2d3232203168316d3230203068316d2d31203168316d2d3232203268316d3230203168316d2d31203168316d2d31203168316d2d3232203168326d33203068316d34203068336d32203068316d33203068316d2d31332d323168316d32203068316d32203068316d2d313020323168316d32203068316d35203068316d322030683122207374726f6b653d2223303030222f3e227d2c207b2274726169745f74797065223a2022547970653a2056616d70697265222c2276616c7565223a2022227d2c207b2274726169745f74797065223a20224163636573736f7279222c2276616c7565223a20223c7061746820643d224d382031306833763348387a6d3131203068337633682d337a222066696c6c3d223c7374796c653e23787b73686170652d72656e646572696e673a20637269737065646765733b7d3c2f7374796c653e3c2f7376673e227d2c207b2274726169745f74797065223a2022436c61696d61626c6520526577617264222c2276616c7565223a20224142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f227d2c207b2274726169745f74797065223a202247656e65726174696f6e222c2276616c7565223a2022227d2c207b2274726169745f74797065223a202245617379426c6f636b205374726f6e672053686172657320496e636c75646564222c2276616c7565223a2022227d2c207b2274726169745f74797065223a2022476c6173736573222c2276616c7565223a2022227d2c207b2274726169745f74797065223a20224d6f757468222c2276616c7565223a2022227d2c207b2274726169745f74797065223a202245796520436f6c6f72222c2276616c7565223a2022227d2c207b2274726169745f74797065223a2022547970653a20416c69656e222c2276616c7565223a20223c706174682066696c6c3d22233030302220643d224d392031316831763148397a6d3131203068317631682d317a222f3e3c7376672069643d22782220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d22302030203330203330223e227d2c207b2274726169745f74797065223a2022547970653a205a6f6d626965222c2276616c7565223a20227b2274726169745f74797065223a2022536b696e20546f6e65222c2276616c7565223a2022a26469706673582212209d95ea8d8bbfd9dbbc52a838addd50d752f86f7ebb3c32fc2d4d5a0cc157b38164736f6c63430008070033

Deployed ByteCode Sourcemap

21362:14580:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17331:224;;;;;;;;;;-1:-1:-1;17331:224:0;;;;;:::i;:::-;;:::i;:::-;;;15887:14:1;;15880:22;15862:41;;15850:2;15835:18;17331:224:0;;;;;;;;10390:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;11473:221::-;;;;;;;;;;-1:-1:-1;11473:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;14895:32:1;;;14877:51;;14865:2;14850:18;11473:221:0;14731:203:1;11054:411:0;;;;;;;;;;-1:-1:-1;11054:411:0;;;;;:::i;:::-;;:::i;:::-;;21816:50;;;;;;;;;;-1:-1:-1;21816:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;17827:113;;;;;;;;;;-1:-1:-1;17915:10:0;:17;17827:113;;;25966:25:1;;;25954:2;25939:18;17827:113:0;25820:177:1;21585:32:0;;;;;;;;;;-1:-1:-1;21585:32:0;;;;;;;;12177:339;;;;;;;;;;-1:-1:-1;12177:339:0;;;;;:::i;:::-;;:::i;21927:149::-;;;;;;;;;;-1:-1:-1;21927:149:0;;;;;:::i;:::-;;:::i;17563:256::-;;;;;;;;;;-1:-1:-1;17563:256:0;;;;;:::i;:::-;;:::i;21548:30::-;;;;;;;;;;;;;;;;12524:185;;;;;;;;;;-1:-1:-1;12524:185:0;;;;;:::i;:::-;;:::i;34805:111::-;;;;;;;;;;-1:-1:-1;34805:111:0;;;;;:::i;:::-;;:::i;34599:94::-;;;;;;;;;;-1:-1:-1;34599:94:0;;;;;:::i;:::-;;:::i;17948:233::-;;;;;;;;;;-1:-1:-1;17948:233:0;;;;;:::i;:::-;;:::i;21776:33::-;;;;;;;;;;;;;;;;34701:96;;;;;;;;;;-1:-1:-1;34701:96:0;;;;;:::i;:::-;;:::i;10143:239::-;;;;;;;;;;-1:-1:-1;10143:239:0;;;;;:::i;:::-;;:::i;9927:208::-;;;;;;;;;;-1:-1:-1;9927:208:0;;;;;:::i;:::-;;:::i;3953:94::-;;;;;;;;;;;;;:::i;21514:27::-;;;;;;;;;;;;;;;;22118:122;;;;;;;;;;-1:-1:-1;22118:122:0;;;;;:::i;:::-;;:::i;35202:125::-;;;:::i;34307:188::-;;;;;;:::i;:::-;;:::i;3730:87::-;;;;;;;;;;-1:-1:-1;3803:6:0;;-1:-1:-1;;;;;3803:6:0;3730:87;;34503:88;;;;;;;;;;-1:-1:-1;34503:88:0;;;;;:::i;:::-;;:::i;10498:104::-;;;;;;;;;;;;;:::i;34924:141::-;;;;;;;;;;-1:-1:-1;34924:141:0;;;;;:::i;:::-;;:::i;21476:31::-;;;;;;;;;;;;;;;;33981:318;;;;;;:::i;:::-;;:::i;11702:295::-;;;;;;;;;;-1:-1:-1;11702:295:0;;;;;:::i;:::-;;:::i;21734:35::-;;;;;;;;;;;;;;;;12717:328;;;;;;;;;;-1:-1:-1;12717:328:0;;;;;:::i;:::-;;:::i;33681:292::-;;;;;;:::i;:::-;;:::i;30987:787::-;;;;;;;;;;-1:-1:-1;30987:787:0;;;;;:::i;:::-;;:::i;35073:121::-;;;;;;;;;;-1:-1:-1;35073:121:0;;;;;:::i;:::-;;:::i;21438:31::-;;;;;;;;;;;;;;;;12005:164;;;;;;;;;;-1:-1:-1;12005:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;12126:25:0;;;12102:4;12126:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;12005:164;4055:192;;;;;;;;;;-1:-1:-1;4055:192:0;;;;;:::i;:::-;;:::i;22292:137::-;;;;;;;;;;-1:-1:-1;22292:137:0;;;;;:::i;:::-;;:::i;17331:224::-;17433:4;-1:-1:-1;;;;;;17457:50:0;;-1:-1:-1;;;17457:50:0;;:90;;;17511:36;17535:11;17511:23;:36::i;:::-;17450:97;17331:224;-1:-1:-1;;17331:224:0:o;10390:100::-;10444:13;10477:5;10470:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10390:100;:::o;11473:221::-;11549:7;13465:16;;;:7;:16;;;;;;-1:-1:-1;;;;;13465:16:0;11569:73;;;;-1:-1:-1;;;11569:73:0;;22190:2:1;11569:73:0;;;22172:21:1;22229:2;22209:18;;;22202:30;22268:34;22248:18;;;22241:62;-1:-1:-1;;;22319:18:1;;;22312:42;22371:19;;11569:73:0;;;;;;;;;-1:-1:-1;11662:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;11662:24:0;;11473:221::o;11054:411::-;11135:13;11151:23;11166:7;11151:14;:23::i;:::-;11135:39;;11199:5;-1:-1:-1;;;;;11193:11:0;:2;-1:-1:-1;;;;;11193:11:0;;;11185:57;;;;-1:-1:-1;;;11185:57:0;;23731:2:1;11185:57:0;;;23713:21:1;23770:2;23750:18;;;23743:30;23809:34;23789:18;;;23782:62;-1:-1:-1;;;23860:18:1;;;23853:31;23901:19;;11185:57:0;23529:397:1;11185:57:0;3361:10;-1:-1:-1;;;;;11277:21:0;;;;:62;;-1:-1:-1;11302:37:0;11319:5;3361:10;12005:164;:::i;11302:37::-;11255:168;;;;-1:-1:-1;;;11255:168:0;;19107:2:1;11255:168:0;;;19089:21:1;19146:2;19126:18;;;19119:30;19185:34;19165:18;;;19158:62;19256:26;19236:18;;;19229:54;19300:19;;11255:168:0;18905:420:1;11255:168:0;11436:21;11445:2;11449:7;11436:8;:21::i;:::-;11124:341;11054:411;;:::o;12177:339::-;12372:41;3361:10;12405:7;12372:18;:41::i;:::-;12364:103;;;;-1:-1:-1;;;12364:103:0;;;;;;;:::i;:::-;12480:28;12490:4;12496:2;12500:7;12480:9;:28::i;21927:149::-;3803:6;;-1:-1:-1;;;;;3803:6:0;3361:10;3865:23;3857:68;;;;-1:-1:-1;;;3857:68:0;;;;;;;:::i;:::-;22012:26:::1;:56:::0;;-1:-1:-1;;;;;;22012:56:0::1;-1:-1:-1::0;;;;;22012:56:0;;;::::1;::::0;;;::::1;::::0;;21927:149::o;17563:256::-;17660:7;17696:23;17713:5;17696:16;:23::i;:::-;17688:5;:31;17680:87;;;;-1:-1:-1;;;17680:87:0;;16340:2:1;17680:87:0;;;16322:21:1;16379:2;16359:18;;;16352:30;16418:34;16398:18;;;16391:62;-1:-1:-1;;;16469:18:1;;;16462:41;16520:19;;17680:87:0;16138:407:1;17680:87:0;-1:-1:-1;;;;;;17785:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;17563:256::o;12524:185::-;12662:39;12679:4;12685:2;12689:7;12662:39;;;;;;;;;;;;:16;:39::i;34805:111::-;3803:6;;-1:-1:-1;;;;;3803:6:0;3361:10;3865:23;3857:68;;;;-1:-1:-1;;;3857:68:0;;;;;;;:::i;:::-;34878:13:::1;:30:::0;;-1:-1:-1;;34878:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;34805:111::o;34599:94::-;3803:6;;-1:-1:-1;;;;;3803:6:0;3361:10;3865:23;3857:68;;;;-1:-1:-1;;;3857:68:0;;;;;;;:::i;:::-;34666:8:::1;:19:::0;34599:94::o;17948:233::-;18023:7;18059:30;17915:10;:17;;17827:113;18059:30;18051:5;:38;18043:95;;;;-1:-1:-1;;;18043:95:0;;24904:2:1;18043:95:0;;;24886:21:1;24943:2;24923:18;;;24916:30;24982:34;24962:18;;;24955:62;-1:-1:-1;;;25033:18:1;;;25026:42;25085:19;;18043:95:0;24702:408:1;18043:95:0;18156:10;18167:5;18156:17;;;;;;;;:::i;:::-;;;;;;;;;18149:24;;17948:233;;;:::o;34701:96::-;3803:6;;-1:-1:-1;;;;;3803:6:0;3361:10;3865:23;3857:68;;;;-1:-1:-1;;;3857:68:0;;;;;;;:::i;:::-;34769:7:::1;:20:::0;34701:96::o;10143:239::-;10215:7;10251:16;;;:7;:16;;;;;;-1:-1:-1;;;;;10251:16:0;10286:19;10278:73;;;;-1:-1:-1;;;10278:73:0;;19943:2:1;10278:73:0;;;19925:21:1;19982:2;19962:18;;;19955:30;20021:34;20001:18;;;19994:62;-1:-1:-1;;;20072:18:1;;;20065:39;20121:19;;10278:73:0;19741:405:1;9927:208:0;9999:7;-1:-1:-1;;;;;10027:19:0;;10019:74;;;;-1:-1:-1;;;10019:74:0;;19532:2:1;10019:74:0;;;19514:21:1;19571:2;19551:18;;;19544:30;19610:34;19590:18;;;19583:62;-1:-1:-1;;;19661:18:1;;;19654:40;19711:19;;10019:74:0;19330:406:1;10019:74:0;-1:-1:-1;;;;;;10111:16:0;;;;;:9;:16;;;;;;;9927:208::o;3953:94::-;3803:6;;-1:-1:-1;;;;;3803:6:0;3361:10;3865:23;3857:68;;;;-1:-1:-1;;;3857:68:0;;;;;;;:::i;:::-;4018:21:::1;4036:1;4018:9;:21::i;:::-;3953:94::o:0;22118:122::-;3803:6;;-1:-1:-1;;;;;3803:6:0;3361:10;3865:23;3857:68;;;;-1:-1:-1;;;3857:68:0;;;;;;;:::i;:::-;22194:17:::1;:38:::0;;-1:-1:-1;;;;;;22194:38:0::1;-1:-1:-1::0;;;;;22194:38:0;;;::::1;::::0;;;::::1;::::0;;22118:122::o;35202:125::-;3803:6;;-1:-1:-1;;;;;3803:6:0;3361:10;3865:23;3857:68;;;;-1:-1:-1;;;3857:68:0;;;;;;;:::i;:::-;35269:49:::1;::::0;3361:10;;35296:21:::1;35269:49:::0;::::1;;;::::0;::::1;::::0;;;35296:21;3361:10;35269:49;::::1;;;;;;35261:58;;;::::0;::::1;34307:188:::0;34397:13;;;;34389:46;;;;-1:-1:-1;;;34389:46:0;;25317:2:1;34389:46:0;;;25299:21:1;25356:2;25336:18;;;25329:30;-1:-1:-1;;;25375:18:1;;;25368:50;25435:18;;34389:46:0;25115:344:1;34389:46:0;34446:41;3361:10;34472:14;34446:11;:41::i;:::-;34307:188;:::o;34503:88::-;3803:6;;-1:-1:-1;;;;;3803:6:0;3361:10;3865:23;3857:68;;;;-1:-1:-1;;;3857:68:0;;;;;;;:::i;:::-;34567:5:::1;:16:::0;34503:88::o;10498:104::-;10554:13;10587:7;10580:14;;;;;:::i;34924:141::-;3803:6;;-1:-1:-1;;;;;3803:6:0;3361:10;3865:23;3857:68;;;;-1:-1:-1;;;3857:68:0;;;;;;;:::i;:::-;35013:19:::1;:44:::0;;;::::1;;;;-1:-1:-1::0;;35013:44:0;;::::1;::::0;;;::::1;::::0;;34924:141::o;33981:318::-;34118:17;;-1:-1:-1;;;;;34118:17:0;:28;3361:10;34118:42;;-1:-1:-1;;;;;;34118:42:0;;;;;;;-1:-1:-1;;;;;14895:32:1;;;34118:42:0;;;14877:51:1;14850:18;;34118:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34093:21;:14;34110:4;34093:21;:::i;:::-;:67;;34085:97;;;;-1:-1:-1;;;34085:97:0;;21492:2:1;34085:97:0;;;21474:21:1;21531:2;21511:18;;;21504:30;-1:-1:-1;;;21550:18:1;;;21543:47;21607:18;;34085:97:0;21290:341:1;34085:97:0;34193:98;34198:13;34212:14;34271:19;34212:14;34286:4;34271:19;:::i;:::-;34228:17;;-1:-1:-1;;;;;34228:17:0;:28;3361:10;34228:42;;-1:-1:-1;;;;;;34228:42:0;;;;;;;-1:-1:-1;;;;;14895:32:1;;;34228:42:0;;;14877:51:1;14850:18;;34228:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;;;;:::i;:::-;34193:4;:98::i;:::-;33981:318;;:::o;11702:295::-;-1:-1:-1;;;;;11805:24:0;;3361:10;11805:24;;11797:62;;;;-1:-1:-1;;;11797:62:0;;18340:2:1;11797:62:0;;;18322:21:1;18379:2;18359:18;;;18352:30;18418:27;18398:18;;;18391:55;18463:18;;11797:62:0;18138:349:1;11797:62:0;3361:10;11872:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;11872:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;11872:53:0;;;;;;;;;;11941:48;;15862:41:1;;;11872:42:0;;3361:10;11941:48;;15835:18:1;11941:48:0;;;;;;;11702:295;;:::o;12717:328::-;12892:41;3361:10;12925:7;12892:18;:41::i;:::-;12884:103;;;;-1:-1:-1;;;12884:103:0;;;;;;;:::i;:::-;12998:39;13012:4;13018:2;13022:7;13031:5;12998:13;:39::i;:::-;12717:328;;;;:::o;33681:292::-;33793:17;;-1:-1:-1;;;;;33793:17:0;:28;3361:10;33793:42;;-1:-1:-1;;;;;;33793:42:0;;;;;;;-1:-1:-1;;;;;14895:32:1;;;33793:42:0;;;14877:51:1;14850:18;;33793:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33768:21;:14;33785:4;33768:21;:::i;:::-;:67;;33760:97;;;;-1:-1:-1;;;33760:97:0;;21492:2:1;33760:97:0;;;21474:21:1;21531:2;21511:18;;;21504:30;-1:-1:-1;;;21550:18:1;;;21543:47;21607:18;;33760:97:0;21290:341:1;33760:97:0;33868;3361:10;33886:14;33945:19;33886:14;33960:4;33945:19;:::i;30987:787::-;31052:13;31097:15;;31086:7;:26;;31078:35;;;;;;31124:34;31161:25;31178:7;31161:16;:25::i;:::-;31124:62;;31197:18;31218:445;31291:17;31300:7;31291:8;:17::i;:::-;31541:30;31551:10;31563:7;31541:9;:30::i;:::-;31613:40;31633:18;31640:10;31633:6;:18::i;:::-;31613:13;:40::i;:::-;31245:415;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;31218:13;:445::i;:::-;31197:466;;31738:4;31688:55;;;;;;;;:::i;:::-;;;;-1:-1:-1;;31688:55:0;;;;;;;;;;30987:787;-1:-1:-1;;;;30987:787:0:o;35073:121::-;3803:6;;-1:-1:-1;;;;;3803:6:0;3361:10;3865:23;3857:68;;;;-1:-1:-1;;;3857:68:0;;;;;;;:::i;:::-;35152:14:::1;:34:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;35152:34:0;;::::1;::::0;;;::::1;::::0;;35073:121::o;4055:192::-;3803:6;;-1:-1:-1;;;;;3803:6:0;3361:10;3865:23;3857:68;;;;-1:-1:-1;;;3857:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4144:22:0;::::1;4136:73;;;::::0;-1:-1:-1;;;4136:73:0;;17171:2:1;4136:73:0::1;::::0;::::1;17153:21:1::0;17210:2;17190:18;;;17183:30;17249:34;17229:18;;;17222:62;-1:-1:-1;;;17300:18:1;;;17293:36;17346:19;;4136:73:0::1;16969:402:1::0;4136:73:0::1;4220:19;4230:8;4220:9;:19::i;22292:137::-:0;3803:6;;-1:-1:-1;;;;;3803:6:0;3361:10;3865:23;3857:68;;;;-1:-1:-1;;;3857:68:0;;;;;;;:::i;:::-;22373:22:::1;:48:::0;;-1:-1:-1;;;;;;22373:48:0::1;-1:-1:-1::0;;;;;22373:48:0;;;::::1;::::0;;;::::1;::::0;;22292:137::o;9614:305::-;9716:4;-1:-1:-1;;;;;;9753:40:0;;-1:-1:-1;;;9753:40:0;;:105;;-1:-1:-1;;;;;;;9810:48:0;;-1:-1:-1;;;9810:48:0;9753:105;:158;;;-1:-1:-1;;;;;;;;;;8999:40:0;;;9875:36;8890:157;15606:174;15681:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;15681:29:0;-1:-1:-1;;;;;15681:29:0;;;;;;;;:24;;15735:23;15681:24;15735:14;:23::i;:::-;-1:-1:-1;;;;;15726:46:0;;;;;;;;;;;15606:174;;:::o;13511:348::-;13604:4;13465:16;;;:7;:16;;;;;;-1:-1:-1;;;;;13465:16:0;13621:73;;;;-1:-1:-1;;;13621:73:0;;18694:2:1;13621:73:0;;;18676:21:1;18733:2;18713:18;;;18706:30;18772:34;18752:18;;;18745:62;-1:-1:-1;;;18823:18:1;;;18816:42;18875:19;;13621:73:0;18492:408:1;13621:73:0;13705:13;13721:23;13736:7;13721:14;:23::i;:::-;13705:39;;13774:5;-1:-1:-1;;;;;13763:16:0;:7;-1:-1:-1;;;;;13763:16:0;;:51;;;;13807:7;-1:-1:-1;;;;;13783:31:0;:20;13795:7;13783:11;:20::i;:::-;-1:-1:-1;;;;;13783:31:0;;13763:51;:87;;;-1:-1:-1;;;;;;12126:25:0;;;12102:4;12126:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;13818:32;13755:96;13511:348;-1:-1:-1;;;;13511:348:0:o;15072:526::-;15231:4;-1:-1:-1;;;;;15204:31:0;:23;15219:7;15204:14;:23::i;:::-;-1:-1:-1;;;;;15204:31:0;;15196:85;;;;-1:-1:-1;;;15196:85:0;;22964:2:1;15196:85:0;;;22946:21:1;23003:2;22983:18;;;22976:30;23042:34;23022:18;;;23015:62;-1:-1:-1;;;23093:18:1;;;23086:39;23142:19;;15196:85:0;22762:405:1;15196:85:0;-1:-1:-1;;;;;15300:16:0;;15292:65;;;;-1:-1:-1;;;15292:65:0;;17935:2:1;15292:65:0;;;17917:21:1;17974:2;17954:18;;;17947:30;18013:34;17993:18;;;17986:62;-1:-1:-1;;;18064:18:1;;;18057:34;18108:19;;15292:65:0;17733:400:1;15292:65:0;15370:39;15391:4;15397:2;15401:7;15370:20;:39::i;:::-;15422:29;15439:1;15443:7;15422:8;:29::i;:::-;-1:-1:-1;;;;;15464:15:0;;;;;;:9;:15;;;;;:20;;15483:1;;15464:15;:20;;15483:1;;15464:20;:::i;:::-;;;;-1:-1:-1;;;;;;;15495:13:0;;;;;;:9;:13;;;;;:18;;15512:1;;15495:13;:18;;15512:1;;15495:18;:::i;:::-;;;;-1:-1:-1;;15524:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;15524:21:0;-1:-1:-1;;;;;15524:21:0;;;;;;;;;15563:27;;15524:16;;15563:27;;;;;;;15072:526;;;:::o;4255:173::-;4330:6;;;-1:-1:-1;;;;;4347:17:0;;;-1:-1:-1;;;;;;4347:17:0;;;;;;;4380:40;;4330:6;;;4347:17;4330:6;;4380:40;;4311:16;;4380:40;4300:128;4255:173;:::o;32922:751::-;33031:9;;17915:10;:17;33015:25;33007:65;;;;-1:-1:-1;;;33007:65:0;;25666:2:1;33007:65:0;;;25648:21:1;25705:2;25685:18;;;25678:30;25744:29;25724:18;;;25717:57;25791:18;;33007:65:0;25464:351:1;33007:65:0;33125:9;;33107:14;33091:13;17915:10;:17;;17827:113;33091:13;:30;;;;:::i;:::-;:43;;33083:87;;;;-1:-1:-1;;;33083:87:0;;20353:2:1;33083:87:0;;;20335:21:1;20392:2;20372:18;;;20365:30;20431:33;20411:18;;;20404:61;20482:18;;33083:87:0;20151:355:1;33083:87:0;33209:7;;33191:14;:25;;33183:87;;;;-1:-1:-1;;;33183:87:0;;;;;;;:::i;:::-;33306:1;33289:14;:18;33281:59;;;;-1:-1:-1;;;33281:59:0;;23374:2:1;33281:59:0;;;23356:21:1;23413:2;23393:18;;;23386:30;23452;23432:18;;;23425:58;23500:18;;33281:59:0;23172:352:1;33281:59:0;33388:9;33370:14;33359:8;;:25;;;;:::i;:::-;:38;33351:74;;;;-1:-1:-1;;;33351:74:0;;21838:2:1;33351:74:0;;;21820:21:1;21877:2;21857:18;;;21850:30;-1:-1:-1;;;21896:18:1;;;21889:53;21959:18;;33351:74:0;21636:347:1;33351:74:0;33443:9;33438:228;33462:14;33458:1;:18;33438:228;;;33498:15;33516;;33534:1;33516:19;;;;:::i;:::-;33498:37;;33550:31;33560:11;33573:7;33550:9;:31::i;:::-;33615:1;33596:15;;:20;;;;;;;:::i;:::-;;;;;;;;33653:1;33631:18;;:23;;;;;;;:::i;:::-;;;;-1:-1:-1;33478:3:0;;-1:-1:-1;33478:3:0;;-1:-1:-1;33478:3:0;;:::i;:::-;;;;33438:228;;31782:1132;31910:9;;17915:10;:17;31894:25;31886:65;;;;-1:-1:-1;;;31886:65:0;;25666:2:1;31886:65:0;;;25648:21:1;25705:2;25685:18;;;25678:30;25744:29;25724:18;;;25717:57;25791:18;;31886:65:0;25464:351:1;31886:65:0;32004:9;;31986:14;31970:13;17915:10;:17;;17827:113;31970:13;:30;;;;:::i;:::-;:43;;31962:87;;;;-1:-1:-1;;;31962:87:0;;20353:2:1;31962:87:0;;;20335:21:1;20392:2;20372:18;;;20365:30;20431:33;20411:18;;;20404:61;20482:18;;31962:87:0;20151:355:1;31962:87:0;32088:7;;32070:14;:25;;32062:87;;;;-1:-1:-1;;;32062:87:0;;;;;;;:::i;:::-;32185:1;32168:14;:18;32160:59;;;;-1:-1:-1;;;32160:59:0;;23374:2:1;32160:59:0;;;23356:21:1;23413:2;23393:18;;;23386:30;23452;23432:18;;;23425:58;23500:18;;32160:59:0;23172:352:1;32160:59:0;32264:9;32246:14;32238:5;;:22;;;;:::i;:::-;:35;32230:71;;;;-1:-1:-1;;;32230:71:0;;21838:2:1;32230:71:0;;;21820:21:1;21877:2;21857:18;;;21850:30;-1:-1:-1;;;21896:18:1;;;21889:53;21959:18;;32230:71:0;21636:347:1;32230:71:0;32319:9;32314:442;32338:14;32334:1;:18;32314:442;;;32374:15;32392;;32410:1;32392:19;;;;:::i;:::-;32374:37;;32426:31;32436:11;32449:7;32426:9;:31::i;:::-;32491:1;32472:15;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;;32507:27:0;;;;:18;:27;;;;;;;:34;;-1:-1:-1;;32507:34:0;32537:4;32507:34;;;32589:26;;:47;;-1:-1:-1;;;32589:47:0;;;;;25966:25:1;;;-1:-1:-1;;;;;32589:26:0;;;;:38;;25939:18:1;;32589:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32688:17:0;;-1:-1:-1;;;;;32688:17:0;;-1:-1:-1;32688:36:0;;-1:-1:-1;3361:10:0;32688:56;;-1:-1:-1;;;;;;32688:56:0;;;;;;;-1:-1:-1;;;;;15635:32:1;;;32688:56:0;;;15617:51:1;32739:4:0;15684:18:1;;;15677:34;15590:18;;32688:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32359:397;32354:3;;;;;:::i;:::-;;;;32314:442;;;-1:-1:-1;32815:17:0;;32861:16;;-1:-1:-1;;;;;32815:17:0;:28;3361:10;32815:42;;-1:-1:-1;;;;;;32815:42:0;;;;;;;-1:-1:-1;;;;;14895:32:1;;;32815:42:0;;;14877:51:1;14850:18;;32815:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;32807:99;;;;-1:-1:-1;;;32807:99:0;;24551:2:1;32807:99:0;;;24533:21:1;24590:2;24570:18;;;24563:30;24629:26;24609:18;;;24602:54;24673:18;;32807:99:0;24349:348:1;13053:315:0;13210:28;13220:4;13226:2;13230:7;13210:9;:28::i;:::-;13257:48;13280:4;13286:2;13290:7;13299:5;13257:22;:48::i;:::-;13249:111;;;;-1:-1:-1;;;13249:111:0;;;;;;;:::i;22610:465::-;22676:23;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22676:23:0;22722:34;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22722:34:0;22791:20;22803:7;22791:11;:20::i;:::-;22769:42;;22844:20;22856:7;22844:11;:20::i;:::-;22822:19;;;:42;22896:19;22907:7;22896:10;:19::i;:::-;22875:18;;;:40;22945:17;22954:7;22945:8;:17::i;:::-;22926:16;;;:36;;;22997:40;;23011:7;;22997:13;:40::i;:::-;22973:21;;;:64;:10;22610:465;-1:-1:-1;;22610:465:0:o;35335:534::-;35391:13;35423:10;35419:53;;-1:-1:-1;;35450:10:0;;;;;;;;;;;;-1:-1:-1;;;35450:10:0;;;;;35335:534::o;35419:53::-;35497:5;35482:12;35538:78;35545:9;;35538:78;;35571:8;;;;:::i;:::-;;-1:-1:-1;35594:10:0;;-1:-1:-1;35602:2:0;35594:10;;:::i;:::-;;;35538:78;;;35626:19;35658:6;35648:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35648:17:0;;35626:39;;35676:154;35683:10;;35676:154;;35710:11;35720:1;35710:11;;:::i;:::-;;-1:-1:-1;35779:10:0;35787:2;35779:5;:10;:::i;:::-;35766:24;;:2;:24;:::i;:::-;35753:39;;35736:6;35743;35736:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;35736:56:0;;;;;;;;-1:-1:-1;35807:11:0;35816:2;35807:11;;:::i;:::-;;;35676:154;;23087:3368;23182:13;23218:23;;:::i;:::-;23262:30;;;;;;;;;;;-1:-1:-1;;;23262:30:0;;;;;;;;;;;23303:50;;;;;;;;;;;;;;;;;;:8;;;:50;23375:22;;23412:19;;23375:57;;-1:-1:-1;;;23375:57:0;;;;;25966:25:1;;;;-1:-1:-1;;;;;23375:22:0;;;;:36;;25939:18:1;;23375:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23375:57:0;;;;;;;;;;;;:::i;:::-;23364:8;;;;:68;;;;23443:54;;;;;;;;;;;;;23364:8;23443:54;;;:8;;;:54;23519:22;;23443:8;23556:19;;;23519:57;;-1:-1:-1;;;23519:57:0;;;;;25966:25:1;;;;-1:-1:-1;;;;;23519:22:0;;;;:36;;25939:18:1;;23519:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23519:57:0;;;;;;;;;;;;:::i;:::-;23508:8;;;:68;23587:52;;;;;;;;;;;;;;23508:8;23587:52;;;:8;;;:52;23661:22;;23697:18;;;;;23661:55;;-1:-1:-1;;;23661:55:0;;;;;25966:25:1;;;;-1:-1:-1;;;;;23661:22:0;;;;:35;;25939:18:1;;23661:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23661:55:0;;;;;;;;;;;;:::i;:::-;23650:8;;;:66;23727:50;;;;;;;;;;;;;;23650:8;23727:50;;;:8;;;:50;23799:22;;23833:16;;;;23799:51;;-1:-1:-1;;;23799:51:0;;;;;25966:25:1;;;;-1:-1:-1;;;;;23799:22:0;;;;:33;;25939:18:1;;23799:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23799:51:0;;;;;;;;;;;;:::i;:::-;23788:8;;;:62;23861:54;;;;;;;;;;;;;;23788:8;23861:54;;;:8;;;:54;23938:22;;23977:21;;;;23938:61;;-1:-1:-1;;;23938:61:0;;;;;25966:25:1;;;;-1:-1:-1;;;;;23938:22:0;;;;:38;;25939:18:1;;23938:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23938:61:0;;;;;;;;;;;;:::i;:::-;23926:9;;;:73;24050:61;;;;;;;;;;;;;;23926:9;24050:61;;;:9;;;:61;24125:19;;24148:2;24125:25;24122:123;;;24167:17;;;;;;;;;;;;-1:-1:-1;;;24167:17:0;;;;:9;;;:17;24122:123;;;24217:16;;;;;;;;;;;;-1:-1:-1;;;24217:16:0;;;;:9;;;:16;24122:123;24274:58;;;;;;;;;;;;;;;;;:9;;;:58;24346:19;;24369:2;24346:25;;:50;;;24375:10;:16;;;24395:1;24375:21;24346:50;24343:148;;;24413:17;;;;;;;;;;;;-1:-1:-1;;;24413:17:0;;;;:9;;;:17;24343:148;;;24463:16;;;;;;;;;;;;-1:-1:-1;;;24463:16:0;;;;:9;;;:16;24343:148;24519:57;;;;;;;;;;;;;;;;;:9;;;:57;24591:19;;24614:2;24591:25;;:54;;;24620:10;:19;;;24643:2;24620:25;24591:54;24587:153;;;24662:17;;;;;;;;;;;;-1:-1:-1;;;24662:17:0;;;;:9;;;:17;24587:153;;;24712:16;;;;;;;;;;;;-1:-1:-1;;;24712:16:0;;;;:9;;;:16;24587:153;24770:59;;;;;;;;;;;;;;;;;:9;;;:59;:9;24843:19;;;24866:2;24843:25;;:50;;;24872:10;:16;;;24892:1;24872:21;24843:50;24840:148;;;24910:17;;;;;;;;;;;;-1:-1:-1;;;24910:17:0;;;;:9;;;:17;24840:148;;;24960:16;;;;;;;;;;;;-1:-1:-1;;;24960:16:0;;;;:9;;;:16;24840:148;25022:56;;;;;;;;;;;;;;;;;:9;;;:56;25103:3;25093:13;;25089:134;;;25123:15;;;;;;;;;;;;-1:-1:-1;;;25123:15:0;;;;:9;;;:15;25089:134;;;25183:28;25192:14;25202:4;25192:7;:14;:::i;:::-;:18;;25209:1;25192:18;:::i;:::-;25183:8;:28::i;:::-;25171:9;;;:40;25089:134;25268:27;;;;:18;:27;;;;;;;;25265:557;;;25315:19;;;;;;;25312:180;;;25355:62;;;;;;;;;;;;;;;;;:9;;;:62;25449:27;25468:7;25449:18;:27::i;:::-;25436:10;;;:40;25312:180;25509:14;;;;;;;25506:305;;;25544:78;;;;;;;;;;;;;;;;;:9;;;:78;25644:27;;;;:18;25544:9;25644:27;;;;;;;25641:155;;;25696:16;;;;;;;;;;;;-1:-1:-1;;;25696:16:0;;;;:9;;;:16;25641:155;;;25761:15;;;;;;;;;;;;-1:-1:-1;;;25761:15:0;;;;:9;;;:15;25641:155;25832:19;;;;;;;;;;;-1:-1:-1;;;25832:19:0;;;;;;;;:9;;;:19;;;;25949:8;;25959;;;;25969;;;;25979;;;;25989;;;;25999;;;;26009;;;;26019;;;;25932:96;;-1:-1:-1;;25932:96:0;;26019:8;;25932:96;;:::i;:::-;;;;;;;-1:-1:-1;;25932:96:0;;;;;;;26095:8;;;;26105;;;;26115:9;;;;26126;;;;26137;;;;26148;;;;26159;;;;25932:96;;-1:-1:-1;26070:99:0;;25932:96;;26159:9;26095:8;26070:99;;:::i;:::-;;;;;;;-1:-1:-1;;26070:99:0;;;;;;;26236:9;;;;26247;;;;26258;;;;26269;;;;26280;;;;26291;;;;26070:99;;-1:-1:-1;26211:90:0;;26070:99;;26291:9;26236;26211:90;;:::i;:::-;;;;;;;-1:-1:-1;;26211:90:0;;;;;;;26368:9;;;;26379;;;;26390;;;;26401;;;;26412;;;;26211:90;;-1:-1:-1;26343:79:0;;26211:90;;26412:9;26368;26343:79;;:::i;:::-;;;;;;;-1:-1:-1;;26343:79:0;;;;;;;23087:3368;-1:-1:-1;;;;;23087:3368:0:o;28877:2102::-;28952:13;28978:23;;:::i;:::-;29014:116;;;;;;;;;;;;;;;;;;;29168:19;;29190:2;-1:-1:-1;29165:325:0;;;29220:22;;29258:19;;29220:58;;-1:-1:-1;;;29220:58:0;;-1:-1:-1;;;;;29220:22:0;;;;:37;;:58;;;;25966:25:1;;;25954:2;25939:18;;25820:177;29220:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29220:58:0;;;;;;;;;;;;:::i;:::-;29209:8;;;:69;29165:325;;;29320:43;;;;;;;;;;;;;;;;;;;;:8;;:43;29389:22;;29427:19;;29389:58;;-1:-1:-1;;;29389:58:0;;;;;25966:25:1;;;;-1:-1:-1;;;;;29389:22:0;;:37;;25939:18:1;;29389:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29389:58:0;;;;;;;;;;;;:::i;:::-;29378:8;;;;:69;;;;29462:16;;;;;;;;;;;-1:-1:-1;;;29378:8:0;29462:16;;;:8;;;:16;29165:325;29520:566;;;;;;;;;;;;;;;;;:8;;;:566;30119:55;;;;;;;;;;;;;;29520:8;30119:55;;;:8;;;:55;30196:22;;30119:8;30234:19;;;30196:58;;-1:-1:-1;;;30196:58:0;;;;;25966:25:1;;;;-1:-1:-1;;;;;30196:22:0;;;;:37;;25939:18:1;;30196:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30196:58:0;;;;;;;;;;;;:::i;:::-;30185:8;;;:69;30265:16;;;;;;;;;;;;-1:-1:-1;;;30185:8:0;30265:16;;;30185:5;30271:1;30265:8;;;:16;;;;30310:62;;;;;;;;;;;;;;;;;:8;;;:62;30394:22;;30431:18;;;;;30394:56;;-1:-1:-1;;;30394:56:0;;;;;25966:25:1;;;;-1:-1:-1;;;;;30394:22:0;;;;:36;;25939:18:1;;30394:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30394:56:0;;;;;;;;;;;;:::i;:::-;30383:8;;;:67;30473:22;;30508:16;;;;30473:52;;-1:-1:-1;;;30473:52:0;;;;;25966:25:1;;;;-1:-1:-1;;;;;30473:22:0;;;;:34;;25939:18:1;;30473:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30473:52:0;;;;;;;;;;;;:::i;:::-;30461:9;;;:64;30548:22;;30588:21;;;;30548:62;;-1:-1:-1;;;30548:62:0;;;;;25966:25:1;;;;-1:-1:-1;;;;;30548:22:0;;;;:39;;25939:18:1;;30548:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30548:62:0;;;;;;;;;;;;:::i;:::-;30536:9;;;:74;30621:67;;;;;;;;;;;;;;30536:9;30621:67;;;:9;;;:67;30748:8;;30621:9;30758:8;;;;30768;;;;;30778;;;;30788;;;;30798;;;;30808;;;;30818;;;;30731:96;;30701:20;;30731:96;;30748:8;;30758;30818;30731:96;;:::i;:::-;;;;;;;-1:-1:-1;;30731:96:0;;;;;;;30894:8;;;;30903;;;;30912:9;;;;30923;;;;30934;;;;30731:96;;-1:-1:-1;30869:75:0;;30731:96;;30934:9;30894:8;30869:75;;:::i;36075:1523::-;36173:11;;36133:13;;36199:8;36195:23;;-1:-1:-1;;36209:9:0;;;;;;;;;-1:-1:-1;36209:9:0;;;36075:1523;-1:-1:-1;36075:1523:0:o;36195:23::-;36231:18;36269:1;36258:7;:3;36264:1;36258:7;:::i;:::-;36257:13;;;;:::i;:::-;36252:19;;:1;:19;:::i;:::-;36231:40;-1:-1:-1;36284:19:0;36316:15;36231:40;36329:2;36316:15;:::i;:::-;36306:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36306:26:0;;36284:48;;36345:18;36366:5;;;;;;;;;;;;;;;;;36345:26;;36435:1;36428:5;36424:13;36480:2;36472:6;36468:15;36531:1;36499:777;36554:3;36551:1;36548:10;36499:777;;;36609:1;36652:12;;;;;36646:19;36747:4;36735:2;36731:14;;;;;36713:40;;36707:47;36856:2;36852:14;;;36848:25;;36834:40;;36828:47;36985:1;36981:13;;;36977:24;;36963:39;;36957:46;37105:16;;;;37091:31;;37085:38;36783:1;36779:11;;;36877:4;36824:58;;;36815:68;36908:11;;36953:57;;;36944:67;;;;37036:11;;37081:49;;37072:59;37160:3;37156:13;37189:22;;37259:1;37244:17;;;;36602:9;36499:777;;;36503:44;37308:1;37303:3;37299:11;37329:1;37324:84;;;;37427:1;37422:82;;;;37292:212;;37324:84;-1:-1:-1;;;;;37357:17:0;;37350:43;37324:84;;37422:82;-1:-1:-1;;;;;37455:17:0;;37448:41;37292:212;-1:-1:-1;;;37520:26:0;;;37527:6;36075:1523;-1:-1:-1;;;;36075:1523:0:o;18189:589::-;-1:-1:-1;;;;;18395:18:0;;18391:187;;18430:40;18462:7;19119:10;:17;;19092:24;;;;:15;:24;;;;;:44;;;19147:24;;;;;;;;;;;;19015:164;18430:40;18391:187;;;18500:2;-1:-1:-1;;;;;18492:10:0;:4;-1:-1:-1;;;;;18492:10:0;;18488:90;;18519:47;18552:4;18558:7;18519:32;:47::i;:::-;-1:-1:-1;;;;;18592:16:0;;18588:183;;18625:45;18662:7;18625:36;:45::i;18588:183::-;18698:4;-1:-1:-1;;;;;18692:10:0;:2;-1:-1:-1;;;;;18692:10:0;;18688:83;;18719:40;18747:2;18751:7;18719:27;:40::i;13867:110::-;13943:26;13953:2;13957:7;13943:26;;;;;;;;;;;;:9;:26::i;15788:803::-;15943:4;-1:-1:-1;;;;;15964:13:0;;5460:20;5508:8;15960:624;;16000:72;;-1:-1:-1;;;16000:72:0;;-1:-1:-1;;;;;16000:36:0;;;;;:72;;3361:10;;16051:4;;16057:7;;16066:5;;16000:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16000:72:0;;;;;;;;-1:-1:-1;;16000:72:0;;;;;;;;;;;;:::i;:::-;;;15996:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16246:13:0;;16242:272;;16289:60;;-1:-1:-1;;;16289:60:0;;;;;;;:::i;16242:272::-;16464:6;16458:13;16449:6;16445:2;16441:15;16434:38;15996:533;-1:-1:-1;;;;;;16123:55:0;-1:-1:-1;;;16123:55:0;;-1:-1:-1;16116:62:0;;15960:624;-1:-1:-1;16568:4:0;15788:803;;;;;;:::o;27096:336::-;27157:7;27182:12;27197:64;27241:17;27250:7;27241:8;:17::i;:::-;27211:48;;;;;;;;:::i;:::-;;;;;;;;;;;;;27197:6;:64::i;:::-;27182:79;-1:-1:-1;27274:10:0;27287:11;27294:4;27182:79;27287:11;:::i;:::-;27274:24;;27352:3;27347:2;:8;27343:82;;27365:7;27370:2;27365;:7;:::i;27343:82::-;27416:7;27421:2;27416;:7;:::i;27440:315::-;27501:7;27525:12;27540:64;27584:17;27593:7;27584:8;:17::i;:::-;27554:48;;;;;;;;:::i;27540:64::-;27525:79;-1:-1:-1;27617:10:0;27630:11;27637:4;27525:79;27630:11;:::i;:::-;27617:24;;27694:3;27689:2;:8;27686:62;;27707:7;27712:2;27707;:7;:::i;27686:62::-;27739:7;27744:2;27739;:7;:::i;27763:347::-;27823:7;27848:12;27863:62;27905:17;27914:7;27905:8;:17::i;:::-;27877:46;;;;;;;;:::i;27863:62::-;27848:77;-1:-1:-1;27938:10:0;27951:11;27958:4;27848:77;27951:11;:::i;:::-;27938:24;;28017:3;28011:2;:9;28007:83;;28030:7;28035:2;28030;:7;:::i;28007:83::-;-1:-1:-1;28086:1:0;;27763:347;-1:-1:-1;;;27763:347:0:o;28118:312::-;28176:7;28201:12;28216:60;28256:17;28265:7;28256:8;:17::i;:::-;28230:44;;;;;;;;:::i;28216:60::-;28201:75;-1:-1:-1;28289:10:0;28302:11;28309:4;28201:75;28302:11;:::i;:::-;28289:24;;28371:3;28365:2;:9;28362:61;;28384:6;28389:1;28384:2;:6;:::i;28362:61::-;28415:6;28420:1;28415:2;:6;:::i;28438:431::-;28519:7;28542:9;28555:1;28542:14;:32;;;;28560:9;28573:1;28560:14;28542:32;:50;;;;28578:9;28591:1;28578:14;28542:50;28539:90;;;-1:-1:-1;28616:1:0;28609:8;;28539:90;28639:12;28654:66;28700:17;28709:7;28700:8;:17::i;:::-;28668:50;;;;;;;;:::i;28654:66::-;28639:81;-1:-1:-1;28733:10:0;28746:11;28753:4;28639:81;28746:11;:::i;:::-;28733:24;;28815:3;28809:2;:9;28806:56;;28828:6;28833:1;28828:2;:6;:::i;:::-;28821:13;;;;;;28806:56;28859:1;28852:8;;;;;;26463:479;26532:13;26558:22;;:::i;:::-;26609:26;;:52;;-1:-1:-1;;;26609:52:0;;;;;25966:25:1;;;26591:15:0;;-1:-1:-1;;;;;26609:26:0;;:42;;25939:18:1;;26609:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26591:70;-1:-1:-1;26683:25:0;26692:15;26700:7;26591:70;26692:15;:::i;26683:25::-;26672:36;;26719:14;;;;;;;;;;;;;-1:-1:-1;;;26672:8:0;26719:14;;;26672:5;;26719:8;;;:14;26755:27;26764:17;26774:7;26764;:17;:::i;26755:27::-;26744:8;;;;:38;;;26793:19;;;;;;;;;;-1:-1:-1;;;26744:8:0;26793:19;;;;;;;:8;;;:19;;;26870:8;;26880;;;;26890;;26853:56;;-1:-1:-1;;26853:56:0;;26870:8;;26880;;26793:19;;26853:56;;:::i;:::-;;;;-1:-1:-1;;26853:56:0;;;;;;;;;;26463:479;-1:-1:-1;;;;;26463:479:0:o;19187:557::-;19281:22;19331:1;19306:22;19323:4;19306:16;:22::i;:::-;:26;;;;:::i;:::-;19343:18;19364:26;;;:17;:26;;;;;;19281:51;;-1:-1:-1;19407:28:0;;;19403:236;;-1:-1:-1;;;;;19474:18:0;;19452:19;19474:18;;;:12;:18;;;;;;;;:34;;;;;;;;;19525:30;;;;;;:44;;;19584:30;;:17;:30;;;;;:43;;;19403:236;-1:-1:-1;19658:26:0;;;;:17;:26;;;;;;;;19651:33;;;-1:-1:-1;;;;;19702:18:0;;;;;:12;:18;;;;;:34;;;;;;;19695:41;19187:557::o;19752:425::-;19861:10;:17;19836:22;;19861:21;;19881:1;;19861:21;:::i;:::-;19893:18;19914:24;;;:15;:24;;;;;;19971:10;:26;;19836:46;;-1:-1:-1;19914:24:0;;19836:46;;19971:26;;;;;;:::i;:::-;;;;;;;;;19949:48;;20035:11;20010:10;20021;20010:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;20057:28;;;:15;:28;;;;;;;:41;;;20118:24;;;;;20111:31;20153:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;19823:354;;;19752:425;:::o;18786:221::-;18871:14;18888:20;18905:2;18888:16;:20::i;:::-;-1:-1:-1;;;;;18919:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;18964:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;18786:221:0:o;13985:321::-;14115:18;14121:2;14125:7;14115:5;:18::i;:::-;14166:54;14197:1;14201:2;14205:7;14214:5;14166:22;:54::i;:::-;14144:154;;;;-1:-1:-1;;;14144:154:0;;;;;;;:::i;26950:138::-;27010:7;27072:5;27055:23;;;;;;;;:::i;:::-;;;;-1:-1:-1;;27055:23:0;;;;;;;;;27045:34;;27055:23;27045:34;;;;;26950:138;-1:-1:-1;;26950:138:0:o;14314:382::-;-1:-1:-1;;;;;14394:16:0;;14386:61;;;;-1:-1:-1;;;14386:61:0;;21131:2:1;14386:61:0;;;21113:21:1;;;21150:18;;;21143:30;21209:34;21189:18;;;21182:62;21261:18;;14386:61:0;20929:356:1;14386:61:0;13441:4;13465:16;;;:7;:16;;;;;;-1:-1:-1;;;;;13465:16:0;:30;14458:58;;;;-1:-1:-1;;;14458:58:0;;17578:2:1;14458:58:0;;;17560:21:1;17617:2;17597:18;;;17590:30;17656;17636:18;;;17629:58;17704:18;;14458:58:0;17376:352:1;14458:58:0;14529:45;14558:1;14562:2;14566:7;14529:20;:45::i;:::-;-1:-1:-1;;;;;14587:13:0;;;;;;:9;:13;;;;;:18;;14604:1;;14587:13;:18;;14604:1;;14587:18;:::i;:::-;;;;-1:-1:-1;;14616:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;14616:21:0;-1:-1:-1;;;;;14616:21:0;;;;;;;;14655:33;;14616:16;;;14655:33;;14616:16;;14655:33;14314:382;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:160::-;257:20;;313:13;;306:21;296:32;;286:60;;342:1;339;332:12;357:186;416:6;469:2;457:9;448:7;444:23;440:32;437:52;;;485:1;482;475:12;437:52;508:29;527:9;508:29;:::i;:::-;498:39;357:186;-1:-1:-1;;;357:186:1:o;548:260::-;616:6;624;677:2;665:9;656:7;652:23;648:32;645:52;;;693:1;690;683:12;645:52;716:29;735:9;716:29;:::i;:::-;706:39;;764:38;798:2;787:9;783:18;764:38;:::i;:::-;754:48;;548:260;;;;;:::o;813:328::-;890:6;898;906;959:2;947:9;938:7;934:23;930:32;927:52;;;975:1;972;965:12;927:52;998:29;1017:9;998:29;:::i;:::-;988:39;;1046:38;1080:2;1069:9;1065:18;1046:38;:::i;:::-;1036:48;;1131:2;1120:9;1116:18;1103:32;1093:42;;813:328;;;;;:::o;1146:888::-;1241:6;1249;1257;1265;1318:3;1306:9;1297:7;1293:23;1289:33;1286:53;;;1335:1;1332;1325:12;1286:53;1358:29;1377:9;1358:29;:::i;:::-;1348:39;;1406:38;1440:2;1429:9;1425:18;1406:38;:::i;:::-;1396:48;;1491:2;1480:9;1476:18;1463:32;1453:42;;1546:2;1535:9;1531:18;1518:32;1573:18;1565:6;1562:30;1559:50;;;1605:1;1602;1595:12;1559:50;1628:22;;1681:4;1673:13;;1669:27;-1:-1:-1;1659:55:1;;1710:1;1707;1700:12;1659:55;1746:2;1733:16;1771:48;1787:31;1815:2;1787:31;:::i;:::-;1771:48;:::i;:::-;1842:2;1835:5;1828:17;1882:7;1877:2;1872;1868;1864:11;1860:20;1857:33;1854:53;;;1903:1;1900;1893:12;1854:53;1958:2;1953;1949;1945:11;1940:2;1933:5;1929:14;1916:45;2002:1;1997:2;1992;1985:5;1981:14;1977:23;1970:34;2023:5;2013:15;;;;;1146:888;;;;;;;:::o;2039:254::-;2104:6;2112;2165:2;2153:9;2144:7;2140:23;2136:32;2133:52;;;2181:1;2178;2171:12;2133:52;2204:29;2223:9;2204:29;:::i;:::-;2194:39;;2252:35;2283:2;2272:9;2268:18;2252:35;:::i;2298:254::-;2366:6;2374;2427:2;2415:9;2406:7;2402:23;2398:32;2395:52;;;2443:1;2440;2433:12;2395:52;2466:29;2485:9;2466:29;:::i;:::-;2456:39;2542:2;2527:18;;;;2514:32;;-1:-1:-1;;;2298:254:1:o;2557:180::-;2613:6;2666:2;2654:9;2645:7;2641:23;2637:32;2634:52;;;2682:1;2679;2672:12;2634:52;2705:26;2721:9;2705:26;:::i;2742:245::-;2800:6;2853:2;2841:9;2832:7;2828:23;2824:32;2821:52;;;2869:1;2866;2859:12;2821:52;2908:9;2895:23;2927:30;2951:5;2927:30;:::i;2992:249::-;3061:6;3114:2;3102:9;3093:7;3089:23;3085:32;3082:52;;;3130:1;3127;3120:12;3082:52;3162:9;3156:16;3181:30;3205:5;3181:30;:::i;3246:635::-;3326:6;3379:2;3367:9;3358:7;3354:23;3350:32;3347:52;;;3395:1;3392;3385:12;3347:52;3428:9;3422:16;3461:18;3453:6;3450:30;3447:50;;;3493:1;3490;3483:12;3447:50;3516:22;;3569:4;3561:13;;3557:27;-1:-1:-1;3547:55:1;;3598:1;3595;3588:12;3547:55;3627:2;3621:9;3652:48;3668:31;3696:2;3668:31;:::i;3652:48::-;3723:2;3716:5;3709:17;3763:7;3758:2;3753;3749;3745:11;3741:20;3738:33;3735:53;;;3784:1;3781;3774:12;3735:53;3797:54;3848:2;3843;3836:5;3832:14;3827:2;3823;3819:11;3797:54;:::i;:::-;3870:5;3246:635;-1:-1:-1;;;;;3246:635:1:o;3886:180::-;3945:6;3998:2;3986:9;3977:7;3973:23;3969:32;3966:52;;;4014:1;4011;4004:12;3966:52;-1:-1:-1;4037:23:1;;3886:180;-1:-1:-1;3886:180:1:o;4071:184::-;4141:6;4194:2;4182:9;4173:7;4169:23;4165:32;4162:52;;;4210:1;4207;4200:12;4162:52;-1:-1:-1;4233:16:1;;4071:184;-1:-1:-1;4071:184:1:o;4260:257::-;4301:3;4339:5;4333:12;4366:6;4361:3;4354:19;4382:63;4438:6;4431:4;4426:3;4422:14;4415:4;4408:5;4404:16;4382:63;:::i;:::-;4499:2;4478:15;-1:-1:-1;;4474:29:1;4465:39;;;;4506:4;4461:50;;4260:257;-1:-1:-1;;4260:257:1:o;4522:185::-;4564:3;4602:5;4596:12;4617:52;4662:6;4657:3;4650:4;4643:5;4639:16;4617:52;:::i;:::-;4685:16;;;;;4522:185;-1:-1:-1;;4522:185:1:o;5062:276::-;5193:3;5231:6;5225:13;5247:53;5293:6;5288:3;5281:4;5273:6;5269:17;5247:53;:::i;:::-;5316:16;;;;;5062:276;-1:-1:-1;;5062:276:1:o;5343:858::-;5618:3;5656:6;5650:13;5672:53;5718:6;5713:3;5706:4;5698:6;5694:17;5672:53;:::i;:::-;5788:13;;5747:16;;;;5810:57;5788:13;5747:16;5844:4;5832:17;;5810:57;:::i;:::-;5934:13;;5889:20;;;5956:57;5934:13;5889:20;5990:4;5978:17;;5956:57;:::i;:::-;6080:13;;6035:20;;;6102:57;6080:13;6035:20;6136:4;6124:17;;6102:57;:::i;:::-;6175:20;;5343:858;-1:-1:-1;;;;;;5343:858:1:o;6206:1257::-;6577:3;6615:6;6609:13;6641:4;6654:51;6698:6;6693:3;6688:2;6680:6;6676:15;6654:51;:::i;:::-;6768:13;;6727:16;;;;6790:55;6768:13;6727:16;6812:15;;;6790:55;:::i;:::-;6912:13;;6867:20;;;6934:55;6912:13;6867:20;6956:15;;;6934:55;:::i;:::-;7056:13;;7011:20;;;7078:55;7056:13;7011:20;7100:15;;;7078:55;:::i;:::-;7200:13;;7155:20;;;7222:55;7200:13;7155:20;7244:15;;;7222:55;:::i;:::-;7344:13;;7299:20;;;7366:55;7344:13;7299:20;7388:15;;;7366:55;:::i;:::-;7437:20;;;;;6206:1257;-1:-1:-1;;;;;;;;;6206:1257:1:o;7468:1449::-;7887:3;7925:6;7919:13;7951:4;7964:51;8008:6;8003:3;7998:2;7990:6;7986:15;7964:51;:::i;:::-;8078:13;;8037:16;;;;8100:55;8078:13;8037:16;8122:15;;;8100:55;:::i;:::-;8222:13;;8177:20;;;8244:55;8222:13;8177:20;8266:15;;;8244:55;:::i;:::-;8366:13;;8321:20;;;8388:55;8366:13;8321:20;8410:15;;;8388:55;:::i;:::-;8510:13;;8465:20;;;8532:55;8510:13;8465:20;8554:15;;;8532:55;:::i;:::-;8654:13;;8609:20;;;8676:55;8654:13;8609:20;8698:15;;;8676:55;:::i;:::-;8798:13;;8753:20;;;8820:55;8798:13;8753:20;8842:15;;;8820:55;:::i;:::-;8891:20;;;;;7468:1449;-1:-1:-1;;;;;;;;;;7468:1449:1:o;8922:1641::-;9389:3;9427:6;9421:13;9453:4;9466:51;9510:6;9505:3;9500:2;9492:6;9488:15;9466:51;:::i;:::-;9580:13;;9539:16;;;;9602:55;9580:13;9539:16;9624:15;;;9602:55;:::i;:::-;9724:13;;9679:20;;;9746:55;9724:13;9679:20;9768:15;;;9746:55;:::i;:::-;9868:13;;9823:20;;;9890:55;9868:13;9823:20;9912:15;;;9890:55;:::i;:::-;10012:13;;9967:20;;;10034:55;10012:13;9967:20;10056:15;;;10034:55;:::i;:::-;10156:13;;10111:20;;;10178:55;10156:13;10111:20;10200:15;;;10178:55;:::i;:::-;10300:13;;10255:20;;;10322:55;10300:13;10255:20;10344:15;;;10322:55;:::i;:::-;10444:13;;10399:20;;;10466:55;10444:13;10399:20;10488:15;;;10466:55;:::i;:::-;10537:20;;;;;8922:1641;-1:-1:-1;;;;;;;;;;;8922:1641:1:o;10568:422::-;-1:-1:-1;;;10825:3:1;10818:20;10800:3;10867:6;10861:13;10883:61;10937:6;10933:1;10928:3;10924:11;10917:4;10909:6;10905:17;10883:61;:::i;:::-;10964:16;;;;10982:1;10960:24;;10568:422;-1:-1:-1;;10568:422:1:o;10995:426::-;-1:-1:-1;;;11252:3:1;11245:24;11227:3;11298:6;11292:13;11314:61;11368:6;11364:1;11359:3;11355:11;11348:4;11340:6;11336:17;11314:61;:::i;:::-;11395:16;;;;11413:1;11391:24;;10995:426;-1:-1:-1;;10995:426:1:o;11426:::-;-1:-1:-1;;;11683:3:1;11676:24;11658:3;11729:6;11723:13;11745:61;11799:6;11795:1;11790:3;11786:11;11779:4;11771:6;11767:17;11745:61;:::i;11857:424::-;-1:-1:-1;;;12114:3:1;12107:22;12089:3;12158:6;12152:13;12174:61;12228:6;12224:1;12219:3;12215:11;12208:4;12200:6;12196:17;12174:61;:::i;:::-;12255:16;;;;12273:1;12251:24;;11857:424;-1:-1:-1;;11857:424:1:o;12286:448::-;12548:31;12543:3;12536:44;12518:3;12609:6;12603:13;12625:62;12680:6;12675:2;12670:3;12666:12;12659:4;12651:6;12647:17;12625:62;:::i;:::-;12707:16;;;;12725:2;12703:25;;12286:448;-1:-1:-1;;12286:448:1:o;12739:1552::-;13400:66;13395:3;13388:79;13370:3;13496:6;13490:13;13512:62;13567:6;13562:2;13557:3;13553:12;13546:4;13538:6;13534:17;13512:62;:::i;:::-;13638:66;13633:2;13593:16;;;13625:11;;;13618:87;13734:34;13729:2;13721:11;;13714:55;13798:34;13793:2;13785:11;;13778:55;13863:34;13857:3;13849:12;;13842:56;13928:34;13922:3;13914:12;;13907:56;13993:34;13987:3;13979:12;;13972:56;14058:34;14052:3;14044:12;;14037:56;-1:-1:-1;;;14117:3:1;14109:12;;14102:39;14157:128;14187:97;14213:70;14243:39;14277:3;14269:12;;14261:6;14243:39;:::i;:::-;4789:66;4777:79;;-1:-1:-1;;;4881:2:1;4872:12;;4865:28;4918:2;4909:12;;4712:215;14213:70;14205:6;14187:97;:::i;:::-;-1:-1:-1;;;4997:27:1;;5049:1;5040:11;;4932:125;14157:128;14150:135;12739:1552;-1:-1:-1;;;;;;12739:1552:1:o;14296:430::-;-1:-1:-1;;;14553:3:1;14546:26;14528:3;14601:6;14595:13;14617:62;14672:6;14667:2;14662:3;14658:12;14651:4;14643:6;14639:17;14617:62;:::i;:::-;14699:16;;;;14717:2;14695:25;;14296:430;-1:-1:-1;;14296:430:1:o;14939:488::-;-1:-1:-1;;;;;15208:15:1;;;15190:34;;15260:15;;15255:2;15240:18;;15233:43;15307:2;15292:18;;15285:34;;;15355:3;15350:2;15335:18;;15328:31;;;15133:4;;15376:45;;15401:19;;15393:6;15376:45;:::i;15914:219::-;16063:2;16052:9;16045:21;16026:4;16083:44;16123:2;16112:9;16108:18;16100:6;16083:44;:::i;16550:414::-;16752:2;16734:21;;;16791:2;16771:18;;;16764:30;16830:34;16825:2;16810:18;;16803:62;-1:-1:-1;;;16896:2:1;16881:18;;16874:48;16954:3;16939:19;;16550:414::o;20511:413::-;20713:2;20695:21;;;20752:2;20732:18;;;20725:30;20791:34;20786:2;20771:18;;20764:62;-1:-1:-1;;;20857:2:1;20842:18;;20835:47;20914:3;20899:19;;20511:413::o;22401:356::-;22603:2;22585:21;;;22622:18;;;22615:30;22681:34;22676:2;22661:18;;22654:62;22748:2;22733:18;;22401:356::o;23931:413::-;24133:2;24115:21;;;24172:2;24152:18;;;24145:30;24211:34;24206:2;24191:18;;24184:62;-1:-1:-1;;;24277:2:1;24262:18;;24255:47;24334:3;24319:19;;23931:413::o;26002:275::-;26073:2;26067:9;26138:2;26119:13;;-1:-1:-1;;26115:27:1;26103:40;;26173:18;26158:34;;26194:22;;;26155:62;26152:88;;;26220:18;;:::i;:::-;26256:2;26249:22;26002:275;;-1:-1:-1;26002:275:1:o;26282:186::-;26330:4;26363:18;26355:6;26352:30;26349:56;;;26385:18;;:::i;:::-;-1:-1:-1;26451:2:1;26430:15;-1:-1:-1;;26426:29:1;26457:4;26422:40;;26282:186::o;26473:128::-;26513:3;26544:1;26540:6;26537:1;26534:13;26531:39;;;26550:18;;:::i;:::-;-1:-1:-1;26586:9:1;;26473:128::o;26606:120::-;26646:1;26672;26662:35;;26677:18;;:::i;:::-;-1:-1:-1;26711:9:1;;26606:120::o;26731:168::-;26771:7;26837:1;26833;26829:6;26825:14;26822:1;26819:21;26814:1;26807:9;26800:17;26796:45;26793:71;;;26844:18;;:::i;:::-;-1:-1:-1;26884:9:1;;26731:168::o;26904:125::-;26944:4;26972:1;26969;26966:8;26963:34;;;26977:18;;:::i;:::-;-1:-1:-1;27014:9:1;;26904:125::o;27034:258::-;27106:1;27116:113;27130:6;27127:1;27124:13;27116:113;;;27206:11;;;27200:18;27187:11;;;27180:39;27152:2;27145:10;27116:113;;;27247:6;27244:1;27241:13;27238:48;;;-1:-1:-1;;27282:1:1;27264:16;;27257:27;27034:258::o;27297:380::-;27376:1;27372:12;;;;27419;;;27440:61;;27494:4;27486:6;27482:17;27472:27;;27440:61;27547:2;27539:6;27536:14;27516:18;27513:38;27510:161;;;27593:10;27588:3;27584:20;27581:1;27574:31;27628:4;27625:1;27618:15;27656:4;27653:1;27646:15;27510:161;;27297:380;;;:::o;27682:135::-;27721:3;-1:-1:-1;;27742:17:1;;27739:43;;;27762:18;;:::i;:::-;-1:-1:-1;27809:1:1;27798:13;;27682:135::o;27822:112::-;27854:1;27880;27870:35;;27885:18;;:::i;:::-;-1:-1:-1;27919:9:1;;27822:112::o;27939:127::-;28000:10;27995:3;27991:20;27988:1;27981:31;28031:4;28028:1;28021:15;28055:4;28052:1;28045:15;28071:127;28132:10;28127:3;28123:20;28120:1;28113:31;28163:4;28160:1;28153:15;28187:4;28184:1;28177:15;28203:127;28264:10;28259:3;28255:20;28252:1;28245:31;28295:4;28292:1;28285:15;28319:4;28316:1;28309:15;28335:127;28396:10;28391:3;28387:20;28384:1;28377:31;28427:4;28424:1;28417:15;28451:4;28448:1;28441:15;28467:127;28528:10;28523:3;28519:20;28516:1;28509:31;28559:4;28556:1;28549:15;28583:4;28580:1;28573:15;28599:131;-1:-1:-1;;;;;;28673:32:1;;28663:43;;28653:71;;28720:1;28717;28710:12

Swarm Source

ipfs://9d95ea8d8bbfd9dbbc52a838addd50d752f86f7ebb3c32fc2d4d5a0cc157b381
Loading