ERC-721
Overview
Max Total Supply
0 MAKERS
Holders
4,281
Market
Volume (24H)
0.0055 ETH
Min Price (24H)
$18.82 @ 0.005500 ETH
Max Price (24H)
$18.82 @ 0.005500 ETH
Other Info
Token Contract
Balance
1 MAKERSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
DigitalMediaCore
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-10-17 */ // File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File: VaultCoreInterface.sol pragma solidity 0.8.9; abstract contract VaultCoreInterface { function getVersion() public pure virtual returns (uint); function typeOfContract() public pure virtual returns (bytes32); function approveToken( uint256 _tokenId, address _tokenContractAddress) external virtual; } // File: RoyaltyRegistryInterface.sol pragma solidity 0.8.9; /** * Interface to the RoyaltyRegistry responsible for looking payout addresses */ abstract contract RoyaltyRegistryInterface { function getAddress(address custodial) external view virtual returns (address); function getMediaCustomPercentage(uint256 mediaId, address tokenAddress) external view virtual returns(uint16); function getExternalTokenPercentage(uint256 tokenId, address tokenAddress) external view virtual returns(uint16, uint16); function typeOfContract() virtual public pure returns (string calldata); function VERSION() virtual public pure returns (uint8); } // File: ApprovedCreatorRegistryInterface.sol pragma solidity 0.8.9; /** * Interface to the digital media store external contract that is * responsible for storing the common digital media and collection data. * This allows for new token contracts to be deployed and continue to reference * the digital media and collection data. */ abstract contract ApprovedCreatorRegistryInterface { function getVersion() virtual public pure returns (uint); function typeOfContract() virtual public pure returns (string calldata); function isOperatorApprovedForCustodialAccount( address _operator, address _custodialAddress) virtual public view returns (bool); } // File: utils/Collaborator.sol pragma solidity 0.8.9; library Collaborator { bytes32 public constant TYPE_HASH = keccak256("Share(address account,uint48 value,uint48 royalty)"); struct Share { address payable account; uint48 value; uint48 royalty; } function hash(Share memory part) internal pure returns (bytes32) { return keccak256(abi.encode(TYPE_HASH, part.account, part.value, part.royalty)); } } // File: @openzeppelin/contracts/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: @openzeppelin/contracts/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 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() { _setOwner(_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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: OBOControl.sol pragma solidity 0.8.9; contract OBOControl is Ownable { address public oboAdmin; uint256 constant public newAddressWaitPeriod = 1 days; bool public canAddOBOImmediately = true; // List of approved on behalf of users. mapping (address => uint256) public approvedOBOs; event NewOBOAddressEvent( address OBOAddress, bool action); event NewOBOAdminAddressEvent( address oboAdminAddress); modifier onlyOBOAdmin() { require(owner() == _msgSender() || oboAdmin == _msgSender(), "not oboAdmin"); _; } function setOBOAdmin(address _oboAdmin) external onlyOwner { oboAdmin = _oboAdmin; emit NewOBOAdminAddressEvent(_oboAdmin); } /** * Add a new approvedOBO address. The address can be used after wait period. */ function addApprovedOBO(address _oboAddress) external onlyOBOAdmin { require(_oboAddress != address(0), "cant set to 0x"); require(approvedOBOs[_oboAddress] == 0, "already added"); approvedOBOs[_oboAddress] = block.timestamp; emit NewOBOAddressEvent(_oboAddress, true); } /** * Removes an approvedOBO immediately. */ function removeApprovedOBO(address _oboAddress) external onlyOBOAdmin { delete approvedOBOs[_oboAddress]; emit NewOBOAddressEvent(_oboAddress, false); } /* * Add OBOAddress for immediate use. This is an internal only Fn that is called * only when the contract is deployed. */ function addApprovedOBOImmediately(address _oboAddress) internal onlyOwner { require(_oboAddress != address(0), "addr(0)"); // set the date to one in past so that address is active immediately. approvedOBOs[_oboAddress] = block.timestamp - newAddressWaitPeriod - 1; emit NewOBOAddressEvent(_oboAddress, true); } function addApprovedOBOAfterDeploy(address _oboAddress) external onlyOBOAdmin { require(canAddOBOImmediately == true, "disabled"); addApprovedOBOImmediately(_oboAddress); } function blockImmediateOBO() external onlyOBOAdmin { canAddOBOImmediately = false; } /* * Helper function to verify is a given address is a valid approvedOBO address. */ function isValidApprovedOBO(address _oboAddress) public view returns (bool) { uint256 createdAt = approvedOBOs[_oboAddress]; if (createdAt == 0) { return false; } return block.timestamp - createdAt > newAddressWaitPeriod; } /** * @dev Modifier to make the obo calls only callable by approved addressess */ modifier isApprovedOBO() { require(isValidApprovedOBO(msg.sender), "unauthorized OBO user"); _; } } // File: @openzeppelin/contracts/security/Pausable.sol pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface 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); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @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`, 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 Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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 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); /** * @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; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @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: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // 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; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @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) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @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 See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @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 { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _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 { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @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. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @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`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * 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 ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a 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 _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * 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, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: DigitalMediaToken.sol pragma solidity 0.8.9; contract DigitalMediaToken is ERC721, OBOControl, Pausable { // creator address has to be set during deploy via constructor only. address public singleCreatorAddress; address public signerAddress; bool public enableExternalMinting; bool public canRoyaltyRegistryChange = true; struct DigitalMedia { uint32 totalSupply; // The total supply of collectibles available uint32 printIndex; // The current print index address creator; // The creator of the collectible uint16 royalty; bool immutableMedia; Collaborator.Share[] collaborators; string metadataPath; // Hash of the media content, with the actual data stored on a secondary // data store (ideally decentralized) } struct DigitalMediaRelease { uint32 printEdition; // The unique edition number of this digital media release uint256 digitalMediaId; // Reference ID to the digital media metadata } ApprovedCreatorRegistryInterface public creatorRegistryStore; RoyaltyRegistryInterface public royaltyStore; VaultCoreInterface public vaultStore; // Event fired when a new digital media is created. No point in returning printIndex // since its always zero when created. event DigitalMediaCreateEvent( uint256 id, address creator, uint32 totalSupply, uint32 royalty, bool immutableMedia, string metadataPath); event DigitalMediaReleaseCreateEvent( uint256 id, address owner, uint32 printEdition, string tokenURI, uint256 digitalMediaId); // Event fired when a creator assigns a new creator address. event ChangedCreator( address creator, address newCreator); // Event fired when a digital media is burned event DigitalMediaBurnEvent( uint256 id, address caller); // Event fired when burning a token event DigitalMediaReleaseBurnEvent( uint256 tokenId, address owner); event NewSignerEvent( address signer); event NewRoyaltyEvent( uint16 value); // ID to Digital Media object mapping (uint256 => DigitalMedia) public idToDigitalMedia; // Maps internal ERC721 token ID to digital media release object. mapping (uint256 => DigitalMediaRelease) public tokenIdToDigitalMediaRelease; // Maps a creator address to a new creator address. Useful if a creator // changes their address or the previous address gets compromised. mapping (address => address) public changedCreators; constructor(string memory _tokenName, string memory _tokenSymbol) ERC721(_tokenName, _tokenSymbol) {} // Set the creator registry address upon construction. Immutable. function setCreatorRegistryStore(address _crsAddress) internal { ApprovedCreatorRegistryInterface candidateCreatorRegistryStore = ApprovedCreatorRegistryInterface(_crsAddress); // require(candidateCreatorRegistryStore.getVersion() == 1, "registry store is not version 1"); // Simple check to make sure we are adding the registry contract indeed // https://fravoll.github.io/solidity-patterns/string_equality_comparison.html bytes32 contractType = keccak256(abi.encodePacked(candidateCreatorRegistryStore.typeOfContract())); // keccak256(abi.encodePacked("approvedCreatorRegistry")) = 0x74cb6de1099c3d993f336da7af5394f68038a23980424e1ae5723d4110522be4 // keccak256(abi.encodePacked("approvedCreatorRegistryReadOnly")) = 0x9732b26dfb8751e6f1f71e8f21b28a237cfe383953dce7db3dfa1777abdb2791 require( contractType == 0x74cb6de1099c3d993f336da7af5394f68038a23980424e1ae5723d4110522be4 || contractType == 0x9732b26dfb8751e6f1f71e8f21b28a237cfe383953dce7db3dfa1777abdb2791, "not crtrRegistry"); creatorRegistryStore = candidateCreatorRegistryStore; } function setRoyaltyRegistryStore(address _royaltyStore) external whenNotPaused onlyOBOAdmin { require(canRoyaltyRegistryChange == true, "no"); RoyaltyRegistryInterface candidateRoyaltyStore = RoyaltyRegistryInterface(_royaltyStore); require(candidateRoyaltyStore.VERSION() == 1, "roylty v!= 1"); bytes32 contractType = keccak256(abi.encodePacked(candidateRoyaltyStore.typeOfContract())); // keccak256(abi.encodePacked("royaltyRegistry")) = 0xb590ff355bf2d720a7e957392d3b76fd1adda1832940640bf5d5a7c387fed323 require(contractType == 0xb590ff355bf2d720a7e957392d3b76fd1adda1832940640bf5d5a7c387fed323, "not royalty"); royaltyStore = candidateRoyaltyStore; } function setRoyaltyRegistryForever() external whenNotPaused onlyOwner { canRoyaltyRegistryChange = false; } function setVaultStore(address _vaultStore) external whenNotPaused onlyOwner { VaultCoreInterface candidateVaultStore = VaultCoreInterface(_vaultStore); bytes32 contractType = candidateVaultStore.typeOfContract(); require(contractType == 0x6d707661756c7400000000000000000000000000000000000000000000000000, "invalid mpvault"); vaultStore = candidateVaultStore; } /* * Set signer address on the token contract. Setting signer means we are opening * the token contract for external accounts to create tokens. Call this to change * the signer immediately. */ function setSignerAddress(address _signerAddress, bool _enableExternalMinting) external whenNotPaused isApprovedOBO { require(_signerAddress != address(0), "cant be zero"); signerAddress = _signerAddress; enableExternalMinting = _enableExternalMinting; emit NewSignerEvent(signerAddress); } /** * Validates that the Registered store is initialized. */ modifier registryInitialized() { require(address(creatorRegistryStore) != address(0), "registry = 0x0"); _; } /** * Validates that the Vault store is initialized. */ modifier vaultInitialized() { require(address(vaultStore) != address(0), "vault = 0x0"); _; } function _setCollaboratorsOnDigitalMedia(DigitalMedia storage _digitalMedia, Collaborator.Share[] memory _collaborators) internal { uint total = 0; uint totalRoyalty = 0; for (uint i = 0; i < _collaborators.length; i++) { require(_collaborators[i].account != address(0x0) || _collaborators[i].account != _digitalMedia.creator, "collab 0x0/creator"); require(_collaborators[i].value != 0 || _collaborators[i].royalty != 0, "share/royalty = 0"); _digitalMedia.collaborators.push(_collaborators[i]); total = total + _collaborators[i].value; totalRoyalty = totalRoyalty + _collaborators[i].royalty; } require(total <= 10000, "total <=10000"); require(totalRoyalty <= 10000, "totalRoyalty <=10000"); } /** * Creates a new digital media object. * @param _creator address the creator of this digital media * @param _totalSupply uint32 the total supply a creation could have * @param _metadataPath string the path to the ipfs metadata * @return uint the new digital media id */ function _createDigitalMedia( address _creator, uint256 _onchainId, uint32 _totalSupply, string memory _metadataPath, Collaborator.Share[] memory _collaborators, uint16 _royalty, bool _immutableMedia) internal returns (uint) { // If this is a single creator contract make sure _owner matches single creator if (singleCreatorAddress != address(0)) { require(singleCreatorAddress == _creator, "Creator must match single creator address"); } // Verify this media does not exist already DigitalMedia storage _digitalMedia = idToDigitalMedia[_onchainId]; require(_digitalMedia.creator == address(0), "media already exists"); // TODO: Dannie check this require throughly. require((_totalSupply > 0) && address(_creator) != address(0) && _royalty <= 10000, "invalid params"); _digitalMedia.printIndex = 0; _digitalMedia.totalSupply = _totalSupply; _digitalMedia.creator = _creator; _digitalMedia.metadataPath = _metadataPath; _digitalMedia.immutableMedia = _immutableMedia; _digitalMedia.royalty = _royalty; _setCollaboratorsOnDigitalMedia(_digitalMedia, _collaborators); emit DigitalMediaCreateEvent( _onchainId, _creator, _totalSupply, _royalty, _immutableMedia, _metadataPath); return _onchainId; } /** * Creates _count number of new digital media releases (i.e a token). * Bumps up the print index by _count. * @param _owner address the owner of the digital media object * @param _digitalMediaId uint256 the digital media id */ function _createDigitalMediaReleases( address _owner, uint256 _digitalMediaId, uint256[] memory _releaseIds) internal { require(_releaseIds.length > 0 && _releaseIds.length < 10000, "0 < count <= 10000"); DigitalMedia storage _digitalMedia = idToDigitalMedia[_digitalMediaId]; require(_digitalMedia.creator != address(0), "media does not exist"); uint32 currentPrintIndex = _digitalMedia.printIndex; require(_checkApprovedCreator(_digitalMedia.creator, _owner), "Creator not approved"); require(_releaseIds.length + currentPrintIndex <= _digitalMedia.totalSupply, "Total supply exceeded."); for (uint32 i=0; i < _releaseIds.length; i++) { uint256 newDigitalMediaReleaseId = _releaseIds[i]; DigitalMediaRelease storage release = tokenIdToDigitalMediaRelease[newDigitalMediaReleaseId]; require(release.printEdition == 0, "tokenId already used"); uint32 newPrintEdition = currentPrintIndex + 1 + i; release.printEdition = newPrintEdition; release.digitalMediaId = _digitalMediaId; emit DigitalMediaReleaseCreateEvent( newDigitalMediaReleaseId, _owner, newPrintEdition, _digitalMedia.metadataPath, _digitalMediaId ); // This will assign ownership and also emit the Transfer event as per ERC721 _mint(_owner, newDigitalMediaReleaseId); } _digitalMedia.printIndex = _digitalMedia.printIndex + uint32(_releaseIds.length); } /** * Checks that a given caller is an approved creator and is allowed to mint or burn * tokens. If the creator was changed it will check against the updated creator. * @param _caller the calling address * @return bool allowed or not */ function _checkApprovedCreator(address _creator, address _caller) internal view returns (bool) { address approvedCreator = changedCreators[_creator]; if (approvedCreator != address(0)) { return approvedCreator == _caller; } else { return _creator == _caller; } } /** * Burns a token for a given tokenId and caller. * @param _tokenId the id of the token to burn. * @param _caller the address of the caller. */ function _burnToken(uint256 _tokenId, address _caller) internal { address owner = ownerOf(_tokenId); require(_isApprovedOrOwner(_caller, _tokenId), "ERC721: burn caller is not owner nor approved"); _burn(_tokenId); // Dont delete the tokenIdToDMR as we dont want to reissue another release // with the same id. Leaving the data will prevent reissuing. // delete tokenIdToDigitalMediaRelease[_tokenId]; emit DigitalMediaReleaseBurnEvent(_tokenId, owner); } /** * Burns a digital media. Once this function succeeds, this digital media * will no longer be able to mint any more tokens. Existing tokens need to be * burned individually though. * @param _digitalMediaId the id of the digital media to burn * @param _caller the address of the caller. */ function _burnDigitalMedia(uint256 _digitalMediaId, address _caller) internal { DigitalMedia storage _digitalMedia = idToDigitalMedia[_digitalMediaId]; require(_digitalMedia.creator != address(0), "media does not exist"); require(_checkApprovedCreator(_digitalMedia.creator, _caller) || isApprovedForAll(_digitalMedia.creator, _caller), "Failed digital media burn. Caller not approved."); _digitalMedia.printIndex = _digitalMedia.totalSupply; emit DigitalMediaBurnEvent(_digitalMediaId, _caller); } /** * @dev Returns an URI for a given token ID * @dev Throws if the token ID does not exist. May return an empty string. * @param _tokenId uint256 ID of the token to query */ function tokenURI(uint256 _tokenId) public view override returns (string memory) { require(_exists(_tokenId)); DigitalMediaRelease storage digitalMediaRelease = tokenIdToDigitalMediaRelease[_tokenId]; uint256 _digitalMediaId = digitalMediaRelease.digitalMediaId; DigitalMedia storage _digitalMedia = idToDigitalMedia[_digitalMediaId]; string memory prefix = "ipfs://"; return string(abi.encodePacked(prefix, string(_digitalMedia.metadataPath))); } /* * Look up a royalty payout address if royaltyStore is set otherwise we returns * the same argument. */ function _getRoyaltyAddress(address custodial) internal view returns(address) { return address(royaltyStore) == address(0) ? custodial : royaltyStore.getAddress(custodial); } } // File: DigitalMediaCore.sol pragma solidity 0.8.9; contract DigitalMediaCore is DigitalMediaToken { using ECDSA for bytes32; uint8 constant public VERSION = 3; struct DigitalMediaCreateRequest { uint256 onchainId; // onchain id for this media uint32 totalSupply; // The total supply of collectibles available address creator; // The creator of the collectible uint16 royalty; bool immutableMedia; Collaborator.Share[] collaborators; string metadataPath; // Hash of the media content uint256[] releaseIds; // number of releases to mint } struct DigitalMediaUpdateRequest { uint256 onchainId; // onchain id for this media uint256 metadataId; uint32 totalSupply; // The total supply of collectibles available address creator; // The creator of the collectible uint16 royalty; Collaborator.Share[] collaborators; string metadataPath; // Hash of the media content } struct DigitalMediaReleaseCreateRequest { uint256 digitalMediaId; uint256[] releaseIds; // number of releases to mint address owner; } struct TokenDestinationRequest { uint256 tokenId; address destinationAddress; } struct ChainSignatureRequest { uint256 onchainId; address owner; } struct PayoutInfo { address user; uint256 amount; } event DigitalMediaUpdateEvent( uint256 id, uint32 totalSupply, uint16 royalty, string metadataPath, uint256 metadataId); event MediasImmutableEvent( uint256[] mediaIds); event MediaImmutableEvent( uint256 mediaId); constructor(string memory _tokenName, string memory _tokenSymbol, address _crsAddress) DigitalMediaToken(_tokenName, _tokenSymbol) { setCreatorRegistryStore(_crsAddress); } /** * Retrieves a Digital Media object. */ function getDigitalMedia(uint256 _id) external view returns (DigitalMedia memory) { DigitalMedia memory _digitalMedia = idToDigitalMedia[_id]; require(_digitalMedia.creator != address(0), "DigitalMedia not found."); return _digitalMedia; } /** * Ok I am not proud of this function but sale conract needs to getDigitalMedia * while I tried to write a interface file DigitalMediaBurnInterfaceV3.sol I could * not include the DigitalMedia struct in that abstract contract. So I am writing * another endpoint to return just the bare minimum data required for the sale contract. */ function getDigitalMediaForSale(uint256 _id) external view returns( address, bool, uint16) { DigitalMedia storage _digitalMedia = idToDigitalMedia[_id]; require(_digitalMedia.creator != address(0), "DigitalMedia not found."); return (_digitalMedia.creator, _digitalMedia.collaborators.length > 0, _digitalMedia.royalty); } /** * Retrieves a Digital Media Release (i.e a token) */ function getDigitalMediaRelease(uint256 _id) external view returns (DigitalMediaRelease memory) { require(_exists(_id), "release does not exist"); DigitalMediaRelease storage digitalMediaRelease = tokenIdToDigitalMediaRelease[_id]; return digitalMediaRelease; } /** * Creates a new digital media object and mints it's first digital media release token. * The onchainid and creator has to be signed by signerAddress in order to create. * No creations of any kind are allowed when the contract is paused. */ function createDigitalMediaAndReleases( DigitalMediaCreateRequest memory request, bytes calldata signature) external whenNotPaused { require(request.creator == msg.sender, "msgSender != creator"); ChainSignatureRequest memory signatureRequest = ChainSignatureRequest(request.onchainId, request.creator); _verifyReleaseRequestSignature(signatureRequest, signature); uint256 digitalMediaId = _createDigitalMedia(msg.sender, request.onchainId, request.totalSupply, request.metadataPath, request.collaborators, request.royalty, request.immutableMedia); _createDigitalMediaReleases(msg.sender, digitalMediaId, request.releaseIds); } /** * Creates a new digital media release (token) for a given digital media id. * This request needs to be signed by the authorized signerAccount to prevent * from user stealing media & release ids on chain and frontrunning. * No creations of any kind are allowed when the contract is paused. */ function createDigitalMediaReleases( DigitalMediaReleaseCreateRequest memory request) external whenNotPaused { // require(request.owner == msg.sender, "owner != msg.sender"); require(signerAddress != address(0), "signer not set"); _createDigitalMediaReleases(msg.sender, request.digitalMediaId, request.releaseIds); } /** * Creates a new digital media object and mints it's digital media release tokens. * Called on behalf of the _owner. Pass count to mint `n` number of tokens. * * Only approved creators are allowed to create Obo. * * No creations of any kind are allowed when the contract is paused. */ function oboCreateDigitalMediaAndReleases( DigitalMediaCreateRequest memory request) external whenNotPaused isApprovedOBO { uint256 digitalMediaId = _createDigitalMedia(request.creator, request.onchainId, request.totalSupply, request.metadataPath, request.collaborators, request.royalty, request.immutableMedia); _createDigitalMediaReleases(request.creator, digitalMediaId, request.releaseIds); } /** * Create many digital medias in one call. */ function oboCreateManyDigitalMedias( DigitalMediaCreateRequest[] memory requests) external whenNotPaused isApprovedOBO { for (uint32 i=0; i < requests.length; i++) { DigitalMediaCreateRequest memory request = requests[i]; _createDigitalMedia(request.creator, request.onchainId, request.totalSupply, request.metadataPath, request.collaborators, request.royalty, request.immutableMedia); } } /** * Creates multiple digital media releases (tokens) for a given digital media id. * Called on behalf of the _owner. * * Only approved creators are allowed to create Obo. * * No creations of any kind are allowed when the contract is paused. */ function oboCreateDigitalMediaReleases( DigitalMediaReleaseCreateRequest memory request) external whenNotPaused isApprovedOBO { _createDigitalMediaReleases(request.owner, request.digitalMediaId, request.releaseIds); } /* * Create multiple digital medias and associated releases (tokens). Called on behalf * of the _owner. Each media should mint atleast 1 token. * No creations of any kind are allowed when the contract is paused. */ function oboCreateManyDigitalMediasAndReleases( DigitalMediaCreateRequest[] memory requests) external whenNotPaused isApprovedOBO { for (uint32 i=0; i < requests.length; i++) { DigitalMediaCreateRequest memory request = requests[i]; uint256 digitalMediaId = _createDigitalMedia(request.creator, request.onchainId, request.totalSupply, request.metadataPath, request.collaborators, request.royalty, request.immutableMedia); _createDigitalMediaReleases(request.creator, digitalMediaId, request.releaseIds); } } /* * Create multiple releases (tokens) associated with existing medias. Called on behalf * of the _owner. * No creations of any kind are allowed when the contract is paused. */ function oboCreateManyReleases( DigitalMediaReleaseCreateRequest[] memory requests) external whenNotPaused isApprovedOBO { for (uint32 i=0; i < requests.length; i++) { DigitalMediaReleaseCreateRequest memory request = requests[i]; DigitalMedia storage _digitalMedia = idToDigitalMedia[request.digitalMediaId]; require(_digitalMedia.creator != address(0), "DigitalMedia not found."); _createDigitalMediaReleases(request.owner, request.digitalMediaId, request.releaseIds); } } /** * Override the isApprovalForAll to check for a special oboApproval list. Reason for this * is that we can can easily remove obo operators if they every become compromised. */ function isApprovedForAll(address _owner, address _operator) public view override registryInitialized returns (bool) { if (creatorRegistryStore.isOperatorApprovedForCustodialAccount(_operator, _owner) == true) { return true; } else { return super.isApprovedForAll(_owner, _operator); } } /** * Changes the creator for the current sender, in the event we * need to be able to mint new tokens from an existing digital media * print production. When changing creator, the old creator will * no longer be able to mint tokens. * * A creator may need to be changed: * 1. If we want to allow a creator to take control over their token minting (i.e go decentralized) * 2. If we want to re-issue private keys due to a compromise. For this reason, we can call this function * when the contract is paused. * @param _creator the creator address * @param _newCreator the new creator address */ function changeCreator(address _creator, address _newCreator) external { address approvedCreator = changedCreators[_creator]; require(msg.sender != address(0) && _creator != address(0), "Creator must be valid non 0x0 address."); require(msg.sender == _creator || msg.sender == approvedCreator, "Unauthorized caller."); if (approvedCreator == address(0)) { changedCreators[msg.sender] = _newCreator; } else { require(msg.sender == approvedCreator, "Unauthorized caller."); changedCreators[_creator] = _newCreator; } emit ChangedCreator(_creator, _newCreator); } // standard ERC721 burn interface function burn(uint256 _tokenId) external { _burnToken(_tokenId, msg.sender); } function burnToken(uint256 _tokenId) external { _burnToken(_tokenId, msg.sender); } /** * Ends the production run of a digital media. Afterwards no more tokens * will be allowed to be printed for each digital media. Used when a creator * makes a mistake and wishes to burn and recreate their digital media. * * When a contract is paused we do not allow new tokens to be created, * so stopping the production of a token doesn't have much purpose. */ function burnDigitalMedia(uint256 _digitalMediaId) external whenNotPaused { _burnDigitalMedia(_digitalMediaId, msg.sender); } /* * Batch transfer multiple tokens from their sources to destination * Owner / ApproveAll user can call this endpoint. */ function safeTransferMany(TokenDestinationRequest[] memory requests) external whenNotPaused { for (uint32 i=0; i < requests.length; i++) { TokenDestinationRequest memory request = requests[i]; safeTransferFrom(ownerOf(request.tokenId), request.destinationAddress, request.tokenId); } } function _updateDigitalMedia(DigitalMediaUpdateRequest memory request, DigitalMedia storage _digitalMedia) internal { require(_digitalMedia.immutableMedia == false, "immutable"); require(_digitalMedia.printIndex <= request.totalSupply, "< currentPrintIndex"); _digitalMedia.totalSupply = request.totalSupply; _digitalMedia.metadataPath = request.metadataPath; _digitalMedia.royalty = request.royalty; delete _digitalMedia.collaborators; _setCollaboratorsOnDigitalMedia(_digitalMedia, request.collaborators); emit DigitalMediaUpdateEvent(request.onchainId, request.totalSupply, request.royalty, request.metadataPath, request.metadataId); } function updateMedia(DigitalMediaUpdateRequest memory request) external { require(request.creator == msg.sender, "msgSender != creator"); DigitalMedia storage _digitalMedia = idToDigitalMedia[request.onchainId]; require(_digitalMedia.creator != address(0) && _digitalMedia.creator == msg.sender, "DM creator issue"); _updateDigitalMedia(request, _digitalMedia); } /* * Update existing digitalMedia's metadata, totalSupply, collaborated, royalty * and immutable attribute. Once a media is immutable you cannot call this function */ function updateManyMedias(DigitalMediaUpdateRequest[] memory requests) external whenNotPaused isApprovedOBO vaultInitialized { for (uint32 i=0; i < requests.length; i++) { DigitalMediaUpdateRequest memory request = requests[i]; DigitalMedia storage _digitalMedia = idToDigitalMedia[request.onchainId]; // Call creator registry to check if the creator gave approveAll to vault require(_digitalMedia.creator != address(0) && _digitalMedia.creator == request.creator, "DM creator"); require(isApprovedForAll(_digitalMedia.creator, address(vaultStore)) == true, "approveall missing"); _updateDigitalMedia(request, _digitalMedia); } } function makeMediaImmutable(uint256 mediaId) external { DigitalMedia storage _digitalMedia = idToDigitalMedia[mediaId]; require(_digitalMedia.creator != address(0) && _digitalMedia.creator == msg.sender, "DM creator"); require(_digitalMedia.immutableMedia == false, "DM immutable"); _digitalMedia.immutableMedia = true; emit MediaImmutableEvent(mediaId); } /* * Once we update media and feel satisfied with the changes, we can render it immutable now. */ function makeMediasImmutable(uint256[] memory mediaIds) external whenNotPaused isApprovedOBO vaultInitialized { for (uint32 i=0; i < mediaIds.length; i++) { uint256 mediaId = mediaIds[i]; DigitalMedia storage _digitalMedia = idToDigitalMedia[mediaId]; require(_digitalMedia.creator != address(0), "DM not found."); require(_digitalMedia.immutableMedia == false, "DM immutable"); require(isApprovedForAll(_digitalMedia.creator, address(vaultStore)) == true, "approveall missing"); _digitalMedia.immutableMedia = true; } emit MediasImmutableEvent(mediaIds); } function _lookUpTokenAndReturnEntries(uint256 _tokenId, uint256 _salePrice, bool _isRoyalty) internal view returns(PayoutInfo[] memory entries) { require(_exists(_tokenId), "no token"); DigitalMediaRelease memory digitalMediaRelease = tokenIdToDigitalMediaRelease[_tokenId]; DigitalMedia memory _digitalMedia = idToDigitalMedia[digitalMediaRelease.digitalMediaId]; uint256 size = _digitalMedia.collaborators.length + 1; entries = new PayoutInfo[](size); uint totalRoyaltyPercentage = 0; for (uint256 index = 0; index < _digitalMedia.collaborators.length; index++) { address payoutAddress = _getRoyaltyAddress(_digitalMedia.collaborators[index].account); if (_isRoyalty == true) { entries[index] = PayoutInfo(payoutAddress, _digitalMedia.collaborators[index].royalty * _digitalMedia.royalty * _salePrice / (10000 * 10000)); totalRoyaltyPercentage = totalRoyaltyPercentage + _digitalMedia.collaborators[index].royalty; } else { entries[index] = PayoutInfo(payoutAddress, _digitalMedia.collaborators[index].value * _salePrice / 10000); totalRoyaltyPercentage = totalRoyaltyPercentage + _digitalMedia.collaborators[index].value; } } address creatorPayoutAddress = _getRoyaltyAddress(_digitalMedia.creator); if (_isRoyalty == true) { entries[size-1]= PayoutInfo(creatorPayoutAddress, _salePrice * (10000 - totalRoyaltyPercentage) * _digitalMedia.royalty / (10000 * 10000)); } else { entries[size-1]= PayoutInfo(creatorPayoutAddress, _salePrice * (10000 - totalRoyaltyPercentage) / 10000); } return entries; } /* * Return royalty for a given Token. Returns an array of PayoutInfo which consists * of address to pay to and amount. * Thank you for posting this gist. Helped me to figure out how to return an array of structs. * https://gist.github.com/minhth1905/4b6208372fc5e7343b5ce1fb6d42c942 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns ( PayoutInfo[] memory) { return _lookUpTokenAndReturnEntries(_tokenId, _salePrice, true); } /* * Given salePrice break down the amount between the creator and collabarators * according to their percentages. */ function saleInfo(uint256 _tokenId, uint256 _totalPayout) external view returns ( PayoutInfo[] memory) { return _lookUpTokenAndReturnEntries(_tokenId, _totalPayout, false); } function pause() external onlyOwner { _pause(); } function unpause() external onlyOwner { _unpause(); } /* * helper to verify signature signed by non-custodial creator. */ function _verifyReleaseRequestSignature( ChainSignatureRequest memory request, bytes calldata signature) internal view { require(enableExternalMinting == true, "ext minting disabled"); bytes32 encodedRequest = keccak256(abi.encode(request)); address addressWhoSigned = encodedRequest.recover(signature); require(addressWhoSigned == signerAddress, "sig error"); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"},{"internalType":"address","name":"_crsAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"address","name":"newCreator","type":"address"}],"name":"ChangedCreator","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"DigitalMediaBurnEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"uint32","name":"totalSupply","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"royalty","type":"uint32"},{"indexed":false,"internalType":"bool","name":"immutableMedia","type":"bool"},{"indexed":false,"internalType":"string","name":"metadataPath","type":"string"}],"name":"DigitalMediaCreateEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"DigitalMediaReleaseBurnEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint32","name":"printEdition","type":"uint32"},{"indexed":false,"internalType":"string","name":"tokenURI","type":"string"},{"indexed":false,"internalType":"uint256","name":"digitalMediaId","type":"uint256"}],"name":"DigitalMediaReleaseCreateEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"totalSupply","type":"uint32"},{"indexed":false,"internalType":"uint16","name":"royalty","type":"uint16"},{"indexed":false,"internalType":"string","name":"metadataPath","type":"string"},{"indexed":false,"internalType":"uint256","name":"metadataId","type":"uint256"}],"name":"DigitalMediaUpdateEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"mediaId","type":"uint256"}],"name":"MediaImmutableEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"mediaIds","type":"uint256[]"}],"name":"MediasImmutableEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"OBOAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"action","type":"bool"}],"name":"NewOBOAddressEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oboAdminAddress","type":"address"}],"name":"NewOBOAdminAddressEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"value","type":"uint16"}],"name":"NewRoyaltyEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"signer","type":"address"}],"name":"NewSignerEvent","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oboAddress","type":"address"}],"name":"addApprovedOBO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oboAddress","type":"address"}],"name":"addApprovedOBOAfterDeploy","outputs":[],"stateMutability":"nonpayable","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":"","type":"address"}],"name":"approvedOBOs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blockImmediateOBO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_digitalMediaId","type":"uint256"}],"name":"burnDigitalMedia","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burnToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"canAddOBOImmediately","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canRoyaltyRegistryChange","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_creator","type":"address"},{"internalType":"address","name":"_newCreator","type":"address"}],"name":"changeCreator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"changedCreators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"onchainId","type":"uint256"},{"internalType":"uint32","name":"totalSupply","type":"uint32"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint16","name":"royalty","type":"uint16"},{"internalType":"bool","name":"immutableMedia","type":"bool"},{"components":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint48","name":"value","type":"uint48"},{"internalType":"uint48","name":"royalty","type":"uint48"}],"internalType":"struct Collaborator.Share[]","name":"collaborators","type":"tuple[]"},{"internalType":"string","name":"metadataPath","type":"string"},{"internalType":"uint256[]","name":"releaseIds","type":"uint256[]"}],"internalType":"struct DigitalMediaCore.DigitalMediaCreateRequest","name":"request","type":"tuple"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"createDigitalMediaAndReleases","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"digitalMediaId","type":"uint256"},{"internalType":"uint256[]","name":"releaseIds","type":"uint256[]"},{"internalType":"address","name":"owner","type":"address"}],"internalType":"struct DigitalMediaCore.DigitalMediaReleaseCreateRequest","name":"request","type":"tuple"}],"name":"createDigitalMediaReleases","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"creatorRegistryStore","outputs":[{"internalType":"contract ApprovedCreatorRegistryInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableExternalMinting","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getDigitalMedia","outputs":[{"components":[{"internalType":"uint32","name":"totalSupply","type":"uint32"},{"internalType":"uint32","name":"printIndex","type":"uint32"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint16","name":"royalty","type":"uint16"},{"internalType":"bool","name":"immutableMedia","type":"bool"},{"components":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint48","name":"value","type":"uint48"},{"internalType":"uint48","name":"royalty","type":"uint48"}],"internalType":"struct Collaborator.Share[]","name":"collaborators","type":"tuple[]"},{"internalType":"string","name":"metadataPath","type":"string"}],"internalType":"struct DigitalMediaToken.DigitalMedia","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getDigitalMediaForSale","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getDigitalMediaRelease","outputs":[{"components":[{"internalType":"uint32","name":"printEdition","type":"uint32"},{"internalType":"uint256","name":"digitalMediaId","type":"uint256"}],"internalType":"struct DigitalMediaToken.DigitalMediaRelease","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"idToDigitalMedia","outputs":[{"internalType":"uint32","name":"totalSupply","type":"uint32"},{"internalType":"uint32","name":"printIndex","type":"uint32"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint16","name":"royalty","type":"uint16"},{"internalType":"bool","name":"immutableMedia","type":"bool"},{"internalType":"string","name":"metadataPath","type":"string"}],"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":[{"internalType":"address","name":"_oboAddress","type":"address"}],"name":"isValidApprovedOBO","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mediaId","type":"uint256"}],"name":"makeMediaImmutable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"mediaIds","type":"uint256[]"}],"name":"makeMediasImmutable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"newAddressWaitPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oboAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"onchainId","type":"uint256"},{"internalType":"uint32","name":"totalSupply","type":"uint32"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint16","name":"royalty","type":"uint16"},{"internalType":"bool","name":"immutableMedia","type":"bool"},{"components":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint48","name":"value","type":"uint48"},{"internalType":"uint48","name":"royalty","type":"uint48"}],"internalType":"struct Collaborator.Share[]","name":"collaborators","type":"tuple[]"},{"internalType":"string","name":"metadataPath","type":"string"},{"internalType":"uint256[]","name":"releaseIds","type":"uint256[]"}],"internalType":"struct DigitalMediaCore.DigitalMediaCreateRequest","name":"request","type":"tuple"}],"name":"oboCreateDigitalMediaAndReleases","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"digitalMediaId","type":"uint256"},{"internalType":"uint256[]","name":"releaseIds","type":"uint256[]"},{"internalType":"address","name":"owner","type":"address"}],"internalType":"struct DigitalMediaCore.DigitalMediaReleaseCreateRequest","name":"request","type":"tuple"}],"name":"oboCreateDigitalMediaReleases","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"onchainId","type":"uint256"},{"internalType":"uint32","name":"totalSupply","type":"uint32"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint16","name":"royalty","type":"uint16"},{"internalType":"bool","name":"immutableMedia","type":"bool"},{"components":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint48","name":"value","type":"uint48"},{"internalType":"uint48","name":"royalty","type":"uint48"}],"internalType":"struct Collaborator.Share[]","name":"collaborators","type":"tuple[]"},{"internalType":"string","name":"metadataPath","type":"string"},{"internalType":"uint256[]","name":"releaseIds","type":"uint256[]"}],"internalType":"struct DigitalMediaCore.DigitalMediaCreateRequest[]","name":"requests","type":"tuple[]"}],"name":"oboCreateManyDigitalMedias","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"onchainId","type":"uint256"},{"internalType":"uint32","name":"totalSupply","type":"uint32"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint16","name":"royalty","type":"uint16"},{"internalType":"bool","name":"immutableMedia","type":"bool"},{"components":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint48","name":"value","type":"uint48"},{"internalType":"uint48","name":"royalty","type":"uint48"}],"internalType":"struct Collaborator.Share[]","name":"collaborators","type":"tuple[]"},{"internalType":"string","name":"metadataPath","type":"string"},{"internalType":"uint256[]","name":"releaseIds","type":"uint256[]"}],"internalType":"struct DigitalMediaCore.DigitalMediaCreateRequest[]","name":"requests","type":"tuple[]"}],"name":"oboCreateManyDigitalMediasAndReleases","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"digitalMediaId","type":"uint256"},{"internalType":"uint256[]","name":"releaseIds","type":"uint256[]"},{"internalType":"address","name":"owner","type":"address"}],"internalType":"struct DigitalMediaCore.DigitalMediaReleaseCreateRequest[]","name":"requests","type":"tuple[]"}],"name":"oboCreateManyReleases","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oboAddress","type":"address"}],"name":"removeApprovedOBO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct DigitalMediaCore.PayoutInfo[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyStore","outputs":[{"internalType":"contract RoyaltyRegistryInterface","name":"","type":"address"}],"stateMutability":"view","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":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"destinationAddress","type":"address"}],"internalType":"struct DigitalMediaCore.TokenDestinationRequest[]","name":"requests","type":"tuple[]"}],"name":"safeTransferMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_totalPayout","type":"uint256"}],"name":"saleInfo","outputs":[{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct DigitalMediaCore.PayoutInfo[]","name":"","type":"tuple[]"}],"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":"address","name":"_oboAdmin","type":"address"}],"name":"setOBOAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setRoyaltyRegistryForever","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royaltyStore","type":"address"}],"name":"setRoyaltyRegistryStore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signerAddress","type":"address"},{"internalType":"bool","name":"_enableExternalMinting","type":"bool"}],"name":"setSignerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vaultStore","type":"address"}],"name":"setVaultStore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"singleCreatorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"","type":"uint256"}],"name":"tokenIdToDigitalMediaRelease","outputs":[{"internalType":"uint32","name":"printEdition","type":"uint32"},{"internalType":"uint256","name":"digitalMediaId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"onchainId","type":"uint256"},{"internalType":"uint256","name":"metadataId","type":"uint256"},{"internalType":"uint32","name":"totalSupply","type":"uint32"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint16","name":"royalty","type":"uint16"},{"components":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint48","name":"value","type":"uint48"},{"internalType":"uint48","name":"royalty","type":"uint48"}],"internalType":"struct Collaborator.Share[]","name":"collaborators","type":"tuple[]"},{"internalType":"string","name":"metadataPath","type":"string"}],"internalType":"struct DigitalMediaCore.DigitalMediaUpdateRequest[]","name":"requests","type":"tuple[]"}],"name":"updateManyMedias","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"onchainId","type":"uint256"},{"internalType":"uint256","name":"metadataId","type":"uint256"},{"internalType":"uint32","name":"totalSupply","type":"uint32"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint16","name":"royalty","type":"uint16"},{"components":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint48","name":"value","type":"uint48"},{"internalType":"uint48","name":"royalty","type":"uint48"}],"internalType":"struct Collaborator.Share[]","name":"collaborators","type":"tuple[]"},{"internalType":"string","name":"metadataPath","type":"string"}],"internalType":"struct DigitalMediaCore.DigitalMediaUpdateRequest","name":"request","type":"tuple"}],"name":"updateMedia","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vaultStore","outputs":[{"internalType":"contract VaultCoreInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526007805460ff60a01b1916600160a01b179055600a805460ff60a81b1916600160a81b1790553480156200003757600080fd5b50604051620062e1380380620062e18339810160408190526200005a9162000402565b8282818181600090805190602001906200007692919062000282565b5080516200008c90600190602084019062000282565b505050620000a9620000a3620000c960201b60201c565b620000cd565b50506009805460ff19169055620000c0816200011f565b5050506200052a565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008190506000816001600160a01b031663c20a03826040518163ffffffff1660e01b815260040160006040518083038186803b1580156200016057600080fd5b505afa15801562000175573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200019f91908101906200048f565b604051602001620001b19190620004cf565b604051602081830303815290604052805190602001209050807f74cb6de1099c3d993f336da7af5394f68038a23980424e1ae5723d4110522be460001b14806200021a57507f9732b26dfb8751e6f1f71e8f21b28a237cfe383953dce7db3dfa1777abdb279181145b6200025e5760405162461bcd60e51b815260206004820152601060248201526f6e6f742063727472526567697374727960801b604482015260640160405180910390fd5b50600b80546001600160a01b0319166001600160a01b039290921691909117905550565b8280546200029090620004ed565b90600052602060002090601f016020900481019282620002b45760008555620002ff565b82601f10620002cf57805160ff1916838001178555620002ff565b82800160010185558215620002ff579182015b82811115620002ff578251825591602001919060010190620002e2565b506200030d92915062000311565b5090565b5b808211156200030d576000815560010162000312565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200035b57818101518382015260200162000341565b838111156200036b576000848401525b50505050565b600082601f8301126200038357600080fd5b81516001600160401b0380821115620003a057620003a062000328565b604051601f8301601f19908116603f01168101908282118183101715620003cb57620003cb62000328565b81604052838152866020858801011115620003e557600080fd5b620003f88460208301602089016200033e565b9695505050505050565b6000806000606084860312156200041857600080fd5b83516001600160401b03808211156200043057600080fd5b6200043e8783880162000371565b945060208601519150808211156200045557600080fd5b50620004648682870162000371565b604086015190935090506001600160a01b03811681146200048457600080fd5b809150509250925092565b600060208284031215620004a257600080fd5b81516001600160401b03811115620004b957600080fd5b620004c78482850162000371565b949350505050565b60008251620004e38184602087016200033e565b9190910192915050565b600181811c908216806200050257607f821691505b602082108114156200052457634e487b7160e01b600052602260045260246000fd5b50919050565b615da7806200053a6000396000f3fe608060405234801561001057600080fd5b50600436106103db5760003560e01c806376aab0731161020a578063a47a2e7711610125578063d400c4c1116100b8578063f2fde38b11610087578063f2fde38b14610905578063fb12a87614610918578063fd694df11461092b578063ffa1ad741461093e578063ffca4bd21461095857600080fd5b8063d400c4c1146108b8578063d5edf45b146108cb578063e985e9c5146108df578063ed32314a146108f257600080fd5b8063c87b56dd116100f4578063c87b56dd1461086c578063c95ab4621461087f578063cd161d2e14610892578063cd73f476146108a557600080fd5b8063a47a2e771461082b578063a790c0e21461083e578063b39ba60a14610846578063b88d4fde1461085957600080fd5b80638ce876461161019d578063987311b51161016c578063987311b5146107cd5780639b36830d146107e0578063a22cb46514610805578063a22d6eba1461081857600080fd5b80638ce876461461078e5780638da5cb5b146107a15780638e945e3b146107b257806395d89b41146107c557600080fd5b80637ff9f614116101d95780637ff9f6141461072c5780638456cb591461073f5780638a603bdf146107475780638c2ba8fe1461077b57600080fd5b806376aab073146106ca578063788e0543146106dd57806378cc32bc146106f05780637b47ec1a146105c557600080fd5b80633f4ba83a116102fa578063570efd461161028d5780635e7785a61161025c5780635e7785a6146106895780636352211e1461069c57806370a08231146106af578063715018a6146106c257600080fd5b8063570efd46146106455780635b7633d0146106585780635c975abb1461066b5780635cf09fee1461067657600080fd5b806345682a0b116102c957806345682a0b146105eb57806347ca0e02146105fe5780634f4385521461061157806355df42751461062557600080fd5b80633f4ba83a146105aa57806342842e0e146105b257806342966c68146105c5578063430648bc146105d857600080fd5b80631ad325621161037257806323b872dd1161034157806323b872dd146105185780632a55205a1461052b5780633ad0288e1461054b5780633db57cbe1461055e57600080fd5b80631ad32562146104ca5780631dc88a5b146104ea5780631fc09717146104fd57806323077f581461050557600080fd5b8063095ea7b3116103ae578063095ea7b3146104715780630c9999291461048657806313e2263e1461049e578063147ca2af146104b257600080fd5b806301ffc9a7146103e05780630629abf21461040857806306fdde0314610449578063081812fc1461045e575b600080fd5b6103f36103ee366004614a06565b61096b565b60405190151581526020015b60405180910390f35b610431610416366004614a48565b6010602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016103ff565b6104516109bd565b6040516103ff9190614abd565b61043161046c366004614ad0565b610a4f565b61048461047f366004614ae9565b610adc565b005b6104906201518081565b6040519081526020016103ff565b600a546103f390600160a01b900460ff1681565b6009546104319061010090046001600160a01b031681565b6104906104d8366004614a48565b60086020526000908152604090205481565b6104846104f8366004614e2e565b610bf2565b610484610dc9565b610484610513366004614ad0565b610e25565b610484610526366004614ede565b610e55565b61053e610539366004614f1f565b610e86565b6040516103ff9190614f41565b610484610559366004614fb2565b610e9b565b61058e61056c366004614ad0565b600f602052600090815260409020805460019091015463ffffffff9091169082565b6040805163ffffffff90931683526020830191909152016103ff565b610484610f8e565b6104846105c0366004614ede565b610fc2565b6104846105d3366004614ad0565b610fdd565b6104846105e6366004614feb565b610fe7565b6104846105f9366004614a48565b61106f565b600d54610431906001600160a01b031681565b600a546103f390600160a81b900460ff1681565b610638610633366004614ad0565b6111a5565b6040516103ff919061510f565b6104846106533660046152ee565b611390565b600a54610431906001600160a01b031681565b60095460ff166103f3565b610484610684366004615391565b611465565b610484610697366004614a48565b611656565b6104316106aa366004614ad0565b6118d5565b6104906106bd366004614a48565b61194c565b6104846119d3565b6104846106d8366004615423565b611a07565b600c54610431906001600160a01b031681565b6107036106fe366004614ad0565b611af6565b604080516001600160a01b039094168452911515602084015261ffff16908201526060016103ff565b61048461073a366004614a48565b611b67565b610484611bff565b61075a610755366004614ad0565b611c31565b60408051825163ffffffff16815260209283015192810192909252016103ff565b6104846107893660046152ee565b611cc3565b61048461079c366004614a48565b611d81565b6006546001600160a01b0316610431565b61053e6107c0366004614f1f565b611df9565b610451611e07565b6104846107db3660046154c6565b611e16565b6107f36107ee366004614ad0565b612041565b6040516103ff969594939291906154fa565b610484610813366004614fb2565b612121565b610484610826366004614ad0565b6121e6565b610484610839366004614a48565b6122e8565b610484612379565b600b54610431906001600160a01b031681565b610484610867366004615550565b6123c7565b61045161087a366004614ad0565b6123ff565b600754610431906001600160a01b031681565b6104846108a0366004614a48565b612481565b6104846108b33660046155cf565b6125af565b6104846108c6366004615665565b612690565b6007546103f390600160a01b900460ff1681565b6103f36108ed366004615391565b61270f565b610484610900366004615699565b612821565b610484610913366004614a48565b6128fd565b6103f3610926366004614a48565b612995565b610484610939366004615665565b6129d2565b610946600381565b60405160ff90911681526020016103ff565b6104846109663660046156cd565b612a31565b60006001600160e01b031982166380ac58cd60e01b148061099c57506001600160e01b03198216635b5e139f60e01b145b806109b757506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600080546109cc90615701565b80601f01602080910402602001604051908101604052809291908181526020018280546109f890615701565b8015610a455780601f10610a1a57610100808354040283529160200191610a45565b820191906000526020600020905b815481529060010190602001808311610a2857829003601f168201915b5050505050905090565b6000610a5a82612abb565b610ac05760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610ae7826118d5565b9050806001600160a01b0316836001600160a01b03161415610b555760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610ab7565b336001600160a01b0382161480610b715750610b71813361270f565b610be35760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610ab7565b610bed8383612ad8565b505050565b60095460ff1615610c155760405162461bcd60e51b8152600401610ab79061573c565b610c1e33612995565b610c3a5760405162461bcd60e51b8152600401610ab790615766565b600d546001600160a01b0316610c805760405162461bcd60e51b815260206004820152600b60248201526a07661756c74203d203078360ac1b6044820152606401610ab7565b60005b81518163ffffffff161015610dc5576000828263ffffffff1681518110610cac57610cac615795565b60209081029190910181015180516000908152600e9092526040909120805491925090600160401b90046001600160a01b031615801590610d05575060608201518154600160401b90046001600160a01b039081169116145b610d3e5760405162461bcd60e51b815260206004820152600a60248201526922269031b932b0ba37b960b11b6044820152606401610ab7565b8054600d54610d60916001600160a01b03600160401b9091048116911661270f565b1515600114610da65760405162461bcd60e51b8152602060048201526012602482015271617070726f7665616c6c206d697373696e6760701b6044820152606401610ab7565b610db08282612b46565b50508080610dbd906157c1565b915050610c83565b5050565b60095460ff1615610dec5760405162461bcd60e51b8152600401610ab79061573c565b6006546001600160a01b03163314610e165760405162461bcd60e51b8152600401610ab7906157e5565b600a805460ff60a81b19169055565b60095460ff1615610e485760405162461bcd60e51b8152600401610ab79061573c565b610e528133612ca5565b50565b610e5f3382612e08565b610e7b5760405162461bcd60e51b8152600401610ab79061581a565b610bed838383612ed2565b6060610e9483836001613072565b9392505050565b60095460ff1615610ebe5760405162461bcd60e51b8152600401610ab79061573c565b610ec733612995565b610ee35760405162461bcd60e51b8152600401610ab790615766565b6001600160a01b038216610f285760405162461bcd60e51b815260206004820152600c60248201526b63616e74206265207a65726f60a01b6044820152606401610ab7565b600a80546001600160a01b038481166001600160a81b031990921691909117600160a01b841515021791829055604051911681527f892cc3ddabcf4697be271eb3df1f098bec1713e58e7287c001532df08b5ebaab906020015b60405180910390a15050565b6006546001600160a01b03163314610fb85760405162461bcd60e51b8152600401610ab7906157e5565b610fc06135c5565b565b610bed838383604051806020016040528060008152506123c7565b610e528133613658565b60095460ff161561100a5760405162461bcd60e51b8152600401610ab79061573c565b60005b81518163ffffffff161015610dc5576000828263ffffffff168151811061103657611036615795565b6020026020010151905061105c61105082600001516118d5565b60208301518351610fc2565b5080611067816157c1565b91505061100d565b60095460ff16156110925760405162461bcd60e51b8152600401610ab79061573c565b6006546001600160a01b031633146110bc5760405162461bcd60e51b8152600401610ab7906157e5565b60008190506000816001600160a01b031663c20a03826040518163ffffffff1660e01b815260040160206040518083038186803b1580156110fc57600080fd5b505afa158015611110573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611134919061586b565b9050661b5c1d985d5b1d60ca1b81146111815760405162461bcd60e51b815260206004820152600f60248201526e1a5b9d985b1a59081b5c1d985d5b1d608a1b6044820152606401610ab7565b50600d80546001600160a01b0319166001600160a01b039290921691909117905550565b6040805160e0810182526000808252602082018190529181018290526060808201839052608082019290925260a0810182905260c08101919091526000828152600e60209081526040808320815160e081018352815463ffffffff8082168352600160201b82041682860152600160401b81046001600160a01b031682850152600160e01b810461ffff166060830152600160f01b900460ff16151560808201526001820180548451818702810187019095528085529194929360a0860193909290879084015b828210156112c857600084815260209081902060408051606081018252918501546001600160a01b038116835265ffffffffffff600160a01b8204811684860152600160d01b909104169082015282526001909201910161126c565b5050505081526020016002820180546112e090615701565b80601f016020809104026020016040519081016040528092919081815260200182805461130c90615701565b80156113595780601f1061132e57610100808354040283529160200191611359565b820191906000526020600020905b81548152906001019060200180831161133c57829003601f168201915b5050509190925250505060408101519091506001600160a01b03166109b75760405162461bcd60e51b8152600401610ab790615884565b60095460ff16156113b35760405162461bcd60e51b8152600401610ab79061573c565b6113bc33612995565b6113d85760405162461bcd60e51b8152600401610ab790615766565b60005b81518163ffffffff161015610dc5576000828263ffffffff168151811061140457611404615795565b60200260200101519050600061143b8260400151836000015184602001518560c001518660a0015187606001518860800151613718565b90506114508260400151828460e00151613938565b5050808061145d906157c1565b9150506113db565b6001600160a01b0380831660009081526010602052604090205416331580159061149757506001600160a01b03831615155b6114f25760405162461bcd60e51b815260206004820152602660248201527f43726561746f72206d7573742062652076616c6964206e6f6e20307830206164604482015265323932b9b99760d11b6064820152608401610ab7565b336001600160a01b03841614806115115750336001600160a01b038216145b6115545760405162461bcd60e51b81526020600482015260146024820152732ab730baba3437b934bd32b21031b0b63632b91760611b6044820152606401610ab7565b6001600160a01b03811661158f5733600090815260106020526040902080546001600160a01b0319166001600160a01b03841617905561160d565b336001600160a01b038216146115de5760405162461bcd60e51b81526020600482015260146024820152732ab730baba3437b934bd32b21031b0b63632b91760611b6044820152606401610ab7565b6001600160a01b03838116600090815260106020526040902080546001600160a01b0319169184169190911790555b604080516001600160a01b038086168252841660208201527fde6cfdf21fe76bcb45258138e27bcd332b76941b24d226b5da8dc5f9cd531c3e91015b60405180910390a1505050565b60095460ff16156116795760405162461bcd60e51b8152600401610ab79061573c565b6006546001600160a01b031633148061169c57506007546001600160a01b031633145b6116b85760405162461bcd60e51b8152600401610ab7906158bb565b600a54600160a81b900460ff1615156001146116fb5760405162461bcd60e51b81526020600482015260026024820152616e6f60f01b6044820152606401610ab7565b6000819050806001600160a01b031663ffa1ad746040518163ffffffff1660e01b815260040160206040518083038186803b15801561173957600080fd5b505afa15801561174d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177191906158e1565b60ff166001146117b25760405162461bcd60e51b815260206004820152600c60248201526b726f796c74792076213d203160a01b6044820152606401610ab7565b6000816001600160a01b031663c20a03826040518163ffffffff1660e01b815260040160006040518083038186803b1580156117ed57600080fd5b505afa158015611801573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118299190810190615904565b6040516020016118399190615971565b604051602081830303815290604052805190602001209050807fb590ff355bf2d720a7e957392d3b76fd1adda1832940640bf5d5a7c387fed32360001b146118b15760405162461bcd60e51b815260206004820152600b60248201526a6e6f7420726f79616c747960a81b6044820152606401610ab7565b50600c80546001600160a01b0319166001600160a01b039290921691909117905550565b6000818152600260205260408120546001600160a01b0316806109b75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610ab7565b60006001600160a01b0382166119b75760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610ab7565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146119fd5760405162461bcd60e51b8152600401610ab7906157e5565b610fc06000613c30565b60095460ff1615611a2a5760405162461bcd60e51b8152600401610ab79061573c565b611a3333612995565b611a4f5760405162461bcd60e51b8152600401610ab790615766565b60005b81518163ffffffff161015610dc5576000828263ffffffff1681518110611a7b57611a7b615795565b60209081029190910181015180516000908152600e9092526040909120805491925090600160401b90046001600160a01b0316611aca5760405162461bcd60e51b8152600401610ab790615884565b611ae1826040015183600001518460200151613938565b50508080611aee906157c1565b915050611a52565b6000818152600e60205260408120805482918291600160401b90046001600160a01b0316611b365760405162461bcd60e51b8152600401610ab790615884565b8054600190910154600160401b82046001600160a01b0316969015159550600160e01b90910461ffff169350915050565b6006546001600160a01b0316331480611b8a57506007546001600160a01b031633145b611ba65760405162461bcd60e51b8152600401610ab7906158bb565b6001600160a01b03811660008181526008602090815260408083208390558051938452908301919091527fe2e2dad866561a9926816384b10b4073c5e0e101b6c911e4936d22438bd63e9b91015b60405180910390a150565b6006546001600160a01b03163314611c295760405162461bcd60e51b8152600401610ab7906157e5565b610fc0613c82565b6040805180820190915260008082526020820152611c4e82612abb565b611c935760405162461bcd60e51b81526020600482015260166024820152751c995b19585cd948191bd95cc81b9bdd08195e1a5cdd60521b6044820152606401610ab7565b506000908152600f60209081526040918290208251808401909352805463ffffffff168352600101549082015290565b60095460ff1615611ce65760405162461bcd60e51b8152600401610ab79061573c565b611cef33612995565b611d0b5760405162461bcd60e51b8152600401610ab790615766565b60005b81518163ffffffff161015610dc5576000828263ffffffff1681518110611d3757611d37615795565b60200260200101519050611d6c8160400151826000015183602001518460c001518560a0015186606001518760800151613718565b50508080611d79906157c1565b915050611d0e565b6006546001600160a01b03163314611dab5760405162461bcd60e51b8152600401610ab7906157e5565b600780546001600160a01b0319166001600160a01b0383169081179091556040519081527ffbd1c2e6a1f767e08b9689ca3ce8ca1e7b60fbb71734bfc34f39f5bcb846cf3090602001611bf4565b6060610e9483836000613072565b6060600180546109cc90615701565b60095460ff1615611e395760405162461bcd60e51b8152600401610ab79061573c565b611e4233612995565b611e5e5760405162461bcd60e51b8152600401610ab790615766565b600d546001600160a01b0316611ea45760405162461bcd60e51b815260206004820152600b60248201526a07661756c74203d203078360ac1b6044820152606401610ab7565b60005b81518163ffffffff161015612011576000828263ffffffff1681518110611ed057611ed0615795565b6020908102919091018101516000818152600e9092526040909120805491925090600160401b90046001600160a01b0316611f3d5760405162461bcd60e51b815260206004820152600d60248201526c2226903737ba103337bab7321760991b6044820152606401610ab7565b8054600160f01b900460ff1615611f855760405162461bcd60e51b815260206004820152600c60248201526b444d20696d6d757461626c6560a01b6044820152606401610ab7565b8054600d54611fa7916001600160a01b03600160401b9091048116911661270f565b1515600114611fed5760405162461bcd60e51b8152602060048201526012602482015271617070726f7665616c6c206d697373696e6760701b6044820152606401610ab7565b805460ff60f01b1916600160f01b1790555080612009816157c1565b915050611ea7565b507f9d16e0b5e4fbfa71074176e81041192860b75c5094916faa8f717a806979a9af81604051611bf4919061598d565b600e602052600090815260409020805460028201805463ffffffff80841694600160201b850490911693600160401b81046001600160a01b031693600160e01b820461ffff1693600160f01b90920460ff16929161209e90615701565b80601f01602080910402602001604051908101604052809291908181526020018280546120ca90615701565b80156121175780601f106120ec57610100808354040283529160200191612117565b820191906000526020600020905b8154815290600101906020018083116120fa57829003601f168201915b5050505050905086565b6001600160a01b03821633141561217a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610ab7565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000818152600e602052604090208054600160401b90046001600160a01b03161580159061222457508054600160401b90046001600160a01b031633145b61225d5760405162461bcd60e51b815260206004820152600a60248201526922269031b932b0ba37b960b11b6044820152606401610ab7565b8054600160f01b900460ff16156122a55760405162461bcd60e51b815260206004820152600c60248201526b444d20696d6d757461626c6560a01b6044820152606401610ab7565b805460ff60f01b1916600160f01b1781556040517fe4a3a767606eb6faa43a9e7b7d2bf6415bfa993a8a74e263aed3fa98221118d490610f829084815260200190565b6006546001600160a01b031633148061230b57506007546001600160a01b031633145b6123275760405162461bcd60e51b8152600401610ab7906158bb565b600754600160a01b900460ff1615156001146123705760405162461bcd60e51b8152602060048201526008602482015267191a5cd8589b195960c21b6044820152606401610ab7565b610e5281613cda565b6006546001600160a01b031633148061239c57506007546001600160a01b031633145b6123b85760405162461bcd60e51b8152600401610ab7906158bb565b6007805460ff60a01b19169055565b6123d13383612e08565b6123ed5760405162461bcd60e51b8152600401610ab79061581a565b6123f984848484613db3565b50505050565b606061240a82612abb565b61241357600080fd5b6000828152600f602090815260408083206001810154808552600e845293829020825180840184526007815266697066733a2f2f60c81b8186015292519194939092916124679183916002860191016159d1565b604051602081830303815290604052945050505050919050565b6006546001600160a01b03163314806124a457506007546001600160a01b031633145b6124c05760405162461bcd60e51b8152600401610ab7906158bb565b6001600160a01b0381166125075760405162461bcd60e51b815260206004820152600e60248201526d0c6c2dce840e6cae840e8de4060f60931b6044820152606401610ab7565b6001600160a01b0381166000908152600860205260409020541561255d5760405162461bcd60e51b815260206004820152600d60248201526c185b1c9958591e481859191959609a1b6044820152606401610ab7565b6001600160a01b03811660008181526008602090815260409182902042905581519283526001908301527fe2e2dad866561a9926816384b10b4073c5e0e101b6c911e4936d22438bd63e9b9101611bf4565b60095460ff16156125d25760405162461bcd60e51b8152600401610ab79061573c565b60408301516001600160a01b031633146126255760405162461bcd60e51b815260206004820152601460248201527336b9b3a9b2b73232b910109e9031b932b0ba37b960611b6044820152606401610ab7565b60408051808201825284518152908401516001600160a01b0316602082015261264f818484613de6565b600061267833866000015187602001518860c001518960a001518a606001518b60800151613718565b905061268933828760e00151613938565b5050505050565b60095460ff16156126b35760405162461bcd60e51b8152600401610ab79061573c565b600a546001600160a01b03166126fc5760405162461bcd60e51b815260206004820152600e60248201526d1cda59db995c881b9bdd081cd95d60921b6044820152606401610ab7565b610e523382600001518360200151613938565b600b546000906001600160a01b031661275b5760405162461bcd60e51b815260206004820152600e60248201526d07265676973747279203d203078360941b6044820152606401610ab7565b600b546040516319f5a9f760e21b81526001600160a01b0384811660048301528581166024830152909116906367d6a7dc9060440160206040518083038186803b1580156127a857600080fd5b505afa1580156127bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e09190615a5a565b1515600114156127f2575060016109b7565b506001600160a01b0382811660009081526005602090815260408083209385168352929052205460ff166109b7565b60608101516001600160a01b031633146128745760405162461bcd60e51b815260206004820152601460248201527336b9b3a9b2b73232b910109e9031b932b0ba37b960611b6044820152606401610ab7565b80516000908152600e602052604090208054600160401b90046001600160a01b0316158015906128b457508054600160401b90046001600160a01b031633145b6128f35760405162461bcd60e51b815260206004820152601060248201526f444d2063726561746f7220697373756560801b6044820152606401610ab7565b610dc58282612b46565b6006546001600160a01b031633146129275760405162461bcd60e51b8152600401610ab7906157e5565b6001600160a01b03811661298c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ab7565b610e5281613c30565b6001600160a01b038116600090815260086020526040812054806129bc5750600092915050565b620151806129ca8242615a77565b119392505050565b60095460ff16156129f55760405162461bcd60e51b8152600401610ab79061573c565b6129fe33612995565b612a1a5760405162461bcd60e51b8152600401610ab790615766565b610e52816040015182600001518360200151613938565b60095460ff1615612a545760405162461bcd60e51b8152600401610ab79061573c565b612a5d33612995565b612a795760405162461bcd60e51b8152600401610ab790615766565b6000612aa68260400151836000015184602001518560c001518660a0015187606001518860800151613718565b9050610dc58260400151828460e00151613938565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612b0d826118d5565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b8054600160f01b900460ff1615612b8b5760405162461bcd60e51b8152602060048201526009602482015268696d6d757461626c6560b81b6044820152606401610ab7565b6040820151815463ffffffff918216600160201b9091049091161115612be95760405162461bcd60e51b815260206004820152601360248201527207840c6eae4e4cadce8a0e4d2dce892dcc8caf606b1b6044820152606401610ab7565b6040820151815463ffffffff191663ffffffff90911617815560c08201518051612c1d916002840191602090910190614941565b506080820151815461ffff909116600160e01b0261ffff60e01b19909116178155612c4c6001820160006149c1565b612c5a818360a00151613f11565b7f8076fb98efc7d3e779e35dbd763324939ccc868ab81816af851ea03eb602b11c8260000151836040015184608001518560c001518660200151604051610f82959493929190615a8e565b6000828152600e602052604090208054600160401b90046001600160a01b0316612d085760405162461bcd60e51b81526020600482015260146024820152731b59591a5848191bd95cc81b9bdd08195e1a5cdd60621b6044820152606401610ab7565b8054612d2490600160401b90046001600160a01b031683614204565b80612d4657508054612d4690600160401b90046001600160a01b03168361270f565b612dab5760405162461bcd60e51b815260206004820152603060248201527f4661696c6564206469676974616c206d65646961206275726e2e202043616c6c60448201526f32b9103737ba1030b8383937bb32b21760811b6064820152608401610ab7565b805467ffffffff0000000019811663ffffffff909116600160201b02178155604080518481526001600160a01b03841660208201527f1b3ee8fd28cba3d21433ef53ff70546a93d89d0b6908691fe2fa38a223dc66499101611649565b6000612e1382612abb565b612e745760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610ab7565b6000612e7f836118d5565b9050806001600160a01b0316846001600160a01b03161480612eba5750836001600160a01b0316612eaf84610a4f565b6001600160a01b0316145b80612eca5750612eca818561270f565b949350505050565b826001600160a01b0316612ee5826118d5565b6001600160a01b031614612f4d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610ab7565b6001600160a01b038216612faf5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610ab7565b612fba600082612ad8565b6001600160a01b0383166000908152600360205260408120805460019290612fe3908490615a77565b90915550506001600160a01b0382166000908152600360205260408120805460019290613011908490615acf565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b606061307d84612abb565b6130b45760405162461bcd60e51b81526020600482015260086024820152673737903a37b5b2b760c11b6044820152606401610ab7565b6000848152600f6020908152604080832081518083018352815463ffffffff90811682526001928301548286018190528652600e8552838620845160e08101865281548084168252600160201b810490931681880152600160401b83046001600160a01b031681870152600160e01b830461ffff166060820152600160f01b90920460ff16151560808301529283018054855181880281018801909652808652929695919460a08601939092879084015b828210156131c157600084815260209081902060408051606081018252918501546001600160a01b038116835265ffffffffffff600160a01b8204811684860152600160d01b9091041690820152825260019092019101613165565b5050505081526020016002820180546131d990615701565b80601f016020809104026020016040519081016040528092919081815260200182805461320590615701565b80156132525780601f1061322757610100808354040283529160200191613252565b820191906000526020600020905b81548152906001019060200180831161323557829003601f168201915b505050505081525050905060008160a001515160016132719190615acf565b9050806001600160401b0381111561328b5761328b614b15565b6040519080825280602002602001820160405280156132d057816020015b60408051808201909152600080825260208201528152602001906001900390816132a95790505b5093506000805b8360a00151518110156134b15760006133108560a0015183815181106132ff576132ff615795565b602002602001015160000151614261565b9050600188151514156133ea576040518060400160405280826001600160a01b031681526020016305f5e1008b886060015161ffff168960a00151878151811061335c5761335c615795565b6020026020010151604001516133729190615ae7565b65ffffffffffff166133849190615b15565b61338e9190615b34565b8152508783815181106133a3576133a3615795565b60200260200101819052508460a0015182815181106133c4576133c4615795565b60200260200101516040015165ffffffffffff16836133e39190615acf565b925061349e565b6040518060400160405280826001600160a01b031681526020016127108b8860a00151868151811061341e5761341e615795565b60200260200101516020015165ffffffffffff1661343c9190615b15565b6134469190615b34565b81525087838151811061345b5761345b615795565b60200260200101819052508460a00151828151811061347c5761347c615795565b60200260200101516020015165ffffffffffff168361349b9190615acf565b92505b50806134a981615b56565b9150506132d7565b5060006134c18460400151614261565b905060018715151415613550576040518060400160405280826001600160a01b031681526020016305f5e100866060015161ffff16856127106135049190615a77565b61350e908d615b15565b6135189190615b15565b6135229190615b34565b905286613530600186615a77565b8151811061354057613540615795565b60200260200101819052506135b9565b6040518060400160405280826001600160a01b031681526020016127108461271061357b9190615a77565b613585908c615b15565b61358f9190615b34565b90528661359d600186615a77565b815181106135ad576135ad615795565b60200260200101819052505b50505050509392505050565b60095460ff1661360e5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610ab7565b6009805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6000613663836118d5565b905061366f8284612e08565b6136d15760405162461bcd60e51b815260206004820152602d60248201527f4552433732313a206275726e2063616c6c6572206973206e6f74206f776e657260448201526c081b9bdc88185c1c1c9bdd9959609a1b6064820152608401610ab7565b6136da836142fb565b604080518481526001600160a01b03831660208201527f1e8df141f42ed659a8fe7e7c5966cbdf2d240d0c45f4c30cbe02526c618075ef9101611649565b60095460009061010090046001600160a01b0316156137a5576009546001600160a01b0389811661010090920416146137a55760405162461bcd60e51b815260206004820152602960248201527f43726561746f72206d757374206d617463682073696e676c652063726561746f60448201526872206164647265737360b81b6064820152608401610ab7565b6000878152600e602052604090208054600160401b90046001600160a01b0316156138095760405162461bcd60e51b81526020600482015260146024820152736d6564696120616c72656164792065786973747360601b6044820152606401610ab7565b60008763ffffffff1611801561382757506001600160a01b03891615155b801561383957506127108461ffff1611155b6138765760405162461bcd60e51b815260206004820152600e60248201526d696e76616c696420706172616d7360901b6044820152606401610ab7565b80546001600160a01b038a16600160401b026001600160e01b031990911663ffffffff89161717815585516138b49060028301906020890190614941565b50805462ffffff60e01b1916600160f01b8415150261ffff60e01b191617600160e01b61ffff8616021781556138ea8186613f11565b7fe32391d620a82af8c8b33cf9eabb3f00aab2a050c566f4f62c04eb328e5d95af888a8987878b60405161392396959493929190615b71565b60405180910390a15095979650505050505050565b6000815111801561394b57506127108151105b61398c5760405162461bcd60e51b8152602060048201526012602482015271030203c20636f756e74203c3d2031303030360741b6044820152606401610ab7565b6000828152600e602052604090208054600160401b90046001600160a01b03166139ef5760405162461bcd60e51b81526020600482015260146024820152731b59591a5848191bd95cc81b9bdd08195e1a5cdd60621b6044820152606401610ab7565b8054600160201b810463ffffffff1690613a1990600160401b90046001600160a01b031686614204565b613a5c5760405162461bcd60e51b815260206004820152601460248201527310dc99585d1bdc881b9bdd08185c1c1c9bdd995960621b6044820152606401610ab7565b8154835163ffffffff91821691613a769190841690615acf565b1115613abd5760405162461bcd60e51b81526020600482015260166024820152752a37ba30b61039bab838363c9032bc31b2b2b232b21760511b6044820152606401610ab7565b60005b83518163ffffffff161015613bec576000848263ffffffff1681518110613ae957613ae9615795565b6020908102919091018101516000818152600f909252604090912080549192509063ffffffff1615613b545760405162461bcd60e51b81526020600482015260146024820152731d1bdad95b925908185b1c9958591e481d5cd95960621b6044820152606401610ab7565b600083613b62866001615bb9565b613b6c9190615bb9565b825463ffffffff191663ffffffff8216178355600183018990556040519091507f775f53e4c75ce0c74e611f7f0bb660e4cd647e0522ef0f8aefd4ecef373c5df990613bc49085908c90859060028c01908e90615be1565b60405180910390a1613bd68984614396565b5050508080613be4906157c1565b915050613ac0565b5082518254613c089190600160201b900463ffffffff16615bb9565b825463ffffffff91909116600160201b0267ffffffff00000000199091161790915550505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60095460ff1615613ca55760405162461bcd60e51b8152600401610ab79061573c565b6009805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861363b3390565b6006546001600160a01b03163314613d045760405162461bcd60e51b8152600401610ab7906157e5565b6001600160a01b038116613d445760405162461bcd60e51b81526020600482015260076024820152666164647228302960c81b6044820152606401610ab7565b6001613d536201518042615a77565b613d5d9190615a77565b6001600160a01b0382166000818152600860209081526040918290209390935580519182526001928201929092527fe2e2dad866561a9926816384b10b4073c5e0e101b6c911e4936d22438bd63e9b9101611bf4565b613dbe848484612ed2565b613dca848484846144c9565b6123f95760405162461bcd60e51b8152600401610ab790615c92565b600a54600160a01b900460ff161515600114613e3b5760405162461bcd60e51b8152602060048201526014602482015273195e1d081b5a5b9d1a5b99c8191a5cd8589b195960621b6044820152606401610ab7565b600083604051602001613e699190815181526020918201516001600160a01b03169181019190915260400190565b6040516020818303038152906040528051906020012090506000613ec584848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525086939250506145d69050565b600a549091506001600160a01b038083169116146126895760405162461bcd60e51b815260206004820152600960248201526839b4b39032b93937b960b91b6044820152606401610ab7565b60008060005b83518110156141785760006001600160a01b0316848281518110613f3d57613f3d615795565b6020026020010151600001516001600160a01b0316141580613f9a575084548451600160401b9091046001600160a01b031690859083908110613f8257613f82615795565b6020026020010151600001516001600160a01b031614155b613fdb5760405162461bcd60e51b815260206004820152601260248201527131b7b63630b110183c1817b1b932b0ba37b960711b6044820152606401610ab7565b838181518110613fed57613fed615795565b60200260200101516020015165ffffffffffff166000141580614036575083818151811061401d5761401d615795565b60200260200101516040015165ffffffffffff16600014155b6140765760405162461bcd60e51b8152602060048201526011602482015270073686172652f726f79616c7479203d203607c1b6044820152606401610ab7565b8460010184828151811061408c5761408c615795565b6020908102919091018101518254600181018455600093845292829020815193018054928201516040909201516001600160a01b039094166001600160d01b031990931692909217600160a01b65ffffffffffff92831602176001600160d01b0316600160d01b9190931602919091179055835184908290811061411257614112615795565b60200260200101516020015165ffffffffffff16836141319190615acf565b925083818151811061414557614145615795565b60200260200101516040015165ffffffffffff16826141649190615acf565b91508061417081615b56565b915050613f17565b506127108211156141bb5760405162461bcd60e51b815260206004820152600d60248201526c0746f74616c203c3d313030303609c1b6044820152606401610ab7565b6127108111156123f95760405162461bcd60e51b81526020600482015260146024820152730746f74616c526f79616c7479203c3d31303030360641b6044820152606401610ab7565b6001600160a01b03808316600090815260106020526040812054909116801561424457826001600160a01b0316816001600160a01b0316149150506109b7565b826001600160a01b0316846001600160a01b0316149150506109b7565b600c546000906001600160a01b0316156142f757600c5460405163ae22c57d60e01b81526001600160a01b0384811660048301529091169063ae22c57d9060240160206040518083038186803b1580156142ba57600080fd5b505afa1580156142ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142f29190615ce4565b6109b7565b5090565b6000614306826118d5565b9050614313600083612ad8565b6001600160a01b038116600090815260036020526040812080546001929061433c908490615a77565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b0382166143ec5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610ab7565b6143f581612abb565b156144425760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610ab7565b6001600160a01b038216600090815260036020526040812080546001929061446b908490615acf565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b156145cb57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061450d903390899088908890600401615d01565b602060405180830381600087803b15801561452757600080fd5b505af1925050508015614557575060408051601f3d908101601f1916820190925261455491810190615d3e565b60015b6145b1573d808015614585576040519150601f19603f3d011682016040523d82523d6000602084013e61458a565b606091505b5080516145a95760405162461bcd60e51b8152600401610ab790615c92565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612eca565b506001949350505050565b60008060006145e585856145fa565b915091506145f28161466a565b509392505050565b6000808251604114156146315760208301516040840151606085015160001a61462587828585614825565b94509450505050614663565b82516040141561465b5760208301516040840151614650868383614912565b935093505050614663565b506000905060025b9250929050565b600081600481111561467e5761467e615d5b565b14156146875750565b600181600481111561469b5761469b615d5b565b14156146e95760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610ab7565b60028160048111156146fd576146fd615d5b565b141561474b5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610ab7565b600381600481111561475f5761475f615d5b565b14156147b85760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610ab7565b60048160048111156147cc576147cc615d5b565b1415610e525760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610ab7565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561485c5750600090506003614909565b8460ff16601b1415801561487457508460ff16601c14155b156148855750600090506004614909565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156148d9573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661490257600060019250925050614909565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b0161493387828885614825565b935093505050935093915050565b82805461494d90615701565b90600052602060002090601f01602090048101928261496f57600085556149b5565b82601f1061498857805160ff19168380011785556149b5565b828001600101855582156149b5579182015b828111156149b557825182559160200191906001019061499a565b506142f79291506149db565b5080546000825590600052602060002090810190610e5291905b5b808211156142f757600081556001016149dc565b6001600160e01b031981168114610e5257600080fd5b600060208284031215614a1857600080fd5b8135610e94816149f0565b6001600160a01b0381168114610e5257600080fd5b8035614a4381614a23565b919050565b600060208284031215614a5a57600080fd5b8135610e9481614a23565b60005b83811015614a80578181015183820152602001614a68565b838111156123f95750506000910152565b60008151808452614aa9816020860160208601614a65565b601f01601f19169290920160200192915050565b602081526000610e946020830184614a91565b600060208284031215614ae257600080fd5b5035919050565b60008060408385031215614afc57600080fd5b8235614b0781614a23565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715614b4d57614b4d614b15565b60405290565b60405160e081016001600160401b0381118282101715614b4d57614b4d614b15565b604080519081016001600160401b0381118282101715614b4d57614b4d614b15565b60405161010081016001600160401b0381118282101715614b4d57614b4d614b15565b604051601f8201601f191681016001600160401b0381118282101715614be257614be2614b15565b604052919050565b60006001600160401b03821115614c0357614c03614b15565b5060051b60200190565b803563ffffffff81168114614a4357600080fd5b803561ffff81168114614a4357600080fd5b803565ffffffffffff81168114614a4357600080fd5b600082601f830112614c5a57600080fd5b81356020614c6f614c6a83614bea565b614bba565b82815260609283028501820192828201919087851115614c8e57600080fd5b8387015b85811015614cec5781818a031215614caa5760008081fd5b614cb2614b2b565b8135614cbd81614a23565b8152614cca828701614c33565b868201526040614cdb818401614c33565b908201528452928401928101614c92565b5090979650505050505050565b60006001600160401b03821115614d1257614d12614b15565b50601f01601f191660200190565b6000614d2e614c6a84614cf9565b9050828152838383011115614d4257600080fd5b828260208301376000602084830101529392505050565b600082601f830112614d6a57600080fd5b610e9483833560208501614d20565b600060e08284031215614d8b57600080fd5b614d93614b53565b90508135815260208201356020820152614daf60408301614c0d565b6040820152614dc060608301614a38565b6060820152614dd160808301614c21565b608082015260a08201356001600160401b0380821115614df057600080fd5b614dfc85838601614c49565b60a084015260c0840135915080821115614e1557600080fd5b50614e2284828501614d59565b60c08301525092915050565b60006020808385031215614e4157600080fd5b82356001600160401b0380821115614e5857600080fd5b818501915085601f830112614e6c57600080fd5b8135614e7a614c6a82614bea565b81815260059190911b83018401908481019088831115614e9957600080fd5b8585015b83811015614ed157803585811115614eb55760008081fd5b614ec38b89838a0101614d79565b845250918601918601614e9d565b5098975050505050505050565b600080600060608486031215614ef357600080fd5b8335614efe81614a23565b92506020840135614f0e81614a23565b929592945050506040919091013590565b60008060408385031215614f3257600080fd5b50508035926020909101359150565b602080825282518282018190526000919060409081850190868401855b82811015614f8c57815180516001600160a01b03168552860151868501529284019290850190600101614f5e565b5091979650505050505050565b8015158114610e5257600080fd5b8035614a4381614f99565b60008060408385031215614fc557600080fd5b8235614fd081614a23565b91506020830135614fe081614f99565b809150509250929050565b60006020808385031215614ffe57600080fd5b82356001600160401b0381111561501457600080fd5b8301601f8101851361502557600080fd5b8035615033614c6a82614bea565b81815260069190911b8201830190838101908783111561505257600080fd5b928401925b8284101561509f57604084890312156150705760008081fd5b615078614b75565b843581528585013561508981614a23565b8187015282526040939093019290840190615057565b979650505050505050565b600081518084526020808501945080840160005b8381101561510457815180516001600160a01b031688528381015165ffffffffffff908116858a01526040918201511690880152606090960195908201906001016150be565b509495945050505050565b60208152600063ffffffff8084511660208401528060208501511660408401525060018060a01b0360408401511660608301526060830151615157608084018261ffff169052565b50608083015180151560a08401525060a083015160e060c08401526151806101008401826150aa565b905060c0840151601f198483030160e085015261519d8282614a91565b95945050505050565b600082601f8301126151b757600080fd5b813560206151c7614c6a83614bea565b82815260059290921b840181019181810190868411156151e657600080fd5b8286015b8481101561520157803583529183019183016151ea565b509695505050505050565b6000610100828403121561521f57600080fd5b615227614b97565b90508135815261523960208301614c0d565b602082015261524a60408301614a38565b604082015261525b60608301614c21565b606082015261526c60808301614fa7565b608082015260a08201356001600160401b038082111561528b57600080fd5b61529785838601614c49565b60a084015260c08401359150808211156152b057600080fd5b6152bc85838601614d59565b60c084015260e08401359150808211156152d557600080fd5b506152e2848285016151a6565b60e08301525092915050565b6000602080838503121561530157600080fd5b82356001600160401b038082111561531857600080fd5b818501915085601f83011261532c57600080fd5b813561533a614c6a82614bea565b81815260059190911b8301840190848101908883111561535957600080fd5b8585015b83811015614ed1578035858111156153755760008081fd5b6153838b89838a010161520c565b84525091860191860161535d565b600080604083850312156153a457600080fd5b82356153af81614a23565b91506020830135614fe081614a23565b6000606082840312156153d157600080fd5b6153d9614b2b565b90508135815260208201356001600160401b038111156153f857600080fd5b615404848285016151a6565b602083015250604082013561541881614a23565b604082015292915050565b6000602080838503121561543657600080fd5b82356001600160401b038082111561544d57600080fd5b818501915085601f83011261546157600080fd5b813561546f614c6a82614bea565b81815260059190911b8301840190848101908883111561548e57600080fd5b8585015b83811015614ed1578035858111156154aa5760008081fd5b6154b88b89838a01016153bf565b845250918601918601615492565b6000602082840312156154d857600080fd5b81356001600160401b038111156154ee57600080fd5b612eca848285016151a6565b63ffffffff8781168252861660208201526001600160a01b038516604082015261ffff84166060820152821515608082015260c060a0820181905260009061554490830184614a91565b98975050505050505050565b6000806000806080858703121561556657600080fd5b843561557181614a23565b9350602085013561558181614a23565b92506040850135915060608501356001600160401b038111156155a357600080fd5b8501601f810187136155b457600080fd5b6155c387823560208401614d20565b91505092959194509250565b6000806000604084860312156155e457600080fd5b83356001600160401b03808211156155fb57600080fd5b6156078783880161520c565b9450602086013591508082111561561d57600080fd5b818601915086601f83011261563157600080fd5b81358181111561564057600080fd5b87602082850101111561565257600080fd5b6020830194508093505050509250925092565b60006020828403121561567757600080fd5b81356001600160401b0381111561568d57600080fd5b612eca848285016153bf565b6000602082840312156156ab57600080fd5b81356001600160401b038111156156c157600080fd5b612eca84828501614d79565b6000602082840312156156df57600080fd5b81356001600160401b038111156156f557600080fd5b612eca8482850161520c565b600181811c9082168061571557607f821691505b6020821081141561573657634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252601590820152743ab730baba3437b934bd32b21027a127903ab9b2b960591b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600063ffffffff808316818114156157db576157db6157ab565b6001019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60006020828403121561587d57600080fd5b5051919050565b60208082526017908201527f4469676974616c4d65646961206e6f7420666f756e642e000000000000000000604082015260600190565b6020808252600c908201526b3737ba1037b137a0b236b4b760a11b604082015260600190565b6000602082840312156158f357600080fd5b815160ff81168114610e9457600080fd5b60006020828403121561591657600080fd5b81516001600160401b0381111561592c57600080fd5b8201601f8101841361593d57600080fd5b805161594b614c6a82614cf9565b81815285602083850101111561596057600080fd5b61519d826020830160208601614a65565b60008251615983818460208701614a65565b9190910192915050565b6020808252825182820181905260009190848201906040850190845b818110156159c5578351835292840192918401916001016159a9565b50909695505050505050565b6000835160206159e48285838901614a65565b8184019150600085546159f681615701565b60018281168015615a0e5760018114615a1f57615a4b565b60ff19841687528287019450615a4b565b896000528560002060005b84811015615a4357815489820152908301908701615a2a565b505082870194505b50929998505050505050505050565b600060208284031215615a6c57600080fd5b8151610e9481614f99565b600082821015615a8957615a896157ab565b500390565b85815263ffffffff8516602082015261ffff8416604082015260a060608201526000615abd60a0830185614a91565b90508260808301529695505050505050565b60008219821115615ae257615ae26157ab565b500190565b600065ffffffffffff80831681851681830481118215151615615b0c57615b0c6157ab565b02949350505050565b6000816000190483118215151615615b2f57615b2f6157ab565b500290565b600082615b5157634e487b7160e01b600052601260045260246000fd5b500490565b6000600019821415615b6a57615b6a6157ab565b5060010190565b8681526001600160a01b038616602082015263ffffffff8516604082015261ffff84166060820152821515608082015260c060a0820181905260009061554490830184614a91565b600063ffffffff808316818516808303821115615bd857615bd86157ab565b01949350505050565b8581526000602060018060a01b0387168184015263ffffffff8616604084015260a0606084015260008554615c1581615701565b8060a087015260c0600180841660008114615c375760018114615c4b57615c79565b60ff1985168984015260e089019550615c79565b8a6000528660002060005b85811015615c715781548b8201860152908301908801615c56565b8a0184019650505b5050505050608093909301939093525095945050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600060208284031215615cf657600080fd5b8151610e9481614a23565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615d3490830184614a91565b9695505050505050565b600060208284031215615d5057600080fd5b8151610e94816149f0565b634e487b7160e01b600052602160045260246000fdfea26469706673582212208fd144566d083799c849aca77f5fe8aada564c1f676b847de868e42d646c12a364736f6c63430008090033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000085508ce7885b65a57ee070460055f3e4b412051e000000000000000000000000000000000000000000000000000000000000000b4d616b657273506c61636500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064d414b4552530000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103db5760003560e01c806376aab0731161020a578063a47a2e7711610125578063d400c4c1116100b8578063f2fde38b11610087578063f2fde38b14610905578063fb12a87614610918578063fd694df11461092b578063ffa1ad741461093e578063ffca4bd21461095857600080fd5b8063d400c4c1146108b8578063d5edf45b146108cb578063e985e9c5146108df578063ed32314a146108f257600080fd5b8063c87b56dd116100f4578063c87b56dd1461086c578063c95ab4621461087f578063cd161d2e14610892578063cd73f476146108a557600080fd5b8063a47a2e771461082b578063a790c0e21461083e578063b39ba60a14610846578063b88d4fde1461085957600080fd5b80638ce876461161019d578063987311b51161016c578063987311b5146107cd5780639b36830d146107e0578063a22cb46514610805578063a22d6eba1461081857600080fd5b80638ce876461461078e5780638da5cb5b146107a15780638e945e3b146107b257806395d89b41146107c557600080fd5b80637ff9f614116101d95780637ff9f6141461072c5780638456cb591461073f5780638a603bdf146107475780638c2ba8fe1461077b57600080fd5b806376aab073146106ca578063788e0543146106dd57806378cc32bc146106f05780637b47ec1a146105c557600080fd5b80633f4ba83a116102fa578063570efd461161028d5780635e7785a61161025c5780635e7785a6146106895780636352211e1461069c57806370a08231146106af578063715018a6146106c257600080fd5b8063570efd46146106455780635b7633d0146106585780635c975abb1461066b5780635cf09fee1461067657600080fd5b806345682a0b116102c957806345682a0b146105eb57806347ca0e02146105fe5780634f4385521461061157806355df42751461062557600080fd5b80633f4ba83a146105aa57806342842e0e146105b257806342966c68146105c5578063430648bc146105d857600080fd5b80631ad325621161037257806323b872dd1161034157806323b872dd146105185780632a55205a1461052b5780633ad0288e1461054b5780633db57cbe1461055e57600080fd5b80631ad32562146104ca5780631dc88a5b146104ea5780631fc09717146104fd57806323077f581461050557600080fd5b8063095ea7b3116103ae578063095ea7b3146104715780630c9999291461048657806313e2263e1461049e578063147ca2af146104b257600080fd5b806301ffc9a7146103e05780630629abf21461040857806306fdde0314610449578063081812fc1461045e575b600080fd5b6103f36103ee366004614a06565b61096b565b60405190151581526020015b60405180910390f35b610431610416366004614a48565b6010602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016103ff565b6104516109bd565b6040516103ff9190614abd565b61043161046c366004614ad0565b610a4f565b61048461047f366004614ae9565b610adc565b005b6104906201518081565b6040519081526020016103ff565b600a546103f390600160a01b900460ff1681565b6009546104319061010090046001600160a01b031681565b6104906104d8366004614a48565b60086020526000908152604090205481565b6104846104f8366004614e2e565b610bf2565b610484610dc9565b610484610513366004614ad0565b610e25565b610484610526366004614ede565b610e55565b61053e610539366004614f1f565b610e86565b6040516103ff9190614f41565b610484610559366004614fb2565b610e9b565b61058e61056c366004614ad0565b600f602052600090815260409020805460019091015463ffffffff9091169082565b6040805163ffffffff90931683526020830191909152016103ff565b610484610f8e565b6104846105c0366004614ede565b610fc2565b6104846105d3366004614ad0565b610fdd565b6104846105e6366004614feb565b610fe7565b6104846105f9366004614a48565b61106f565b600d54610431906001600160a01b031681565b600a546103f390600160a81b900460ff1681565b610638610633366004614ad0565b6111a5565b6040516103ff919061510f565b6104846106533660046152ee565b611390565b600a54610431906001600160a01b031681565b60095460ff166103f3565b610484610684366004615391565b611465565b610484610697366004614a48565b611656565b6104316106aa366004614ad0565b6118d5565b6104906106bd366004614a48565b61194c565b6104846119d3565b6104846106d8366004615423565b611a07565b600c54610431906001600160a01b031681565b6107036106fe366004614ad0565b611af6565b604080516001600160a01b039094168452911515602084015261ffff16908201526060016103ff565b61048461073a366004614a48565b611b67565b610484611bff565b61075a610755366004614ad0565b611c31565b60408051825163ffffffff16815260209283015192810192909252016103ff565b6104846107893660046152ee565b611cc3565b61048461079c366004614a48565b611d81565b6006546001600160a01b0316610431565b61053e6107c0366004614f1f565b611df9565b610451611e07565b6104846107db3660046154c6565b611e16565b6107f36107ee366004614ad0565b612041565b6040516103ff969594939291906154fa565b610484610813366004614fb2565b612121565b610484610826366004614ad0565b6121e6565b610484610839366004614a48565b6122e8565b610484612379565b600b54610431906001600160a01b031681565b610484610867366004615550565b6123c7565b61045161087a366004614ad0565b6123ff565b600754610431906001600160a01b031681565b6104846108a0366004614a48565b612481565b6104846108b33660046155cf565b6125af565b6104846108c6366004615665565b612690565b6007546103f390600160a01b900460ff1681565b6103f36108ed366004615391565b61270f565b610484610900366004615699565b612821565b610484610913366004614a48565b6128fd565b6103f3610926366004614a48565b612995565b610484610939366004615665565b6129d2565b610946600381565b60405160ff90911681526020016103ff565b6104846109663660046156cd565b612a31565b60006001600160e01b031982166380ac58cd60e01b148061099c57506001600160e01b03198216635b5e139f60e01b145b806109b757506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600080546109cc90615701565b80601f01602080910402602001604051908101604052809291908181526020018280546109f890615701565b8015610a455780601f10610a1a57610100808354040283529160200191610a45565b820191906000526020600020905b815481529060010190602001808311610a2857829003601f168201915b5050505050905090565b6000610a5a82612abb565b610ac05760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610ae7826118d5565b9050806001600160a01b0316836001600160a01b03161415610b555760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610ab7565b336001600160a01b0382161480610b715750610b71813361270f565b610be35760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610ab7565b610bed8383612ad8565b505050565b60095460ff1615610c155760405162461bcd60e51b8152600401610ab79061573c565b610c1e33612995565b610c3a5760405162461bcd60e51b8152600401610ab790615766565b600d546001600160a01b0316610c805760405162461bcd60e51b815260206004820152600b60248201526a07661756c74203d203078360ac1b6044820152606401610ab7565b60005b81518163ffffffff161015610dc5576000828263ffffffff1681518110610cac57610cac615795565b60209081029190910181015180516000908152600e9092526040909120805491925090600160401b90046001600160a01b031615801590610d05575060608201518154600160401b90046001600160a01b039081169116145b610d3e5760405162461bcd60e51b815260206004820152600a60248201526922269031b932b0ba37b960b11b6044820152606401610ab7565b8054600d54610d60916001600160a01b03600160401b9091048116911661270f565b1515600114610da65760405162461bcd60e51b8152602060048201526012602482015271617070726f7665616c6c206d697373696e6760701b6044820152606401610ab7565b610db08282612b46565b50508080610dbd906157c1565b915050610c83565b5050565b60095460ff1615610dec5760405162461bcd60e51b8152600401610ab79061573c565b6006546001600160a01b03163314610e165760405162461bcd60e51b8152600401610ab7906157e5565b600a805460ff60a81b19169055565b60095460ff1615610e485760405162461bcd60e51b8152600401610ab79061573c565b610e528133612ca5565b50565b610e5f3382612e08565b610e7b5760405162461bcd60e51b8152600401610ab79061581a565b610bed838383612ed2565b6060610e9483836001613072565b9392505050565b60095460ff1615610ebe5760405162461bcd60e51b8152600401610ab79061573c565b610ec733612995565b610ee35760405162461bcd60e51b8152600401610ab790615766565b6001600160a01b038216610f285760405162461bcd60e51b815260206004820152600c60248201526b63616e74206265207a65726f60a01b6044820152606401610ab7565b600a80546001600160a01b038481166001600160a81b031990921691909117600160a01b841515021791829055604051911681527f892cc3ddabcf4697be271eb3df1f098bec1713e58e7287c001532df08b5ebaab906020015b60405180910390a15050565b6006546001600160a01b03163314610fb85760405162461bcd60e51b8152600401610ab7906157e5565b610fc06135c5565b565b610bed838383604051806020016040528060008152506123c7565b610e528133613658565b60095460ff161561100a5760405162461bcd60e51b8152600401610ab79061573c565b60005b81518163ffffffff161015610dc5576000828263ffffffff168151811061103657611036615795565b6020026020010151905061105c61105082600001516118d5565b60208301518351610fc2565b5080611067816157c1565b91505061100d565b60095460ff16156110925760405162461bcd60e51b8152600401610ab79061573c565b6006546001600160a01b031633146110bc5760405162461bcd60e51b8152600401610ab7906157e5565b60008190506000816001600160a01b031663c20a03826040518163ffffffff1660e01b815260040160206040518083038186803b1580156110fc57600080fd5b505afa158015611110573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611134919061586b565b9050661b5c1d985d5b1d60ca1b81146111815760405162461bcd60e51b815260206004820152600f60248201526e1a5b9d985b1a59081b5c1d985d5b1d608a1b6044820152606401610ab7565b50600d80546001600160a01b0319166001600160a01b039290921691909117905550565b6040805160e0810182526000808252602082018190529181018290526060808201839052608082019290925260a0810182905260c08101919091526000828152600e60209081526040808320815160e081018352815463ffffffff8082168352600160201b82041682860152600160401b81046001600160a01b031682850152600160e01b810461ffff166060830152600160f01b900460ff16151560808201526001820180548451818702810187019095528085529194929360a0860193909290879084015b828210156112c857600084815260209081902060408051606081018252918501546001600160a01b038116835265ffffffffffff600160a01b8204811684860152600160d01b909104169082015282526001909201910161126c565b5050505081526020016002820180546112e090615701565b80601f016020809104026020016040519081016040528092919081815260200182805461130c90615701565b80156113595780601f1061132e57610100808354040283529160200191611359565b820191906000526020600020905b81548152906001019060200180831161133c57829003601f168201915b5050509190925250505060408101519091506001600160a01b03166109b75760405162461bcd60e51b8152600401610ab790615884565b60095460ff16156113b35760405162461bcd60e51b8152600401610ab79061573c565b6113bc33612995565b6113d85760405162461bcd60e51b8152600401610ab790615766565b60005b81518163ffffffff161015610dc5576000828263ffffffff168151811061140457611404615795565b60200260200101519050600061143b8260400151836000015184602001518560c001518660a0015187606001518860800151613718565b90506114508260400151828460e00151613938565b5050808061145d906157c1565b9150506113db565b6001600160a01b0380831660009081526010602052604090205416331580159061149757506001600160a01b03831615155b6114f25760405162461bcd60e51b815260206004820152602660248201527f43726561746f72206d7573742062652076616c6964206e6f6e20307830206164604482015265323932b9b99760d11b6064820152608401610ab7565b336001600160a01b03841614806115115750336001600160a01b038216145b6115545760405162461bcd60e51b81526020600482015260146024820152732ab730baba3437b934bd32b21031b0b63632b91760611b6044820152606401610ab7565b6001600160a01b03811661158f5733600090815260106020526040902080546001600160a01b0319166001600160a01b03841617905561160d565b336001600160a01b038216146115de5760405162461bcd60e51b81526020600482015260146024820152732ab730baba3437b934bd32b21031b0b63632b91760611b6044820152606401610ab7565b6001600160a01b03838116600090815260106020526040902080546001600160a01b0319169184169190911790555b604080516001600160a01b038086168252841660208201527fde6cfdf21fe76bcb45258138e27bcd332b76941b24d226b5da8dc5f9cd531c3e91015b60405180910390a1505050565b60095460ff16156116795760405162461bcd60e51b8152600401610ab79061573c565b6006546001600160a01b031633148061169c57506007546001600160a01b031633145b6116b85760405162461bcd60e51b8152600401610ab7906158bb565b600a54600160a81b900460ff1615156001146116fb5760405162461bcd60e51b81526020600482015260026024820152616e6f60f01b6044820152606401610ab7565b6000819050806001600160a01b031663ffa1ad746040518163ffffffff1660e01b815260040160206040518083038186803b15801561173957600080fd5b505afa15801561174d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177191906158e1565b60ff166001146117b25760405162461bcd60e51b815260206004820152600c60248201526b726f796c74792076213d203160a01b6044820152606401610ab7565b6000816001600160a01b031663c20a03826040518163ffffffff1660e01b815260040160006040518083038186803b1580156117ed57600080fd5b505afa158015611801573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118299190810190615904565b6040516020016118399190615971565b604051602081830303815290604052805190602001209050807fb590ff355bf2d720a7e957392d3b76fd1adda1832940640bf5d5a7c387fed32360001b146118b15760405162461bcd60e51b815260206004820152600b60248201526a6e6f7420726f79616c747960a81b6044820152606401610ab7565b50600c80546001600160a01b0319166001600160a01b039290921691909117905550565b6000818152600260205260408120546001600160a01b0316806109b75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610ab7565b60006001600160a01b0382166119b75760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610ab7565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146119fd5760405162461bcd60e51b8152600401610ab7906157e5565b610fc06000613c30565b60095460ff1615611a2a5760405162461bcd60e51b8152600401610ab79061573c565b611a3333612995565b611a4f5760405162461bcd60e51b8152600401610ab790615766565b60005b81518163ffffffff161015610dc5576000828263ffffffff1681518110611a7b57611a7b615795565b60209081029190910181015180516000908152600e9092526040909120805491925090600160401b90046001600160a01b0316611aca5760405162461bcd60e51b8152600401610ab790615884565b611ae1826040015183600001518460200151613938565b50508080611aee906157c1565b915050611a52565b6000818152600e60205260408120805482918291600160401b90046001600160a01b0316611b365760405162461bcd60e51b8152600401610ab790615884565b8054600190910154600160401b82046001600160a01b0316969015159550600160e01b90910461ffff169350915050565b6006546001600160a01b0316331480611b8a57506007546001600160a01b031633145b611ba65760405162461bcd60e51b8152600401610ab7906158bb565b6001600160a01b03811660008181526008602090815260408083208390558051938452908301919091527fe2e2dad866561a9926816384b10b4073c5e0e101b6c911e4936d22438bd63e9b91015b60405180910390a150565b6006546001600160a01b03163314611c295760405162461bcd60e51b8152600401610ab7906157e5565b610fc0613c82565b6040805180820190915260008082526020820152611c4e82612abb565b611c935760405162461bcd60e51b81526020600482015260166024820152751c995b19585cd948191bd95cc81b9bdd08195e1a5cdd60521b6044820152606401610ab7565b506000908152600f60209081526040918290208251808401909352805463ffffffff168352600101549082015290565b60095460ff1615611ce65760405162461bcd60e51b8152600401610ab79061573c565b611cef33612995565b611d0b5760405162461bcd60e51b8152600401610ab790615766565b60005b81518163ffffffff161015610dc5576000828263ffffffff1681518110611d3757611d37615795565b60200260200101519050611d6c8160400151826000015183602001518460c001518560a0015186606001518760800151613718565b50508080611d79906157c1565b915050611d0e565b6006546001600160a01b03163314611dab5760405162461bcd60e51b8152600401610ab7906157e5565b600780546001600160a01b0319166001600160a01b0383169081179091556040519081527ffbd1c2e6a1f767e08b9689ca3ce8ca1e7b60fbb71734bfc34f39f5bcb846cf3090602001611bf4565b6060610e9483836000613072565b6060600180546109cc90615701565b60095460ff1615611e395760405162461bcd60e51b8152600401610ab79061573c565b611e4233612995565b611e5e5760405162461bcd60e51b8152600401610ab790615766565b600d546001600160a01b0316611ea45760405162461bcd60e51b815260206004820152600b60248201526a07661756c74203d203078360ac1b6044820152606401610ab7565b60005b81518163ffffffff161015612011576000828263ffffffff1681518110611ed057611ed0615795565b6020908102919091018101516000818152600e9092526040909120805491925090600160401b90046001600160a01b0316611f3d5760405162461bcd60e51b815260206004820152600d60248201526c2226903737ba103337bab7321760991b6044820152606401610ab7565b8054600160f01b900460ff1615611f855760405162461bcd60e51b815260206004820152600c60248201526b444d20696d6d757461626c6560a01b6044820152606401610ab7565b8054600d54611fa7916001600160a01b03600160401b9091048116911661270f565b1515600114611fed5760405162461bcd60e51b8152602060048201526012602482015271617070726f7665616c6c206d697373696e6760701b6044820152606401610ab7565b805460ff60f01b1916600160f01b1790555080612009816157c1565b915050611ea7565b507f9d16e0b5e4fbfa71074176e81041192860b75c5094916faa8f717a806979a9af81604051611bf4919061598d565b600e602052600090815260409020805460028201805463ffffffff80841694600160201b850490911693600160401b81046001600160a01b031693600160e01b820461ffff1693600160f01b90920460ff16929161209e90615701565b80601f01602080910402602001604051908101604052809291908181526020018280546120ca90615701565b80156121175780601f106120ec57610100808354040283529160200191612117565b820191906000526020600020905b8154815290600101906020018083116120fa57829003601f168201915b5050505050905086565b6001600160a01b03821633141561217a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610ab7565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000818152600e602052604090208054600160401b90046001600160a01b03161580159061222457508054600160401b90046001600160a01b031633145b61225d5760405162461bcd60e51b815260206004820152600a60248201526922269031b932b0ba37b960b11b6044820152606401610ab7565b8054600160f01b900460ff16156122a55760405162461bcd60e51b815260206004820152600c60248201526b444d20696d6d757461626c6560a01b6044820152606401610ab7565b805460ff60f01b1916600160f01b1781556040517fe4a3a767606eb6faa43a9e7b7d2bf6415bfa993a8a74e263aed3fa98221118d490610f829084815260200190565b6006546001600160a01b031633148061230b57506007546001600160a01b031633145b6123275760405162461bcd60e51b8152600401610ab7906158bb565b600754600160a01b900460ff1615156001146123705760405162461bcd60e51b8152602060048201526008602482015267191a5cd8589b195960c21b6044820152606401610ab7565b610e5281613cda565b6006546001600160a01b031633148061239c57506007546001600160a01b031633145b6123b85760405162461bcd60e51b8152600401610ab7906158bb565b6007805460ff60a01b19169055565b6123d13383612e08565b6123ed5760405162461bcd60e51b8152600401610ab79061581a565b6123f984848484613db3565b50505050565b606061240a82612abb565b61241357600080fd5b6000828152600f602090815260408083206001810154808552600e845293829020825180840184526007815266697066733a2f2f60c81b8186015292519194939092916124679183916002860191016159d1565b604051602081830303815290604052945050505050919050565b6006546001600160a01b03163314806124a457506007546001600160a01b031633145b6124c05760405162461bcd60e51b8152600401610ab7906158bb565b6001600160a01b0381166125075760405162461bcd60e51b815260206004820152600e60248201526d0c6c2dce840e6cae840e8de4060f60931b6044820152606401610ab7565b6001600160a01b0381166000908152600860205260409020541561255d5760405162461bcd60e51b815260206004820152600d60248201526c185b1c9958591e481859191959609a1b6044820152606401610ab7565b6001600160a01b03811660008181526008602090815260409182902042905581519283526001908301527fe2e2dad866561a9926816384b10b4073c5e0e101b6c911e4936d22438bd63e9b9101611bf4565b60095460ff16156125d25760405162461bcd60e51b8152600401610ab79061573c565b60408301516001600160a01b031633146126255760405162461bcd60e51b815260206004820152601460248201527336b9b3a9b2b73232b910109e9031b932b0ba37b960611b6044820152606401610ab7565b60408051808201825284518152908401516001600160a01b0316602082015261264f818484613de6565b600061267833866000015187602001518860c001518960a001518a606001518b60800151613718565b905061268933828760e00151613938565b5050505050565b60095460ff16156126b35760405162461bcd60e51b8152600401610ab79061573c565b600a546001600160a01b03166126fc5760405162461bcd60e51b815260206004820152600e60248201526d1cda59db995c881b9bdd081cd95d60921b6044820152606401610ab7565b610e523382600001518360200151613938565b600b546000906001600160a01b031661275b5760405162461bcd60e51b815260206004820152600e60248201526d07265676973747279203d203078360941b6044820152606401610ab7565b600b546040516319f5a9f760e21b81526001600160a01b0384811660048301528581166024830152909116906367d6a7dc9060440160206040518083038186803b1580156127a857600080fd5b505afa1580156127bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e09190615a5a565b1515600114156127f2575060016109b7565b506001600160a01b0382811660009081526005602090815260408083209385168352929052205460ff166109b7565b60608101516001600160a01b031633146128745760405162461bcd60e51b815260206004820152601460248201527336b9b3a9b2b73232b910109e9031b932b0ba37b960611b6044820152606401610ab7565b80516000908152600e602052604090208054600160401b90046001600160a01b0316158015906128b457508054600160401b90046001600160a01b031633145b6128f35760405162461bcd60e51b815260206004820152601060248201526f444d2063726561746f7220697373756560801b6044820152606401610ab7565b610dc58282612b46565b6006546001600160a01b031633146129275760405162461bcd60e51b8152600401610ab7906157e5565b6001600160a01b03811661298c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ab7565b610e5281613c30565b6001600160a01b038116600090815260086020526040812054806129bc5750600092915050565b620151806129ca8242615a77565b119392505050565b60095460ff16156129f55760405162461bcd60e51b8152600401610ab79061573c565b6129fe33612995565b612a1a5760405162461bcd60e51b8152600401610ab790615766565b610e52816040015182600001518360200151613938565b60095460ff1615612a545760405162461bcd60e51b8152600401610ab79061573c565b612a5d33612995565b612a795760405162461bcd60e51b8152600401610ab790615766565b6000612aa68260400151836000015184602001518560c001518660a0015187606001518860800151613718565b9050610dc58260400151828460e00151613938565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612b0d826118d5565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b8054600160f01b900460ff1615612b8b5760405162461bcd60e51b8152602060048201526009602482015268696d6d757461626c6560b81b6044820152606401610ab7565b6040820151815463ffffffff918216600160201b9091049091161115612be95760405162461bcd60e51b815260206004820152601360248201527207840c6eae4e4cadce8a0e4d2dce892dcc8caf606b1b6044820152606401610ab7565b6040820151815463ffffffff191663ffffffff90911617815560c08201518051612c1d916002840191602090910190614941565b506080820151815461ffff909116600160e01b0261ffff60e01b19909116178155612c4c6001820160006149c1565b612c5a818360a00151613f11565b7f8076fb98efc7d3e779e35dbd763324939ccc868ab81816af851ea03eb602b11c8260000151836040015184608001518560c001518660200151604051610f82959493929190615a8e565b6000828152600e602052604090208054600160401b90046001600160a01b0316612d085760405162461bcd60e51b81526020600482015260146024820152731b59591a5848191bd95cc81b9bdd08195e1a5cdd60621b6044820152606401610ab7565b8054612d2490600160401b90046001600160a01b031683614204565b80612d4657508054612d4690600160401b90046001600160a01b03168361270f565b612dab5760405162461bcd60e51b815260206004820152603060248201527f4661696c6564206469676974616c206d65646961206275726e2e202043616c6c60448201526f32b9103737ba1030b8383937bb32b21760811b6064820152608401610ab7565b805467ffffffff0000000019811663ffffffff909116600160201b02178155604080518481526001600160a01b03841660208201527f1b3ee8fd28cba3d21433ef53ff70546a93d89d0b6908691fe2fa38a223dc66499101611649565b6000612e1382612abb565b612e745760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610ab7565b6000612e7f836118d5565b9050806001600160a01b0316846001600160a01b03161480612eba5750836001600160a01b0316612eaf84610a4f565b6001600160a01b0316145b80612eca5750612eca818561270f565b949350505050565b826001600160a01b0316612ee5826118d5565b6001600160a01b031614612f4d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610ab7565b6001600160a01b038216612faf5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610ab7565b612fba600082612ad8565b6001600160a01b0383166000908152600360205260408120805460019290612fe3908490615a77565b90915550506001600160a01b0382166000908152600360205260408120805460019290613011908490615acf565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b606061307d84612abb565b6130b45760405162461bcd60e51b81526020600482015260086024820152673737903a37b5b2b760c11b6044820152606401610ab7565b6000848152600f6020908152604080832081518083018352815463ffffffff90811682526001928301548286018190528652600e8552838620845160e08101865281548084168252600160201b810490931681880152600160401b83046001600160a01b031681870152600160e01b830461ffff166060820152600160f01b90920460ff16151560808301529283018054855181880281018801909652808652929695919460a08601939092879084015b828210156131c157600084815260209081902060408051606081018252918501546001600160a01b038116835265ffffffffffff600160a01b8204811684860152600160d01b9091041690820152825260019092019101613165565b5050505081526020016002820180546131d990615701565b80601f016020809104026020016040519081016040528092919081815260200182805461320590615701565b80156132525780601f1061322757610100808354040283529160200191613252565b820191906000526020600020905b81548152906001019060200180831161323557829003601f168201915b505050505081525050905060008160a001515160016132719190615acf565b9050806001600160401b0381111561328b5761328b614b15565b6040519080825280602002602001820160405280156132d057816020015b60408051808201909152600080825260208201528152602001906001900390816132a95790505b5093506000805b8360a00151518110156134b15760006133108560a0015183815181106132ff576132ff615795565b602002602001015160000151614261565b9050600188151514156133ea576040518060400160405280826001600160a01b031681526020016305f5e1008b886060015161ffff168960a00151878151811061335c5761335c615795565b6020026020010151604001516133729190615ae7565b65ffffffffffff166133849190615b15565b61338e9190615b34565b8152508783815181106133a3576133a3615795565b60200260200101819052508460a0015182815181106133c4576133c4615795565b60200260200101516040015165ffffffffffff16836133e39190615acf565b925061349e565b6040518060400160405280826001600160a01b031681526020016127108b8860a00151868151811061341e5761341e615795565b60200260200101516020015165ffffffffffff1661343c9190615b15565b6134469190615b34565b81525087838151811061345b5761345b615795565b60200260200101819052508460a00151828151811061347c5761347c615795565b60200260200101516020015165ffffffffffff168361349b9190615acf565b92505b50806134a981615b56565b9150506132d7565b5060006134c18460400151614261565b905060018715151415613550576040518060400160405280826001600160a01b031681526020016305f5e100866060015161ffff16856127106135049190615a77565b61350e908d615b15565b6135189190615b15565b6135229190615b34565b905286613530600186615a77565b8151811061354057613540615795565b60200260200101819052506135b9565b6040518060400160405280826001600160a01b031681526020016127108461271061357b9190615a77565b613585908c615b15565b61358f9190615b34565b90528661359d600186615a77565b815181106135ad576135ad615795565b60200260200101819052505b50505050509392505050565b60095460ff1661360e5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610ab7565b6009805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6000613663836118d5565b905061366f8284612e08565b6136d15760405162461bcd60e51b815260206004820152602d60248201527f4552433732313a206275726e2063616c6c6572206973206e6f74206f776e657260448201526c081b9bdc88185c1c1c9bdd9959609a1b6064820152608401610ab7565b6136da836142fb565b604080518481526001600160a01b03831660208201527f1e8df141f42ed659a8fe7e7c5966cbdf2d240d0c45f4c30cbe02526c618075ef9101611649565b60095460009061010090046001600160a01b0316156137a5576009546001600160a01b0389811661010090920416146137a55760405162461bcd60e51b815260206004820152602960248201527f43726561746f72206d757374206d617463682073696e676c652063726561746f60448201526872206164647265737360b81b6064820152608401610ab7565b6000878152600e602052604090208054600160401b90046001600160a01b0316156138095760405162461bcd60e51b81526020600482015260146024820152736d6564696120616c72656164792065786973747360601b6044820152606401610ab7565b60008763ffffffff1611801561382757506001600160a01b03891615155b801561383957506127108461ffff1611155b6138765760405162461bcd60e51b815260206004820152600e60248201526d696e76616c696420706172616d7360901b6044820152606401610ab7565b80546001600160a01b038a16600160401b026001600160e01b031990911663ffffffff89161717815585516138b49060028301906020890190614941565b50805462ffffff60e01b1916600160f01b8415150261ffff60e01b191617600160e01b61ffff8616021781556138ea8186613f11565b7fe32391d620a82af8c8b33cf9eabb3f00aab2a050c566f4f62c04eb328e5d95af888a8987878b60405161392396959493929190615b71565b60405180910390a15095979650505050505050565b6000815111801561394b57506127108151105b61398c5760405162461bcd60e51b8152602060048201526012602482015271030203c20636f756e74203c3d2031303030360741b6044820152606401610ab7565b6000828152600e602052604090208054600160401b90046001600160a01b03166139ef5760405162461bcd60e51b81526020600482015260146024820152731b59591a5848191bd95cc81b9bdd08195e1a5cdd60621b6044820152606401610ab7565b8054600160201b810463ffffffff1690613a1990600160401b90046001600160a01b031686614204565b613a5c5760405162461bcd60e51b815260206004820152601460248201527310dc99585d1bdc881b9bdd08185c1c1c9bdd995960621b6044820152606401610ab7565b8154835163ffffffff91821691613a769190841690615acf565b1115613abd5760405162461bcd60e51b81526020600482015260166024820152752a37ba30b61039bab838363c9032bc31b2b2b232b21760511b6044820152606401610ab7565b60005b83518163ffffffff161015613bec576000848263ffffffff1681518110613ae957613ae9615795565b6020908102919091018101516000818152600f909252604090912080549192509063ffffffff1615613b545760405162461bcd60e51b81526020600482015260146024820152731d1bdad95b925908185b1c9958591e481d5cd95960621b6044820152606401610ab7565b600083613b62866001615bb9565b613b6c9190615bb9565b825463ffffffff191663ffffffff8216178355600183018990556040519091507f775f53e4c75ce0c74e611f7f0bb660e4cd647e0522ef0f8aefd4ecef373c5df990613bc49085908c90859060028c01908e90615be1565b60405180910390a1613bd68984614396565b5050508080613be4906157c1565b915050613ac0565b5082518254613c089190600160201b900463ffffffff16615bb9565b825463ffffffff91909116600160201b0267ffffffff00000000199091161790915550505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60095460ff1615613ca55760405162461bcd60e51b8152600401610ab79061573c565b6009805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861363b3390565b6006546001600160a01b03163314613d045760405162461bcd60e51b8152600401610ab7906157e5565b6001600160a01b038116613d445760405162461bcd60e51b81526020600482015260076024820152666164647228302960c81b6044820152606401610ab7565b6001613d536201518042615a77565b613d5d9190615a77565b6001600160a01b0382166000818152600860209081526040918290209390935580519182526001928201929092527fe2e2dad866561a9926816384b10b4073c5e0e101b6c911e4936d22438bd63e9b9101611bf4565b613dbe848484612ed2565b613dca848484846144c9565b6123f95760405162461bcd60e51b8152600401610ab790615c92565b600a54600160a01b900460ff161515600114613e3b5760405162461bcd60e51b8152602060048201526014602482015273195e1d081b5a5b9d1a5b99c8191a5cd8589b195960621b6044820152606401610ab7565b600083604051602001613e699190815181526020918201516001600160a01b03169181019190915260400190565b6040516020818303038152906040528051906020012090506000613ec584848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525086939250506145d69050565b600a549091506001600160a01b038083169116146126895760405162461bcd60e51b815260206004820152600960248201526839b4b39032b93937b960b91b6044820152606401610ab7565b60008060005b83518110156141785760006001600160a01b0316848281518110613f3d57613f3d615795565b6020026020010151600001516001600160a01b0316141580613f9a575084548451600160401b9091046001600160a01b031690859083908110613f8257613f82615795565b6020026020010151600001516001600160a01b031614155b613fdb5760405162461bcd60e51b815260206004820152601260248201527131b7b63630b110183c1817b1b932b0ba37b960711b6044820152606401610ab7565b838181518110613fed57613fed615795565b60200260200101516020015165ffffffffffff166000141580614036575083818151811061401d5761401d615795565b60200260200101516040015165ffffffffffff16600014155b6140765760405162461bcd60e51b8152602060048201526011602482015270073686172652f726f79616c7479203d203607c1b6044820152606401610ab7565b8460010184828151811061408c5761408c615795565b6020908102919091018101518254600181018455600093845292829020815193018054928201516040909201516001600160a01b039094166001600160d01b031990931692909217600160a01b65ffffffffffff92831602176001600160d01b0316600160d01b9190931602919091179055835184908290811061411257614112615795565b60200260200101516020015165ffffffffffff16836141319190615acf565b925083818151811061414557614145615795565b60200260200101516040015165ffffffffffff16826141649190615acf565b91508061417081615b56565b915050613f17565b506127108211156141bb5760405162461bcd60e51b815260206004820152600d60248201526c0746f74616c203c3d313030303609c1b6044820152606401610ab7565b6127108111156123f95760405162461bcd60e51b81526020600482015260146024820152730746f74616c526f79616c7479203c3d31303030360641b6044820152606401610ab7565b6001600160a01b03808316600090815260106020526040812054909116801561424457826001600160a01b0316816001600160a01b0316149150506109b7565b826001600160a01b0316846001600160a01b0316149150506109b7565b600c546000906001600160a01b0316156142f757600c5460405163ae22c57d60e01b81526001600160a01b0384811660048301529091169063ae22c57d9060240160206040518083038186803b1580156142ba57600080fd5b505afa1580156142ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142f29190615ce4565b6109b7565b5090565b6000614306826118d5565b9050614313600083612ad8565b6001600160a01b038116600090815260036020526040812080546001929061433c908490615a77565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b0382166143ec5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610ab7565b6143f581612abb565b156144425760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610ab7565b6001600160a01b038216600090815260036020526040812080546001929061446b908490615acf565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b156145cb57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061450d903390899088908890600401615d01565b602060405180830381600087803b15801561452757600080fd5b505af1925050508015614557575060408051601f3d908101601f1916820190925261455491810190615d3e565b60015b6145b1573d808015614585576040519150601f19603f3d011682016040523d82523d6000602084013e61458a565b606091505b5080516145a95760405162461bcd60e51b8152600401610ab790615c92565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612eca565b506001949350505050565b60008060006145e585856145fa565b915091506145f28161466a565b509392505050565b6000808251604114156146315760208301516040840151606085015160001a61462587828585614825565b94509450505050614663565b82516040141561465b5760208301516040840151614650868383614912565b935093505050614663565b506000905060025b9250929050565b600081600481111561467e5761467e615d5b565b14156146875750565b600181600481111561469b5761469b615d5b565b14156146e95760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610ab7565b60028160048111156146fd576146fd615d5b565b141561474b5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610ab7565b600381600481111561475f5761475f615d5b565b14156147b85760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610ab7565b60048160048111156147cc576147cc615d5b565b1415610e525760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610ab7565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561485c5750600090506003614909565b8460ff16601b1415801561487457508460ff16601c14155b156148855750600090506004614909565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156148d9573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661490257600060019250925050614909565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b0161493387828885614825565b935093505050935093915050565b82805461494d90615701565b90600052602060002090601f01602090048101928261496f57600085556149b5565b82601f1061498857805160ff19168380011785556149b5565b828001600101855582156149b5579182015b828111156149b557825182559160200191906001019061499a565b506142f79291506149db565b5080546000825590600052602060002090810190610e5291905b5b808211156142f757600081556001016149dc565b6001600160e01b031981168114610e5257600080fd5b600060208284031215614a1857600080fd5b8135610e94816149f0565b6001600160a01b0381168114610e5257600080fd5b8035614a4381614a23565b919050565b600060208284031215614a5a57600080fd5b8135610e9481614a23565b60005b83811015614a80578181015183820152602001614a68565b838111156123f95750506000910152565b60008151808452614aa9816020860160208601614a65565b601f01601f19169290920160200192915050565b602081526000610e946020830184614a91565b600060208284031215614ae257600080fd5b5035919050565b60008060408385031215614afc57600080fd5b8235614b0781614a23565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715614b4d57614b4d614b15565b60405290565b60405160e081016001600160401b0381118282101715614b4d57614b4d614b15565b604080519081016001600160401b0381118282101715614b4d57614b4d614b15565b60405161010081016001600160401b0381118282101715614b4d57614b4d614b15565b604051601f8201601f191681016001600160401b0381118282101715614be257614be2614b15565b604052919050565b60006001600160401b03821115614c0357614c03614b15565b5060051b60200190565b803563ffffffff81168114614a4357600080fd5b803561ffff81168114614a4357600080fd5b803565ffffffffffff81168114614a4357600080fd5b600082601f830112614c5a57600080fd5b81356020614c6f614c6a83614bea565b614bba565b82815260609283028501820192828201919087851115614c8e57600080fd5b8387015b85811015614cec5781818a031215614caa5760008081fd5b614cb2614b2b565b8135614cbd81614a23565b8152614cca828701614c33565b868201526040614cdb818401614c33565b908201528452928401928101614c92565b5090979650505050505050565b60006001600160401b03821115614d1257614d12614b15565b50601f01601f191660200190565b6000614d2e614c6a84614cf9565b9050828152838383011115614d4257600080fd5b828260208301376000602084830101529392505050565b600082601f830112614d6a57600080fd5b610e9483833560208501614d20565b600060e08284031215614d8b57600080fd5b614d93614b53565b90508135815260208201356020820152614daf60408301614c0d565b6040820152614dc060608301614a38565b6060820152614dd160808301614c21565b608082015260a08201356001600160401b0380821115614df057600080fd5b614dfc85838601614c49565b60a084015260c0840135915080821115614e1557600080fd5b50614e2284828501614d59565b60c08301525092915050565b60006020808385031215614e4157600080fd5b82356001600160401b0380821115614e5857600080fd5b818501915085601f830112614e6c57600080fd5b8135614e7a614c6a82614bea565b81815260059190911b83018401908481019088831115614e9957600080fd5b8585015b83811015614ed157803585811115614eb55760008081fd5b614ec38b89838a0101614d79565b845250918601918601614e9d565b5098975050505050505050565b600080600060608486031215614ef357600080fd5b8335614efe81614a23565b92506020840135614f0e81614a23565b929592945050506040919091013590565b60008060408385031215614f3257600080fd5b50508035926020909101359150565b602080825282518282018190526000919060409081850190868401855b82811015614f8c57815180516001600160a01b03168552860151868501529284019290850190600101614f5e565b5091979650505050505050565b8015158114610e5257600080fd5b8035614a4381614f99565b60008060408385031215614fc557600080fd5b8235614fd081614a23565b91506020830135614fe081614f99565b809150509250929050565b60006020808385031215614ffe57600080fd5b82356001600160401b0381111561501457600080fd5b8301601f8101851361502557600080fd5b8035615033614c6a82614bea565b81815260069190911b8201830190838101908783111561505257600080fd5b928401925b8284101561509f57604084890312156150705760008081fd5b615078614b75565b843581528585013561508981614a23565b8187015282526040939093019290840190615057565b979650505050505050565b600081518084526020808501945080840160005b8381101561510457815180516001600160a01b031688528381015165ffffffffffff908116858a01526040918201511690880152606090960195908201906001016150be565b509495945050505050565b60208152600063ffffffff8084511660208401528060208501511660408401525060018060a01b0360408401511660608301526060830151615157608084018261ffff169052565b50608083015180151560a08401525060a083015160e060c08401526151806101008401826150aa565b905060c0840151601f198483030160e085015261519d8282614a91565b95945050505050565b600082601f8301126151b757600080fd5b813560206151c7614c6a83614bea565b82815260059290921b840181019181810190868411156151e657600080fd5b8286015b8481101561520157803583529183019183016151ea565b509695505050505050565b6000610100828403121561521f57600080fd5b615227614b97565b90508135815261523960208301614c0d565b602082015261524a60408301614a38565b604082015261525b60608301614c21565b606082015261526c60808301614fa7565b608082015260a08201356001600160401b038082111561528b57600080fd5b61529785838601614c49565b60a084015260c08401359150808211156152b057600080fd5b6152bc85838601614d59565b60c084015260e08401359150808211156152d557600080fd5b506152e2848285016151a6565b60e08301525092915050565b6000602080838503121561530157600080fd5b82356001600160401b038082111561531857600080fd5b818501915085601f83011261532c57600080fd5b813561533a614c6a82614bea565b81815260059190911b8301840190848101908883111561535957600080fd5b8585015b83811015614ed1578035858111156153755760008081fd5b6153838b89838a010161520c565b84525091860191860161535d565b600080604083850312156153a457600080fd5b82356153af81614a23565b91506020830135614fe081614a23565b6000606082840312156153d157600080fd5b6153d9614b2b565b90508135815260208201356001600160401b038111156153f857600080fd5b615404848285016151a6565b602083015250604082013561541881614a23565b604082015292915050565b6000602080838503121561543657600080fd5b82356001600160401b038082111561544d57600080fd5b818501915085601f83011261546157600080fd5b813561546f614c6a82614bea565b81815260059190911b8301840190848101908883111561548e57600080fd5b8585015b83811015614ed1578035858111156154aa5760008081fd5b6154b88b89838a01016153bf565b845250918601918601615492565b6000602082840312156154d857600080fd5b81356001600160401b038111156154ee57600080fd5b612eca848285016151a6565b63ffffffff8781168252861660208201526001600160a01b038516604082015261ffff84166060820152821515608082015260c060a0820181905260009061554490830184614a91565b98975050505050505050565b6000806000806080858703121561556657600080fd5b843561557181614a23565b9350602085013561558181614a23565b92506040850135915060608501356001600160401b038111156155a357600080fd5b8501601f810187136155b457600080fd5b6155c387823560208401614d20565b91505092959194509250565b6000806000604084860312156155e457600080fd5b83356001600160401b03808211156155fb57600080fd5b6156078783880161520c565b9450602086013591508082111561561d57600080fd5b818601915086601f83011261563157600080fd5b81358181111561564057600080fd5b87602082850101111561565257600080fd5b6020830194508093505050509250925092565b60006020828403121561567757600080fd5b81356001600160401b0381111561568d57600080fd5b612eca848285016153bf565b6000602082840312156156ab57600080fd5b81356001600160401b038111156156c157600080fd5b612eca84828501614d79565b6000602082840312156156df57600080fd5b81356001600160401b038111156156f557600080fd5b612eca8482850161520c565b600181811c9082168061571557607f821691505b6020821081141561573657634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252601590820152743ab730baba3437b934bd32b21027a127903ab9b2b960591b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600063ffffffff808316818114156157db576157db6157ab565b6001019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60006020828403121561587d57600080fd5b5051919050565b60208082526017908201527f4469676974616c4d65646961206e6f7420666f756e642e000000000000000000604082015260600190565b6020808252600c908201526b3737ba1037b137a0b236b4b760a11b604082015260600190565b6000602082840312156158f357600080fd5b815160ff81168114610e9457600080fd5b60006020828403121561591657600080fd5b81516001600160401b0381111561592c57600080fd5b8201601f8101841361593d57600080fd5b805161594b614c6a82614cf9565b81815285602083850101111561596057600080fd5b61519d826020830160208601614a65565b60008251615983818460208701614a65565b9190910192915050565b6020808252825182820181905260009190848201906040850190845b818110156159c5578351835292840192918401916001016159a9565b50909695505050505050565b6000835160206159e48285838901614a65565b8184019150600085546159f681615701565b60018281168015615a0e5760018114615a1f57615a4b565b60ff19841687528287019450615a4b565b896000528560002060005b84811015615a4357815489820152908301908701615a2a565b505082870194505b50929998505050505050505050565b600060208284031215615a6c57600080fd5b8151610e9481614f99565b600082821015615a8957615a896157ab565b500390565b85815263ffffffff8516602082015261ffff8416604082015260a060608201526000615abd60a0830185614a91565b90508260808301529695505050505050565b60008219821115615ae257615ae26157ab565b500190565b600065ffffffffffff80831681851681830481118215151615615b0c57615b0c6157ab565b02949350505050565b6000816000190483118215151615615b2f57615b2f6157ab565b500290565b600082615b5157634e487b7160e01b600052601260045260246000fd5b500490565b6000600019821415615b6a57615b6a6157ab565b5060010190565b8681526001600160a01b038616602082015263ffffffff8516604082015261ffff84166060820152821515608082015260c060a0820181905260009061554490830184614a91565b600063ffffffff808316818516808303821115615bd857615bd86157ab565b01949350505050565b8581526000602060018060a01b0387168184015263ffffffff8616604084015260a0606084015260008554615c1581615701565b8060a087015260c0600180841660008114615c375760018114615c4b57615c79565b60ff1985168984015260e089019550615c79565b8a6000528660002060005b85811015615c715781548b8201860152908301908801615c56565b8a0184019650505b5050505050608093909301939093525095945050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600060208284031215615cf657600080fd5b8151610e9481614a23565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615d3490830184614a91565b9695505050505050565b600060208284031215615d5057600080fd5b8151610e94816149f0565b634e487b7160e01b600052602160045260246000fdfea26469706673582212208fd144566d083799c849aca77f5fe8aada564c1f676b847de868e42d646c12a364736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000085508ce7885b65a57ee070460055f3e4b412051e000000000000000000000000000000000000000000000000000000000000000b4d616b657273506c61636500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064d414b4552530000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _tokenName (string): MakersPlace
Arg [1] : _tokenSymbol (string): MAKERS
Arg [2] : _crsAddress (address): 0x85508Ce7885B65a57Ee070460055f3e4b412051e
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000085508ce7885b65a57ee070460055f3e4b412051e
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [4] : 4d616b657273506c616365000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [6] : 4d414b4552530000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
65750:18776:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39293:305;;;;;;:::i;:::-;;:::i;:::-;;;661:14:1;;654:22;636:41;;624:2;609:18;39293:305:0;;;;;;;;54099:51;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;54099:51:0;;;;;;-1:-1:-1;;;;;1379:32:1;;;1361:51;;1349:2;1334:18;54099:51:0;1215:203:1;40238:100:0;;;:::i;:::-;;;;;;;:::i;41797:221::-;;;;;;:::i;:::-;;:::i;41320:411::-;;;;;;:::i;:::-;;:::i;:::-;;16545:53;;16592:6;16545:53;;;;;2825:25:1;;;2813:2;2798:18;16545:53:0;2679:177:1;51711:33:0;;;;;-1:-1:-1;;;51711:33:0;;;;;;51634:35;;;;;;;;-1:-1:-1;;;;;51634:35:0;;;16698:48;;;;;;:::i;:::-;;;;;;;;;;;;;;79168:760;;;;;;:::i;:::-;;:::i;56256:121::-;;;:::i;77156:139::-;;;;;;:::i;:::-;;:::i;42687:339::-;;;;;;:::i;:::-;;:::i;83305:199::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;57017:344::-;;;;;;:::i;:::-;;:::i;53866:76::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11500:10:1;11488:23;;;11470:42;;11543:2;11528:18;;11521:34;;;;11443:18;53866:76:0;11298:263:1;83934:67:0;;;:::i;43097:185::-;;;;;;:::i;:::-;;:::i;76537:92::-;;;;;;:::i;:::-;;:::i;77449:334::-;;;;;;:::i;:::-;;:::i;56385:402::-;;;;;;:::i;:::-;;:::i;52608:36::-;;;;;-1:-1:-1;;;;;52608:36:0;;;51751:43;;;;;-1:-1:-1;;;51751:43:0;;;;;;67769:310;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;73221:595::-;;;;;;:::i;:::-;;:::i;51676:28::-;;;;;-1:-1:-1;;;;;51676:28:0;;;20371:86;20442:7;;;;20371:86;;75823:667;;;;;;:::i;:::-;;:::i;55513:735::-;;;;;;:::i;:::-;;:::i;39932:239::-;;;;;;:::i;:::-;;:::i;39662:208::-;;;;;;:::i;:::-;;:::i;15787:94::-;;;:::i;74030:558::-;;;;;;:::i;:::-;;:::i;52557:44::-;;;;;-1:-1:-1;;;;;52557:44:0;;;68459:384;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;20720:32:1;;;20702:51;;20796:14;;20789:22;20784:2;20769:18;;20762:50;20860:6;20848:19;20828:18;;;20821:47;20690:2;20675:18;68459:384:0;20508:366:1;17690:175:0;;;;;;:::i;:::-;;:::i;83863:63::-;;;:::i;68925:332::-;;;;;;:::i;:::-;;:::i;:::-;;;;21121:13:1;;21136:10;21117:30;21099:49;;21204:4;21192:17;;;21186:24;21164:20;;;21157:54;;;;21072:18;68925:332:0;20879:338:1;71913:468:0;;;;;;:::i;:::-;;:::i;17052:148::-;;;;;;:::i;:::-;;:::i;15136:87::-;15209:6;;-1:-1:-1;;;;;15209:6:0;15136:87;;83654:201;;;;;;:::i;:::-;;:::i;40407:104::-;;;:::i;80478:667::-;;;;;;:::i;:::-;;:::i;53731:57::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;42090:295::-;;;;;;:::i;:::-;;:::i;79936:419::-;;;;;;:::i;:::-;;:::i;18379:195::-;;;;;;:::i;:::-;;:::i;18582:98::-;;;:::i;52490:60::-;;;;;-1:-1:-1;;;;;52490:60:0;;;43353:328;;;;;;:::i;:::-;;:::i;64845:506::-;;;;;;:::i;:::-;;:::i;16515:23::-;;;;;-1:-1:-1;;;;;16515:23:0;;;17308:312;;;;;;:::i;:::-;;:::i;69538:742::-;;;;;;:::i;:::-;;:::i;70619:388::-;;;;;;:::i;:::-;;:::i;16605:39::-;;;;;-1:-1:-1;;;16605:39:0;;;;;;74799:345;;;;;;:::i;:::-;;:::i;78553:417::-;;;;;;:::i;:::-;;:::i;16036:192::-;;;;;;:::i;:::-;;:::i;18790:277::-;;;;;;:::i;:::-;;:::i;72682:287::-;;;;;;:::i;:::-;;:::i;65834:33::-;;65866:1;65834:33;;;;;25110:4:1;25098:17;;;25080:36;;25068:2;25053:18;65834:33:0;24938:184:1;71350:488:0;;;;;;:::i;:::-;;:::i;39293:305::-;39395:4;-1:-1:-1;;;;;;39432:40:0;;-1:-1:-1;;;39432:40:0;;:105;;-1:-1:-1;;;;;;;39489:48:0;;-1:-1:-1;;;39489:48:0;39432:105;:158;;;-1:-1:-1;;;;;;;;;;32372:40:0;;;39554:36;39412:178;39293:305;-1:-1:-1;;39293:305:0:o;40238:100::-;40292:13;40325:5;40318:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40238:100;:::o;41797:221::-;41873:7;41901:16;41909:7;41901;:16::i;:::-;41893:73;;;;-1:-1:-1;;;41893:73:0;;26100:2:1;41893:73:0;;;26082:21:1;26139:2;26119:18;;;26112:30;26178:34;26158:18;;;26151:62;-1:-1:-1;;;26229:18:1;;;26222:42;26281:19;;41893:73:0;;;;;;;;;-1:-1:-1;41986:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;41986:24:0;;41797:221::o;41320:411::-;41401:13;41417:23;41432:7;41417:14;:23::i;:::-;41401:39;;41465:5;-1:-1:-1;;;;;41459:11:0;:2;-1:-1:-1;;;;;41459:11:0;;;41451:57;;;;-1:-1:-1;;;41451:57:0;;26513:2:1;41451:57:0;;;26495:21:1;26552:2;26532:18;;;26525:30;26591:34;26571:18;;;26564:62;-1:-1:-1;;;26642:18:1;;;26635:31;26683:19;;41451:57:0;26311:397:1;41451:57:0;14004:10;-1:-1:-1;;;;;41543:21:0;;;;:62;;-1:-1:-1;41568:37:0;41585:5;14004:10;74799:345;:::i;41568:37::-;41521:168;;;;-1:-1:-1;;;41521:168:0;;26915:2:1;41521:168:0;;;26897:21:1;26954:2;26934:18;;;26927:30;26993:34;26973:18;;;26966:62;27064:26;27044:18;;;27037:54;27108:19;;41521:168:0;26713:420:1;41521:168:0;41702:21;41711:2;41715:7;41702:8;:21::i;:::-;41390:341;41320:411;;:::o;79168:760::-;20442:7;;;;20696:9;20688:38;;;;-1:-1:-1;;;20688:38:0;;;;;;;:::i;:::-;19216:30:::1;19235:10;19216:18;:30::i;:::-;19208:64;;;;-1:-1:-1::0;;;19208:64:0::1;;;;;;;:::i;:::-;57716:10:::2;::::0;-1:-1:-1;;;;;57716:10:0::2;57700:57;;;::::0;-1:-1:-1;;;57700:57:0;;28035:2:1;57700:57:0::2;::::0;::::2;28017:21:1::0;28074:2;28054:18;;;28047:30;-1:-1:-1;;;28093:18:1;;;28086:41;28144:18;;57700:57:0::2;27833:335:1::0;57700:57:0::2;79322:8:::3;79317:604;79338:8;:15;79334:1;:19;;;79317:604;;;79375:40;79418:8;79427:1;79418:11;;;;;;;;;;:::i;:::-;;::::0;;::::3;::::0;;;;;;;79498:17;;79444:34:::3;79481:35:::0;;;:16:::3;:35:::0;;;;;;;79626:21;;79418:11;;-1:-1:-1;79481:35:0;-1:-1:-1;;;79626:21:0;::::3;-1:-1:-1::0;;;;;79626:21:0::3;:35:::0;;::::3;::::0;:79:::3;;-1:-1:-1::0;79690:15:0::3;::::0;::::3;::::0;79665:21;;-1:-1:-1;;;79665:21:0;::::3;-1:-1:-1::0;;;;;79665:21:0;;::::3;:40:::0;::::3;;79626:79;79618:119;;;::::0;-1:-1:-1;;;79618:119:0;;28507:2:1;79618:119:0::3;::::0;::::3;28489:21:1::0;28546:2;28526:18;;;28519:30;-1:-1:-1;;;28565:18:1;;;28558:40;28615:18;;79618:119:0::3;28305:334:1::0;79618:119:0::3;79777:21:::0;;79808:10:::3;::::0;79760:60:::3;::::0;-1:-1:-1;;;;;;;;79777:21:0;;::::3;::::0;::::3;::::0;79808:10:::3;79760:16;:60::i;:::-;:68;;79824:4;79760:68;79752:99;;;::::0;-1:-1:-1;;;79752:99:0;;28846:2:1;79752:99:0::3;::::0;::::3;28828:21:1::0;28885:2;28865:18;;;28858:30;-1:-1:-1;;;28904:18:1;;;28897:48;28962:18;;79752:99:0::3;28644:342:1::0;79752:99:0::3;79866:43;79886:7;79895:13;79866:19;:43::i;:::-;79360:561;;79355:3;;;;;:::i;:::-;;;;79317:604;;;;79168:760:::0;:::o;56256:121::-;20442:7;;;;20696:9;20688:38;;;;-1:-1:-1;;;20688:38:0;;;;;;;:::i;:::-;15209:6;;-1:-1:-1;;;;;15209:6:0;14004:10;15356:23:::1;15348:68;;;;-1:-1:-1::0;;;15348:68:0::1;;;;;;;:::i;:::-;56337:24:::2;:32:::0;;-1:-1:-1;;;;56337:32:0::2;::::0;;56256:121::o;77156:139::-;20442:7;;;;20696:9;20688:38;;;;-1:-1:-1;;;20688:38:0;;;;;;;:::i;:::-;77241:46:::1;77259:15;77276:10;77241:17;:46::i;:::-;77156:139:::0;:::o;42687:339::-;42882:41;14004:10;42915:7;42882:18;:41::i;:::-;42874:103;;;;-1:-1:-1;;;42874:103:0;;;;;;;:::i;:::-;42990:28;43000:4;43006:2;43010:7;42990:9;:28::i;83305:199::-;83401:19;83440:56;83469:8;83479:10;83491:4;83440:28;:56::i;:::-;83433:63;83305:199;-1:-1:-1;;;83305:199:0:o;57017:344::-;20442:7;;;;20696:9;20688:38;;;;-1:-1:-1;;;20688:38:0;;;;;;;:::i;:::-;19216:30:::1;19235:10;19216:18;:30::i;:::-;19208:64;;;;-1:-1:-1::0;;;19208:64:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;57165:28:0;::::2;57157:53;;;::::0;-1:-1:-1;;;57157:53:0;;30310:2:1;57157:53:0::2;::::0;::::2;30292:21:1::0;30349:2;30329:18;;;30322:30;-1:-1:-1;;;30368:18:1;;;30361:42;30420:18;;57157:53:0::2;30108:336:1::0;57157:53:0::2;57221:13;:30:::0;;-1:-1:-1;;;;;57221:30:0;;::::2;-1:-1:-1::0;;;;;;57262:46:0;;;;;;;-1:-1:-1;;;57262:46:0;::::2;;;;::::0;;;;57324:29:::2;::::0;57339:13;::::2;1361:51:1::0;;57324:29:0::2;::::0;1349:2:1;1334:18;57324:29:0::2;;;;;;;;57017:344:::0;;:::o;83934:67::-;15209:6;;-1:-1:-1;;;;;15209:6:0;14004:10;15356:23;15348:68;;;;-1:-1:-1;;;15348:68:0;;;;;;;:::i;:::-;83983:10:::1;:8;:10::i;:::-;83934:67::o:0;43097:185::-;43235:39;43252:4;43258:2;43262:7;43235:39;;;;;;;;;;;;:16;:39::i;76537:92::-;76589:32;76600:8;76610:10;76589;:32::i;77449:334::-;20442:7;;;;20696:9;20688:38;;;;-1:-1:-1;;;20688:38:0;;;;;;;:::i;:::-;77557:8:::1;77552:224;77573:8;:15;77569:1;:19;;;77552:224;;;77610:38;77651:8;77660:1;77651:11;;;;;;;;;;:::i;:::-;;;;;;;77610:52;;77677:87;77694:24;77702:7;:15;;;77694:7;:24::i;:::-;77720:26;::::0;::::1;::::0;77748:15;;77677:16:::1;:87::i;:::-;-1:-1:-1::0;77590:3:0;::::1;::::0;::::1;:::i;:::-;;;;77552:224;;56385:402:::0;20442:7;;;;20696:9;20688:38;;;;-1:-1:-1;;;20688:38:0;;;;;;;:::i;:::-;15209:6;;-1:-1:-1;;;;;15209:6:0;14004:10;15356:23:::1;15348:68;;;;-1:-1:-1::0;;;15348:68:0::1;;;;;;;:::i;:::-;56473:38:::2;56533:11;56473:72;;56556:20;56579:19;-1:-1:-1::0;;;;;56579:34:0::2;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56556:59:::0;-1:-1:-1;;;;56634:82:0;::::2;56626:110;;;::::0;-1:-1:-1;;;56626:110:0;;30840:2:1;56626:110:0::2;::::0;::::2;30822:21:1::0;30879:2;30859:18;;;30852:30;-1:-1:-1;;;30898:18:1;;;30891:45;30953:18;;56626:110:0::2;30638:339:1::0;56626:110:0::2;-1:-1:-1::0;56747:10:0::2;:32:::0;;-1:-1:-1;;;;;;56747:32:0::2;-1:-1:-1::0;;;;;56747:32:0;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;56385:402:0:o;67769:310::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67901:33:0;67937:21;;;:16;:21;;;;;;;;67901:57;;;;;;;;;;;;;;;-1:-1:-1;;;67901:57:0;;;;;;;-1:-1:-1;;;67901:57:0;;-1:-1:-1;;;;;67901:57:0;;;;;-1:-1:-1;;;67901:57:0;;;;;;;;-1:-1:-1;;;67901:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67937:21;;67901:57;;;;;;;:33;;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67901:57:0;;;;;-1:-1:-1;;;67901:57:0;;;;;;;;-1:-1:-1;;;67901:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;67901:57:0;;;;-1:-1:-1;;;67977:21:0;;;;67901:57;;-1:-1:-1;;;;;;67977:35:0;67969:71;;;;-1:-1:-1;;;67969:71:0;;;;;;;:::i;73221:595::-;20442:7;;;;20696:9;20688:38;;;;-1:-1:-1;;;20688:38:0;;;;;;;:::i;:::-;19216:30:::1;19235:10;19216:18;:30::i;:::-;19208:64;;;;-1:-1:-1::0;;;19208:64:0::1;;;;;;;:::i;:::-;73376:8:::2;73371:438;73392:8;:15;73388:1;:19;;;73371:438;;;73429:40;73472:8;73481:1;73472:11;;;;;;;;;;:::i;:::-;;;;;;;73429:54;;73498:22;73523:179;73543:7;:15;;;73560:7;:17;;;73579:7;:19;;;73617:7;:20;;;73639:7;:21;;;73662:7;:15;;;73679:7;:22;;;73523:19;:179::i;:::-;73498:204;;73717:80;73745:7;:15;;;73762:14;73778:7;:18;;;73717:27;:80::i;:::-;73414:395;;73409:3;;;;;:::i;:::-;;;;73371:438;;75823:667:::0;-1:-1:-1;;;;;75931:25:0;;;75905:23;75931:25;;;:15;:25;;;;;;;75975:10;:24;;;;:50;;-1:-1:-1;;;;;;76003:22:0;;;;75975:50;75967:101;;;;-1:-1:-1;;;75967:101:0;;31536:2:1;75967:101:0;;;31518:21:1;31575:2;31555:18;;;31548:30;31614:34;31594:18;;;31587:62;-1:-1:-1;;;31665:18:1;;;31658:36;31711:19;;75967:101:0;31334:402:1;75967:101:0;76087:10;-1:-1:-1;;;;;76087:22:0;;;;:55;;-1:-1:-1;76113:10:0;-1:-1:-1;;;;;76113:29:0;;;76087:55;76079:88;;;;-1:-1:-1;;;76079:88:0;;31943:2:1;76079:88:0;;;31925:21:1;31982:2;31962:18;;;31955:30;-1:-1:-1;;;32001:18:1;;;31994:50;32061:18;;76079:88:0;31741:344:1;76079:88:0;-1:-1:-1;;;;;76182:29:0;;76178:252;;76244:10;76228:27;;;;:15;:27;;;;;:41;;-1:-1:-1;;;;;;76228:41:0;-1:-1:-1;;;;;76228:41:0;;;;;76178:252;;;76310:10;-1:-1:-1;;;;;76310:29:0;;;76302:62;;;;-1:-1:-1;;;76302:62:0;;31943:2:1;76302:62:0;;;31925:21:1;31982:2;31962:18;;;31955:30;-1:-1:-1;;;32001:18:1;;;31994:50;32061:18;;76302:62:0;31741:344:1;76302:62:0;-1:-1:-1;;;;;76379:25:0;;;;;;;:15;:25;;;;;:39;;-1:-1:-1;;;;;;76379:39:0;;;;;;;;;;76178:252;76445:37;;;-1:-1:-1;;;;;32320:15:1;;;32302:34;;32372:15;;32367:2;32352:18;;32345:43;76445:37:0;;32237:18:1;76445:37:0;;;;;;;;75894:596;75823:667;;:::o;55513:735::-;20442:7;;;;20696:9;20688:38;;;;-1:-1:-1;;;20688:38:0;;;;;;;:::i;:::-;15209:6;;-1:-1:-1;;;;;15209:6:0;14004:10;16956:23:::1;::::0;:51:::1;;-1:-1:-1::0;16983:8:0::1;::::0;-1:-1:-1;;;;;16983:8:0::1;14004:10:::0;16983:24:::1;16956:51;16948:76;;;;-1:-1:-1::0;;;16948:76:0::1;;;;;;;:::i;:::-;55624:24:::2;::::0;-1:-1:-1;;;55624:24:0;::::2;;;:32;;55652:4;55624:32;55616:47;;;::::0;-1:-1:-1;;;55616:47:0;;32942:2:1;55616:47:0::2;::::0;::::2;32924:21:1::0;32981:1;32961:18;;;32954:29;-1:-1:-1;;;32999:18:1;;;32992:32;33041:18;;55616:47:0::2;32740:325:1::0;55616:47:0::2;55674:46;55748:13;55674:88;;55781:21;-1:-1:-1::0;;;;;55781:29:0::2;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:36;;55816:1;55781:36;55773:61;;;::::0;-1:-1:-1;;;55773:61:0;;33550:2:1;55773:61:0::2;::::0;::::2;33532:21:1::0;33589:2;33569:18;;;33562:30;-1:-1:-1;;;33608:18:1;;;33601:42;33660:18;;55773:61:0::2;33348:336:1::0;55773:61:0::2;55845:20;55895:21;-1:-1:-1::0;;;;;55895:36:0::2;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;::::0;;::::2;-1:-1:-1::0;;55895:38:0::2;::::0;::::2;;::::0;::::2;::::0;;;::::2;::::0;::::2;:::i;:::-;55878:56;;;;;;;;:::i;:::-;;;;;;;;;;;;;55868:67;;;;;;55845:90;;56082:12;56098:66;56082:82;;;56074:119;;;::::0;-1:-1:-1;;;56074:119:0;;34813:2:1;56074:119:0::2;::::0;::::2;34795:21:1::0;34852:2;34832:18;;;34825:30;-1:-1:-1;;;34871:18:1;;;34864:41;34922:18;;56074:119:0::2;34611:335:1::0;56074:119:0::2;-1:-1:-1::0;56204:12:0::2;:36:::0;;-1:-1:-1;;;;;;56204:36:0::2;-1:-1:-1::0;;;;;56204:36:0;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;55513:735:0:o;39932:239::-;40004:7;40040:16;;;:7;:16;;;;;;-1:-1:-1;;;;;40040:16:0;40075:19;40067:73;;;;-1:-1:-1;;;40067:73:0;;35153:2:1;40067:73:0;;;35135:21:1;35192:2;35172:18;;;35165:30;35231:34;35211:18;;;35204:62;-1:-1:-1;;;35282:18:1;;;35275:39;35331:19;;40067:73:0;34951:405:1;39662:208:0;39734:7;-1:-1:-1;;;;;39762:19:0;;39754:74;;;;-1:-1:-1;;;39754:74:0;;35563:2:1;39754:74:0;;;35545:21:1;35602:2;35582:18;;;35575:30;35641:34;35621:18;;;35614:62;-1:-1:-1;;;35692:18:1;;;35685:40;35742:19;;39754:74:0;35361:406:1;39754:74:0;-1:-1:-1;;;;;;39846:16:0;;;;;:9;:16;;;;;;;39662:208::o;15787:94::-;15209:6;;-1:-1:-1;;;;;15209:6:0;14004:10;15356:23;15348:68;;;;-1:-1:-1;;;15348:68:0;;;;;;;:::i;:::-;15852:21:::1;15870:1;15852:9;:21::i;74030:558::-:0;20442:7;;;;20696:9;20688:38;;;;-1:-1:-1;;;20688:38:0;;;;;;;:::i;:::-;19216:30:::1;19235:10;19216:18;:30::i;:::-;19208:64;;;;-1:-1:-1::0;;;19208:64:0::1;;;;;;;:::i;:::-;74176:8:::2;74171:410;74192:8;:15;74188:1;:19;;;74171:410;;;74229:47;74279:8;74288:1;74279:11;;;;;;;;;;:::i;:::-;;::::0;;::::2;::::0;;;;;;;74359:22;;74305:34:::2;74342:40:::0;;;:16:::2;:40:::0;;;;;;;74405:21;;74279:11;;-1:-1:-1;74342:40:0;-1:-1:-1;;;74405:21:0;::::2;-1:-1:-1::0;;;;;74405:21:0::2;74397:71;;;;-1:-1:-1::0;;;74397:71:0::2;;;;;;;:::i;:::-;74483:86;74511:7;:13;;;74526:7;:22;;;74550:7;:18;;;74483:27;:86::i;:::-;74214:367;;74209:3;;;;;:::i;:::-;;;;74171:410;;68459:384:::0;68540:7;68611:21;;;:16;:21;;;;;68651;;68540:7;;;;-1:-1:-1;;;68651:21:0;;-1:-1:-1;;;;;68651:21:0;68643:71;;;;-1:-1:-1;;;68643:71:0;;;;;;;:::i;:::-;68733:21;;68756:27;;;;:34;-1:-1:-1;;;68733:21:0;;-1:-1:-1;;;;;68733:21:0;;68756:38;;;;-1:-1:-1;;;;68813:21:0;;;;;;-1:-1:-1;68459:384:0;-1:-1:-1;;68459:384:0:o;17690:175::-;15209:6;;-1:-1:-1;;;;;15209:6:0;14004:10;16956:23;;:51;;-1:-1:-1;16983:8:0;;-1:-1:-1;;;;;16983:8:0;14004:10;16983:24;16956:51;16948:76;;;;-1:-1:-1;;;16948:76:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17778:25:0;::::1;;::::0;;;:12:::1;:25;::::0;;;;;;;17771:32;;;17819:38;;35940:51:1;;;36007:18;;;36000:50;;;;17819:38:0::1;::::0;35913:18:1;17819:38:0::1;;;;;;;;17690:175:::0;:::o;83863:63::-;15209:6;;-1:-1:-1;;;;;15209:6:0;14004:10;15356:23;15348:68;;;;-1:-1:-1;;;15348:68:0;;;;;;;:::i;:::-;83910:8:::1;:6;:8::i;68925:332::-:0;-1:-1:-1;;;;;;;;;;;;;;;;;69079:12:0;69087:3;69079:7;:12::i;:::-;69071:47;;;;-1:-1:-1;;;69071:47:0;;36263:2:1;69071:47:0;;;36245:21:1;36302:2;36282:18;;;36275:30;-1:-1:-1;;;36321:18:1;;;36314:52;36383:18;;69071:47:0;36061:346:1;69071:47:0;-1:-1:-1;69129:47:0;69179:33;;;:28;:33;;;;;;;;;69223:26;;;;;;;;;;;;;;;;;;;;;;68925:332::o;71913:468::-;20442:7;;;;20696:9;20688:38;;;;-1:-1:-1;;;20688:38:0;;;;;;;:::i;:::-;19216:30:::1;19235:10;19216:18;:30::i;:::-;19208:64;;;;-1:-1:-1::0;;;19208:64:0::1;;;;;;;:::i;:::-;72061:8:::2;72056:318;72077:8;:15;72073:1;:19;;;72056:318;;;72114:40;72157:8;72166:1;72157:11;;;;;;;;;;:::i;:::-;;;;;;;72114:54;;72183:179;72203:7;:15;;;72220:7;:17;;;72239:7;:19;;;72277:7;:20;;;72299:7;:21;;;72322:7;:15;;;72339:7;:22;;;72183:19;:179::i;:::-;;72099:275;72094:3;;;;;:::i;:::-;;;;72056:318;;17052:148:::0;15209:6;;-1:-1:-1;;;;;15209:6:0;14004:10;15356:23;15348:68;;;;-1:-1:-1;;;15348:68:0;;;;;;;:::i;:::-;17122:8:::1;:20:::0;;-1:-1:-1;;;;;;17122:20:0::1;-1:-1:-1::0;;;;;17122:20:0;::::1;::::0;;::::1;::::0;;;17158:34:::1;::::0;1361:51:1;;;17158:34:0::1;::::0;1349:2:1;1334:18;17158:34:0::1;1215:203:1::0;83654:201:0;83749:19;83788:59;83817:8;83827:12;83841:5;83788:28;:59::i;40407:104::-;40463:13;40496:7;40489:14;;;;;:::i;80478:667::-;20442:7;;;;20696:9;20688:38;;;;-1:-1:-1;;;20688:38:0;;;;;;;:::i;:::-;19216:30:::1;19235:10;19216:18;:30::i;:::-;19208:64;;;;-1:-1:-1::0;;;19208:64:0::1;;;;;;;:::i;:::-;57716:10:::2;::::0;-1:-1:-1;;;;;57716:10:0::2;57700:57;;;::::0;-1:-1:-1;;;57700:57:0;;28035:2:1;57700:57:0::2;::::0;::::2;28017:21:1::0;28074:2;28054:18;;;28047:30;-1:-1:-1;;;28093:18:1;;;28086:41;28144:18;;57700:57:0::2;27833:335:1::0;57700:57:0::2;80604:8:::3;80599:493;80620:8;:15;80616:1;:19;;;80599:493;;;80657:15;80675:8;80684:1;80675:11;;;;;;;;;;:::i;:::-;;::::0;;::::3;::::0;;;;;;;80701:34:::3;80738:25:::0;;;:16:::3;:25:::0;;;;;;;80786:21;;80675:11;;-1:-1:-1;80738:25:0;-1:-1:-1;;;80786:21:0;::::3;-1:-1:-1::0;;;;;80786:21:0::3;80778:61;;;::::0;-1:-1:-1;;;80778:61:0;;36614:2:1;80778:61:0::3;::::0;::::3;36596:21:1::0;36653:2;36633:18;;;36626:30;-1:-1:-1;;;36672:18:1;;;36665:43;36725:18;;80778:61:0::3;36412:337:1::0;80778:61:0::3;80862:28:::0;;-1:-1:-1;;;80862:28:0;::::3;;;:37;80854:62;;;::::0;-1:-1:-1;;;80854:62:0;;36956:2:1;80854:62:0::3;::::0;::::3;36938:21:1::0;36995:2;36975:18;;;36968:30;-1:-1:-1;;;37014:18:1;;;37007:42;37066:18;;80854:62:0::3;36754:336:1::0;80854:62:0::3;80956:21:::0;;80987:10:::3;::::0;80939:60:::3;::::0;-1:-1:-1;;;;;;;;80956:21:0;;::::3;::::0;::::3;::::0;80987:10:::3;80939:16;:60::i;:::-;:68;;81003:4;80939:68;80931:99;;;::::0;-1:-1:-1;;;80931:99:0;;28846:2:1;80931:99:0::3;::::0;::::3;28828:21:1::0;28885:2;28865:18;;;28858:30;-1:-1:-1;;;28904:18:1;;;28897:48;28962:18;;80931:99:0::3;28644:342:1::0;80931:99:0::3;81045:35:::0;;-1:-1:-1;;;;81045:35:0::3;-1:-1:-1::0;;;81045:35:0::3;::::0;;-1:-1:-1;80637:3:0;::::3;::::0;::::3;:::i;:::-;;;;80599:493;;;;81107:30;81128:8;81107:30;;;;;;:::i;53731:57::-:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;53731:57:0;;;;;;-1:-1:-1;;;53731:57:0;;-1:-1:-1;;;;;53731:57:0;;-1:-1:-1;;;53731:57:0;;;;;-1:-1:-1;;;53731:57:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42090:295::-;-1:-1:-1;;;;;42193:24:0;;14004:10;42193:24;;42185:62;;;;-1:-1:-1;;;42185:62:0;;37934:2:1;42185:62:0;;;37916:21:1;37973:2;37953:18;;;37946:30;38012:27;37992:18;;;37985:55;38057:18;;42185:62:0;37732:349:1;42185:62:0;14004:10;42260:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;42260:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;42260:53:0;;;;;;;;;;42329:48;;636:41:1;;;42260:42:0;;14004:10;42329:48;;609:18:1;42329:48:0;;;;;;;42090:295;;:::o;79936:419::-;80001:34;80038:25;;;:16;:25;;;;;80082:21;;-1:-1:-1;;;80082:21:0;;-1:-1:-1;;;;;80082:21:0;:35;;;;:74;;-1:-1:-1;80121:21:0;;-1:-1:-1;;;80121:21:0;;-1:-1:-1;;;;;80121:21:0;80146:10;80121:35;80082:74;80074:110;;;;-1:-1:-1;;;80074:110:0;;28507:2:1;80074:110:0;;;28489:21:1;28546:2;28526:18;;;28519:30;-1:-1:-1;;;28565:18:1;;;28558:40;28615:18;;80074:110:0;28305:334:1;80074:110:0;80203:28;;-1:-1:-1;;;80203:28:0;;;;:37;80195:62;;;;-1:-1:-1;;;80195:62:0;;36956:2:1;80195:62:0;;;36938:21:1;36995:2;36975:18;;;36968:30;-1:-1:-1;;;37014:18:1;;;37007:42;37066:18;;80195:62:0;36754:336:1;80195:62:0;80268:35;;-1:-1:-1;;;;80268:35:0;-1:-1:-1;;;80268:35:0;;;80319:28;;;;;;80339:7;2825:25:1;;2813:2;2798:18;;2679:177;18379:195:0;15209:6;;-1:-1:-1;;;;;15209:6:0;14004:10;16956:23;;:51;;-1:-1:-1;16983:8:0;;-1:-1:-1;;;;;16983:8:0;14004:10;16983:24;16956:51;16948:76;;;;-1:-1:-1;;;16948:76:0;;;;;;;:::i;:::-;18476:20:::1;::::0;-1:-1:-1;;;18476:20:0;::::1;;;:28;;18500:4;18476:28;18468:49;;;::::0;-1:-1:-1;;;18468:49:0;;38288:2:1;18468:49:0::1;::::0;::::1;38270:21:1::0;38327:1;38307:18;;;38300:29;-1:-1:-1;;;38345:18:1;;;38338:38;38393:18;;18468:49:0::1;38086:331:1::0;18468:49:0::1;18528:38;18554:11;18528:25;:38::i;18582:98::-:0;15209:6;;-1:-1:-1;;;;;15209:6:0;14004:10;16956:23;;:51;;-1:-1:-1;16983:8:0;;-1:-1:-1;;;;;16983:8:0;14004:10;16983:24;16956:51;16948:76;;;;-1:-1:-1;;;16948:76:0;;;;;;;:::i;:::-;18644:20:::1;:28:::0;;-1:-1:-1;;;;18644:28:0::1;::::0;;18582:98::o;43353:328::-;43528:41;14004:10;43561:7;43528:18;:41::i;:::-;43520:103;;;;-1:-1:-1;;;43520:103:0;;;;;;;:::i;:::-;43634:39;43648:4;43654:2;43658:7;43667:5;43634:13;:39::i;:::-;43353:328;;;;:::o;64845:506::-;64911:13;64945:17;64953:8;64945:7;:17::i;:::-;64937:26;;;;;;64974:47;65024:38;;;:28;:38;;;;;;;;65099:34;;;;65181:33;;;:16;:33;;;;;;65225:32;;;;;;;;;;-1:-1:-1;;;65225:32:0;;;;65282:60;;65024:38;;65099:34;65181:33;;65225:32;65282:60;;65225:32;;65314:26;;;;65282:60;;:::i;:::-;;;;;;;;;;;;;65268:75;;;;;;64845:506;;;:::o;17308:312::-;15209:6;;-1:-1:-1;;;;;15209:6:0;14004:10;16956:23;;:51;;-1:-1:-1;16983:8:0;;-1:-1:-1;;;;;16983:8:0;14004:10;16983:24;16956:51;16948:76;;;;-1:-1:-1;;;16948:76:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17394:25:0;::::1;17386:52;;;::::0;-1:-1:-1;;;17386:52:0;;39640:2:1;17386:52:0::1;::::0;::::1;39622:21:1::0;39679:2;39659:18;;;39652:30;-1:-1:-1;;;39698:18:1;;;39691:44;39752:18;;17386:52:0::1;39438:338:1::0;17386:52:0::1;-1:-1:-1::0;;;;;17457:25:0;::::1;;::::0;;;:12:::1;:25;::::0;;;;;:30;17449:56:::1;;;::::0;-1:-1:-1;;;17449:56:0;;39983:2:1;17449:56:0::1;::::0;::::1;39965:21:1::0;40022:2;40002:18;;;39995:30;-1:-1:-1;;;40041:18:1;;;40034:43;40094:18;;17449:56:0::1;39781:337:1::0;17449:56:0::1;-1:-1:-1::0;;;;;17516:25:0;::::1;;::::0;;;:12:::1;:25;::::0;;;;;;;;17544:15:::1;17516:43:::0;;17575:37;;35940:51:1;;;17607:4:0::1;36007:18:1::0;;;36000:50;17575:37:0::1;::::0;35913:18:1;17575:37:0::1;35772:284:1::0;69538:742:0;20442:7;;;;20696:9;20688:38;;;;-1:-1:-1;;;20688:38:0;;;;;;;:::i;:::-;69740:15:::1;::::0;::::1;::::0;-1:-1:-1;;;;;69740:29:0::1;69759:10;69740:29;69732:62;;;::::0;-1:-1:-1;;;69732:62:0;;40325:2:1;69732:62:0::1;::::0;::::1;40307:21:1::0;40364:2;40344:18;;;40337:30;-1:-1:-1;;;40383:18:1;;;40376:50;40443:18;;69732:62:0::1;40123:344:1::0;69732:62:0::1;69853:57;::::0;;;;::::1;::::0;;69875:17;;69853:57;;69894:15;;::::1;::::0;-1:-1:-1;;;;;69853:57:0::1;;::::0;::::1;::::0;69921:59:::1;69853:57:::0;69970:9;;69921:30:::1;:59::i;:::-;69991:22;70016:170;70036:10;70048:7;:17;;;70067:7;:19;;;70101:7;:20;;;70123:7;:21;;;70146:7;:15;;;70163:7;:22;;;70016:19;:170::i;:::-;69991:195;;70197:75;70225:10;70237:14;70253:7;:18;;;70197:27;:75::i;:::-;69721:559;;69538:742:::0;;;:::o;70619:388::-;20442:7;;;;20696:9;20688:38;;;;-1:-1:-1;;;20688:38:0;;;;;;;:::i;:::-;70859:13:::1;::::0;-1:-1:-1;;;;;70859:13:0::1;70851:54;;;::::0;-1:-1:-1;;;70851:54:0;;40674:2:1;70851:54:0::1;::::0;::::1;40656:21:1::0;40713:2;40693:18;;;40686:30;-1:-1:-1;;;40732:18:1;;;40725:44;40786:18;;70851:54:0::1;40472:338:1::0;70851:54:0::1;70916:83;70944:10;70956:7;:22;;;70980:7;:18;;;70916:27;:83::i;74799:345::-:0;57506:20;;74910:4;;-1:-1:-1;;;;;57506:20:0;57490:70;;;;-1:-1:-1;;;57490:70:0;;41017:2:1;57490:70:0;;;40999:21:1;41056:2;41036:18;;;41029:30;-1:-1:-1;;;41075:18:1;;;41068:44;41129:18;;57490:70:0;40815:338:1;57490:70:0;74931:20:::1;::::0;:77:::1;::::0;-1:-1:-1;;;74931:77:0;;-1:-1:-1;;;;;32320:15:1;;;74931:77:0::1;::::0;::::1;32302:34:1::0;32372:15;;;32352:18;;;32345:43;74931:20:0;;::::1;::::0;:58:::1;::::0;32237:18:1;;74931:77:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:85;;75012:4;74931:85;74927:210;;;-1:-1:-1::0;75040:4:0::1;75033:11;;74927:210;-1:-1:-1::0;;;;;;42577:25:0;;;42553:4;42577:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;75077:48:::1;;78553:417:::0;78644:15;;;;-1:-1:-1;;;;;78644:29:0;78663:10;78644:29;78636:62;;;;-1:-1:-1;;;78636:62:0;;40325:2:1;78636:62:0;;;40307:21:1;40364:2;40344:18;;;40337:30;-1:-1:-1;;;40383:18:1;;;40376:50;40443:18;;78636:62:0;40123:344:1;78636:62:0;78763:17;;78709:34;78746:35;;;:16;:35;;;;;78800:21;;-1:-1:-1;;;78800:21:0;;-1:-1:-1;;;;;78800:21:0;:35;;;;:74;;-1:-1:-1;78839:21:0;;-1:-1:-1;;;78839:21:0;;-1:-1:-1;;;;;78839:21:0;78864:10;78839:35;78800:74;78792:116;;;;-1:-1:-1;;;78792:116:0;;41610:2:1;78792:116:0;;;41592:21:1;41649:2;41629:18;;;41622:30;-1:-1:-1;;;41668:18:1;;;41661:46;41724:18;;78792:116:0;41408:340:1;78792:116:0;78919:43;78939:7;78948:13;78919:19;:43::i;16036:192::-;15209:6;;-1:-1:-1;;;;;15209:6:0;14004:10;15356:23;15348:68;;;;-1:-1:-1;;;15348:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16125:22:0;::::1;16117:73;;;::::0;-1:-1:-1;;;16117:73:0;;41955:2:1;16117:73:0::1;::::0;::::1;41937:21:1::0;41994:2;41974:18;;;41967:30;42033:34;42013:18;;;42006:62;-1:-1:-1;;;42084:18:1;;;42077:36;42130:19;;16117:73:0::1;41753:402:1::0;16117:73:0::1;16201:19;16211:8;16201:9;:19::i;18790:277::-:0;-1:-1:-1;;;;;18897:25:0;;18860:4;18897:25;;;:12;:25;;;;;;18937:14;18933:59;;-1:-1:-1;18975:5:0;;18790:277;-1:-1:-1;;18790:277:0:o;18933:59::-;16592:6;19009:27;19027:9;19009:15;:27;:::i;:::-;:50;;18790:277;-1:-1:-1;;;18790:277:0:o;72682:287::-;20442:7;;;;20696:9;20688:38;;;;-1:-1:-1;;;20688:38:0;;;;;;;:::i;:::-;19216:30:::1;19235:10;19216:18;:30::i;:::-;19208:64;;;;-1:-1:-1::0;;;19208:64:0::1;;;;;;;:::i;:::-;72875:86:::2;72903:7;:13;;;72918:7;:22;;;72942:7;:18;;;72875:27;:86::i;71350:488::-:0;20442:7;;;;20696:9;20688:38;;;;-1:-1:-1;;;20688:38:0;;;;;;;:::i;:::-;19216:30:::1;19235:10;19216:18;:30::i;:::-;19208:64;;;;-1:-1:-1::0;;;19208:64:0::1;;;;;;;:::i;:::-;71539:22:::2;71564:175;71584:7;:15;;;71601:7;:17;;;71620:7;:19;;;71641:7;:20;;;71676:7;:21;;;71699:7;:15;;;71716:7;:22;;;71564:19;:175::i;:::-;71539:200;;71750:80;71778:7;:15;;;71795:14;71811:7;:18;;;71750:27;:80::i;45191:127::-:0;45256:4;45280:16;;;:7;:16;;;;;;-1:-1:-1;;;;;45280:16:0;:30;;;45191:127::o;49173:174::-;49248:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;49248:29:0;-1:-1:-1;;;;;49248:29:0;;;;;;;;:24;;49302:23;49248:24;49302:14;:23::i;:::-;-1:-1:-1;;;;;49293:46:0;;;;;;;;;;;49173:174;;:::o;77791:754::-;77939:28;;-1:-1:-1;;;77939:28:0;;;;:37;77931:59;;;;-1:-1:-1;;;77931:59:0;;42492:2:1;77931:59:0;;;42474:21:1;42531:1;42511:18;;;42504:29;-1:-1:-1;;;42549:18:1;;;42542:39;42598:18;;77931:59:0;42290:332:1;77931:59:0;78037:19;;;;78009:24;;:47;;;;-1:-1:-1;;;78009:24:0;;;;;;:47;;78001:79;;;;-1:-1:-1;;;78001:79:0;;42829:2:1;78001:79:0;;;42811:21:1;42868:2;42848:18;;;42841:30;-1:-1:-1;;;42887:18:1;;;42880:49;42946:18;;78001:79:0;42627:343:1;78001:79:0;78119:19;;;;78091:47;;-1:-1:-1;;78091:47:0;;;;;;;;78178:20;;;;78149:49;;;;:26;;;;:49;;;;;;:::i;:::-;-1:-1:-1;78233:15:0;;;;78209:39;;;;;;-1:-1:-1;;;78209:39:0;-1:-1:-1;;;;78209:39:0;;;;;;78259:34;-1:-1:-1;78266:27:0;;78209:21;78259:34;:::i;:::-;78304:69;78336:13;78351:7;:21;;;78304:31;:69::i;:::-;78389:148;78413:7;:17;;;78445:7;:19;;;78466:7;:15;;;78483:7;:20;;;78518:7;:18;;;78389:148;;;;;;;;;;:::i;64040:585::-;64129:34;64166:33;;;:16;:33;;;;;64218:21;;-1:-1:-1;;;64218:21:0;;-1:-1:-1;;;;;64218:21:0;64210:68;;;;-1:-1:-1;;;64210:68:0;;43715:2:1;64210:68:0;;;43697:21:1;43754:2;43734:18;;;43727:30;-1:-1:-1;;;43773:18:1;;;43766:50;43833:18;;64210:68:0;43513:344:1;64210:68:0;64319:21;;64297:53;;-1:-1:-1;;;64319:21:0;;-1:-1:-1;;;;;64319:21:0;64342:7;64297:21;:53::i;:::-;:122;;;-1:-1:-1;64388:21:0;;64371:48;;-1:-1:-1;;;64388:21:0;;-1:-1:-1;;;;;64388:21:0;64411:7;64371:16;:48::i;:::-;64289:200;;;;-1:-1:-1;;;64289:200:0;;44064:2:1;64289:200:0;;;44046:21:1;44103:2;44083:18;;;44076:30;44142:34;44122:18;;;44115:62;-1:-1:-1;;;44193:18:1;;;44186:46;44249:19;;64289:200:0;43862:412:1;64289:200:0;64529:25;;-1:-1:-1;;64502:52:0;;64529:25;;;;-1:-1:-1;;;64502:52:0;;;;64570:47;;;44453:25:1;;;-1:-1:-1;;;;;44514:32:1;;44509:2;44494:18;;44487:60;64570:47:0;;44426:18:1;64570:47:0;44279:274:1;45485:348:0;45578:4;45603:16;45611:7;45603;:16::i;:::-;45595:73;;;;-1:-1:-1;;;45595:73:0;;44760:2:1;45595:73:0;;;44742:21:1;44799:2;44779:18;;;44772:30;44838:34;44818:18;;;44811:62;-1:-1:-1;;;44889:18:1;;;44882:42;44941:19;;45595:73:0;44558:408:1;45595:73:0;45679:13;45695:23;45710:7;45695:14;:23::i;:::-;45679:39;;45748:5;-1:-1:-1;;;;;45737:16:0;:7;-1:-1:-1;;;;;45737:16:0;;:51;;;;45781:7;-1:-1:-1;;;;;45757:31:0;:20;45769:7;45757:11;:20::i;:::-;-1:-1:-1;;;;;45757:31:0;;45737:51;:87;;;;45792:32;45809:5;45816:7;45792:16;:32::i;:::-;45729:96;45485:348;-1:-1:-1;;;;45485:348:0:o;48477:578::-;48636:4;-1:-1:-1;;;;;48609:31:0;:23;48624:7;48609:14;:23::i;:::-;-1:-1:-1;;;;;48609:31:0;;48601:85;;;;-1:-1:-1;;;48601:85:0;;45173:2:1;48601:85:0;;;45155:21:1;45212:2;45192:18;;;45185:30;45251:34;45231:18;;;45224:62;-1:-1:-1;;;45302:18:1;;;45295:39;45351:19;;48601:85:0;44971:405:1;48601:85:0;-1:-1:-1;;;;;48705:16:0;;48697:65;;;;-1:-1:-1;;;48697:65:0;;45583:2:1;48697:65:0;;;45565:21:1;45622:2;45602:18;;;45595:30;45661:34;45641:18;;;45634:62;-1:-1:-1;;;45712:18:1;;;45705:34;45756:19;;48697:65:0;45381:400:1;48697:65:0;48879:29;48896:1;48900:7;48879:8;:29::i;:::-;-1:-1:-1;;;;;48921:15:0;;;;;;:9;:15;;;;;:20;;48940:1;;48921:15;:20;;48940:1;;48921:20;:::i;:::-;;;;-1:-1:-1;;;;;;;48952:13:0;;;;;;:9;:13;;;;;:18;;48969:1;;48952:13;:18;;48969:1;;48952:18;:::i;:::-;;;;-1:-1:-1;;48981:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;48981:21:0;-1:-1:-1;;;;;48981:21:0;;;;;;;;;49020:27;;48981:16;;49020:27;;;;;;;48477:578;;;:::o;81153:1822::-;81281:27;81329:17;81337:8;81329:7;:17::i;:::-;81321:38;;;;-1:-1:-1;;;81321:38:0;;46121:2:1;81321:38:0;;;46103:21:1;46160:1;46140:18;;;46133:29;-1:-1:-1;;;46178:18:1;;;46171:38;46226:18;;81321:38:0;45919:331:1;81321:38:0;81370:46;81419:38;;;:28;:38;;;;;;;;81370:87;;;;;;;;;;;;;;;;;;;;;;;;;;81504:52;;:16;:52;;;;;81468:88;;;;;;;;;;;;;;-1:-1:-1;;;81468:88:0;;;;;;;;;-1:-1:-1;;;81468:88:0;;-1:-1:-1;;;;;81468:88:0;;;;;-1:-1:-1;;;81468:88:0;;;;;;;;-1:-1:-1;;;81468:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81370:87;;:46;81468:88;;;;;;;;81370:46;;81468:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;81468:88:0;;;;;-1:-1:-1;;;81468:88:0;;;;;;;;-1:-1:-1;;;81468:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81567:12;81582:13;:27;;;:34;81619:1;81582:38;;;;:::i;:::-;81567:53;;81658:4;-1:-1:-1;;;;;81641:22:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;81641:22:0;;;;;;;;;;;;;;;;81631:32;;81674:27;81721:13;81716:808;81748:13;:27;;;:34;81740:5;:42;81716:808;;;81808:21;81832:62;81851:13;:27;;;81879:5;81851:34;;;;;;;;:::i;:::-;;;;;;;:42;;;81832:18;:62::i;:::-;81808:86;-1:-1:-1;81927:4:0;81913:18;;;;81909:604;;;81969:145;;;;;;;;81980:13;-1:-1:-1;;;;;81969:145:0;;;;;82099:13;82085:10;82061:13;:21;;;82016:66;;:13;:27;;;82044:5;82016:34;;;;;;;;:::i;:::-;;;;;;;:42;;;:66;;;;:::i;:::-;:79;;;;;;:::i;:::-;:97;;;;:::i;:::-;81969:145;;;81952:7;81960:5;81952:14;;;;;;;;:::i;:::-;;;;;;:162;;;;82183:13;:27;;;82211:5;82183:34;;;;;;;;:::i;:::-;;;;;;;:42;;;82158:67;;:22;:67;;;;:::i;:::-;82133:92;;81909:604;;;82283:105;;;;;;;;82294:13;-1:-1:-1;;;;;82283:105:0;;;;;82382:5;82369:10;82326:13;:27;;;82354:5;82326:34;;;;;;;;:::i;:::-;;;;;;;:40;;;:53;;;;;;:::i;:::-;:61;;;;:::i;:::-;82283:105;;;82266:7;82274:5;82266:14;;;;;;;;:::i;:::-;;;;;;:122;;;;82457:13;:27;;;82485:5;82457:34;;;;;;;;:::i;:::-;;;;;;;:40;;;82432:65;;:22;:65;;;;:::i;:::-;82407:90;;81909:604;-1:-1:-1;81784:7:0;;;;:::i;:::-;;;;81716:808;;;;82534:28;82565:41;82584:13;:21;;;82565:18;:41::i;:::-;82534:72;-1:-1:-1;82635:4:0;82621:18;;;;82617:326;;;82673:121;;;;;;;;82684:20;-1:-1:-1;;;;;82673:121:0;;;;;82779:13;82754;:21;;;82706:69;;82728:22;82720:5;:30;;;;:::i;:::-;82706:45;;:10;:45;:::i;:::-;:69;;;;:::i;:::-;:87;;;;:::i;:::-;82673:121;;82656:7;82664:6;82669:1;82664:4;:6;:::i;:::-;82656:15;;;;;;;;:::i;:::-;;;;;;:138;;;;82617:326;;;82844:87;;;;;;;;82855:20;-1:-1:-1;;;;;82844:87:0;;;;;82925:5;82899:22;82891:5;:30;;;;:::i;:::-;82877:45;;:10;:45;:::i;:::-;:53;;;;:::i;:::-;82844:87;;82827:7;82835:6;82840:1;82835:4;:6;:::i;:::-;82827:15;;;;;;;;:::i;:::-;;;;;;:104;;;;82617:326;82953:14;;;;;81153:1822;;;;;:::o;21430:120::-;20442:7;;;;20966:41;;;;-1:-1:-1;;;20966:41:0;;47263:2:1;20966:41:0;;;47245:21:1;47302:2;47282:18;;;47275:30;-1:-1:-1;;;47321:18:1;;;47314:50;47381:18;;20966:41:0;47061:344:1;20966:41:0;21489:7:::1;:15:::0;;-1:-1:-1;;21489:15:0::1;::::0;;21520:22:::1;14004:10:::0;21529:12:::1;21520:22;::::0;-1:-1:-1;;;;;1379:32:1;;;1361:51;;1349:2;1334:18;21520:22:0::1;;;;;;;21430:120::o:0;63172:523::-;63247:13;63263:17;63271:8;63263:7;:17::i;:::-;63247:33;;63299:37;63318:7;63327:8;63299:18;:37::i;:::-;63291:95;;;;-1:-1:-1;;;63291:95:0;;47612:2:1;63291:95:0;;;47594:21:1;47651:2;47631:18;;;47624:30;47690:34;47670:18;;;47663:62;-1:-1:-1;;;47741:18:1;;;47734:43;47794:19;;63291:95:0;47410:409:1;63291:95:0;63397:15;63403:8;63397:5;:15::i;:::-;63642:45;;;44453:25:1;;;-1:-1:-1;;;;;44514:32:1;;44509:2;44494:18;;44487:60;63642:45:0;;44426:18:1;63642:45:0;44279:274:1;58978:1443:0;59359:20;;59249:4;;59359:20;;;-1:-1:-1;;;;;59359:20:0;:34;59355:153;;59418:20;;-1:-1:-1;;;;;59418:32:0;;;:20;;;;;:32;59410:86;;;;-1:-1:-1;;;59410:86:0;;48026:2:1;59410:86:0;;;48008:21:1;48065:2;48045:18;;;48038:30;48104:34;48084:18;;;48077:62;-1:-1:-1;;;48155:18:1;;;48148:39;48204:19;;59410:86:0;47824:405:1;59410:86:0;59571:34;59608:28;;;:16;:28;;;;;59655:21;;-1:-1:-1;;;59655:21:0;;-1:-1:-1;;;;;59655:21:0;:35;59647:68;;;;-1:-1:-1;;;59647:68:0;;48436:2:1;59647:68:0;;;48418:21:1;48475:2;48455:18;;;48448:30;-1:-1:-1;;;48494:18:1;;;48487:50;48554:18;;59647:68:0;48234:344:1;59647:68:0;59805:1;59790:12;:16;;;59789:53;;;;-1:-1:-1;;;;;;59811:31:0;;;;59789:53;:74;;;;;59858:5;59846:8;:17;;;;59789:74;59781:101;;;;-1:-1:-1;;;59781:101:0;;48785:2:1;59781:101:0;;;48767:21:1;48824:2;48804:18;;;48797:30;-1:-1:-1;;;48843:18:1;;;48836:44;48897:18;;59781:101:0;48583:338:1;59781:101:0;59893:28;;-1:-1:-1;;;;;59983:32:0;;-1:-1:-1;;;59983:32:0;-1:-1:-1;;;;;;59983:32:0;;;59893:28;59932:40;;59983:32;;;;60026:42;;;;:26;;;;:42;;;;;:::i;:::-;-1:-1:-1;60079:46:0;;-1:-1:-1;;;;60136:32:0;-1:-1:-1;;;60079:46:0;;;;-1:-1:-1;;;;60136:32:0;;-1:-1:-1;;;60136:32:0;;;;;;;60179:62;60079:46;60226:14;60179:31;:62::i;:::-;60257:128;60295:10;60307:8;60317:12;60344:8;60354:15;60371:13;60257:128;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;60403:10:0;;58978:1443;-1:-1:-1;;;;;;;58978:1443:0:o;60696:1639::-;60872:1;60851:11;:18;:22;:52;;;;;60898:5;60877:11;:18;:26;60851:52;60843:83;;;;-1:-1:-1;;;60843:83:0;;49774:2:1;60843:83:0;;;49756:21:1;49813:2;49793:18;;;49786:30;-1:-1:-1;;;49832:18:1;;;49825:48;49890:18;;60843:83:0;49572:342:1;60843:83:0;60937:34;60974:33;;;:16;:33;;;;;61026:21;;-1:-1:-1;;;61026:21:0;;-1:-1:-1;;;;;61026:21:0;61018:68;;;;-1:-1:-1;;;61018:68:0;;43715:2:1;61018:68:0;;;43697:21:1;43754:2;43734:18;;;43727:30;-1:-1:-1;;;43773:18:1;;;43766:50;43833:18;;61018:68:0;43513:344:1;61018:68:0;61124:24;;-1:-1:-1;;;61124:24:0;;;;;61167:52;;-1:-1:-1;;;61189:21:0;;-1:-1:-1;;;;;61189:21:0;61212:6;61167:21;:52::i;:::-;61159:85;;;;-1:-1:-1;;;61159:85:0;;50121:2:1;61159:85:0;;;50103:21:1;50160:2;50140:18;;;50133:30;-1:-1:-1;;;50179:18:1;;;50172:50;50239:18;;61159:85:0;49919:344:1;61159:85:0;61305:25;;61263:18;;61305:25;;;;;61263:38;;;;;;;:::i;:::-;:67;;61255:102;;;;-1:-1:-1;;;61255:102:0;;50470:2:1;61255:102:0;;;50452:21:1;50509:2;50489:18;;;50482:30;-1:-1:-1;;;50528:18:1;;;50521:52;50590:18;;61255:102:0;50268:346:1;61255:102:0;61375:8;61370:867;61391:11;:18;61387:1;:22;;;61370:867;;;61431:32;61466:11;61478:1;61466:14;;;;;;;;;;:::i;:::-;;;;;;;;;;;;61495:35;61533:54;;;:28;:54;;;;;;;61610:20;;61466:14;;-1:-1:-1;61533:54:0;61610:20;;:25;61602:58;;;;-1:-1:-1;;;61602:58:0;;50821:2:1;61602:58:0;;;50803:21:1;50860:2;50840:18;;;50833:30;-1:-1:-1;;;50879:18:1;;;50872:50;50939:18;;61602:58:0;50619:344:1;61602:58:0;61675:22;61724:1;61700:21;:17;61720:1;61700:21;:::i;:::-;:25;;;;:::i;:::-;61740:38;;-1:-1:-1;;61740:38:0;;;;;;;-1:-1:-1;61793:22:0;;:40;;;61853:226;;61740:38;;-1:-1:-1;61853:226:0;;;;61902:24;;61945:6;;61740:38;;62004:26;;;;61793:40;;61853:226;:::i;:::-;;;;;;;;62186:39;62192:6;62200:24;62186:5;:39::i;:::-;61416:821;;;61411:3;;;;;:::i;:::-;;;;61370:867;;;-1:-1:-1;62308:18:0;;62274:24;;:53;;62308:18;-1:-1:-1;;;62274:24:0;;;;:53;:::i;:::-;62247:80;;;;;;;-1:-1:-1;;;62247:80:0;-1:-1:-1;;62247:80:0;;;;;;;-1:-1:-1;;;;60696:1639:0:o;16236:173::-;16311:6;;;-1:-1:-1;;;;;16328:17:0;;;-1:-1:-1;;;;;;16328:17:0;;;;;;;16361:40;;16311:6;;;16328:17;16311:6;;16361:40;;16292:16;;16361:40;16281:128;16236:173;:::o;21171:118::-;20442:7;;;;20696:9;20688:38;;;;-1:-1:-1;;;20688:38:0;;;;;;;:::i;:::-;21231:7:::1;:14:::0;;-1:-1:-1;;21231:14:0::1;21241:4;21231:14;::::0;;21261:20:::1;21268:12;14004:10:::0;;13924:98;18019:352;15209:6;;-1:-1:-1;;;;;15209:6:0;14004:10;15356:23;15348:68;;;;-1:-1:-1;;;15348:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18113:25:0;::::1;18105:45;;;::::0;-1:-1:-1;;;18105:45:0;;52664:2:1;18105:45:0::1;::::0;::::1;52646:21:1::0;52703:1;52683:18;;;52676:29;-1:-1:-1;;;52721:18:1;;;52714:37;52768:18;;18105:45:0::1;52462:330:1::0;18105:45:0::1;18309:1;18268:38;16592:6;18268:15;:38;:::i;:::-;:42;;;;:::i;:::-;-1:-1:-1::0;;;;;18240:25:0;::::1;;::::0;;;:12:::1;:25;::::0;;;;;;;;:70;;;;18326:37;;35940:51:1;;;18358:4:0::1;36007:18:1::0;;;36000:50;;;;18326:37:0::1;::::0;35913:18:1;18326:37:0::1;35772:284:1::0;44563:315:0;44720:28;44730:4;44736:2;44740:7;44720:9;:28::i;:::-;44767:48;44790:4;44796:2;44800:7;44809:5;44767:22;:48::i;:::-;44759:111;;;;-1:-1:-1;;;44759:111:0;;;;;;;:::i;84094:429::-;84258:21;;-1:-1:-1;;;84258:21:0;;;;:29;;84283:4;84258:29;84250:62;;;;-1:-1:-1;;;84250:62:0;;53418:2:1;84250:62:0;;;53400:21:1;53457:2;53437:18;;;53430:30;-1:-1:-1;;;53476:18:1;;;53469:50;53536:18;;84250:62:0;53216:344:1;84250:62:0;84323:22;84369:7;84358:19;;;;;;;53807:13:1;;53789:32;;53881:4;53869:17;;;53863:24;-1:-1:-1;;;;;53859:50:1;53837:20;;;53830:80;;;;53777:2;53762:18;;53565:351;84358:19:0;;;;;;;;;;;;;84348:30;;;;;;84323:55;;84389:24;84416:33;84439:9;;84416:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;84416:14:0;;:33;-1:-1:-1;;84416:22:0;:33;-1:-1:-1;84416:33:0:i;:::-;84488:13;;84389:60;;-1:-1:-1;;;;;;84468:33:0;;;84488:13;;84468:33;84460:55;;;;-1:-1:-1;;;84460:55:0;;54123:2:1;84460:55:0;;;54105:21:1;54162:1;54142:18;;;54135:29;-1:-1:-1;;;54180:18:1;;;54173:39;54229:18;;84460:55:0;53921:332:1;57785:867:0;57939:10;57964:17;58001:6;57996:533;58017:14;:21;58013:1;:25;57996:533;;;58105:3;-1:-1:-1;;;;;58068:41:0;:14;58083:1;58068:17;;;;;;;;:::i;:::-;;;;;;;:25;;;-1:-1:-1;;;;;58068:41:0;;;:112;;;-1:-1:-1;58159:21:0;;58130:17;;-1:-1:-1;;;58159:21:0;;;-1:-1:-1;;;;;58159:21:0;;58130:17;;58145:1;;58130:17;;;;;;:::i;:::-;;;;;;;:25;;;-1:-1:-1;;;;;58130:50:0;;;58068:112;58060:143;;;;-1:-1:-1;;;58060:143:0;;54460:2:1;58060:143:0;;;54442:21:1;54499:2;54479:18;;;54472:30;-1:-1:-1;;;54518:18:1;;;54511:48;54576:18;;58060:143:0;54258:342:1;58060:143:0;58226:14;58241:1;58226:17;;;;;;;;:::i;:::-;;;;;;;:23;;;:28;;58253:1;58226:28;;:62;;;;58258:14;58273:1;58258:17;;;;;;;;:::i;:::-;;;;;;;:25;;;:30;;58287:1;58258:30;;58226:62;58218:109;;;;-1:-1:-1;;;58218:109:0;;54807:2:1;58218:109:0;;;54789:21:1;54846:2;54826:18;;;54819:30;-1:-1:-1;;;54865:18:1;;;54858:47;54922:18;;58218:109:0;54605:341:1;58218:109:0;58342:13;:27;;58375:14;58390:1;58375:17;;;;;;;;:::i;:::-;;;;;;;;;;;;58342:51;;;;;;;-1:-1:-1;58342:51:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58342:51:0;;;-1:-1:-1;;;;;;58342:51:0;;;;;;;-1:-1:-1;;;58342:51:0;;;;;;-1:-1:-1;;;;;58342:51:0;-1:-1:-1;;;58342:51:0;;;;;;;;;;;58424:17;;;;58439:1;;58424:17;;;;;;:::i;:::-;;;;;;;:23;;;58416:31;;:5;:31;;;;:::i;:::-;58408:39;;58492:14;58507:1;58492:17;;;;;;;;:::i;:::-;;;;;;;:25;;;58477:40;;:12;:40;;;;:::i;:::-;58462:55;-1:-1:-1;58040:3:0;;;;:::i;:::-;;;;57996:533;;;;58556:5;58547;:14;;58539:40;;;;-1:-1:-1;;;58539:40:0;;55153:2:1;58539:40:0;;;55135:21:1;55192:2;55172:18;;;55165:30;-1:-1:-1;;;55211:18:1;;;55204:43;55264:18;;58539:40:0;54951:337:1;58539:40:0;58614:5;58598:12;:21;;58590:54;;;;-1:-1:-1;;;58590:54:0;;55495:2:1;58590:54:0;;;55477:21:1;55534:2;55514:18;;;55507:30;-1:-1:-1;;;55553:18:1;;;55546:50;55613:18;;58590:54:0;55293:344:1;62619:368:0;-1:-1:-1;;;;;62790:25:0;;;62747:4;62790:25;;;:15;:25;;;;;;62747:4;;62790:25;62830:29;;62826:154;;62902:7;-1:-1:-1;;;;;62883:26:0;:15;-1:-1:-1;;;;;62883:26:0;;62876:33;;;;;62826:154;62961:7;-1:-1:-1;;;;;62949:19:0;:8;-1:-1:-1;;;;;62949:19:0;;62942:26;;;;;65488:188;65592:12;;65557:7;;-1:-1:-1;;;;;65592:12:0;65584:35;:84;;65634:12;;:34;;-1:-1:-1;;;65634:34:0;;-1:-1:-1;;;;;1379:32:1;;;65634:34:0;;;1361:51:1;65634:12:0;;;;:23;;1334:18:1;;65634:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65584:84;;;-1:-1:-1;65622:9:0;65488:188::o;47780:360::-;47840:13;47856:23;47871:7;47856:14;:23::i;:::-;47840:39;;47981:29;47998:1;48002:7;47981:8;:29::i;:::-;-1:-1:-1;;;;;48023:16:0;;;;;;:9;:16;;;;;:21;;48043:1;;48023:16;:21;;48043:1;;48023:21;:::i;:::-;;;;-1:-1:-1;;48062:16:0;;;;:7;:16;;;;;;48055:23;;-1:-1:-1;;;;;;48055:23:0;;;48096:36;48070:7;;48062:16;-1:-1:-1;;;;;48096:36:0;;;;;48062:16;;48096:36;47829:311;47780:360;:::o;47169:382::-;-1:-1:-1;;;;;47249:16:0;;47241:61;;;;-1:-1:-1;;;47241:61:0;;56100:2:1;47241:61:0;;;56082:21:1;;;56119:18;;;56112:30;56178:34;56158:18;;;56151:62;56230:18;;47241:61:0;55898:356:1;47241:61:0;47322:16;47330:7;47322;:16::i;:::-;47321:17;47313:58;;;;-1:-1:-1;;;47313:58:0;;56461:2:1;47313:58:0;;;56443:21:1;56500:2;56480:18;;;56473:30;56539;56519:18;;;56512:58;56587:18;;47313:58:0;56259:352:1;47313:58:0;-1:-1:-1;;;;;47442:13:0;;;;;;:9;:13;;;;;:18;;47459:1;;47442:13;:18;;47459:1;;47442:18;:::i;:::-;;;;-1:-1:-1;;47471:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;47471:21:0;-1:-1:-1;;;;;47471:21:0;;;;;;;;47510:33;;47471:16;;;47510:33;;47471:16;;47510:33;47169:382;;:::o;49912:799::-;50067:4;-1:-1:-1;;;;;50088:13:0;;22646:20;22694:8;50084:620;;50124:72;;-1:-1:-1;;;50124:72:0;;-1:-1:-1;;;;;50124:36:0;;;;;:72;;14004:10;;50175:4;;50181:7;;50190:5;;50124:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50124:72:0;;;;;;;;-1:-1:-1;;50124:72:0;;;;;;;;;;;;:::i;:::-;;;50120:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50366:13:0;;50362:272;;50409:60;;-1:-1:-1;;;50409:60:0;;;;;;;:::i;50362:272::-;50584:6;50578:13;50569:6;50565:2;50561:15;50554:38;50120:529;-1:-1:-1;;;;;;50247:51:0;-1:-1:-1;;;50247:51:0;;-1:-1:-1;50240:58:0;;50084:620;-1:-1:-1;50688:4:0;49912:799;;;;;;:::o;4335:231::-;4413:7;4434:17;4453:18;4475:27;4486:4;4492:9;4475:10;:27::i;:::-;4433:69;;;;4513:18;4525:5;4513:11;:18::i;:::-;-1:-1:-1;4549:9:0;4335:231;-1:-1:-1;;;4335:231:0:o;2225:1308::-;2306:7;2315:12;2540:9;:16;2560:2;2540:22;2536:990;;;2836:4;2821:20;;2815:27;2886:4;2871:20;;2865:27;2944:4;2929:20;;2923:27;2579:9;2915:36;2987:25;2998:4;2915:36;2815:27;2865;2987:10;:25::i;:::-;2980:32;;;;;;;;;2536:990;3034:9;:16;3054:2;3034:22;3030:496;;;3309:4;3294:20;;3288:27;3360:4;3345:20;;3339:27;3402:23;3413:4;3288:27;3339;3402:10;:23::i;:::-;3395:30;;;;;;;;3030:496;-1:-1:-1;3474:1:0;;-1:-1:-1;3478:35:0;3030:496;2225:1308;;;;;:::o;496:643::-;574:20;565:5;:29;;;;;;;;:::i;:::-;;561:571;;;496:643;:::o;561:571::-;672:29;663:5;:38;;;;;;;;:::i;:::-;;659:473;;;718:34;;-1:-1:-1;;;718:34:0;;57698:2:1;718:34:0;;;57680:21:1;57737:2;57717:18;;;57710:30;57776:26;57756:18;;;57749:54;57820:18;;718:34:0;57496:348:1;659:473:0;783:35;774:5;:44;;;;;;;;:::i;:::-;;770:362;;;835:41;;-1:-1:-1;;;835:41:0;;58051:2:1;835:41:0;;;58033:21:1;58090:2;58070:18;;;58063:30;58129:33;58109:18;;;58102:61;58180:18;;835:41:0;57849:355:1;770:362:0;907:30;898:5;:39;;;;;;;;:::i;:::-;;894:238;;;954:44;;-1:-1:-1;;;954:44:0;;58411:2:1;954:44:0;;;58393:21:1;58450:2;58430:18;;;58423:30;58489:34;58469:18;;;58462:62;-1:-1:-1;;;58540:18:1;;;58533:32;58582:19;;954:44:0;58209:398:1;894:238:0;1029:30;1020:5;:39;;;;;;;;:::i;:::-;;1016:116;;;1076:44;;-1:-1:-1;;;1076:44:0;;58814:2:1;1076:44:0;;;58796:21:1;58853:2;58833:18;;;58826:30;58892:34;58872:18;;;58865:62;-1:-1:-1;;;58943:18:1;;;58936:32;58985:19;;1076:44:0;58612:398:1;5834:1632:0;5965:7;;6899:66;6886:79;;6882:163;;;-1:-1:-1;6998:1:0;;-1:-1:-1;7002:30:0;6982:51;;6882:163;7059:1;:7;;7064:2;7059:7;;:18;;;;;7070:1;:7;;7075:2;7070:7;;7059:18;7055:102;;;-1:-1:-1;7110:1:0;;-1:-1:-1;7114:30:0;7094:51;;7055:102;7271:24;;;7254:14;7271:24;;;;;;;;;59242:25:1;;;59315:4;59303:17;;59283:18;;;59276:45;;;;59337:18;;;59330:34;;;59380:18;;;59373:34;;;7271:24:0;;59214:19:1;;7271:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7271:24:0;;-1:-1:-1;;7271:24:0;;;-1:-1:-1;;;;;;;7310:20:0;;7306:103;;7363:1;7367:29;7347:50;;;;;;;7306:103;7429:6;-1:-1:-1;7437:20:0;;-1:-1:-1;5834:1632:0;;;;;;;;:::o;4829:391::-;4943:7;;-1:-1:-1;;;;;5044:75:0;;5146:3;5142:12;;;5156:2;5138:21;5187:25;5198:4;5138:21;5207:1;5044:75;5187:10;:25::i;:::-;5180:32;;;;;;4829:391;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;688:131::-;-1:-1:-1;;;;;763:31:1;;753:42;;743:70;;809:1;806;799:12;824:134;892:20;;921:31;892:20;921:31;:::i;:::-;824:134;;;:::o;963:247::-;1022:6;1075:2;1063:9;1054:7;1050:23;1046:32;1043:52;;;1091:1;1088;1081:12;1043:52;1130:9;1117:23;1149:31;1174:5;1149:31;:::i;1423:258::-;1495:1;1505:113;1519:6;1516:1;1513:13;1505:113;;;1595:11;;;1589:18;1576:11;;;1569:39;1541:2;1534:10;1505:113;;;1636:6;1633:1;1630:13;1627:48;;;-1:-1:-1;;1671:1:1;1653:16;;1646:27;1423:258::o;1686:::-;1728:3;1766:5;1760:12;1793:6;1788:3;1781:19;1809:63;1865:6;1858:4;1853:3;1849:14;1842:4;1835:5;1831:16;1809:63;:::i;:::-;1926:2;1905:15;-1:-1:-1;;1901:29:1;1892:39;;;;1933:4;1888:50;;1686:258;-1:-1:-1;;1686:258:1:o;1949:220::-;2098:2;2087:9;2080:21;2061:4;2118:45;2159:2;2148:9;2144:18;2136:6;2118:45;:::i;2174:180::-;2233:6;2286:2;2274:9;2265:7;2261:23;2257:32;2254:52;;;2302:1;2299;2292:12;2254:52;-1:-1:-1;2325:23:1;;2174:180;-1:-1:-1;2174:180:1:o;2359:315::-;2427:6;2435;2488:2;2476:9;2467:7;2463:23;2459:32;2456:52;;;2504:1;2501;2494:12;2456:52;2543:9;2530:23;2562:31;2587:5;2562:31;:::i;:::-;2612:5;2664:2;2649:18;;;;2636:32;;-1:-1:-1;;;2359:315:1:o;2861:127::-;2922:10;2917:3;2913:20;2910:1;2903:31;2953:4;2950:1;2943:15;2977:4;2974:1;2967:15;2993:253;3065:2;3059:9;3107:4;3095:17;;-1:-1:-1;;;;;3127:34:1;;3163:22;;;3124:62;3121:88;;;3189:18;;:::i;:::-;3225:2;3218:22;2993:253;:::o;3251:::-;3323:2;3317:9;3365:4;3353:17;;-1:-1:-1;;;;;3385:34:1;;3421:22;;;3382:62;3379:88;;;3447:18;;:::i;3509:257::-;3581:4;3575:11;;;3613:17;;-1:-1:-1;;;;;3645:34:1;;3681:22;;;3642:62;3639:88;;;3707:18;;:::i;3771:255::-;3843:2;3837:9;3885:6;3873:19;;-1:-1:-1;;;;;3907:34:1;;3943:22;;;3904:62;3901:88;;;3969:18;;:::i;4031:275::-;4102:2;4096:9;4167:2;4148:13;;-1:-1:-1;;4144:27:1;4132:40;;-1:-1:-1;;;;;4187:34:1;;4223:22;;;4184:62;4181:88;;;4249:18;;:::i;:::-;4285:2;4278:22;4031:275;;-1:-1:-1;4031:275:1:o;4311:208::-;4396:4;-1:-1:-1;;;;;4421:6:1;4418:30;4415:56;;;4451:18;;:::i;:::-;-1:-1:-1;4496:1:1;4492:14;4508:4;4488:25;;4311:208::o;4524:163::-;4591:20;;4651:10;4640:22;;4630:33;;4620:61;;4677:1;4674;4667:12;4692:159;4759:20;;4819:6;4808:18;;4798:29;;4788:57;;4841:1;4838;4831:12;4856:167;4923:20;;4983:14;4972:26;;4962:37;;4952:65;;5013:1;5010;5003:12;5028:1164;5087:5;5140:3;5133:4;5125:6;5121:17;5117:27;5107:55;;5158:1;5155;5148:12;5107:55;5194:6;5181:20;5220:4;5244:85;5260:68;5325:2;5260:68;:::i;:::-;5244:85;:::i;:::-;5363:15;;;5425:4;5468:11;;;5456:24;;5452:33;;;5394:12;;;;5351:3;5497:15;;;5494:35;;;5525:1;5522;5515:12;5494:35;5561:2;5553:6;5549:15;5573:590;5589:6;5584:3;5581:15;5573:590;;;5665:2;5659:3;5654;5650:13;5646:22;5643:112;;;5709:1;5738:2;5734;5727:14;5643:112;5781:22;;:::i;:::-;5844:3;5831:17;5861:33;5886:7;5861:33;:::i;:::-;5907:22;;5965:31;5983:12;;;5965:31;:::i;:::-;5960:2;5953:5;5949:14;5942:55;6020:2;6058:31;6085:2;6080:3;6076:12;6058:31;:::i;:::-;6042:14;;;6035:55;6103:18;;6141:12;;;;5606;;5573:590;;;-1:-1:-1;6181:5:1;;5028:1164;-1:-1:-1;;;;;;;5028:1164:1:o;6197:187::-;6246:4;-1:-1:-1;;;;;6271:6:1;6268:30;6265:56;;;6301:18;;:::i;:::-;-1:-1:-1;6367:2:1;6346:15;-1:-1:-1;;6342:29:1;6373:4;6338:40;;6197:187::o;6389:338::-;6454:5;6483:53;6499:36;6528:6;6499:36;:::i;6483:53::-;6474:62;;6559:6;6552:5;6545:21;6599:3;6590:6;6585:3;6581:16;6578:25;6575:45;;;6616:1;6613;6606:12;6575:45;6665:6;6660:3;6653:4;6646:5;6642:16;6629:43;6719:1;6712:4;6703:6;6696:5;6692:18;6688:29;6681:40;6389:338;;;;;:::o;6732:222::-;6775:5;6828:3;6821:4;6813:6;6809:17;6805:27;6795:55;;6846:1;6843;6836:12;6795:55;6868:80;6944:3;6935:6;6922:20;6915:4;6907:6;6903:17;6868:80;:::i;6959:930::-;7031:5;7079:4;7067:9;7062:3;7058:19;7054:30;7051:50;;;7097:1;7094;7087:12;7051:50;7119:22;;:::i;:::-;7110:31;;7177:9;7164:23;7157:5;7150:38;7248:2;7237:9;7233:18;7220:32;7215:2;7208:5;7204:14;7197:56;7285:37;7318:2;7307:9;7303:18;7285:37;:::i;:::-;7280:2;7273:5;7269:14;7262:61;7355:38;7389:2;7378:9;7374:18;7355:38;:::i;:::-;7350:2;7343:5;7339:14;7332:62;7427:38;7460:3;7449:9;7445:19;7427:38;:::i;:::-;7421:3;7414:5;7410:15;7403:63;7517:3;7506:9;7502:19;7489:33;-1:-1:-1;;;;;7582:2:1;7574:6;7571:14;7568:34;;;7598:1;7595;7588:12;7568:34;7635:62;7693:3;7684:6;7673:9;7669:22;7635:62;:::i;:::-;7629:3;7622:5;7618:15;7611:87;7751:3;7740:9;7736:19;7723:33;7707:49;;7781:2;7771:8;7768:16;7765:36;;;7797:1;7794;7787:12;7765:36;;7834:48;7878:3;7867:8;7856:9;7852:24;7834:48;:::i;:::-;7828:3;7821:5;7817:15;7810:73;;6959:930;;;;:::o;7894:1217::-;8021:6;8052:2;8095;8083:9;8074:7;8070:23;8066:32;8063:52;;;8111:1;8108;8101:12;8063:52;8151:9;8138:23;-1:-1:-1;;;;;8221:2:1;8213:6;8210:14;8207:34;;;8237:1;8234;8227:12;8207:34;8275:6;8264:9;8260:22;8250:32;;8320:7;8313:4;8309:2;8305:13;8301:27;8291:55;;8342:1;8339;8332:12;8291:55;8378:2;8365:16;8401:85;8417:68;8482:2;8417:68;:::i;8401:85::-;8520:15;;;8602:1;8598:10;;;;8590:19;;8586:28;;;8551:12;;;;8626:19;;;8623:39;;;8658:1;8655;8648:12;8623:39;8690:2;8686;8682:11;8702:379;8718:6;8713:3;8710:15;8702:379;;;8804:3;8791:17;8840:2;8827:11;8824:19;8821:109;;;8884:1;8913:2;8909;8902:14;8821:109;8955:83;9030:7;9025:2;9011:11;9007:2;9003:20;8999:29;8955:83;:::i;:::-;8943:96;;-1:-1:-1;9059:12:1;;;;8735;;8702:379;;;-1:-1:-1;9100:5:1;7894:1217;-1:-1:-1;;;;;;;;7894:1217:1:o;9116:456::-;9193:6;9201;9209;9262:2;9250:9;9241:7;9237:23;9233:32;9230:52;;;9278:1;9275;9268:12;9230:52;9317:9;9304:23;9336:31;9361:5;9336:31;:::i;:::-;9386:5;-1:-1:-1;9443:2:1;9428:18;;9415:32;9456:33;9415:32;9456:33;:::i;:::-;9116:456;;9508:7;;-1:-1:-1;;;9562:2:1;9547:18;;;;9534:32;;9116:456::o;9577:248::-;9645:6;9653;9706:2;9694:9;9685:7;9681:23;9677:32;9674:52;;;9722:1;9719;9712:12;9674:52;-1:-1:-1;;9745:23:1;;;9815:2;9800:18;;;9787:32;;-1:-1:-1;9577:248:1:o;9830:820::-;10057:2;10109:21;;;10179:13;;10082:18;;;10201:22;;;10028:4;;10057:2;10242;;10260:18;;;;10301:15;;;10028:4;10344:280;10358:6;10355:1;10352:13;10344:280;;;10417:13;;10459:9;;-1:-1:-1;;;;;10455:35:1;10443:48;;10531:11;;10525:18;10511:12;;;10504:40;10564:12;;;;10599:15;;;;10487:1;10373:9;10344:280;;;-1:-1:-1;10641:3:1;;9830:820;-1:-1:-1;;;;;;;9830:820:1:o;10655:118::-;10741:5;10734:13;10727:21;10720:5;10717:32;10707:60;;10763:1;10760;10753:12;10778:128;10843:20;;10872:28;10843:20;10872:28;:::i;10911:382::-;10976:6;10984;11037:2;11025:9;11016:7;11012:23;11008:32;11005:52;;;11053:1;11050;11043:12;11005:52;11092:9;11079:23;11111:31;11136:5;11111:31;:::i;:::-;11161:5;-1:-1:-1;11218:2:1;11203:18;;11190:32;11231:30;11190:32;11231:30;:::i;:::-;11280:7;11270:17;;;10911:382;;;;;:::o;11566:1315::-;11691:6;11722:2;11765;11753:9;11744:7;11740:23;11736:32;11733:52;;;11781:1;11778;11771:12;11733:52;11821:9;11808:23;-1:-1:-1;;;;;11846:6:1;11843:30;11840:50;;;11886:1;11883;11876:12;11840:50;11909:22;;11962:4;11954:13;;11950:27;-1:-1:-1;11940:55:1;;11991:1;11988;11981:12;11940:55;12027:2;12014:16;12050:85;12066:68;12131:2;12066:68;:::i;12050:85::-;12169:15;;;12251:1;12247:10;;;;12239:19;;12235:28;;;12200:12;;;;12275:19;;;12272:39;;;12307:1;12304;12297:12;12272:39;12331:11;;;;12351:500;12367:6;12362:3;12359:15;12351:500;;;12449:4;12443:3;12434:7;12430:17;12426:28;12423:118;;;12495:1;12524:2;12520;12513:14;12423:118;12567:22;;:::i;:::-;12629:3;12616:17;12609:5;12602:32;12684:2;12679:3;12675:12;12662:26;12701:33;12726:7;12701:33;:::i;:::-;12754:14;;;12747:31;12791:18;;12393:4;12384:14;;;;;12829:12;;;;12351:500;;;12870:5;11566:1315;-1:-1:-1;;;;;;;11566:1315:1:o;13215:733::-;13273:3;13311:5;13305:12;13338:6;13333:3;13326:19;13364:4;13393:2;13388:3;13384:12;13377:19;;13430:2;13423:5;13419:14;13451:1;13461:462;13475:6;13472:1;13469:13;13461:462;;;13534:13;;13576:9;;-1:-1:-1;;;;;13572:35:1;13560:48;;13647:11;;;13641:18;13682:14;13730:21;;;13716:12;;;13709:43;13775:4;13823:11;;;13817:18;13813:27;13799:12;;;13792:49;13870:4;13861:14;;;;13898:15;;;;13604:1;13490:9;13461:462;;;-1:-1:-1;13939:3:1;;13215:733;-1:-1:-1;;;;;13215:733:1:o;13953:1042::-;14142:2;14131:9;14124:21;14105:4;14164:10;14229:2;14220:6;14214:13;14210:22;14205:2;14194:9;14190:18;14183:50;14297:2;14291;14283:6;14279:15;14273:22;14269:31;14264:2;14253:9;14249:18;14242:59;;14382:1;14378;14373:3;14369:11;14365:19;14359:2;14351:6;14347:15;14341:22;14337:48;14332:2;14321:9;14317:18;14310:76;14433:2;14425:6;14421:15;14415:22;14446:52;14493:3;14482:9;14478:19;14464:12;13196:6;13185:18;13173:31;;13120:90;14446:52;-1:-1:-1;14547:3:1;14535:16;;14529:23;470:13;;463:21;14608:3;14593:19;;451:34;14561:52;14662:3;14654:6;14650:16;14644:23;14704:4;14698:3;14687:9;14683:19;14676:33;14732:70;14797:3;14786:9;14782:19;14766:14;14732:70;:::i;:::-;14718:84;;14851:3;14843:6;14839:16;14833:23;14926:2;14922:7;14910:9;14902:6;14898:22;14894:36;14887:4;14876:9;14872:20;14865:66;14948:41;14982:6;14966:14;14948:41;:::i;:::-;14940:49;13953:1042;-1:-1:-1;;;;;13953:1042:1:o;15000:687::-;15054:5;15107:3;15100:4;15092:6;15088:17;15084:27;15074:55;;15125:1;15122;15115:12;15074:55;15161:6;15148:20;15187:4;15211:85;15227:68;15292:2;15227:68;:::i;15211:85::-;15330:15;;;15416:1;15412:10;;;;15400:23;;15396:32;;;15361:12;;;;15440:15;;;15437:35;;;15468:1;15465;15458:12;15437:35;15504:2;15496:6;15492:15;15516:142;15532:6;15527:3;15524:15;15516:142;;;15598:17;;15586:30;;15636:12;;;;15549;;15516:142;;;-1:-1:-1;15676:5:1;15000:687;-1:-1:-1;;;;;;15000:687:1:o;15692:1131::-;15764:5;15812:6;15800:9;15795:3;15791:19;15787:32;15784:52;;;15832:1;15829;15822:12;15784:52;15854:22;;:::i;:::-;15845:31;;15912:9;15899:23;15892:5;15885:38;15955:37;15988:2;15977:9;15973:18;15955:37;:::i;:::-;15950:2;15943:5;15939:14;15932:61;16025:38;16059:2;16048:9;16044:18;16025:38;:::i;:::-;16020:2;16013:5;16009:14;16002:62;16096:37;16129:2;16118:9;16114:18;16096:37;:::i;:::-;16091:2;16084:5;16080:14;16073:61;16167:36;16198:3;16187:9;16183:19;16167:36;:::i;:::-;16161:3;16154:5;16150:15;16143:61;16255:3;16244:9;16240:19;16227:33;-1:-1:-1;;;;;16320:2:1;16312:6;16309:14;16306:34;;;16336:1;16333;16326:12;16306:34;16373:62;16431:3;16422:6;16411:9;16407:22;16373:62;:::i;:::-;16367:3;16360:5;16356:15;16349:87;16489:3;16478:9;16474:19;16461:33;16445:49;;16519:2;16509:8;16506:16;16503:36;;;16535:1;16532;16525:12;16503:36;16572:48;16616:3;16605:8;16594:9;16590:24;16572:48;:::i;:::-;16566:3;16559:5;16555:15;16548:73;16674:3;16663:9;16659:19;16646:33;16630:49;;16704:2;16694:8;16691:16;16688:36;;;16720:1;16717;16710:12;16688:36;;16757:59;16812:3;16801:8;16790:9;16786:24;16757:59;:::i;:::-;16751:3;16744:5;16740:15;16733:84;;15692:1131;;;;:::o;16828:1217::-;16955:6;16986:2;17029;17017:9;17008:7;17004:23;17000:32;16997:52;;;17045:1;17042;17035:12;16997:52;17085:9;17072:23;-1:-1:-1;;;;;17155:2:1;17147:6;17144:14;17141:34;;;17171:1;17168;17161:12;17141:34;17209:6;17198:9;17194:22;17184:32;;17254:7;17247:4;17243:2;17239:13;17235:27;17225:55;;17276:1;17273;17266:12;17225:55;17312:2;17299:16;17335:85;17351:68;17416:2;17351:68;:::i;17335:85::-;17454:15;;;17536:1;17532:10;;;;17524:19;;17520:28;;;17485:12;;;;17560:19;;;17557:39;;;17592:1;17589;17582:12;17557:39;17624:2;17620;17616:11;17636:379;17652:6;17647:3;17644:15;17636:379;;;17738:3;17725:17;17774:2;17761:11;17758:19;17755:109;;;17818:1;17847:2;17843;17836:14;17755:109;17889:83;17964:7;17959:2;17945:11;17941:2;17937:20;17933:29;17889:83;:::i;:::-;17877:96;;-1:-1:-1;17993:12:1;;;;17669;;17636:379;;18050:388;18118:6;18126;18179:2;18167:9;18158:7;18154:23;18150:32;18147:52;;;18195:1;18192;18185:12;18147:52;18234:9;18221:23;18253:31;18278:5;18253:31;:::i;:::-;18303:5;-1:-1:-1;18360:2:1;18345:18;;18332:32;18373:33;18332:32;18373:33;:::i;18443:584::-;18522:5;18570:4;18558:9;18553:3;18549:19;18545:30;18542:50;;;18588:1;18585;18578:12;18542:50;18610:22;;:::i;:::-;18601:31;;18668:9;18655:23;18648:5;18641:38;18730:2;18719:9;18715:18;18702:32;-1:-1:-1;;;;;18749:6:1;18746:30;18743:50;;;18789:1;18786;18779:12;18743:50;18825:57;18878:3;18869:6;18858:9;18854:22;18825:57;:::i;:::-;18820:2;18813:5;18809:14;18802:81;;18935:2;18924:9;18920:18;18907:32;18948:33;18973:7;18948:33;:::i;:::-;19008:2;18997:14;;18990:31;19001:5;18443:584;-1:-1:-1;;18443:584:1:o;19032:1231::-;19166:6;19197:2;19240;19228:9;19219:7;19215:23;19211:32;19208:52;;;19256:1;19253;19246:12;19208:52;19296:9;19283:23;-1:-1:-1;;;;;19366:2:1;19358:6;19355:14;19352:34;;;19382:1;19379;19372:12;19352:34;19420:6;19409:9;19405:22;19395:32;;19465:7;19458:4;19454:2;19450:13;19446:27;19436:55;;19487:1;19484;19477:12;19436:55;19523:2;19510:16;19546:85;19562:68;19627:2;19562:68;:::i;19546:85::-;19665:15;;;19747:1;19743:10;;;;19735:19;;19731:28;;;19696:12;;;;19771:19;;;19768:39;;;19803:1;19800;19793:12;19768:39;19835:2;19831;19827:11;19847:386;19863:6;19858:3;19855:15;19847:386;;;19949:3;19936:17;19985:2;19972:11;19969:19;19966:109;;;20029:1;20058:2;20054;20047:14;19966:109;20100:90;20182:7;20177:2;20163:11;20159:2;20155:20;20151:29;20100:90;:::i;:::-;20088:103;;-1:-1:-1;20211:12:1;;;;19880;;19847:386;;21222:348;21306:6;21359:2;21347:9;21338:7;21334:23;21330:32;21327:52;;;21375:1;21372;21365:12;21327:52;21415:9;21402:23;-1:-1:-1;;;;;21440:6:1;21437:30;21434:50;;;21480:1;21477;21470:12;21434:50;21503:61;21556:7;21547:6;21536:9;21532:22;21503:61;:::i;21575:669::-;21844:10;21881:15;;;21863:34;;21933:15;;21928:2;21913:18;;21906:43;-1:-1:-1;;;;;21985:32:1;;21980:2;21965:18;;21958:60;22066:6;22054:19;;22049:2;22034:18;;22027:47;22118:14;;22111:22;22105:3;22090:19;;22083:51;22171:3;22005;22150:19;;22143:32;;;21815:4;;22192:46;;22218:19;;22210:6;22192:46;:::i;:::-;22184:54;21575:669;-1:-1:-1;;;;;;;;21575:669:1:o;22497:795::-;22592:6;22600;22608;22616;22669:3;22657:9;22648:7;22644:23;22640:33;22637:53;;;22686:1;22683;22676:12;22637:53;22725:9;22712:23;22744:31;22769:5;22744:31;:::i;:::-;22794:5;-1:-1:-1;22851:2:1;22836:18;;22823:32;22864:33;22823:32;22864:33;:::i;:::-;22916:7;-1:-1:-1;22970:2:1;22955:18;;22942:32;;-1:-1:-1;23025:2:1;23010:18;;22997:32;-1:-1:-1;;;;;23041:30:1;;23038:50;;;23084:1;23081;23074:12;23038:50;23107:22;;23160:4;23152:13;;23148:27;-1:-1:-1;23138:55:1;;23189:1;23186;23179:12;23138:55;23212:74;23278:7;23273:2;23260:16;23255:2;23251;23247:11;23212:74;:::i;:::-;23202:84;;;22497:795;;;;;;;:::o;23297:850::-;23419:6;23427;23435;23488:2;23476:9;23467:7;23463:23;23459:32;23456:52;;;23504:1;23501;23494:12;23456:52;23544:9;23531:23;-1:-1:-1;;;;;23614:2:1;23606:6;23603:14;23600:34;;;23630:1;23627;23620:12;23600:34;23653:76;23721:7;23712:6;23701:9;23697:22;23653:76;:::i;:::-;23643:86;;23782:2;23771:9;23767:18;23754:32;23738:48;;23811:2;23801:8;23798:16;23795:36;;;23827:1;23824;23817:12;23795:36;23865:8;23854:9;23850:24;23840:34;;23912:7;23905:4;23901:2;23897:13;23893:27;23883:55;;23934:1;23931;23924:12;23883:55;23974:2;23961:16;24000:2;23992:6;23989:14;23986:34;;;24016:1;24013;24006:12;23986:34;24061:7;24056:2;24047:6;24043:2;24039:15;24035:24;24032:37;24029:57;;;24082:1;24079;24072:12;24029:57;24113:2;24109;24105:11;24095:21;;24135:6;24125:16;;;;;23297:850;;;;;:::o;24152:395::-;24261:6;24314:2;24302:9;24293:7;24289:23;24285:32;24282:52;;;24330:1;24327;24320:12;24282:52;24370:9;24357:23;-1:-1:-1;;;;;24395:6:1;24392:30;24389:50;;;24435:1;24432;24425:12;24389:50;24458:83;24533:7;24524:6;24513:9;24509:22;24458:83;:::i;24552:381::-;24654:6;24707:2;24695:9;24686:7;24682:23;24678:32;24675:52;;;24723:1;24720;24713:12;24675:52;24763:9;24750:23;-1:-1:-1;;;;;24788:6:1;24785:30;24782:50;;;24828:1;24825;24818:12;24782:50;24851:76;24919:7;24910:6;24899:9;24895:22;24851:76;:::i;25127:381::-;25229:6;25282:2;25270:9;25261:7;25257:23;25253:32;25250:52;;;25298:1;25295;25288:12;25250:52;25338:9;25325:23;-1:-1:-1;;;;;25363:6:1;25360:30;25357:50;;;25403:1;25400;25393:12;25357:50;25426:76;25494:7;25485:6;25474:9;25470:22;25426:76;:::i;25513:380::-;25592:1;25588:12;;;;25635;;;25656:61;;25710:4;25702:6;25698:17;25688:27;;25656:61;25763:2;25755:6;25752:14;25732:18;25729:38;25726:161;;;25809:10;25804:3;25800:20;25797:1;25790:31;25844:4;25841:1;25834:15;25872:4;25869:1;25862:15;25726:161;;25513:380;;;:::o;27138:340::-;27340:2;27322:21;;;27379:2;27359:18;;;27352:30;-1:-1:-1;;;27413:2:1;27398:18;;27391:46;27469:2;27454:18;;27138:340::o;27483:345::-;27685:2;27667:21;;;27724:2;27704:18;;;27697:30;-1:-1:-1;;;27758:2:1;27743:18;;27736:51;27819:2;27804:18;;27483:345::o;28173:127::-;28234:10;28229:3;28225:20;28222:1;28215:31;28265:4;28262:1;28255:15;28289:4;28286:1;28279:15;28991:127;29052:10;29047:3;29043:20;29040:1;29033:31;29083:4;29080:1;29073:15;29107:4;29104:1;29097:15;29123:201;29161:3;29189:10;29234:2;29227:5;29223:14;29261:2;29252:7;29249:15;29246:41;;;29267:18;;:::i;:::-;29316:1;29303:15;;29123:201;-1:-1:-1;;;29123:201:1:o;29329:356::-;29531:2;29513:21;;;29550:18;;;29543:30;29609:34;29604:2;29589:18;;29582:62;29676:2;29661:18;;29329:356::o;29690:413::-;29892:2;29874:21;;;29931:2;29911:18;;;29904:30;29970:34;29965:2;29950:18;;29943:62;-1:-1:-1;;;30036:2:1;30021:18;;30014:47;30093:3;30078:19;;29690:413::o;30449:184::-;30519:6;30572:2;30560:9;30551:7;30547:23;30543:32;30540:52;;;30588:1;30585;30578:12;30540:52;-1:-1:-1;30611:16:1;;30449:184;-1:-1:-1;30449:184:1:o;30982:347::-;31184:2;31166:21;;;31223:2;31203:18;;;31196:30;31262:25;31257:2;31242:18;;31235:53;31320:2;31305:18;;30982:347::o;32399:336::-;32601:2;32583:21;;;32640:2;32620:18;;;32613:30;-1:-1:-1;;;32674:2:1;32659:18;;32652:42;32726:2;32711:18;;32399:336::o;33070:273::-;33138:6;33191:2;33179:9;33170:7;33166:23;33162:32;33159:52;;;33207:1;33204;33197:12;33159:52;33239:9;33233:16;33289:4;33282:5;33278:16;33271:5;33268:27;33258:55;;33309:1;33306;33299:12;33689:636;33769:6;33822:2;33810:9;33801:7;33797:23;33793:32;33790:52;;;33838:1;33835;33828:12;33790:52;33871:9;33865:16;-1:-1:-1;;;;;33896:6:1;33893:30;33890:50;;;33936:1;33933;33926:12;33890:50;33959:22;;34012:4;34004:13;;34000:27;-1:-1:-1;33990:55:1;;34041:1;34038;34031:12;33990:55;34070:2;34064:9;34095:49;34111:32;34140:2;34111:32;:::i;34095:49::-;34167:2;34160:5;34153:17;34207:7;34202:2;34197;34193;34189:11;34185:20;34182:33;34179:53;;;34228:1;34225;34218:12;34179:53;34241:54;34292:2;34287;34280:5;34276:14;34271:2;34267;34263:11;34241:54;:::i;34330:276::-;34461:3;34499:6;34493:13;34515:53;34561:6;34556:3;34549:4;34541:6;34537:17;34515:53;:::i;:::-;34584:16;;;;;34330:276;-1:-1:-1;;34330:276:1:o;37095:632::-;37266:2;37318:21;;;37388:13;;37291:18;;;37410:22;;;37237:4;;37266:2;37489:15;;;;37463:2;37448:18;;;37237:4;37532:169;37546:6;37543:1;37540:13;37532:169;;;37607:13;;37595:26;;37676:15;;;;37641:12;;;;37568:1;37561:9;37532:169;;;-1:-1:-1;37718:3:1;;37095:632;-1:-1:-1;;;;;;37095:632:1:o;38422:1011::-;38602:3;38640:6;38634:13;38666:4;38679:51;38723:6;38718:3;38713:2;38705:6;38701:15;38679:51;:::i;:::-;38761:6;38756:3;38752:16;38739:29;;38788:1;38821:6;38815:13;38853:36;38879:9;38853:36;:::i;:::-;38908:1;38925:18;;;38952:110;;;;39076:1;39071:337;;;;38918:490;;38952:110;-1:-1:-1;;38987:24:1;;38973:39;;39032:20;;;;-1:-1:-1;38952:110:1;;39071:337;39102:6;39099:1;39092:17;39150:2;39147:1;39137:16;39175:1;39189:169;39203:8;39200:1;39197:15;39189:169;;;39285:14;;39270:13;;;39263:37;39328:16;;;;39220:10;;39189:169;;;39193:3;;39389:8;39382:5;39378:20;39371:27;;38918:490;-1:-1:-1;39424:3:1;;38422:1011;-1:-1:-1;;;;;;;;;38422:1011:1:o;41158:245::-;41225:6;41278:2;41266:9;41257:7;41253:23;41249:32;41246:52;;;41294:1;41291;41284:12;41246:52;41326:9;41320:16;41345:28;41367:5;41345:28;:::i;42160:125::-;42200:4;42228:1;42225;42222:8;42219:34;;;42233:18;;:::i;:::-;-1:-1:-1;42270:9:1;;42160:125::o;42975:533::-;43232:6;43221:9;43214:25;43287:10;43279:6;43275:23;43270:2;43259:9;43255:18;43248:51;43347:6;43339;43335:19;43330:2;43319:9;43315:18;43308:47;43391:3;43386:2;43375:9;43371:18;43364:31;43195:4;43412:46;43453:3;43442:9;43438:19;43430:6;43412:46;:::i;:::-;43404:54;;43495:6;43489:3;43478:9;43474:19;43467:35;42975:533;;;;;;;;:::o;45786:128::-;45826:3;45857:1;45853:6;45850:1;45847:13;45844:39;;;45863:18;;:::i;:::-;-1:-1:-1;45899:9:1;;45786:128::o;46255:266::-;46294:7;46326:14;46367:2;46364:1;46360:10;46397:2;46394:1;46390:10;46453:3;46449:2;46445:12;46440:3;46437:21;46430:3;46423:11;46416:19;46412:47;46409:73;;;46462:18;;:::i;:::-;46502:13;;46255:266;-1:-1:-1;;;;46255:266:1:o;46526:168::-;46566:7;46632:1;46628;46624:6;46620:14;46617:1;46614:21;46609:1;46602:9;46595:17;46591:45;46588:71;;;46639:18;;:::i;:::-;-1:-1:-1;46679:9:1;;46526:168::o;46699:217::-;46739:1;46765;46755:132;;46809:10;46804:3;46800:20;46797:1;46790:31;46844:4;46841:1;46834:15;46872:4;46869:1;46862:15;46755:132;-1:-1:-1;46901:9:1;;46699:217::o;46921:135::-;46960:3;-1:-1:-1;;46981:17:1;;46978:43;;;47001:18;;:::i;:::-;-1:-1:-1;47048:1:1;47037:13;;46921:135::o;48926:641::-;49187:25;;;-1:-1:-1;;;;;49248:32:1;;49243:2;49228:18;;49221:60;49329:10;49317:23;;49312:2;49297:18;;49290:51;49389:6;49377:19;;49372:2;49357:18;;49350:47;49441:14;;49434:22;49428:3;49413:19;;49406:51;49494:3;49268;49473:19;;49466:32;;;-1:-1:-1;;49515:46:1;;49541:19;;49533:6;49515:46;:::i;50968:228::-;51007:3;51035:10;51072:2;51069:1;51065:10;51102:2;51099:1;51095:10;51133:3;51129:2;51125:12;51120:3;51117:21;51114:47;;;51141:18;;:::i;:::-;51177:13;;50968:228;-1:-1:-1;;;;50968:228:1:o;51201:1256::-;51457:6;51446:9;51439:25;51420:4;51483:2;51550:1;51546;51541:3;51537:11;51533:19;51525:6;51521:32;51516:2;51505:9;51501:18;51494:60;51602:10;51594:6;51590:23;51585:2;51574:9;51570:18;51563:51;51650:3;51645:2;51634:9;51630:18;51623:31;51674:1;51707:6;51701:13;51737:36;51763:9;51737:36;:::i;:::-;51810:6;51804:3;51793:9;51789:19;51782:35;51836:3;51858:1;51890:2;51879:9;51875:18;51907:1;51902:122;;;;52038:1;52033:354;;;;51868:519;;51902:122;-1:-1:-1;;51950:24:1;;51930:18;;;51923:52;52010:3;51995:19;;;-1:-1:-1;51902:122:1;;52033:354;52064:6;52061:1;52054:17;52112:2;52109:1;52099:16;52137:1;52151:180;52165:6;52162:1;52159:13;52151:180;;;52258:14;;52234:17;;;52230:26;;52223:50;52301:16;;;;52180:10;;52151:180;;;52355:17;;52351:26;;;-1:-1:-1;;51868:519:1;-1:-1:-1;;;;;52438:3:1;52423:19;;;;52416:35;;;;-1:-1:-1;52404:3:1;51201:1256;-1:-1:-1;;;;;51201:1256:1:o;52797:414::-;52999:2;52981:21;;;53038:2;53018:18;;;53011:30;53077:34;53072:2;53057:18;;53050:62;-1:-1:-1;;;53143:2:1;53128:18;;53121:48;53201:3;53186:19;;52797:414::o;55642:251::-;55712:6;55765:2;55753:9;55744:7;55740:23;55736:32;55733:52;;;55781:1;55778;55771:12;55733:52;55813:9;55807:16;55832:31;55857:5;55832:31;:::i;56616:489::-;-1:-1:-1;;;;;56885:15:1;;;56867:34;;56937:15;;56932:2;56917:18;;56910:43;56984:2;56969:18;;56962:34;;;57032:3;57027:2;57012:18;;57005:31;;;56810:4;;57053:46;;57079:19;;57071:6;57053:46;:::i;:::-;57045:54;56616:489;-1:-1:-1;;;;;;56616:489:1:o;57110:249::-;57179:6;57232:2;57220:9;57211:7;57207:23;57203:32;57200:52;;;57248:1;57245;57238:12;57200:52;57280:9;57274:16;57299:30;57323:5;57299:30;:::i;57364:127::-;57425:10;57420:3;57416:20;57413:1;57406:31;57456:4;57453:1;57446:15;57480:4;57477:1;57470:15
Swarm Source
ipfs://8fd144566d083799c849aca77f5fe8aada564c1f676b847de868e42d646c12a3
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.