ERC-721
Overview
Max Total Supply
223 bsanyc2
Holders
39
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 bsanyc2Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
BSANYC2
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-08-10 */ /** |___ ___ _ _ ___ _____ ___ | _ ) __| /_\ | \| \ \ / / __|_ ) | _ \__ \/ _ \| .` |\ V / (__ / / |___/___/_/ \_\_|\_| |_| \___/___| */ // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`, * consuming from one or the other at each step according to the instructions given by * `proofFlags`. * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof} * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol 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); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ 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); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed 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); } } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // IERC165 // ============================== /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================== // IERC721 // ============================== /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================== // IERC721Metadata // ============================== /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Mask of an entry in packed address data. uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225; // The tokenId of the next token to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See `_packedOwnershipOf` implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see `_totalMinted`. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to `_startTokenId()` unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes of the XOR of // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165 // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)` return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> BITPOS_AUX); } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; assembly { // Cast aux without masking. auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); _packedAddressData[owner] = packed; } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & BITMASK_BURNED == 0) { // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP); ownership.burned = packed & BITMASK_BURNED != 0; } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev Casts the address to uint256 without masking. */ function _addressToUint256(address value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev Casts the boolean to uint256 without branching. */ function _boolToUint256(bool value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = address(uint160(_packedOwnershipOf(tokenId))); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.code.length != 0) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex < end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); if (approvalCheck) { bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(from) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_BURNED | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: contracts/bsanyc.sol /** ___ ___ _ _ ___ _____ | _ ) __| /_\ | \| \ \ / / __| | _ \__ \/ _ \| .` |\ V / (__ |___/___/_/ \_\_|\_| |_| \___| */ pragma solidity >= 0.8.9 < 0.9.0; error AddressNotAllowlistVerified(); contract BSANYC is Ownable, ERC721A { uint256 public maxPerAddressDuringMint; uint256 public collectionSize; uint256 public amountForDevs; bytes32 public merkleRoot; uint256 public whitelistMintSig = 1; mapping(address => bool) private altarOfSacrifice; struct SaleConfig { uint32 publicSaleStartTime; uint64 publicPriceWei; uint32 privateSaleStartTime; uint64 privatePriceWei; } SaleConfig public saleConfig; // metadata URI string private _baseTokenURI; constructor( uint256 maxBatchSize_, uint256 collectionSize_, uint256 amountForDevs_ ) ERC721A("BSANYC", "bsanyc") { require( maxBatchSize_ < collectionSize_, "MaxBarchSize should be smaller than collectionSize" ); maxPerAddressDuringMint = maxBatchSize_; collectionSize = collectionSize_; amountForDevs = amountForDevs_; addAltar(_msgSender()); } modifier callerIsUser() { require(tx.origin == msg.sender, "The caller is another contract"); _; } modifier onlyAltars() { require(altarOfSacrifice[_msgSender()], 'Not an altar of sacrifice'); _; } function devMint(uint256 quantity) external onlyOwner { require( quantity <= amountForDevs, "Too many already minted before dev mint" ); require( totalSupply() + quantity <= collectionSize, "Reached max supply" ); _safeMint(msg.sender, quantity); } function mint(uint256 quantity) external payable callerIsUser { require(isPublicSaleOn(), "Public sale has not begun yet"); require( totalSupply() + quantity <= collectionSize, "Reached max supply" ); require( numberMinted(msg.sender) + quantity <= maxPerAddressDuringMint, "Reached max quantity that one wallet can mint" ); uint256 minted = numberMinted(msg.sender); uint256 priceWei; if (minted > 0) { priceWei = quantity * saleConfig.publicPriceWei; } else { priceWei = (quantity - 1) * saleConfig.publicPriceWei; } if (quantity == 10) { priceWei = priceWei * 4 / 5; } require(msg.value >= priceWei, "Insufficient funds"); _safeMint(msg.sender, quantity); } function whitelistMint(uint256 quantity, bytes32[] calldata _merkleProof) external payable callerIsUser { bytes32 leaf = keccak256(abi.encodePacked(_msgSender(), whitelistMintSig)); require( MerkleProof.verify(_merkleProof, merkleRoot, leaf), "Invalid proof!" ); require(isPrivateSaleOn(), "Private sale has not begun yet"); require( totalSupply() + quantity <= collectionSize, "Reached max supply" ); require( numberMinted(msg.sender) + quantity <= maxPerAddressDuringMint, "Reached max quantity that one wallet can mint" ); uint256 minted = numberMinted(msg.sender); uint256 priceWei; if (minted > 0) { priceWei = quantity * saleConfig.publicPriceWei; } else { priceWei = (quantity - 1) * saleConfig.publicPriceWei; } if (quantity == 10) { priceWei = priceWei * 4 / 5; } require(msg.value >= priceWei, "Insufficient funds"); _safeMint(msg.sender, quantity); } // Public Views // ***************************************************************************** function numberMinted(address minter) public view returns(uint256) { return _numberMinted(minter); } function isPublicSaleOn() public view returns(bool) { require( saleConfig.publicSaleStartTime != 0, "Public Sale Time is TBD." ); return block.timestamp >= saleConfig.publicSaleStartTime; } function isPrivateSaleOn() public view returns(bool) { require( saleConfig.privateSaleStartTime != 0, "Private Sale Time is TBD." ); return block.timestamp >= saleConfig.privateSaleStartTime; } // Contract Controls (onlyOwner) // ***************************************************************************** function setBaseURI(string calldata baseURI) external onlyOwner { _baseTokenURI = baseURI; } function withdrawMoney() external onlyOwner { (bool success, ) = msg.sender.call{ value: address(this).balance } (""); require(success, "Transfer failed."); } function setupSaleInfo( uint64 publicPriceWei, uint32 publicSaleStartTime, uint64 privatePriceWei, uint32 privateSaleStartTime ) public onlyOwner { saleConfig = SaleConfig( publicSaleStartTime, publicPriceWei, privateSaleStartTime, privatePriceWei ); } function setupCollectionInit( uint256 newMaxPerAddressDuringMint, uint256 newCollectionSize, uint256 newAmountForDevs ) public onlyOwner { maxPerAddressDuringMint = newMaxPerAddressDuringMint; collectionSize = newCollectionSize; amountForDevs = newAmountForDevs; } function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner { merkleRoot = _merkleRoot; } function addAltar(address a) public onlyOwner { altarOfSacrifice[a] = true; } function removeAltar(address a) public onlyOwner { altarOfSacrifice[a] = false; } function burnFromAltar(uint256 tokenId) public onlyAltars { require(_exists(tokenId), 'Token does not exist'); _burn(tokenId); } // Internal Functions // ***************************************************************************** function _baseURI() internal view virtual override returns(string memory) { return _baseTokenURI; } function tokenURI(uint256 _tokenId) public view override returns (string memory) { require(_exists(_tokenId), "Token does not exist."); return bytes(_baseTokenURI).length > 0 ? string( abi.encodePacked( _baseTokenURI, Strings.toString(_tokenId), ".json" ) ) : ""; } } // File: contracts/bsanyc_gen2.sol pragma solidity >= 0.8.9 < 0.9.0; // import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; // error AddressNotAllowlistVerified(); contract BSANYC2 is Ownable, ERC721A { uint256 public maxPerAddressDuringMint; uint256 public collectionSize; uint256 public amountForDevs; // bytes32 public merkleRoot; // uint256 public whitelistMintSig = 1; BSANYC private _bsanycContract; mapping(address => bool) private altarOfSacrifice; struct SaleConfig { uint32 publicSaleStartTime; uint64 publicPriceWei; uint32 rebornStartTime; // uint32 privateSaleStartTime; // uint64 privatePriceWei; } SaleConfig public saleConfig; // metadata URI string private _baseTokenURI; constructor( uint256 maxBatchSize_, uint256 collectionSize_, uint256 amountForDevs_, address bsanycAddress_ ) ERC721A("BSANYC2", "bsanyc2") { require( maxBatchSize_ < collectionSize_, "MaxBarchSize should be smaller than collectionSize" ); maxPerAddressDuringMint = maxBatchSize_; collectionSize = collectionSize_; amountForDevs = amountForDevs_; _bsanycContract = BSANYC(bsanycAddress_); addAltar(_msgSender()); } modifier callerIsUser() { require(tx.origin == msg.sender, "The caller is another contract"); _; } modifier onlyAltars() { require(altarOfSacrifice[_msgSender()], 'Not an altar of sacrifice'); _; } function devMint(uint256 quantity) external onlyOwner { require( quantity <= amountForDevs, "Too many already minted before dev mint" ); require( totalSupply() + quantity <= collectionSize, "Reached max supply" ); _safeMint(msg.sender, quantity); } function mint(uint256 quantity) external payable callerIsUser { require(isPublicSaleOn(), "Public sale has not begun yet"); require( totalSupply() + quantity <= collectionSize, "Reached max supply" ); require( numberMinted(msg.sender) + quantity <= maxPerAddressDuringMint, "Reached max quantity that one wallet can mint" ); uint256 priceWei; priceWei = quantity * saleConfig.publicPriceWei; require(msg.value >= priceWei, "Insufficient funds"); _safeMint(msg.sender, quantity); } function reborn(uint256 tokenId1, uint256 tokenId2) external callerIsUser { require(isRebornTimeOn(), "Reborn has not begun yet"); uint256 quantity = 1; require( totalSupply() + quantity <= collectionSize, "Reached max supply" ); require( numberMinted(msg.sender) + quantity <= maxPerAddressDuringMint, "Reached max quantity that one wallet can mint" ); require(_msgSender() == _bsanycContract.ownerOf(tokenId1), 'TokenId1 not owned by currentSender'); require(_msgSender() == _bsanycContract.ownerOf(tokenId2), 'TokenId2 not owned by currentSender'); _bsanycContract.burnFromAltar(tokenId1); _bsanycContract.burnFromAltar(tokenId2); _safeMint(msg.sender, quantity); } // Public Views // ***************************************************************************** function numberMinted(address minter) public view returns(uint256) { return _numberMinted(minter); } function isPublicSaleOn() public view returns(bool) { require( saleConfig.publicSaleStartTime != 0, "Public Sale Time is TBD." ); return block.timestamp >= saleConfig.publicSaleStartTime; } function isRebornTimeOn() public view returns(bool) { require( saleConfig.rebornStartTime != 0, "Reborn Time is TBD." ); return block.timestamp >= saleConfig.rebornStartTime; } // Contract Controls (onlyOwner) // ***************************************************************************** function setBaseURI(string calldata baseURI) external onlyOwner { _baseTokenURI = baseURI; } function withdrawMoney() external onlyOwner { (bool success, ) = msg.sender.call{ value: address(this).balance } (""); require(success, "Transfer failed."); } function setupSaleInfo( uint64 publicPriceWei, uint32 publicSaleStartTime, uint32 rebornStartTime ) public onlyOwner { saleConfig = SaleConfig( publicSaleStartTime, publicPriceWei, rebornStartTime ); } function setupCollectionInit( uint256 newMaxPerAddressDuringMint, uint256 newCollectionSize, uint256 newAmountForDevs ) public onlyOwner { maxPerAddressDuringMint = newMaxPerAddressDuringMint; collectionSize = newCollectionSize; amountForDevs = newAmountForDevs; } function addAltar(address a) public onlyOwner { altarOfSacrifice[a] = true; } function removeAltar(address a) public onlyOwner { altarOfSacrifice[a] = false; } function burnFromAltar(uint256 tokenId) public onlyAltars { require(_exists(tokenId), 'Token does not exist'); _burn(tokenId); } // Internal Functions // ***************************************************************************** function _baseURI() internal view virtual override returns(string memory) { return _baseTokenURI; } function tokenURI(uint256 _tokenId) public view override returns (string memory) { require(_exists(_tokenId), "Token does not exist."); return bytes(_baseTokenURI).length > 0 ? string( abi.encodePacked( _baseTokenURI, Strings.toString(_tokenId), ".json" ) ) : ""; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"maxBatchSize_","type":"uint256"},{"internalType":"uint256","name":"collectionSize_","type":"uint256"},{"internalType":"uint256","name":"amountForDevs_","type":"uint256"},{"internalType":"address","name":"bsanycAddress_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"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":"a","type":"address"}],"name":"addAltar","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"amountForDevs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"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":"burnFromAltar","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collectionSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","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":"isPublicSaleOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRebornTimeOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerAddressDuringMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"numberMinted","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":[{"internalType":"uint256","name":"tokenId1","type":"uint256"},{"internalType":"uint256","name":"tokenId2","type":"uint256"}],"name":"reborn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"removeAltar","outputs":[],"stateMutability":"nonpayable","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":[],"name":"saleConfig","outputs":[{"internalType":"uint32","name":"publicSaleStartTime","type":"uint32"},{"internalType":"uint64","name":"publicPriceWei","type":"uint64"},{"internalType":"uint32","name":"rebornStartTime","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxPerAddressDuringMint","type":"uint256"},{"internalType":"uint256","name":"newCollectionSize","type":"uint256"},{"internalType":"uint256","name":"newAmountForDevs","type":"uint256"}],"name":"setupCollectionInit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"publicPriceWei","type":"uint64"},{"internalType":"uint32","name":"publicSaleStartTime","type":"uint32"},{"internalType":"uint32","name":"rebornStartTime","type":"uint32"}],"name":"setupSaleInfo","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":"_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":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162004cda38038062004cda83398181016040528101906200003791906200050b565b6040518060400160405280600781526020017f4253414e594332000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f6273616e79633200000000000000000000000000000000000000000000000000815250620000c3620000b7620001d260201b60201c565b620001da60201b60201c565b8160039080519060200190620000db929190620003b6565b508060049080519060200190620000f4929190620003b6565b50620001056200029e60201b60201c565b600181905550505082841062000152576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001499062000604565b60405180910390fd5b8360098190555082600a8190555081600b8190555080600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620001c8620001bc620001d260201b60201c565b620002a360201b60201c565b50505050620006fd565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b620002b3620001d260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002d96200038d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000332576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003299062000676565b60405180910390fd5b6001600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003c490620006c7565b90600052602060002090601f016020900481019282620003e8576000855562000434565b82601f106200040357805160ff191683800117855562000434565b8280016001018555821562000434579182015b828111156200043357825182559160200191906001019062000416565b5b50905062000443919062000447565b5090565b5b808211156200046257600081600090555060010162000448565b5090565b600080fd5b6000819050919050565b62000480816200046b565b81146200048c57600080fd5b50565b600081519050620004a08162000475565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620004d382620004a6565b9050919050565b620004e581620004c6565b8114620004f157600080fd5b50565b6000815190506200050581620004da565b92915050565b6000806000806080858703121562000528576200052762000466565b5b600062000538878288016200048f565b94505060206200054b878288016200048f565b93505060406200055e878288016200048f565b92505060606200057187828801620004f4565b91505092959194509250565b600082825260208201905092915050565b7f4d6178426172636853697a652073686f756c6420626520736d616c6c6572207460008201527f68616e20636f6c6c656374696f6e53697a650000000000000000000000000000602082015250565b6000620005ec6032836200057d565b9150620005f9826200058e565b604082019050919050565b600060208201905081810360008301526200061f81620005dd565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200065e6020836200057d565b91506200066b8262000626565b602082019050919050565b6000602082019050818103600083015262000691816200064f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620006e057607f821691505b60208210811415620006f757620006f662000698565b5b50919050565b6145cd806200070d6000396000f3fe6080604052600436106101f95760003560e01c80638bc35c2f1161010d578063ac446002116100a0578063cddb28ff1161006f578063cddb28ff146106ea578063dc33e68114610713578063e985e9c514610750578063f2fde38b1461078d578063fbe1aa51146107b6576101f9565b8063ac44600214610644578063af15dd981461065b578063b88d4fde14610684578063c87b56dd146106ad576101f9565b806395d89b41116100dc57806395d89b41146105a9578063a0712d68146105d4578063a22cb465146105f0578063a2bf9cb914610619576101f9565b80638bc35c2f146104fd5780638da5cb5b1461052857806390aa0b0f1461055357806394f4114514610580576101f9565b806342842e0e1161019057806355f804b31161015f57806355f804b31461041a5780636352211e146104435780636aef50691461048057806370a08231146104a9578063715018a6146104e6576101f9565b806342842e0e1461037457806345c0f5331461039d5780634867eb47146103c85780634e920d51146103f1576101f9565b806318160ddd116101cc57806318160ddd146102cc57806323b872dd146102f7578063375a069a146103205780633f5e474114610349576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b50610225600480360381019061022091906130bf565b6107e1565b6040516102329190613107565b60405180910390f35b34801561024757600080fd5b50610250610873565b60405161025d91906131bb565b60405180910390f35b34801561027257600080fd5b5061028d60048036038101906102889190613213565b610905565b60405161029a9190613281565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c591906132c8565b610981565b005b3480156102d857600080fd5b506102e1610b28565b6040516102ee9190613317565b60405180910390f35b34801561030357600080fd5b5061031e60048036038101906103199190613332565b610b3f565b005b34801561032c57600080fd5b5061034760048036038101906103429190613213565b610b4f565b005b34801561035557600080fd5b5061035e610c74565b60405161036b9190613107565b60405180910390f35b34801561038057600080fd5b5061039b60048036038101906103969190613332565b610cf8565b005b3480156103a957600080fd5b506103b2610d18565b6040516103bf9190613317565b60405180910390f35b3480156103d457600080fd5b506103ef60048036038101906103ea9190613385565b610d1e565b005b3480156103fd57600080fd5b5061041860048036038101906104139190613385565b610df5565b005b34801561042657600080fd5b50610441600480360381019061043c9190613417565b610ecc565b005b34801561044f57600080fd5b5061046a60048036038101906104659190613213565b610f5e565b6040516104779190613281565b60405180910390f35b34801561048c57600080fd5b506104a760048036038101906104a29190613213565b610f70565b005b3480156104b557600080fd5b506104d060048036038101906104cb9190613385565b611057565b6040516104dd9190613317565b60405180910390f35b3480156104f257600080fd5b506104fb611110565b005b34801561050957600080fd5b50610512611198565b60405161051f9190613317565b60405180910390f35b34801561053457600080fd5b5061053d61119e565b60405161054a9190613281565b60405180910390f35b34801561055f57600080fd5b506105686111c7565b604051610577939291906134a6565b60405180910390f35b34801561058c57600080fd5b506105a760048036038101906105a29190613535565b611213565b005b3480156105b557600080fd5b506105be611347565b6040516105cb91906131bb565b60405180910390f35b6105ee60048036038101906105e99190613213565b6113d9565b005b3480156105fc57600080fd5b50610617600480360381019061061291906135b4565b6115c1565b005b34801561062557600080fd5b5061062e611739565b60405161063b9190613107565b60405180910390f35b34801561065057600080fd5b506106596117bd565b005b34801561066757600080fd5b50610682600480360381019061067d91906135f4565b6118e8565b005b34801561069057600080fd5b506106ab60048036038101906106a69190613764565b611db9565b005b3480156106b957600080fd5b506106d460048036038101906106cf9190613213565b611e2c565b6040516106e191906131bb565b60405180910390f35b3480156106f657600080fd5b50610711600480360381019061070c91906137e7565b611ed4565b005b34801561071f57600080fd5b5061073a60048036038101906107359190613385565b611f6a565b6040516107479190613317565b60405180910390f35b34801561075c57600080fd5b506107776004803603810190610772919061383a565b611f7c565b6040516107849190613107565b60405180910390f35b34801561079957600080fd5b506107b460048036038101906107af9190613385565b612010565b005b3480156107c257600080fd5b506107cb612108565b6040516107d89190613317565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061083c57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061086c5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610882906138a9565b80601f01602080910402602001604051908101604052809291908181526020018280546108ae906138a9565b80156108fb5780601f106108d0576101008083540402835291602001916108fb565b820191906000526020600020905b8154815290600101906020018083116108de57829003601f168201915b5050505050905090565b60006109108261210e565b610946576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061098c8261216d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109f4576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a1361223b565b73ffffffffffffffffffffffffffffffffffffffff1614610a7657610a3f81610a3a61223b565b611f7c565b610a75576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610b32612243565b6002546001540303905090565b610b4a838383612248565b505050565b610b576125f2565b73ffffffffffffffffffffffffffffffffffffffff16610b7561119e565b73ffffffffffffffffffffffffffffffffffffffff1614610bcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc290613927565b60405180910390fd5b600b54811115610c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c07906139b9565b60405180910390fd5b600a5481610c1c610b28565b610c269190613a08565b1115610c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5e90613aaa565b60405180910390fd5b610c7133826125fa565b50565b600080600e60000160009054906101000a900463ffffffff1663ffffffff161415610cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccb90613b16565b60405180910390fd5b600e60000160009054906101000a900463ffffffff1663ffffffff16421015905090565b610d1383838360405180602001604052806000815250611db9565b505050565b600a5481565b610d266125f2565b73ffffffffffffffffffffffffffffffffffffffff16610d4461119e565b73ffffffffffffffffffffffffffffffffffffffff1614610d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9190613927565b60405180910390fd5b6001600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b610dfd6125f2565b73ffffffffffffffffffffffffffffffffffffffff16610e1b61119e565b73ffffffffffffffffffffffffffffffffffffffff1614610e71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6890613927565b60405180910390fd5b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b610ed46125f2565b73ffffffffffffffffffffffffffffffffffffffff16610ef261119e565b73ffffffffffffffffffffffffffffffffffffffff1614610f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3f90613927565b60405180910390fd5b8181600f9190610f59929190612fb0565b505050565b6000610f698261216d565b9050919050565b600d6000610f7c6125f2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611003576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffa90613b82565b60405180910390fd5b61100c8161210e565b61104b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104290613bee565b60405180910390fd5b61105481612618565b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110bf576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6111186125f2565b73ffffffffffffffffffffffffffffffffffffffff1661113661119e565b73ffffffffffffffffffffffffffffffffffffffff161461118c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118390613927565b60405180910390fd5b6111966000612626565b565b60095481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e8060000160009054906101000a900463ffffffff16908060000160049054906101000a900467ffffffffffffffff169080600001600c9054906101000a900463ffffffff16905083565b61121b6125f2565b73ffffffffffffffffffffffffffffffffffffffff1661123961119e565b73ffffffffffffffffffffffffffffffffffffffff161461128f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128690613927565b60405180910390fd5b60405180606001604052808363ffffffff1681526020018467ffffffffffffffff1681526020018263ffffffff16815250600e60008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550604082015181600001600c6101000a81548163ffffffff021916908363ffffffff160217905550905050505050565b606060048054611356906138a9565b80601f0160208091040260200160405190810160405280929190818152602001828054611382906138a9565b80156113cf5780601f106113a4576101008083540402835291602001916113cf565b820191906000526020600020905b8154815290600101906020018083116113b257829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611447576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143e90613c5a565b60405180910390fd5b61144f610c74565b61148e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148590613cc6565b60405180910390fd5b600a548161149a610b28565b6114a49190613a08565b11156114e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114dc90613aaa565b60405180910390fd5b600954816114f233611f6a565b6114fc9190613a08565b111561153d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153490613d58565b60405180910390fd5b6000600e60000160049054906101000a900467ffffffffffffffff1667ffffffffffffffff168261156e9190613d78565b9050803410156115b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115aa90613e1e565b60405180910390fd5b6115bd33836125fa565b5050565b6115c961223b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561162e576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806008600061163b61223b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116e861223b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161172d9190613107565b60405180910390a35050565b600080600e600001600c9054906101000a900463ffffffff1663ffffffff161415611799576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179090613e8a565b60405180910390fd5b600e600001600c9054906101000a900463ffffffff1663ffffffff16421015905090565b6117c56125f2565b73ffffffffffffffffffffffffffffffffffffffff166117e361119e565b73ffffffffffffffffffffffffffffffffffffffff1614611839576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183090613927565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405161185f90613edb565b60006040518083038185875af1925050503d806000811461189c576040519150601f19603f3d011682016040523d82523d6000602084013e6118a1565b606091505b50509050806118e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118dc90613f3c565b60405180910390fd5b50565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194d90613c5a565b60405180910390fd5b61195e611739565b61199d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199490613fa8565b60405180910390fd5b600060019050600a54816119af610b28565b6119b99190613a08565b11156119fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f190613aaa565b60405180910390fd5b60095481611a0733611f6a565b611a119190613a08565b1115611a52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4990613d58565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b8152600401611aad9190613317565b60206040518083038186803b158015611ac557600080fd5b505afa158015611ad9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611afd9190613fdd565b73ffffffffffffffffffffffffffffffffffffffff16611b1b6125f2565b73ffffffffffffffffffffffffffffffffffffffff1614611b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b689061407c565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401611bcc9190613317565b60206040518083038186803b158015611be457600080fd5b505afa158015611bf8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1c9190613fdd565b73ffffffffffffffffffffffffffffffffffffffff16611c3a6125f2565b73ffffffffffffffffffffffffffffffffffffffff1614611c90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c879061410e565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636aef5069846040518263ffffffff1660e01b8152600401611ceb9190613317565b600060405180830381600087803b158015611d0557600080fd5b505af1158015611d19573d6000803e3d6000fd5b50505050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636aef5069836040518263ffffffff1660e01b8152600401611d789190613317565b600060405180830381600087803b158015611d9257600080fd5b505af1158015611da6573d6000803e3d6000fd5b50505050611db433826125fa565b505050565b611dc4848484612248565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611e2657611def848484846126ea565b611e25576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060611e378261210e565b611e76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6d9061417a565b60405180910390fd5b6000600f8054611e85906138a9565b905011611ea15760405180602001604052806000815250611ecd565b600f611eac8361284a565b604051602001611ebd9291906142b6565b6040516020818303038152906040525b9050919050565b611edc6125f2565b73ffffffffffffffffffffffffffffffffffffffff16611efa61119e565b73ffffffffffffffffffffffffffffffffffffffff1614611f50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4790613927565b60405180910390fd5b8260098190555081600a8190555080600b81905550505050565b6000611f75826129ab565b9050919050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6120186125f2565b73ffffffffffffffffffffffffffffffffffffffff1661203661119e565b73ffffffffffffffffffffffffffffffffffffffff161461208c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208390613927565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f390614357565b60405180910390fd5b61210581612626565b50565b600b5481565b600081612119612243565b11158015612128575060015482105b8015612166575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b6000808290508061217c612243565b11612204576001548110156122035760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612201575b60008114156121f75760056000836001900393508381526020019081526020016000205490506121cc565b8092505050612236565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b60006122538261216d565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146122ba576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166122db61223b565b73ffffffffffffffffffffffffffffffffffffffff16148061230a57506123098561230461223b565b611f7c565b5b8061234f575061231861223b565b73ffffffffffffffffffffffffffffffffffffffff1661233784610905565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612388576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156123ef576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123fc8585856001612a02565b6007600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b6124f986612a08565b1717600560008581526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415612583576000600184019050600060056000838152602001908152602001600020541415612581576001548114612580578260056000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125eb8585856001612a12565b5050505050565b600033905090565b612614828260405180602001604052806000815250612a18565b5050565b612623816000612cce565b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261271061223b565b8786866040518563ffffffff1660e01b815260040161273294939291906143cc565b602060405180830381600087803b15801561274c57600080fd5b505af192505050801561277d57506040513d601f19601f8201168201806040525081019061277a919061442d565b60015b6127f7573d80600081146127ad576040519150601f19603f3d011682016040523d82523d6000602084013e6127b2565b606091505b506000815114156127ef576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415612892576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506129a6565b600082905060005b600082146128c45780806128ad9061445a565b915050600a826128bd91906144d2565b915061289a565b60008167ffffffffffffffff8111156128e0576128df613639565b5b6040519080825280601f01601f1916602001820160405280156129125781602001600182028036833780820191505090505b5090505b6000851461299f5760018261292b9190614503565b9150600a8561293a9190614537565b60306129469190613a08565b60f81b81838151811061295c5761295b614568565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561299891906144d2565b9450612916565b8093505050505b919050565b600067ffffffffffffffff6040600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b50505050565b6000819050919050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612a86576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415612ac1576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ace6000858386612a02565b600160406001901b178302600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1612b3360018514612fa6565b901b60a042901b612b4386612a08565b1717600560008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612c47575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bf760008784806001019550876126ea565b612c2d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210612b88578260015414612c4257600080fd5b612cb2565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612c48575b816001819055505050612cc86000858386612a12565b50505050565b6000612cd98361216d565b905060008190508215612db65760008173ffffffffffffffffffffffffffffffffffffffff16612d0761223b565b73ffffffffffffffffffffffffffffffffffffffff161480612d365750612d3582612d3061223b565b611f7c565b5b80612d7b5750612d4461223b565b73ffffffffffffffffffffffffffffffffffffffff16612d6386610905565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612db4576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b612dc4816000866001612a02565b6007600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600160806001901b03600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055507c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000060a042901b612e9984612a08565b171717600560008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415612f24576000600185019050600060056000838152602001908152602001600020541415612f22576001548114612f21578260056000838152602001908152602001600020819055505b5b505b83600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612f8e816000866001612a12565b60026000815480929190600101919050555050505050565b6000819050919050565b828054612fbc906138a9565b90600052602060002090601f016020900481019282612fde5760008555613025565b82601f10612ff757803560ff1916838001178555613025565b82800160010185558215613025579182015b82811115613024578235825591602001919060010190613009565b5b5090506130329190613036565b5090565b5b8082111561304f576000816000905550600101613037565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61309c81613067565b81146130a757600080fd5b50565b6000813590506130b981613093565b92915050565b6000602082840312156130d5576130d461305d565b5b60006130e3848285016130aa565b91505092915050565b60008115159050919050565b613101816130ec565b82525050565b600060208201905061311c60008301846130f8565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561315c578082015181840152602081019050613141565b8381111561316b576000848401525b50505050565b6000601f19601f8301169050919050565b600061318d82613122565b613197818561312d565b93506131a781856020860161313e565b6131b081613171565b840191505092915050565b600060208201905081810360008301526131d58184613182565b905092915050565b6000819050919050565b6131f0816131dd565b81146131fb57600080fd5b50565b60008135905061320d816131e7565b92915050565b6000602082840312156132295761322861305d565b5b6000613237848285016131fe565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061326b82613240565b9050919050565b61327b81613260565b82525050565b60006020820190506132966000830184613272565b92915050565b6132a581613260565b81146132b057600080fd5b50565b6000813590506132c28161329c565b92915050565b600080604083850312156132df576132de61305d565b5b60006132ed858286016132b3565b92505060206132fe858286016131fe565b9150509250929050565b613311816131dd565b82525050565b600060208201905061332c6000830184613308565b92915050565b60008060006060848603121561334b5761334a61305d565b5b6000613359868287016132b3565b935050602061336a868287016132b3565b925050604061337b868287016131fe565b9150509250925092565b60006020828403121561339b5761339a61305d565b5b60006133a9848285016132b3565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126133d7576133d66133b2565b5b8235905067ffffffffffffffff8111156133f4576133f36133b7565b5b6020830191508360018202830111156134105761340f6133bc565b5b9250929050565b6000806020838503121561342e5761342d61305d565b5b600083013567ffffffffffffffff81111561344c5761344b613062565b5b613458858286016133c1565b92509250509250929050565b600063ffffffff82169050919050565b61347d81613464565b82525050565b600067ffffffffffffffff82169050919050565b6134a081613483565b82525050565b60006060820190506134bb6000830186613474565b6134c86020830185613497565b6134d56040830184613474565b949350505050565b6134e681613483565b81146134f157600080fd5b50565b600081359050613503816134dd565b92915050565b61351281613464565b811461351d57600080fd5b50565b60008135905061352f81613509565b92915050565b60008060006060848603121561354e5761354d61305d565b5b600061355c868287016134f4565b935050602061356d86828701613520565b925050604061357e86828701613520565b9150509250925092565b613591816130ec565b811461359c57600080fd5b50565b6000813590506135ae81613588565b92915050565b600080604083850312156135cb576135ca61305d565b5b60006135d9858286016132b3565b92505060206135ea8582860161359f565b9150509250929050565b6000806040838503121561360b5761360a61305d565b5b6000613619858286016131fe565b925050602061362a858286016131fe565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61367182613171565b810181811067ffffffffffffffff821117156136905761368f613639565b5b80604052505050565b60006136a3613053565b90506136af8282613668565b919050565b600067ffffffffffffffff8211156136cf576136ce613639565b5b6136d882613171565b9050602081019050919050565b82818337600083830152505050565b6000613707613702846136b4565b613699565b90508281526020810184848401111561372357613722613634565b5b61372e8482856136e5565b509392505050565b600082601f83011261374b5761374a6133b2565b5b813561375b8482602086016136f4565b91505092915050565b6000806000806080858703121561377e5761377d61305d565b5b600061378c878288016132b3565b945050602061379d878288016132b3565b93505060406137ae878288016131fe565b925050606085013567ffffffffffffffff8111156137cf576137ce613062565b5b6137db87828801613736565b91505092959194509250565b600080600060608486031215613800576137ff61305d565b5b600061380e868287016131fe565b935050602061381f868287016131fe565b9250506040613830868287016131fe565b9150509250925092565b600080604083850312156138515761385061305d565b5b600061385f858286016132b3565b9250506020613870858286016132b3565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806138c157607f821691505b602082108114156138d5576138d461387a565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061391160208361312d565b915061391c826138db565b602082019050919050565b6000602082019050818103600083015261394081613904565b9050919050565b7f546f6f206d616e7920616c7265616479206d696e746564206265666f7265206460008201527f6576206d696e7400000000000000000000000000000000000000000000000000602082015250565b60006139a360278361312d565b91506139ae82613947565b604082019050919050565b600060208201905081810360008301526139d281613996565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a13826131dd565b9150613a1e836131dd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a5357613a526139d9565b5b828201905092915050565b7f52656163686564206d617820737570706c790000000000000000000000000000600082015250565b6000613a9460128361312d565b9150613a9f82613a5e565b602082019050919050565b60006020820190508181036000830152613ac381613a87565b9050919050565b7f5075626c69632053616c652054696d65206973205442442e0000000000000000600082015250565b6000613b0060188361312d565b9150613b0b82613aca565b602082019050919050565b60006020820190508181036000830152613b2f81613af3565b9050919050565b7f4e6f7420616e20616c746172206f662073616372696669636500000000000000600082015250565b6000613b6c60198361312d565b9150613b7782613b36565b602082019050919050565b60006020820190508181036000830152613b9b81613b5f565b9050919050565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b6000613bd860148361312d565b9150613be382613ba2565b602082019050919050565b60006020820190508181036000830152613c0781613bcb565b9050919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b6000613c44601e8361312d565b9150613c4f82613c0e565b602082019050919050565b60006020820190508181036000830152613c7381613c37565b9050919050565b7f5075626c69632073616c6520686173206e6f7420626567756e20796574000000600082015250565b6000613cb0601d8361312d565b9150613cbb82613c7a565b602082019050919050565b60006020820190508181036000830152613cdf81613ca3565b9050919050565b7f52656163686564206d6178207175616e746974792074686174206f6e6520776160008201527f6c6c65742063616e206d696e7400000000000000000000000000000000000000602082015250565b6000613d42602d8361312d565b9150613d4d82613ce6565b604082019050919050565b60006020820190508181036000830152613d7181613d35565b9050919050565b6000613d83826131dd565b9150613d8e836131dd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613dc757613dc66139d9565b5b828202905092915050565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b6000613e0860128361312d565b9150613e1382613dd2565b602082019050919050565b60006020820190508181036000830152613e3781613dfb565b9050919050565b7f5265626f726e2054696d65206973205442442e00000000000000000000000000600082015250565b6000613e7460138361312d565b9150613e7f82613e3e565b602082019050919050565b60006020820190508181036000830152613ea381613e67565b9050919050565b600081905092915050565b50565b6000613ec5600083613eaa565b9150613ed082613eb5565b600082019050919050565b6000613ee682613eb8565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b6000613f2660108361312d565b9150613f3182613ef0565b602082019050919050565b60006020820190508181036000830152613f5581613f19565b9050919050565b7f5265626f726e20686173206e6f7420626567756e207965740000000000000000600082015250565b6000613f9260188361312d565b9150613f9d82613f5c565b602082019050919050565b60006020820190508181036000830152613fc181613f85565b9050919050565b600081519050613fd78161329c565b92915050565b600060208284031215613ff357613ff261305d565b5b600061400184828501613fc8565b91505092915050565b7f546f6b656e496431206e6f74206f776e65642062792063757272656e7453656e60008201527f6465720000000000000000000000000000000000000000000000000000000000602082015250565b600061406660238361312d565b91506140718261400a565b604082019050919050565b6000602082019050818103600083015261409581614059565b9050919050565b7f546f6b656e496432206e6f74206f776e65642062792063757272656e7453656e60008201527f6465720000000000000000000000000000000000000000000000000000000000602082015250565b60006140f860238361312d565b91506141038261409c565b604082019050919050565b60006020820190508181036000830152614127816140eb565b9050919050565b7f546f6b656e20646f6573206e6f742065786973742e0000000000000000000000600082015250565b600061416460158361312d565b915061416f8261412e565b602082019050919050565b6000602082019050818103600083015261419381614157565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546141c7816138a9565b6141d1818661419a565b945060018216600081146141ec57600181146141fd57614230565b60ff19831686528186019350614230565b614206856141a5565b60005b8381101561422857815481890152600182019150602081019050614209565b838801955050505b50505092915050565b600061424482613122565b61424e818561419a565b935061425e81856020860161313e565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006142a060058361419a565b91506142ab8261426a565b600582019050919050565b60006142c282856141ba565b91506142ce8284614239565b91506142d982614293565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061434160268361312d565b915061434c826142e5565b604082019050919050565b6000602082019050818103600083015261437081614334565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061439e82614377565b6143a88185614382565b93506143b881856020860161313e565b6143c181613171565b840191505092915050565b60006080820190506143e16000830187613272565b6143ee6020830186613272565b6143fb6040830185613308565b818103606083015261440d8184614393565b905095945050505050565b60008151905061442781613093565b92915050565b6000602082840312156144435761444261305d565b5b600061445184828501614418565b91505092915050565b6000614465826131dd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614498576144976139d9565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006144dd826131dd565b91506144e8836131dd565b9250826144f8576144f76144a3565b5b828204905092915050565b600061450e826131dd565b9150614519836131dd565b92508282101561452c5761452b6139d9565b5b828203905092915050565b6000614542826131dd565b915061454d836131dd565b92508261455d5761455c6144a3565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea26469706673582212206bc91d864800bc5bd517e9845a0910ac16c67552282380a6000257ae8dbdec9664736f6c634300080900330000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000089800000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000f7ee5b608d1b96ef828815d64da2bb8cc05c399a
Deployed Bytecode
0x6080604052600436106101f95760003560e01c80638bc35c2f1161010d578063ac446002116100a0578063cddb28ff1161006f578063cddb28ff146106ea578063dc33e68114610713578063e985e9c514610750578063f2fde38b1461078d578063fbe1aa51146107b6576101f9565b8063ac44600214610644578063af15dd981461065b578063b88d4fde14610684578063c87b56dd146106ad576101f9565b806395d89b41116100dc57806395d89b41146105a9578063a0712d68146105d4578063a22cb465146105f0578063a2bf9cb914610619576101f9565b80638bc35c2f146104fd5780638da5cb5b1461052857806390aa0b0f1461055357806394f4114514610580576101f9565b806342842e0e1161019057806355f804b31161015f57806355f804b31461041a5780636352211e146104435780636aef50691461048057806370a08231146104a9578063715018a6146104e6576101f9565b806342842e0e1461037457806345c0f5331461039d5780634867eb47146103c85780634e920d51146103f1576101f9565b806318160ddd116101cc57806318160ddd146102cc57806323b872dd146102f7578063375a069a146103205780633f5e474114610349576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b50610225600480360381019061022091906130bf565b6107e1565b6040516102329190613107565b60405180910390f35b34801561024757600080fd5b50610250610873565b60405161025d91906131bb565b60405180910390f35b34801561027257600080fd5b5061028d60048036038101906102889190613213565b610905565b60405161029a9190613281565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c591906132c8565b610981565b005b3480156102d857600080fd5b506102e1610b28565b6040516102ee9190613317565b60405180910390f35b34801561030357600080fd5b5061031e60048036038101906103199190613332565b610b3f565b005b34801561032c57600080fd5b5061034760048036038101906103429190613213565b610b4f565b005b34801561035557600080fd5b5061035e610c74565b60405161036b9190613107565b60405180910390f35b34801561038057600080fd5b5061039b60048036038101906103969190613332565b610cf8565b005b3480156103a957600080fd5b506103b2610d18565b6040516103bf9190613317565b60405180910390f35b3480156103d457600080fd5b506103ef60048036038101906103ea9190613385565b610d1e565b005b3480156103fd57600080fd5b5061041860048036038101906104139190613385565b610df5565b005b34801561042657600080fd5b50610441600480360381019061043c9190613417565b610ecc565b005b34801561044f57600080fd5b5061046a60048036038101906104659190613213565b610f5e565b6040516104779190613281565b60405180910390f35b34801561048c57600080fd5b506104a760048036038101906104a29190613213565b610f70565b005b3480156104b557600080fd5b506104d060048036038101906104cb9190613385565b611057565b6040516104dd9190613317565b60405180910390f35b3480156104f257600080fd5b506104fb611110565b005b34801561050957600080fd5b50610512611198565b60405161051f9190613317565b60405180910390f35b34801561053457600080fd5b5061053d61119e565b60405161054a9190613281565b60405180910390f35b34801561055f57600080fd5b506105686111c7565b604051610577939291906134a6565b60405180910390f35b34801561058c57600080fd5b506105a760048036038101906105a29190613535565b611213565b005b3480156105b557600080fd5b506105be611347565b6040516105cb91906131bb565b60405180910390f35b6105ee60048036038101906105e99190613213565b6113d9565b005b3480156105fc57600080fd5b50610617600480360381019061061291906135b4565b6115c1565b005b34801561062557600080fd5b5061062e611739565b60405161063b9190613107565b60405180910390f35b34801561065057600080fd5b506106596117bd565b005b34801561066757600080fd5b50610682600480360381019061067d91906135f4565b6118e8565b005b34801561069057600080fd5b506106ab60048036038101906106a69190613764565b611db9565b005b3480156106b957600080fd5b506106d460048036038101906106cf9190613213565b611e2c565b6040516106e191906131bb565b60405180910390f35b3480156106f657600080fd5b50610711600480360381019061070c91906137e7565b611ed4565b005b34801561071f57600080fd5b5061073a60048036038101906107359190613385565b611f6a565b6040516107479190613317565b60405180910390f35b34801561075c57600080fd5b506107776004803603810190610772919061383a565b611f7c565b6040516107849190613107565b60405180910390f35b34801561079957600080fd5b506107b460048036038101906107af9190613385565b612010565b005b3480156107c257600080fd5b506107cb612108565b6040516107d89190613317565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061083c57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061086c5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610882906138a9565b80601f01602080910402602001604051908101604052809291908181526020018280546108ae906138a9565b80156108fb5780601f106108d0576101008083540402835291602001916108fb565b820191906000526020600020905b8154815290600101906020018083116108de57829003601f168201915b5050505050905090565b60006109108261210e565b610946576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061098c8261216d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109f4576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a1361223b565b73ffffffffffffffffffffffffffffffffffffffff1614610a7657610a3f81610a3a61223b565b611f7c565b610a75576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610b32612243565b6002546001540303905090565b610b4a838383612248565b505050565b610b576125f2565b73ffffffffffffffffffffffffffffffffffffffff16610b7561119e565b73ffffffffffffffffffffffffffffffffffffffff1614610bcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc290613927565b60405180910390fd5b600b54811115610c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c07906139b9565b60405180910390fd5b600a5481610c1c610b28565b610c269190613a08565b1115610c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5e90613aaa565b60405180910390fd5b610c7133826125fa565b50565b600080600e60000160009054906101000a900463ffffffff1663ffffffff161415610cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccb90613b16565b60405180910390fd5b600e60000160009054906101000a900463ffffffff1663ffffffff16421015905090565b610d1383838360405180602001604052806000815250611db9565b505050565b600a5481565b610d266125f2565b73ffffffffffffffffffffffffffffffffffffffff16610d4461119e565b73ffffffffffffffffffffffffffffffffffffffff1614610d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9190613927565b60405180910390fd5b6001600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b610dfd6125f2565b73ffffffffffffffffffffffffffffffffffffffff16610e1b61119e565b73ffffffffffffffffffffffffffffffffffffffff1614610e71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6890613927565b60405180910390fd5b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b610ed46125f2565b73ffffffffffffffffffffffffffffffffffffffff16610ef261119e565b73ffffffffffffffffffffffffffffffffffffffff1614610f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3f90613927565b60405180910390fd5b8181600f9190610f59929190612fb0565b505050565b6000610f698261216d565b9050919050565b600d6000610f7c6125f2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611003576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffa90613b82565b60405180910390fd5b61100c8161210e565b61104b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104290613bee565b60405180910390fd5b61105481612618565b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110bf576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6111186125f2565b73ffffffffffffffffffffffffffffffffffffffff1661113661119e565b73ffffffffffffffffffffffffffffffffffffffff161461118c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118390613927565b60405180910390fd5b6111966000612626565b565b60095481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e8060000160009054906101000a900463ffffffff16908060000160049054906101000a900467ffffffffffffffff169080600001600c9054906101000a900463ffffffff16905083565b61121b6125f2565b73ffffffffffffffffffffffffffffffffffffffff1661123961119e565b73ffffffffffffffffffffffffffffffffffffffff161461128f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128690613927565b60405180910390fd5b60405180606001604052808363ffffffff1681526020018467ffffffffffffffff1681526020018263ffffffff16815250600e60008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550604082015181600001600c6101000a81548163ffffffff021916908363ffffffff160217905550905050505050565b606060048054611356906138a9565b80601f0160208091040260200160405190810160405280929190818152602001828054611382906138a9565b80156113cf5780601f106113a4576101008083540402835291602001916113cf565b820191906000526020600020905b8154815290600101906020018083116113b257829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611447576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143e90613c5a565b60405180910390fd5b61144f610c74565b61148e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148590613cc6565b60405180910390fd5b600a548161149a610b28565b6114a49190613a08565b11156114e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114dc90613aaa565b60405180910390fd5b600954816114f233611f6a565b6114fc9190613a08565b111561153d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153490613d58565b60405180910390fd5b6000600e60000160049054906101000a900467ffffffffffffffff1667ffffffffffffffff168261156e9190613d78565b9050803410156115b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115aa90613e1e565b60405180910390fd5b6115bd33836125fa565b5050565b6115c961223b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561162e576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806008600061163b61223b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116e861223b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161172d9190613107565b60405180910390a35050565b600080600e600001600c9054906101000a900463ffffffff1663ffffffff161415611799576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179090613e8a565b60405180910390fd5b600e600001600c9054906101000a900463ffffffff1663ffffffff16421015905090565b6117c56125f2565b73ffffffffffffffffffffffffffffffffffffffff166117e361119e565b73ffffffffffffffffffffffffffffffffffffffff1614611839576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183090613927565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405161185f90613edb565b60006040518083038185875af1925050503d806000811461189c576040519150601f19603f3d011682016040523d82523d6000602084013e6118a1565b606091505b50509050806118e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118dc90613f3c565b60405180910390fd5b50565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194d90613c5a565b60405180910390fd5b61195e611739565b61199d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199490613fa8565b60405180910390fd5b600060019050600a54816119af610b28565b6119b99190613a08565b11156119fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f190613aaa565b60405180910390fd5b60095481611a0733611f6a565b611a119190613a08565b1115611a52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4990613d58565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b8152600401611aad9190613317565b60206040518083038186803b158015611ac557600080fd5b505afa158015611ad9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611afd9190613fdd565b73ffffffffffffffffffffffffffffffffffffffff16611b1b6125f2565b73ffffffffffffffffffffffffffffffffffffffff1614611b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b689061407c565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401611bcc9190613317565b60206040518083038186803b158015611be457600080fd5b505afa158015611bf8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1c9190613fdd565b73ffffffffffffffffffffffffffffffffffffffff16611c3a6125f2565b73ffffffffffffffffffffffffffffffffffffffff1614611c90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c879061410e565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636aef5069846040518263ffffffff1660e01b8152600401611ceb9190613317565b600060405180830381600087803b158015611d0557600080fd5b505af1158015611d19573d6000803e3d6000fd5b50505050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636aef5069836040518263ffffffff1660e01b8152600401611d789190613317565b600060405180830381600087803b158015611d9257600080fd5b505af1158015611da6573d6000803e3d6000fd5b50505050611db433826125fa565b505050565b611dc4848484612248565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611e2657611def848484846126ea565b611e25576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060611e378261210e565b611e76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6d9061417a565b60405180910390fd5b6000600f8054611e85906138a9565b905011611ea15760405180602001604052806000815250611ecd565b600f611eac8361284a565b604051602001611ebd9291906142b6565b6040516020818303038152906040525b9050919050565b611edc6125f2565b73ffffffffffffffffffffffffffffffffffffffff16611efa61119e565b73ffffffffffffffffffffffffffffffffffffffff1614611f50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4790613927565b60405180910390fd5b8260098190555081600a8190555080600b81905550505050565b6000611f75826129ab565b9050919050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6120186125f2565b73ffffffffffffffffffffffffffffffffffffffff1661203661119e565b73ffffffffffffffffffffffffffffffffffffffff161461208c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208390613927565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f390614357565b60405180910390fd5b61210581612626565b50565b600b5481565b600081612119612243565b11158015612128575060015482105b8015612166575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b6000808290508061217c612243565b11612204576001548110156122035760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612201575b60008114156121f75760056000836001900393508381526020019081526020016000205490506121cc565b8092505050612236565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b60006122538261216d565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146122ba576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166122db61223b565b73ffffffffffffffffffffffffffffffffffffffff16148061230a57506123098561230461223b565b611f7c565b5b8061234f575061231861223b565b73ffffffffffffffffffffffffffffffffffffffff1661233784610905565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612388576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156123ef576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123fc8585856001612a02565b6007600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b6124f986612a08565b1717600560008581526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415612583576000600184019050600060056000838152602001908152602001600020541415612581576001548114612580578260056000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125eb8585856001612a12565b5050505050565b600033905090565b612614828260405180602001604052806000815250612a18565b5050565b612623816000612cce565b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261271061223b565b8786866040518563ffffffff1660e01b815260040161273294939291906143cc565b602060405180830381600087803b15801561274c57600080fd5b505af192505050801561277d57506040513d601f19601f8201168201806040525081019061277a919061442d565b60015b6127f7573d80600081146127ad576040519150601f19603f3d011682016040523d82523d6000602084013e6127b2565b606091505b506000815114156127ef576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415612892576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506129a6565b600082905060005b600082146128c45780806128ad9061445a565b915050600a826128bd91906144d2565b915061289a565b60008167ffffffffffffffff8111156128e0576128df613639565b5b6040519080825280601f01601f1916602001820160405280156129125781602001600182028036833780820191505090505b5090505b6000851461299f5760018261292b9190614503565b9150600a8561293a9190614537565b60306129469190613a08565b60f81b81838151811061295c5761295b614568565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561299891906144d2565b9450612916565b8093505050505b919050565b600067ffffffffffffffff6040600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b50505050565b6000819050919050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612a86576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415612ac1576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ace6000858386612a02565b600160406001901b178302600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1612b3360018514612fa6565b901b60a042901b612b4386612a08565b1717600560008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612c47575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bf760008784806001019550876126ea565b612c2d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210612b88578260015414612c4257600080fd5b612cb2565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612c48575b816001819055505050612cc86000858386612a12565b50505050565b6000612cd98361216d565b905060008190508215612db65760008173ffffffffffffffffffffffffffffffffffffffff16612d0761223b565b73ffffffffffffffffffffffffffffffffffffffff161480612d365750612d3582612d3061223b565b611f7c565b5b80612d7b5750612d4461223b565b73ffffffffffffffffffffffffffffffffffffffff16612d6386610905565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612db4576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b612dc4816000866001612a02565b6007600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600160806001901b03600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055507c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000060a042901b612e9984612a08565b171717600560008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415612f24576000600185019050600060056000838152602001908152602001600020541415612f22576001548114612f21578260056000838152602001908152602001600020819055505b5b505b83600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612f8e816000866001612a12565b60026000815480929190600101919050555050505050565b6000819050919050565b828054612fbc906138a9565b90600052602060002090601f016020900481019282612fde5760008555613025565b82601f10612ff757803560ff1916838001178555613025565b82800160010185558215613025579182015b82811115613024578235825591602001919060010190613009565b5b5090506130329190613036565b5090565b5b8082111561304f576000816000905550600101613037565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61309c81613067565b81146130a757600080fd5b50565b6000813590506130b981613093565b92915050565b6000602082840312156130d5576130d461305d565b5b60006130e3848285016130aa565b91505092915050565b60008115159050919050565b613101816130ec565b82525050565b600060208201905061311c60008301846130f8565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561315c578082015181840152602081019050613141565b8381111561316b576000848401525b50505050565b6000601f19601f8301169050919050565b600061318d82613122565b613197818561312d565b93506131a781856020860161313e565b6131b081613171565b840191505092915050565b600060208201905081810360008301526131d58184613182565b905092915050565b6000819050919050565b6131f0816131dd565b81146131fb57600080fd5b50565b60008135905061320d816131e7565b92915050565b6000602082840312156132295761322861305d565b5b6000613237848285016131fe565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061326b82613240565b9050919050565b61327b81613260565b82525050565b60006020820190506132966000830184613272565b92915050565b6132a581613260565b81146132b057600080fd5b50565b6000813590506132c28161329c565b92915050565b600080604083850312156132df576132de61305d565b5b60006132ed858286016132b3565b92505060206132fe858286016131fe565b9150509250929050565b613311816131dd565b82525050565b600060208201905061332c6000830184613308565b92915050565b60008060006060848603121561334b5761334a61305d565b5b6000613359868287016132b3565b935050602061336a868287016132b3565b925050604061337b868287016131fe565b9150509250925092565b60006020828403121561339b5761339a61305d565b5b60006133a9848285016132b3565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126133d7576133d66133b2565b5b8235905067ffffffffffffffff8111156133f4576133f36133b7565b5b6020830191508360018202830111156134105761340f6133bc565b5b9250929050565b6000806020838503121561342e5761342d61305d565b5b600083013567ffffffffffffffff81111561344c5761344b613062565b5b613458858286016133c1565b92509250509250929050565b600063ffffffff82169050919050565b61347d81613464565b82525050565b600067ffffffffffffffff82169050919050565b6134a081613483565b82525050565b60006060820190506134bb6000830186613474565b6134c86020830185613497565b6134d56040830184613474565b949350505050565b6134e681613483565b81146134f157600080fd5b50565b600081359050613503816134dd565b92915050565b61351281613464565b811461351d57600080fd5b50565b60008135905061352f81613509565b92915050565b60008060006060848603121561354e5761354d61305d565b5b600061355c868287016134f4565b935050602061356d86828701613520565b925050604061357e86828701613520565b9150509250925092565b613591816130ec565b811461359c57600080fd5b50565b6000813590506135ae81613588565b92915050565b600080604083850312156135cb576135ca61305d565b5b60006135d9858286016132b3565b92505060206135ea8582860161359f565b9150509250929050565b6000806040838503121561360b5761360a61305d565b5b6000613619858286016131fe565b925050602061362a858286016131fe565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61367182613171565b810181811067ffffffffffffffff821117156136905761368f613639565b5b80604052505050565b60006136a3613053565b90506136af8282613668565b919050565b600067ffffffffffffffff8211156136cf576136ce613639565b5b6136d882613171565b9050602081019050919050565b82818337600083830152505050565b6000613707613702846136b4565b613699565b90508281526020810184848401111561372357613722613634565b5b61372e8482856136e5565b509392505050565b600082601f83011261374b5761374a6133b2565b5b813561375b8482602086016136f4565b91505092915050565b6000806000806080858703121561377e5761377d61305d565b5b600061378c878288016132b3565b945050602061379d878288016132b3565b93505060406137ae878288016131fe565b925050606085013567ffffffffffffffff8111156137cf576137ce613062565b5b6137db87828801613736565b91505092959194509250565b600080600060608486031215613800576137ff61305d565b5b600061380e868287016131fe565b935050602061381f868287016131fe565b9250506040613830868287016131fe565b9150509250925092565b600080604083850312156138515761385061305d565b5b600061385f858286016132b3565b9250506020613870858286016132b3565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806138c157607f821691505b602082108114156138d5576138d461387a565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061391160208361312d565b915061391c826138db565b602082019050919050565b6000602082019050818103600083015261394081613904565b9050919050565b7f546f6f206d616e7920616c7265616479206d696e746564206265666f7265206460008201527f6576206d696e7400000000000000000000000000000000000000000000000000602082015250565b60006139a360278361312d565b91506139ae82613947565b604082019050919050565b600060208201905081810360008301526139d281613996565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a13826131dd565b9150613a1e836131dd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a5357613a526139d9565b5b828201905092915050565b7f52656163686564206d617820737570706c790000000000000000000000000000600082015250565b6000613a9460128361312d565b9150613a9f82613a5e565b602082019050919050565b60006020820190508181036000830152613ac381613a87565b9050919050565b7f5075626c69632053616c652054696d65206973205442442e0000000000000000600082015250565b6000613b0060188361312d565b9150613b0b82613aca565b602082019050919050565b60006020820190508181036000830152613b2f81613af3565b9050919050565b7f4e6f7420616e20616c746172206f662073616372696669636500000000000000600082015250565b6000613b6c60198361312d565b9150613b7782613b36565b602082019050919050565b60006020820190508181036000830152613b9b81613b5f565b9050919050565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b6000613bd860148361312d565b9150613be382613ba2565b602082019050919050565b60006020820190508181036000830152613c0781613bcb565b9050919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b6000613c44601e8361312d565b9150613c4f82613c0e565b602082019050919050565b60006020820190508181036000830152613c7381613c37565b9050919050565b7f5075626c69632073616c6520686173206e6f7420626567756e20796574000000600082015250565b6000613cb0601d8361312d565b9150613cbb82613c7a565b602082019050919050565b60006020820190508181036000830152613cdf81613ca3565b9050919050565b7f52656163686564206d6178207175616e746974792074686174206f6e6520776160008201527f6c6c65742063616e206d696e7400000000000000000000000000000000000000602082015250565b6000613d42602d8361312d565b9150613d4d82613ce6565b604082019050919050565b60006020820190508181036000830152613d7181613d35565b9050919050565b6000613d83826131dd565b9150613d8e836131dd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613dc757613dc66139d9565b5b828202905092915050565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b6000613e0860128361312d565b9150613e1382613dd2565b602082019050919050565b60006020820190508181036000830152613e3781613dfb565b9050919050565b7f5265626f726e2054696d65206973205442442e00000000000000000000000000600082015250565b6000613e7460138361312d565b9150613e7f82613e3e565b602082019050919050565b60006020820190508181036000830152613ea381613e67565b9050919050565b600081905092915050565b50565b6000613ec5600083613eaa565b9150613ed082613eb5565b600082019050919050565b6000613ee682613eb8565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b6000613f2660108361312d565b9150613f3182613ef0565b602082019050919050565b60006020820190508181036000830152613f5581613f19565b9050919050565b7f5265626f726e20686173206e6f7420626567756e207965740000000000000000600082015250565b6000613f9260188361312d565b9150613f9d82613f5c565b602082019050919050565b60006020820190508181036000830152613fc181613f85565b9050919050565b600081519050613fd78161329c565b92915050565b600060208284031215613ff357613ff261305d565b5b600061400184828501613fc8565b91505092915050565b7f546f6b656e496431206e6f74206f776e65642062792063757272656e7453656e60008201527f6465720000000000000000000000000000000000000000000000000000000000602082015250565b600061406660238361312d565b91506140718261400a565b604082019050919050565b6000602082019050818103600083015261409581614059565b9050919050565b7f546f6b656e496432206e6f74206f776e65642062792063757272656e7453656e60008201527f6465720000000000000000000000000000000000000000000000000000000000602082015250565b60006140f860238361312d565b91506141038261409c565b604082019050919050565b60006020820190508181036000830152614127816140eb565b9050919050565b7f546f6b656e20646f6573206e6f742065786973742e0000000000000000000000600082015250565b600061416460158361312d565b915061416f8261412e565b602082019050919050565b6000602082019050818103600083015261419381614157565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546141c7816138a9565b6141d1818661419a565b945060018216600081146141ec57600181146141fd57614230565b60ff19831686528186019350614230565b614206856141a5565b60005b8381101561422857815481890152600182019150602081019050614209565b838801955050505b50505092915050565b600061424482613122565b61424e818561419a565b935061425e81856020860161313e565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006142a060058361419a565b91506142ab8261426a565b600582019050919050565b60006142c282856141ba565b91506142ce8284614239565b91506142d982614293565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061434160268361312d565b915061434c826142e5565b604082019050919050565b6000602082019050818103600083015261437081614334565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061439e82614377565b6143a88185614382565b93506143b881856020860161313e565b6143c181613171565b840191505092915050565b60006080820190506143e16000830187613272565b6143ee6020830186613272565b6143fb6040830185613308565b818103606083015261440d8184614393565b905095945050505050565b60008151905061442781613093565b92915050565b6000602082840312156144435761444261305d565b5b600061445184828501614418565b91505092915050565b6000614465826131dd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614498576144976139d9565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006144dd826131dd565b91506144e8836131dd565b9250826144f8576144f76144a3565b5b828204905092915050565b600061450e826131dd565b9150614519836131dd565b92508282101561452c5761452b6139d9565b5b828203905092915050565b6000614542826131dd565b915061454d836131dd565b92508261455d5761455c6144a3565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea26469706673582212206bc91d864800bc5bd517e9845a0910ac16c67552282380a6000257ae8dbdec9664736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000089800000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000f7ee5b608d1b96ef828815d64da2bb8cc05c399a
-----Decoded View---------------
Arg [0] : maxBatchSize_ (uint256): 2
Arg [1] : collectionSize_ (uint256): 2200
Arg [2] : amountForDevs_ (uint256): 200
Arg [3] : bsanycAddress_ (address): 0xf7EE5B608d1b96eF828815D64DA2bb8cC05C399a
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000898
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [3] : 000000000000000000000000f7ee5b608d1b96ef828815d64da2bb8cc05c399a
Deployed Bytecode Sourcemap
59997:6154:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24077:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29090:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31158:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30618:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23131:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32044:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61473:350;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63604:249;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32285:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60088:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65181:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65280:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64237:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28879:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65383:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24756:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51957:103;;;;;;;;;;;;;:::i;:::-;;60043:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51306:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60554:28;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;64540:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29259:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61835:654;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31434:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63861:236;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64351:181;;;;;;;;;;;;;:::i;:::-;;62499:860;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32541:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65778:368;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64843:330;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63482:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31813:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52215:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60124:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24077:615;24162:4;24477:10;24462:25;;:11;:25;;;;:102;;;;24554:10;24539:25;;:11;:25;;;;24462:102;:179;;;;24631:10;24616:25;;:11;:25;;;;24462:179;24442:199;;24077:615;;;:::o;29090:100::-;29144:13;29177:5;29170:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29090:100;:::o;31158:204::-;31226:7;31251:16;31259:7;31251;:16::i;:::-;31246:64;;31276:34;;;;;;;;;;;;;;31246:64;31330:15;:24;31346:7;31330:24;;;;;;;;;;;;;;;;;;;;;31323:31;;31158:204;;;:::o;30618:474::-;30691:13;30723:27;30742:7;30723:18;:27::i;:::-;30691:61;;30773:5;30767:11;;:2;:11;;;30763:48;;;30787:24;;;;;;;;;;;;;;30763:48;30851:5;30828:28;;:19;:17;:19::i;:::-;:28;;;30824:175;;30876:44;30893:5;30900:19;:17;:19::i;:::-;30876:16;:44::i;:::-;30871:128;;30948:35;;;;;;;;;;;;;;30871:128;30824:175;31038:2;31011:15;:24;31027:7;31011:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31076:7;31072:2;31056:28;;31065:5;31056:28;;;;;;;;;;;;30680:412;30618:474;;:::o;23131:315::-;23184:7;23412:15;:13;:15::i;:::-;23397:12;;23381:13;;:28;:46;23374:53;;23131:315;:::o;32044:170::-;32178:28;32188:4;32194:2;32198:7;32178:9;:28::i;:::-;32044:170;;;:::o;61473:350::-;51537:12;:10;:12::i;:::-;51526:23;;:7;:5;:7::i;:::-;:23;;;51518:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61572:13:::1;;61560:8;:25;;61538:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;61713:14;;61701:8;61685:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:42;;61663:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;61784:31;61794:10;61806:8;61784:9;:31::i;:::-;61473:350:::0;:::o;63604:249::-;63650:4;63723:1;63689:10;:30;;;;;;;;;;;;:35;;;;63667:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;63815:10;:30;;;;;;;;;;;;63796:49;;:15;:49;;63789:56;;63604:249;:::o;32285:185::-;32423:39;32440:4;32446:2;32450:7;32423:39;;;;;;;;;;;;:16;:39::i;:::-;32285:185;;;:::o;60088:29::-;;;;:::o;65181:91::-;51537:12;:10;:12::i;:::-;51526:23;;:7;:5;:7::i;:::-;:23;;;51518:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65260:4:::1;65238:16;:19;65255:1;65238:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;65181:91:::0;:::o;65280:95::-;51537:12;:10;:12::i;:::-;51526:23;;:7;:5;:7::i;:::-;:23;;;51518:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65362:5:::1;65340:16;:19;65357:1;65340:19;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;65280:95:::0;:::o;64237:106::-;51537:12;:10;:12::i;:::-;51526:23;;:7;:5;:7::i;:::-;:23;;;51518:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64328:7:::1;;64312:13;:23;;;;;;;:::i;:::-;;64237:106:::0;;:::o;28879:144::-;28943:7;28986:27;29005:7;28986:18;:27::i;:::-;28963:52;;28879:144;;;:::o;65383:151::-;61381:16;:30;61398:12;:10;:12::i;:::-;61381:30;;;;;;;;;;;;;;;;;;;;;;;;;61373:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65460:16:::1;65468:7;65460;:16::i;:::-;65452:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;65512:14;65518:7;65512:5;:14::i;:::-;65383:151:::0;:::o;24756:224::-;24820:7;24861:1;24844:19;;:5;:19;;;24840:60;;;24872:28;;;;;;;;;;;;;;24840:60;20095:13;24918:18;:25;24937:5;24918:25;;;;;;;;;;;;;;;;:54;24911:61;;24756:224;;;:::o;51957:103::-;51537:12;:10;:12::i;:::-;51526:23;;:7;:5;:7::i;:::-;:23;;;51518:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52022:30:::1;52049:1;52022:18;:30::i;:::-;51957:103::o:0;60043:38::-;;;;:::o;51306:87::-;51352:7;51379:6;;;;;;;;;;;51372:13;;51306:87;:::o;60554:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;64540:295::-;51537:12;:10;:12::i;:::-;51526:23;;:7;:5;:7::i;:::-;:23;;;51518:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64713:114:::1;;;;;;;;64738:19;64713:114;;;;;;64772:14;64713:114;;;;;;64801:15;64713:114;;;;::::0;64700:10:::1;:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64540:295:::0;;;:::o;29259:104::-;29315:13;29348:7;29341:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29259:104;:::o;61835:654::-;61267:10;61254:23;;:9;:23;;;61246:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;61936:16:::1;:14;:16::i;:::-;61928:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;62047:14;;62035:8;62019:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:42;;61997:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;62179:23;;62167:8;62140:24;62153:10;62140:12;:24::i;:::-;:35;;;;:::i;:::-;:62;;62118:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;62288:16;62337:10;:25;;;;;;;;;;;;62326:36;;:8;:36;;;;:::i;:::-;62315:47;;62404:8;62391:9;:21;;62383:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;62448:31;62458:10;62470:8;62448:9;:31::i;:::-;61917:572;61835:654:::0;:::o;31434:308::-;31545:19;:17;:19::i;:::-;31533:31;;:8;:31;;;31529:61;;;31573:17;;;;;;;;;;;;;;31529:61;31655:8;31603:18;:39;31622:19;:17;:19::i;:::-;31603:39;;;;;;;;;;;;;;;:49;31643:8;31603:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;31715:8;31679:55;;31694:19;:17;:19::i;:::-;31679:55;;;31725:8;31679:55;;;;;;:::i;:::-;;;;;;;;31434:308;;:::o;63861:236::-;63907:4;63976:1;63946:10;:26;;;;;;;;;;;;:31;;;;63924:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;64063:10;:26;;;;;;;;;;;;64044:45;;:15;:45;;64037:52;;63861:236;:::o;64351:181::-;51537:12;:10;:12::i;:::-;51526:23;;:7;:5;:7::i;:::-;:23;;;51518:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64407:12:::1;64425:10;:15;;64449:21;64425:52;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64406:71;;;64496:7;64488:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;64395:137;64351:181::o:0;62499:860::-;61267:10;61254:23;;:9;:23;;;61246:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;62608:16:::1;:14;:16::i;:::-;62600:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;62666:16;62685:1;62666:20;;62757:14;;62745:8;62729:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:42;;62707:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;62891:23;;62879:8;62852:24;62865:10;62852:12;:24::i;:::-;:35;;;;:::i;:::-;:62;;62830:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;63024:15;;;;;;;;;;;:23;;;63048:8;63024:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63008:49;;:12;:10;:12::i;:::-;:49;;;63000:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;63132:15;;;;;;;;;;;:23;;;63156:8;63132:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63116:49;;:12;:10;:12::i;:::-;:49;;;63108:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;63218:15;;;;;;;;;;;:29;;;63248:8;63218:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;63268:15;;;;;;;;;;;:29;;;63298:8;63268:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;63320:31;63330:10;63342:8;63320:9;:31::i;:::-;62589:770;62499:860:::0;;:::o;32541:396::-;32708:28;32718:4;32724:2;32728:7;32708:9;:28::i;:::-;32769:1;32751:2;:14;;;:19;32747:183;;32790:56;32821:4;32827:2;32831:7;32840:5;32790:30;:56::i;:::-;32785:145;;32874:40;;;;;;;;;;;;;;32785:145;32747:183;32541:396;;;;:::o;65778:368::-;65844:13;65878:17;65886:8;65878:7;:17::i;:::-;65870:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;65969:1;65945:13;65939:27;;;;;:::i;:::-;;;:31;:199;;;;;;;;;;;;;;;;;66027:13;66057:26;66074:8;66057:16;:26::i;:::-;65994:128;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65939:199;65932:206;;65778:368;;;:::o;64843:330::-;51537:12;:10;:12::i;:::-;51526:23;;:7;:5;:7::i;:::-;:23;;;51518:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65051:26:::1;65025:23;:52;;;;65105:17;65088:14;:34;;;;65149:16;65133:13;:32;;;;64843:330:::0;;;:::o;63482:114::-;63540:7;63567:21;63581:6;63567:13;:21::i;:::-;63560:28;;63482:114;;;:::o;31813:164::-;31910:4;31934:18;:25;31953:5;31934:25;;;;;;;;;;;;;;;:35;31960:8;31934:35;;;;;;;;;;;;;;;;;;;;;;;;;31927:42;;31813:164;;;;:::o;52215:201::-;51537:12;:10;:12::i;:::-;51526:23;;:7;:5;:7::i;:::-;:23;;;51518:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52324:1:::1;52304:22;;:8;:22;;;;52296:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;52380:28;52399:8;52380:18;:28::i;:::-;52215:201:::0;:::o;60124:28::-;;;;:::o;33192:273::-;33249:4;33305:7;33286:15;:13;:15::i;:::-;:26;;:66;;;;;33339:13;;33329:7;:23;33286:66;:152;;;;;33437:1;20865:8;33390:17;:26;33408:7;33390:26;;;;;;;;;;;;:43;:48;33286:152;33266:172;;33192:273;;;:::o;26394:1129::-;26461:7;26481:12;26496:7;26481:22;;26564:4;26545:15;:13;:15::i;:::-;:23;26541:915;;26598:13;;26591:4;:20;26587:869;;;26636:14;26653:17;:23;26671:4;26653:23;;;;;;;;;;;;26636:40;;26769:1;20865:8;26742:6;:23;:28;26738:699;;;27261:113;27278:1;27268:6;:11;27261:113;;;27321:17;:25;27339:6;;;;;;;27321:25;;;;;;;;;;;;27312:34;;27261:113;;;27407:6;27400:13;;;;;;26738:699;26613:843;26587:869;26541:915;27484:31;;;;;;;;;;;;;;26394:1129;;;;:::o;47174:105::-;47234:7;47261:10;47254:17;;47174:105;:::o;22654:92::-;22710:7;22654:92;:::o;38431:2515::-;38546:27;38576;38595:7;38576:18;:27::i;:::-;38546:57;;38661:4;38620:45;;38636:19;38620:45;;;38616:86;;38674:28;;;;;;;;;;;;;;38616:86;38715:22;38764:4;38741:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;38785:43;38802:4;38808:19;:17;:19::i;:::-;38785:16;:43::i;:::-;38741:87;:147;;;;38869:19;:17;:19::i;:::-;38845:43;;:20;38857:7;38845:11;:20::i;:::-;:43;;;38741:147;38715:174;;38907:17;38902:66;;38933:35;;;;;;;;;;;;;;38902:66;38997:1;38983:16;;:2;:16;;;38979:52;;;39008:23;;;;;;;;;;;;;;38979:52;39044:43;39066:4;39072:2;39076:7;39085:1;39044:21;:43::i;:::-;39160:15;:24;39176:7;39160:24;;;;;;;;;;;;39153:31;;;;;;;;;;;39552:18;:24;39571:4;39552:24;;;;;;;;;;;;;;;;39550:26;;;;;;;;;;;;39621:18;:22;39640:2;39621:22;;;;;;;;;;;;;;;;39619:24;;;;;;;;;;;21147:8;20749:3;40002:15;:41;;39960:21;39978:2;39960:17;:21::i;:::-;:84;:128;39914:17;:26;39932:7;39914:26;;;;;;;;;;;:174;;;;40258:1;21147:8;40208:19;:46;:51;40204:626;;;40280:19;40312:1;40302:7;:11;40280:33;;40469:1;40435:17;:30;40453:11;40435:30;;;;;;;;;;;;:35;40431:384;;;40573:13;;40558:11;:28;40554:242;;40753:19;40720:17;:30;40738:11;40720:30;;;;;;;;;;;:52;;;;40554:242;40431:384;40261:569;40204:626;40877:7;40873:2;40858:27;;40867:4;40858:27;;;;;;;;;;;;40896:42;40917:4;40923:2;40927:7;40936:1;40896:20;:42::i;:::-;38535:2411;;38431:2515;;;:::o;50030:98::-;50083:7;50110:10;50103:17;;50030:98;:::o;33549:104::-;33618:27;33628:2;33632:8;33618:27;;;;;;;;;;;;:9;:27::i;:::-;33549:104;;:::o;41024:89::-;41084:21;41090:7;41099:5;41084;:21::i;:::-;41024:89;:::o;52576:191::-;52650:16;52669:6;;;;;;;;;;;52650:25;;52695:8;52686:6;;:17;;;;;;;;;;;;;;;;;;52750:8;52719:40;;52740:8;52719:40;;;;;;;;;;;;52639:128;52576:191;:::o;44643:716::-;44806:4;44852:2;44827:45;;;44873:19;:17;:19::i;:::-;44894:4;44900:7;44909:5;44827:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;44823:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45127:1;45110:6;:13;:18;45106:235;;;45156:40;;;;;;;;;;;;;;45106:235;45299:6;45293:13;45284:6;45280:2;45276:15;45269:38;44823:529;44996:54;;;44986:64;;;:6;:64;;;;44979:71;;;44643:716;;;;;;:::o;9245:723::-;9301:13;9531:1;9522:5;:10;9518:53;;;9549:10;;;;;;;;;;;;;;;;;;;;;9518:53;9581:12;9596:5;9581:20;;9612:14;9637:78;9652:1;9644:4;:9;9637:78;;9670:8;;;;;:::i;:::-;;;;9701:2;9693:10;;;;;:::i;:::-;;;9637:78;;;9725:19;9757:6;9747:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9725:39;;9775:154;9791:1;9782:5;:10;9775:154;;9819:1;9809:11;;;;;:::i;:::-;;;9886:2;9878:5;:10;;;;:::i;:::-;9865:2;:24;;;;:::i;:::-;9852:39;;9835:6;9842;9835:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;9915:2;9906:11;;;;;:::i;:::-;;;9775:154;;;9953:6;9939:21;;;;;9245:723;;;;:::o;25062:176::-;25123:7;20095:13;20232:2;25151:18;:25;25170:5;25151:25;;;;;;;;;;;;;;;;:49;;25150:80;25143:87;;25062:176;;;:::o;46007:159::-;;;;;:::o;30179:148::-;30243:14;30304:5;30294:15;;30179:148;;;:::o;46825:158::-;;;;;:::o;34026:2236::-;34149:20;34172:13;;34149:36;;34214:1;34200:16;;:2;:16;;;34196:48;;;34225:19;;;;;;;;;;;;;;34196:48;34271:1;34259:8;:13;34255:44;;;34281:18;;;;;;;;;;;;;;34255:44;34312:61;34342:1;34346:2;34350:12;34364:8;34312:21;:61::i;:::-;34916:1;20232:2;34887:1;:25;;34886:31;34874:8;:44;34848:18;:22;34867:2;34848:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;21012:3;35317:29;35344:1;35332:8;:13;35317:14;:29::i;:::-;:56;;20749:3;35254:15;:41;;35212:21;35230:2;35212:17;:21::i;:::-;:84;:162;35161:17;:31;35179:12;35161:31;;;;;;;;;;;:213;;;;35391:20;35414:12;35391:35;;35441:11;35470:8;35455:12;:23;35441:37;;35517:1;35499:2;:14;;;:19;35495:635;;35539:313;35595:12;35591:2;35570:38;;35587:1;35570:38;;;;;;;;;;;;35636:69;35675:1;35679:2;35683:14;;;;;;35699:5;35636:30;:69::i;:::-;35631:174;;35741:40;;;;;;;;;;;;;;35631:174;35847:3;35832:12;:18;35539:313;;35933:12;35916:13;;:29;35912:43;;35947:8;;;35912:43;35495:635;;;35996:119;36052:14;;;;;;36048:2;36027:40;;36044:1;36027:40;;;;;;;;;;;;36110:3;36095:12;:18;35996:119;;35495:635;36160:12;36144:13;:28;;;;34625:1559;;36194:60;36223:1;36227:2;36231:12;36245:8;36194:20;:60::i;:::-;34138:2124;34026:2236;;;:::o;41342:2809::-;41422:27;41452;41471:7;41452:18;:27::i;:::-;41422:57;;41492:12;41523:19;41492:52;;41561:13;41557:311;;;41591:22;41640:4;41617:27;;:19;:17;:19::i;:::-;:27;;;:91;;;;41665:43;41682:4;41688:19;:17;:19::i;:::-;41665:16;:43::i;:::-;41617:91;:155;;;;41753:19;:17;:19::i;:::-;41729:43;;:20;41741:7;41729:11;:20::i;:::-;:43;;;41617:155;41591:182;;41795:17;41790:66;;41821:35;;;;;;;;;;;;;;41790:66;41576:292;41557:311;41880:51;41902:4;41916:1;41920:7;41929:1;41880:21;:51::i;:::-;42004:15;:24;42020:7;42004:24;;;;;;;;;;;;41997:31;;;;;;;;;;;42675:1;20358:3;42646:1;:25;;42645:31;42617:18;:24;42636:4;42617:24;;;;;;;;;;;;;;;;:59;;;;;;;;;;;21147:8;20865;20749:3;43004:15;:41;;42960:23;42978:4;42960:17;:23::i;:::-;:86;:120;:165;42914:17;:26;42932:7;42914:26;;;;;;;;;;;:211;;;;43295:1;21147:8;43245:19;:46;:51;43241:626;;;43317:19;43349:1;43339:7;:11;43317:33;;43506:1;43472:17;:30;43490:11;43472:30;;;;;;;;;;;;:35;43468:384;;;43610:13;;43595:11;:28;43591:242;;43790:19;43757:17;:30;43775:11;43757:30;;;;;;;;;;;:52;;;;43591:242;43468:384;43298:569;43241:626;43922:7;43918:1;43895:35;;43904:4;43895:35;;;;;;;;;;;;43941:50;43962:4;43976:1;43980:7;43989:1;43941:20;:50::i;:::-;44118:12;;:14;;;;;;;;;;;;;41411:2740;;41342:2809;;:::o;30414:142::-;30472:14;30533:5;30523:15;;30414:142;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:329::-;5974:6;6023:2;6011:9;6002:7;5998:23;5994:32;5991:119;;;6029:79;;:::i;:::-;5991:119;6149:1;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6120:117;5915:329;;;;:::o;6250:117::-;6359:1;6356;6349:12;6373:117;6482:1;6479;6472:12;6496:117;6605:1;6602;6595:12;6633:553;6691:8;6701:6;6751:3;6744:4;6736:6;6732:17;6728:27;6718:122;;6759:79;;:::i;:::-;6718:122;6872:6;6859:20;6849:30;;6902:18;6894:6;6891:30;6888:117;;;6924:79;;:::i;:::-;6888:117;7038:4;7030:6;7026:17;7014:29;;7092:3;7084:4;7076:6;7072:17;7062:8;7058:32;7055:41;7052:128;;;7099:79;;:::i;:::-;7052:128;6633:553;;;;;:::o;7192:529::-;7263:6;7271;7320:2;7308:9;7299:7;7295:23;7291:32;7288:119;;;7326:79;;:::i;:::-;7288:119;7474:1;7463:9;7459:17;7446:31;7504:18;7496:6;7493:30;7490:117;;;7526:79;;:::i;:::-;7490:117;7639:65;7696:7;7687:6;7676:9;7672:22;7639:65;:::i;:::-;7621:83;;;;7417:297;7192:529;;;;;:::o;7727:93::-;7763:7;7803:10;7796:5;7792:22;7781:33;;7727:93;;;:::o;7826:115::-;7911:23;7928:5;7911:23;:::i;:::-;7906:3;7899:36;7826:115;;:::o;7947:101::-;7983:7;8023:18;8016:5;8012:30;8001:41;;7947:101;;;:::o;8054:115::-;8139:23;8156:5;8139:23;:::i;:::-;8134:3;8127:36;8054:115;;:::o;8175:430::-;8318:4;8356:2;8345:9;8341:18;8333:26;;8369:69;8435:1;8424:9;8420:17;8411:6;8369:69;:::i;:::-;8448:70;8514:2;8503:9;8499:18;8490:6;8448:70;:::i;:::-;8528;8594:2;8583:9;8579:18;8570:6;8528:70;:::i;:::-;8175:430;;;;;;:::o;8611:120::-;8683:23;8700:5;8683:23;:::i;:::-;8676:5;8673:34;8663:62;;8721:1;8718;8711:12;8663:62;8611:120;:::o;8737:137::-;8782:5;8820:6;8807:20;8798:29;;8836:32;8862:5;8836:32;:::i;:::-;8737:137;;;;:::o;8880:120::-;8952:23;8969:5;8952:23;:::i;:::-;8945:5;8942:34;8932:62;;8990:1;8987;8980:12;8932:62;8880:120;:::o;9006:137::-;9051:5;9089:6;9076:20;9067:29;;9105:32;9131:5;9105:32;:::i;:::-;9006:137;;;;:::o;9149:613::-;9223:6;9231;9239;9288:2;9276:9;9267:7;9263:23;9259:32;9256:119;;;9294:79;;:::i;:::-;9256:119;9414:1;9439:52;9483:7;9474:6;9463:9;9459:22;9439:52;:::i;:::-;9429:62;;9385:116;9540:2;9566:52;9610:7;9601:6;9590:9;9586:22;9566:52;:::i;:::-;9556:62;;9511:117;9667:2;9693:52;9737:7;9728:6;9717:9;9713:22;9693:52;:::i;:::-;9683:62;;9638:117;9149:613;;;;;:::o;9768:116::-;9838:21;9853:5;9838:21;:::i;:::-;9831:5;9828:32;9818:60;;9874:1;9871;9864:12;9818:60;9768:116;:::o;9890:133::-;9933:5;9971:6;9958:20;9949:29;;9987:30;10011:5;9987:30;:::i;:::-;9890:133;;;;:::o;10029:468::-;10094:6;10102;10151:2;10139:9;10130:7;10126:23;10122:32;10119:119;;;10157:79;;:::i;:::-;10119:119;10277:1;10302:53;10347:7;10338:6;10327:9;10323:22;10302:53;:::i;:::-;10292:63;;10248:117;10404:2;10430:50;10472:7;10463:6;10452:9;10448:22;10430:50;:::i;:::-;10420:60;;10375:115;10029:468;;;;;:::o;10503:474::-;10571:6;10579;10628:2;10616:9;10607:7;10603:23;10599:32;10596:119;;;10634:79;;:::i;:::-;10596:119;10754:1;10779:53;10824:7;10815:6;10804:9;10800:22;10779:53;:::i;:::-;10769:63;;10725:117;10881:2;10907:53;10952:7;10943:6;10932:9;10928:22;10907:53;:::i;:::-;10897:63;;10852:118;10503:474;;;;;:::o;10983:117::-;11092:1;11089;11082:12;11106:180;11154:77;11151:1;11144:88;11251:4;11248:1;11241:15;11275:4;11272:1;11265:15;11292:281;11375:27;11397:4;11375:27;:::i;:::-;11367:6;11363:40;11505:6;11493:10;11490:22;11469:18;11457:10;11454:34;11451:62;11448:88;;;11516:18;;:::i;:::-;11448:88;11556:10;11552:2;11545:22;11335:238;11292:281;;:::o;11579:129::-;11613:6;11640:20;;:::i;:::-;11630:30;;11669:33;11697:4;11689:6;11669:33;:::i;:::-;11579:129;;;:::o;11714:307::-;11775:4;11865:18;11857:6;11854:30;11851:56;;;11887:18;;:::i;:::-;11851:56;11925:29;11947:6;11925:29;:::i;:::-;11917:37;;12009:4;12003;11999:15;11991:23;;11714:307;;;:::o;12027:154::-;12111:6;12106:3;12101;12088:30;12173:1;12164:6;12159:3;12155:16;12148:27;12027:154;;;:::o;12187:410::-;12264:5;12289:65;12305:48;12346:6;12305:48;:::i;:::-;12289:65;:::i;:::-;12280:74;;12377:6;12370:5;12363:21;12415:4;12408:5;12404:16;12453:3;12444:6;12439:3;12435:16;12432:25;12429:112;;;12460:79;;:::i;:::-;12429:112;12550:41;12584:6;12579:3;12574;12550:41;:::i;:::-;12270:327;12187:410;;;;;:::o;12616:338::-;12671:5;12720:3;12713:4;12705:6;12701:17;12697:27;12687:122;;12728:79;;:::i;:::-;12687:122;12845:6;12832:20;12870:78;12944:3;12936:6;12929:4;12921:6;12917:17;12870:78;:::i;:::-;12861:87;;12677:277;12616:338;;;;:::o;12960:943::-;13055:6;13063;13071;13079;13128:3;13116:9;13107:7;13103:23;13099:33;13096:120;;;13135:79;;:::i;:::-;13096:120;13255:1;13280:53;13325:7;13316:6;13305:9;13301:22;13280:53;:::i;:::-;13270:63;;13226:117;13382:2;13408:53;13453:7;13444:6;13433:9;13429:22;13408:53;:::i;:::-;13398:63;;13353:118;13510:2;13536:53;13581:7;13572:6;13561:9;13557:22;13536:53;:::i;:::-;13526:63;;13481:118;13666:2;13655:9;13651:18;13638:32;13697:18;13689:6;13686:30;13683:117;;;13719:79;;:::i;:::-;13683:117;13824:62;13878:7;13869:6;13858:9;13854:22;13824:62;:::i;:::-;13814:72;;13609:287;12960:943;;;;;;;:::o;13909:619::-;13986:6;13994;14002;14051:2;14039:9;14030:7;14026:23;14022:32;14019:119;;;14057:79;;:::i;:::-;14019:119;14177:1;14202:53;14247:7;14238:6;14227:9;14223:22;14202:53;:::i;:::-;14192:63;;14148:117;14304:2;14330:53;14375:7;14366:6;14355:9;14351:22;14330:53;:::i;:::-;14320:63;;14275:118;14432:2;14458:53;14503:7;14494:6;14483:9;14479:22;14458:53;:::i;:::-;14448:63;;14403:118;13909:619;;;;;:::o;14534:474::-;14602:6;14610;14659:2;14647:9;14638:7;14634:23;14630:32;14627:119;;;14665:79;;:::i;:::-;14627:119;14785:1;14810:53;14855:7;14846:6;14835:9;14831:22;14810:53;:::i;:::-;14800:63;;14756:117;14912:2;14938:53;14983:7;14974:6;14963:9;14959:22;14938:53;:::i;:::-;14928:63;;14883:118;14534:474;;;;;:::o;15014:180::-;15062:77;15059:1;15052:88;15159:4;15156:1;15149:15;15183:4;15180:1;15173:15;15200:320;15244:6;15281:1;15275:4;15271:12;15261:22;;15328:1;15322:4;15318:12;15349:18;15339:81;;15405:4;15397:6;15393:17;15383:27;;15339:81;15467:2;15459:6;15456:14;15436:18;15433:38;15430:84;;;15486:18;;:::i;:::-;15430:84;15251:269;15200:320;;;:::o;15526:182::-;15666:34;15662:1;15654:6;15650:14;15643:58;15526:182;:::o;15714:366::-;15856:3;15877:67;15941:2;15936:3;15877:67;:::i;:::-;15870:74;;15953:93;16042:3;15953:93;:::i;:::-;16071:2;16066:3;16062:12;16055:19;;15714:366;;;:::o;16086:419::-;16252:4;16290:2;16279:9;16275:18;16267:26;;16339:9;16333:4;16329:20;16325:1;16314:9;16310:17;16303:47;16367:131;16493:4;16367:131;:::i;:::-;16359:139;;16086:419;;;:::o;16511:226::-;16651:34;16647:1;16639:6;16635:14;16628:58;16720:9;16715:2;16707:6;16703:15;16696:34;16511:226;:::o;16743:366::-;16885:3;16906:67;16970:2;16965:3;16906:67;:::i;:::-;16899:74;;16982:93;17071:3;16982:93;:::i;:::-;17100:2;17095:3;17091:12;17084:19;;16743:366;;;:::o;17115:419::-;17281:4;17319:2;17308:9;17304:18;17296:26;;17368:9;17362:4;17358:20;17354:1;17343:9;17339:17;17332:47;17396:131;17522:4;17396:131;:::i;:::-;17388:139;;17115:419;;;:::o;17540:180::-;17588:77;17585:1;17578:88;17685:4;17682:1;17675:15;17709:4;17706:1;17699:15;17726:305;17766:3;17785:20;17803:1;17785:20;:::i;:::-;17780:25;;17819:20;17837:1;17819:20;:::i;:::-;17814:25;;17973:1;17905:66;17901:74;17898:1;17895:81;17892:107;;;17979:18;;:::i;:::-;17892:107;18023:1;18020;18016:9;18009:16;;17726:305;;;;:::o;18037:168::-;18177:20;18173:1;18165:6;18161:14;18154:44;18037:168;:::o;18211:366::-;18353:3;18374:67;18438:2;18433:3;18374:67;:::i;:::-;18367:74;;18450:93;18539:3;18450:93;:::i;:::-;18568:2;18563:3;18559:12;18552:19;;18211:366;;;:::o;18583:419::-;18749:4;18787:2;18776:9;18772:18;18764:26;;18836:9;18830:4;18826:20;18822:1;18811:9;18807:17;18800:47;18864:131;18990:4;18864:131;:::i;:::-;18856:139;;18583:419;;;:::o;19008:174::-;19148:26;19144:1;19136:6;19132:14;19125:50;19008:174;:::o;19188:366::-;19330:3;19351:67;19415:2;19410:3;19351:67;:::i;:::-;19344:74;;19427:93;19516:3;19427:93;:::i;:::-;19545:2;19540:3;19536:12;19529:19;;19188:366;;;:::o;19560:419::-;19726:4;19764:2;19753:9;19749:18;19741:26;;19813:9;19807:4;19803:20;19799:1;19788:9;19784:17;19777:47;19841:131;19967:4;19841:131;:::i;:::-;19833:139;;19560:419;;;:::o;19985:175::-;20125:27;20121:1;20113:6;20109:14;20102:51;19985:175;:::o;20166:366::-;20308:3;20329:67;20393:2;20388:3;20329:67;:::i;:::-;20322:74;;20405:93;20494:3;20405:93;:::i;:::-;20523:2;20518:3;20514:12;20507:19;;20166:366;;;:::o;20538:419::-;20704:4;20742:2;20731:9;20727:18;20719:26;;20791:9;20785:4;20781:20;20777:1;20766:9;20762:17;20755:47;20819:131;20945:4;20819:131;:::i;:::-;20811:139;;20538:419;;;:::o;20963:170::-;21103:22;21099:1;21091:6;21087:14;21080:46;20963:170;:::o;21139:366::-;21281:3;21302:67;21366:2;21361:3;21302:67;:::i;:::-;21295:74;;21378:93;21467:3;21378:93;:::i;:::-;21496:2;21491:3;21487:12;21480:19;;21139:366;;;:::o;21511:419::-;21677:4;21715:2;21704:9;21700:18;21692:26;;21764:9;21758:4;21754:20;21750:1;21739:9;21735:17;21728:47;21792:131;21918:4;21792:131;:::i;:::-;21784:139;;21511:419;;;:::o;21936:180::-;22076:32;22072:1;22064:6;22060:14;22053:56;21936:180;:::o;22122:366::-;22264:3;22285:67;22349:2;22344:3;22285:67;:::i;:::-;22278:74;;22361:93;22450:3;22361:93;:::i;:::-;22479:2;22474:3;22470:12;22463:19;;22122:366;;;:::o;22494:419::-;22660:4;22698:2;22687:9;22683:18;22675:26;;22747:9;22741:4;22737:20;22733:1;22722:9;22718:17;22711:47;22775:131;22901:4;22775:131;:::i;:::-;22767:139;;22494:419;;;:::o;22919:179::-;23059:31;23055:1;23047:6;23043:14;23036:55;22919:179;:::o;23104:366::-;23246:3;23267:67;23331:2;23326:3;23267:67;:::i;:::-;23260:74;;23343:93;23432:3;23343:93;:::i;:::-;23461:2;23456:3;23452:12;23445:19;;23104:366;;;:::o;23476:419::-;23642:4;23680:2;23669:9;23665:18;23657:26;;23729:9;23723:4;23719:20;23715:1;23704:9;23700:17;23693:47;23757:131;23883:4;23757:131;:::i;:::-;23749:139;;23476:419;;;:::o;23901:232::-;24041:34;24037:1;24029:6;24025:14;24018:58;24110:15;24105:2;24097:6;24093:15;24086:40;23901:232;:::o;24139:366::-;24281:3;24302:67;24366:2;24361:3;24302:67;:::i;:::-;24295:74;;24378:93;24467:3;24378:93;:::i;:::-;24496:2;24491:3;24487:12;24480:19;;24139:366;;;:::o;24511:419::-;24677:4;24715:2;24704:9;24700:18;24692:26;;24764:9;24758:4;24754:20;24750:1;24739:9;24735:17;24728:47;24792:131;24918:4;24792:131;:::i;:::-;24784:139;;24511:419;;;:::o;24936:348::-;24976:7;24999:20;25017:1;24999:20;:::i;:::-;24994:25;;25033:20;25051:1;25033:20;:::i;:::-;25028:25;;25221:1;25153:66;25149:74;25146:1;25143:81;25138:1;25131:9;25124:17;25120:105;25117:131;;;25228:18;;:::i;:::-;25117:131;25276:1;25273;25269:9;25258:20;;24936:348;;;;:::o;25290:168::-;25430:20;25426:1;25418:6;25414:14;25407:44;25290:168;:::o;25464:366::-;25606:3;25627:67;25691:2;25686:3;25627:67;:::i;:::-;25620:74;;25703:93;25792:3;25703:93;:::i;:::-;25821:2;25816:3;25812:12;25805:19;;25464:366;;;:::o;25836:419::-;26002:4;26040:2;26029:9;26025:18;26017:26;;26089:9;26083:4;26079:20;26075:1;26064:9;26060:17;26053:47;26117:131;26243:4;26117:131;:::i;:::-;26109:139;;25836:419;;;:::o;26261:169::-;26401:21;26397:1;26389:6;26385:14;26378:45;26261:169;:::o;26436:366::-;26578:3;26599:67;26663:2;26658:3;26599:67;:::i;:::-;26592:74;;26675:93;26764:3;26675:93;:::i;:::-;26793:2;26788:3;26784:12;26777:19;;26436:366;;;:::o;26808:419::-;26974:4;27012:2;27001:9;26997:18;26989:26;;27061:9;27055:4;27051:20;27047:1;27036:9;27032:17;27025:47;27089:131;27215:4;27089:131;:::i;:::-;27081:139;;26808:419;;;:::o;27233:147::-;27334:11;27371:3;27356:18;;27233:147;;;;:::o;27386:114::-;;:::o;27506:398::-;27665:3;27686:83;27767:1;27762:3;27686:83;:::i;:::-;27679:90;;27778:93;27867:3;27778:93;:::i;:::-;27896:1;27891:3;27887:11;27880:18;;27506:398;;;:::o;27910:379::-;28094:3;28116:147;28259:3;28116:147;:::i;:::-;28109:154;;28280:3;28273:10;;27910:379;;;:::o;28295:166::-;28435:18;28431:1;28423:6;28419:14;28412:42;28295:166;:::o;28467:366::-;28609:3;28630:67;28694:2;28689:3;28630:67;:::i;:::-;28623:74;;28706:93;28795:3;28706:93;:::i;:::-;28824:2;28819:3;28815:12;28808:19;;28467:366;;;:::o;28839:419::-;29005:4;29043:2;29032:9;29028:18;29020:26;;29092:9;29086:4;29082:20;29078:1;29067:9;29063:17;29056:47;29120:131;29246:4;29120:131;:::i;:::-;29112:139;;28839:419;;;:::o;29264:174::-;29404:26;29400:1;29392:6;29388:14;29381:50;29264:174;:::o;29444:366::-;29586:3;29607:67;29671:2;29666:3;29607:67;:::i;:::-;29600:74;;29683:93;29772:3;29683:93;:::i;:::-;29801:2;29796:3;29792:12;29785:19;;29444:366;;;:::o;29816:419::-;29982:4;30020:2;30009:9;30005:18;29997:26;;30069:9;30063:4;30059:20;30055:1;30044:9;30040:17;30033:47;30097:131;30223:4;30097:131;:::i;:::-;30089:139;;29816:419;;;:::o;30241:143::-;30298:5;30329:6;30323:13;30314:22;;30345:33;30372:5;30345:33;:::i;:::-;30241:143;;;;:::o;30390:351::-;30460:6;30509:2;30497:9;30488:7;30484:23;30480:32;30477:119;;;30515:79;;:::i;:::-;30477:119;30635:1;30660:64;30716:7;30707:6;30696:9;30692:22;30660:64;:::i;:::-;30650:74;;30606:128;30390:351;;;;:::o;30747:222::-;30887:34;30883:1;30875:6;30871:14;30864:58;30956:5;30951:2;30943:6;30939:15;30932:30;30747:222;:::o;30975:366::-;31117:3;31138:67;31202:2;31197:3;31138:67;:::i;:::-;31131:74;;31214:93;31303:3;31214:93;:::i;:::-;31332:2;31327:3;31323:12;31316:19;;30975:366;;;:::o;31347:419::-;31513:4;31551:2;31540:9;31536:18;31528:26;;31600:9;31594:4;31590:20;31586:1;31575:9;31571:17;31564:47;31628:131;31754:4;31628:131;:::i;:::-;31620:139;;31347:419;;;:::o;31772:222::-;31912:34;31908:1;31900:6;31896:14;31889:58;31981:5;31976:2;31968:6;31964:15;31957:30;31772:222;:::o;32000:366::-;32142:3;32163:67;32227:2;32222:3;32163:67;:::i;:::-;32156:74;;32239:93;32328:3;32239:93;:::i;:::-;32357:2;32352:3;32348:12;32341:19;;32000:366;;;:::o;32372:419::-;32538:4;32576:2;32565:9;32561:18;32553:26;;32625:9;32619:4;32615:20;32611:1;32600:9;32596:17;32589:47;32653:131;32779:4;32653:131;:::i;:::-;32645:139;;32372:419;;;:::o;32797:171::-;32937:23;32933:1;32925:6;32921:14;32914:47;32797:171;:::o;32974:366::-;33116:3;33137:67;33201:2;33196:3;33137:67;:::i;:::-;33130:74;;33213:93;33302:3;33213:93;:::i;:::-;33331:2;33326:3;33322:12;33315:19;;32974:366;;;:::o;33346:419::-;33512:4;33550:2;33539:9;33535:18;33527:26;;33599:9;33593:4;33589:20;33585:1;33574:9;33570:17;33563:47;33627:131;33753:4;33627:131;:::i;:::-;33619:139;;33346:419;;;:::o;33771:148::-;33873:11;33910:3;33895:18;;33771:148;;;;:::o;33925:141::-;33974:4;33997:3;33989:11;;34020:3;34017:1;34010:14;34054:4;34051:1;34041:18;34033:26;;33925:141;;;:::o;34096:845::-;34199:3;34236:5;34230:12;34265:36;34291:9;34265:36;:::i;:::-;34317:89;34399:6;34394:3;34317:89;:::i;:::-;34310:96;;34437:1;34426:9;34422:17;34453:1;34448:137;;;;34599:1;34594:341;;;;34415:520;;34448:137;34532:4;34528:9;34517;34513:25;34508:3;34501:38;34568:6;34563:3;34559:16;34552:23;;34448:137;;34594:341;34661:38;34693:5;34661:38;:::i;:::-;34721:1;34735:154;34749:6;34746:1;34743:13;34735:154;;;34823:7;34817:14;34813:1;34808:3;34804:11;34797:35;34873:1;34864:7;34860:15;34849:26;;34771:4;34768:1;34764:12;34759:17;;34735:154;;;34918:6;34913:3;34909:16;34902:23;;34601:334;;34415:520;;34203:738;;34096:845;;;;:::o;34947:377::-;35053:3;35081:39;35114:5;35081:39;:::i;:::-;35136:89;35218:6;35213:3;35136:89;:::i;:::-;35129:96;;35234:52;35279:6;35274:3;35267:4;35260:5;35256:16;35234:52;:::i;:::-;35311:6;35306:3;35302:16;35295:23;;35057:267;34947:377;;;;:::o;35330:155::-;35470:7;35466:1;35458:6;35454:14;35447:31;35330:155;:::o;35491:400::-;35651:3;35672:84;35754:1;35749:3;35672:84;:::i;:::-;35665:91;;35765:93;35854:3;35765:93;:::i;:::-;35883:1;35878:3;35874:11;35867:18;;35491:400;;;:::o;35897:695::-;36175:3;36197:92;36285:3;36276:6;36197:92;:::i;:::-;36190:99;;36306:95;36397:3;36388:6;36306:95;:::i;:::-;36299:102;;36418:148;36562:3;36418:148;:::i;:::-;36411:155;;36583:3;36576:10;;35897:695;;;;;:::o;36598:225::-;36738:34;36734:1;36726:6;36722:14;36715:58;36807:8;36802:2;36794:6;36790:15;36783:33;36598:225;:::o;36829:366::-;36971:3;36992:67;37056:2;37051:3;36992:67;:::i;:::-;36985:74;;37068:93;37157:3;37068:93;:::i;:::-;37186:2;37181:3;37177:12;37170:19;;36829:366;;;:::o;37201:419::-;37367:4;37405:2;37394:9;37390:18;37382:26;;37454:9;37448:4;37444:20;37440:1;37429:9;37425:17;37418:47;37482:131;37608:4;37482:131;:::i;:::-;37474:139;;37201:419;;;:::o;37626:98::-;37677:6;37711:5;37705:12;37695:22;;37626:98;;;:::o;37730:168::-;37813:11;37847:6;37842:3;37835:19;37887:4;37882:3;37878:14;37863:29;;37730:168;;;;:::o;37904:360::-;37990:3;38018:38;38050:5;38018:38;:::i;:::-;38072:70;38135:6;38130:3;38072:70;:::i;:::-;38065:77;;38151:52;38196:6;38191:3;38184:4;38177:5;38173:16;38151:52;:::i;:::-;38228:29;38250:6;38228:29;:::i;:::-;38223:3;38219:39;38212:46;;37994:270;37904:360;;;;:::o;38270:640::-;38465:4;38503:3;38492:9;38488:19;38480:27;;38517:71;38585:1;38574:9;38570:17;38561:6;38517:71;:::i;:::-;38598:72;38666:2;38655:9;38651:18;38642:6;38598:72;:::i;:::-;38680;38748:2;38737:9;38733:18;38724:6;38680:72;:::i;:::-;38799:9;38793:4;38789:20;38784:2;38773:9;38769:18;38762:48;38827:76;38898:4;38889:6;38827:76;:::i;:::-;38819:84;;38270:640;;;;;;;:::o;38916:141::-;38972:5;39003:6;38997:13;38988:22;;39019:32;39045:5;39019:32;:::i;:::-;38916:141;;;;:::o;39063:349::-;39132:6;39181:2;39169:9;39160:7;39156:23;39152:32;39149:119;;;39187:79;;:::i;:::-;39149:119;39307:1;39332:63;39387:7;39378:6;39367:9;39363:22;39332:63;:::i;:::-;39322:73;;39278:127;39063:349;;;;:::o;39418:233::-;39457:3;39480:24;39498:5;39480:24;:::i;:::-;39471:33;;39526:66;39519:5;39516:77;39513:103;;;39596:18;;:::i;:::-;39513:103;39643:1;39636:5;39632:13;39625:20;;39418:233;;;:::o;39657:180::-;39705:77;39702:1;39695:88;39802:4;39799:1;39792:15;39826:4;39823:1;39816:15;39843:185;39883:1;39900:20;39918:1;39900:20;:::i;:::-;39895:25;;39934:20;39952:1;39934:20;:::i;:::-;39929:25;;39973:1;39963:35;;39978:18;;:::i;:::-;39963:35;40020:1;40017;40013:9;40008:14;;39843:185;;;;:::o;40034:191::-;40074:4;40094:20;40112:1;40094:20;:::i;:::-;40089:25;;40128:20;40146:1;40128:20;:::i;:::-;40123:25;;40167:1;40164;40161:8;40158:34;;;40172:18;;:::i;:::-;40158:34;40217:1;40214;40210:9;40202:17;;40034:191;;;;:::o;40231:176::-;40263:1;40280:20;40298:1;40280:20;:::i;:::-;40275:25;;40314:20;40332:1;40314:20;:::i;:::-;40309:25;;40353:1;40343:35;;40358:18;;:::i;:::-;40343:35;40399:1;40396;40392:9;40387:14;;40231:176;;;;:::o;40413:180::-;40461:77;40458:1;40451:88;40558:4;40555:1;40548:15;40582:4;40579:1;40572:15
Swarm Source
ipfs://6bc91d864800bc5bd517e9845a0910ac16c67552282380a6000257ae8dbdec96
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.