Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 10 internal transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0xFE6Bf013...6975152aa The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
CreatorTokenTransferValidator
Compiler Version
v0.8.24-1.0.1
ZkSolc Version
v1.5.7
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.24; import "./Constants.sol"; import "./DataTypes.sol"; import "./ZkTstorish.sol"; import "@limitbreak/permit-c/PermitC.sol"; import "@limitbreak/tm-core-lib/src/utils/introspection/ERC165.sol"; import "@limitbreak/tm-core-lib/src/utils/structs/EnumerableSet.sol"; import "@limitbreak/tm-core-lib/src/utils/token/IEOARegistry.sol"; import "@limitbreak/tm-core-lib/src/utils/token/ITransferValidator.sol"; /** * @title CreatorTokenTransferValidator * @author Limit Break, Inc. * @notice The CreatorTokenTransferValidator contract is designed to provide a customizable and secure transfer * validation mechanism for NFT collections. This contract allows the owner of an NFT collection to configure * the transfer security level, blacklisted accounts and codehashes, whitelisted accounts and codehashes, and * authorized accounts and codehashes for each collection. * * @dev <h4>Features</h4> * - Transfer security levels: Provides different levels of transfer security, * from open transfers to completely restricted transfers. * - Blacklist: Allows the owner of a collection to blacklist specific operator addresses or codehashes * from executing transfers on behalf of others. * - Whitelist: Allows the owner of a collection to whitelist specific operator addresses or codehashes * permitted to execute transfers on behalf of others or send/receive tokens when otherwise disabled by * security policy. * - Authorizers: Allows the owner of a collection to enable authorizer contracts, that can perform * authorization-based filtering of transfers. * * @dev <h4>Benefits</h4> * - Enhanced security: Allows creators to have more control over their NFT collections, ensuring the safety * and integrity of their assets. * - Flexibility: Provides collection owners the ability to customize transfer rules as per their requirements. * - Compliance: Facilitates compliance with regulations by enabling creators to restrict transfers based on * specific criteria. * * @dev <h4>Intended Usage</h4> * - The CreatorTokenTransferValidatorV3 contract is intended to be used by NFT collection owners to manage and * enforce transfer policies. This contract is integrated with the following varations of creator token * NFT contracts to validate transfers according to the defined security policies. * * - ERC721-C: Creator token implenting OpenZeppelin's ERC-721 standard. * - ERC721-AC: Creator token implenting Azuki's ERC-721A standard. * - ERC721-CW: Creator token implementing OpenZeppelin's ERC-721 standard with opt-in staking to * wrap/upgrade a pre-existing ERC-721 collection. * - ERC721-ACW: Creator token implementing Azuki's ERC721-A standard with opt-in staking to * wrap/upgrade a pre-existing ERC-721 collection. * - ERC1155-C: Creator token implenting OpenZeppelin's ERC-1155 standard. * - ERC1155-CW: Creator token implementing OpenZeppelin's ERC-1155 standard with opt-in staking to * wrap/upgrade a pre-existing ERC-1155 collection. * * <h4>Transfer Security Levels</h4> * - Recommended: Recommended defaults are same as Level 3 (Whitelisting with OTC Enabled). * - Caller Constraints: OperatorWhitelistEnableOTC * - Receiver Constraints: None * - Level 1: No transfer restrictions. * - Caller Constraints: None * - Receiver Constraints: None * - Level 2: Only non-blacklisted operators can initiate transfers, over-the-counter (OTC) trading enabled. * - Caller Constraints: OperatorBlacklistEnableOTC * - Receiver Constraints: None * - Level 3: Only whitelisted accounts can initiate transfers, over-the-counter (OTC) trading enabled. * - Caller Constraints: OperatorWhitelistEnableOTC * - Receiver Constraints: None * - Level 4: Only whitelisted accounts can initiate transfers, over-the-counter (OTC) trading disabled. * - Caller Constraints: OperatorWhitelistDisableOTC * - Receiver Constraints: None * - Level 5: Only whitelisted accounts can initiate transfers, over-the-counter (OTC) trading enabled. * Transfers to contracts with code are not allowed, unless present on the whitelist. * - Caller Constraints: OperatorWhitelistEnableOTC * - Receiver Constraints: NoCode * - Level 6: Only whitelisted accounts can initiate transfers, over-the-counter (OTC) trading enabled. * Transfers are allowed only to Externally Owned Accounts (EOAs), unless present on the whitelist. * - Caller Constraints: OperatorWhitelistEnableOTC * - Receiver Constraints: EOA * - Level 7: Only whitelisted accounts can initiate transfers, over-the-counter (OTC) trading disabled. * Transfers to contracts with code are not allowed, unless present on the whitelist. * - Caller Constraints: OperatorWhitelistDisableOTC * - Receiver Constraints: NoCode * - Level 8: Only whitelisted accounts can initiate transfers, over-the-counter (OTC) trading disabled. * Transfers are allowed only to Externally Owned Accounts (EOAs), unless present on the whitelist. * - Caller Constraints: OperatorWhitelistDisableOTC * - Receiver Constraints: EOA * - Level 9: Soulbound Token, No Transfers Allowed. */ contract CreatorTokenTransferValidator is IEOARegistry, ITransferValidator, ERC165, ZkTstorish, PermitC { using EnumerableSet for EnumerableSet.AddressSet; using EnumerableSet for EnumerableSet.Bytes32Set; /*************************************************************************/ /* CUSTOM ERRORS */ /*************************************************************************/ /// @dev Thrown when attempting to set a list id that does not exist. error CreatorTokenTransferValidator__ListDoesNotExist(); /// @dev Thrown when attempting to transfer the ownership of a list to the zero address. error CreatorTokenTransferValidator__ListOwnershipCannotBeTransferredToZeroAddress(); /// @dev Thrown when attempting to call a function that requires the caller to be the list owner. error CreatorTokenTransferValidator__CallerDoesNotOwnList(); /// @dev Thrown when validating a transfer for a collection using whitelists and the operator is not on the whitelist. error CreatorTokenTransferValidator__CallerMustBeWhitelisted(); /// @dev Thrown when authorizing a transfer for a collection using authorizers and the msg.sender is not in the authorizer list. error CreatorTokenTransferValidator__CallerMustBeAnAuthorizer(); /// @dev Thrown when attempting to call a function that requires owner or default admin role for a collection that the caller does not have. error CreatorTokenTransferValidator__CallerMustHaveElevatedPermissionsForSpecifiedNFT(); /// @dev Thrown when attempting to renounce or transfer ownership of the default list id. error CreatorTokenTransferValidator__CannotReassignOwnershipOfDefaultList(); /// @dev Thrown when constructor args are not valid error CreatorTokenTransferValidator__InvalidConstructorArgs(); /// @dev Thrown when setting the transfer security level to an invalid value. error CreatorTokenTransferValidator__InvalidTransferSecurityLevel(); /// @dev Thrown when validating a transfer for a collection using blacklists and the operator is on the blacklist. error CreatorTokenTransferValidator__OperatorIsBlacklisted(); /// @dev Thrown when validating a transfer for a collection that does not allow receiver to have code and the receiver has code. error CreatorTokenTransferValidator__ReceiverMustNotHaveDeployedCode(); /// @dev Thrown when validating a transfer for a collection that requires receivers be verified EOAs and the receiver is not verified. error CreatorTokenTransferValidator__ReceiverProofOfEOASignatureUnverified(); /// @dev Thrown when a frozen account is the receiver of a transfer error CreatorTokenTransferValidator__ReceiverAccountIsFrozen(); /// @dev Thrown when a frozen account is the sender of a transfer error CreatorTokenTransferValidator__SenderAccountIsFrozen(); /// @dev Thrown when validating a transfer for a collection that is in soulbound token mode. error CreatorTokenTransferValidator__TokenIsSoulbound(); /// @dev Thrown when an authorizer attempts to set a wildcard authorized operator on collections that don't allow wildcards error CreatorTokenTransferValidator__WildcardOperatorsCannotBeAuthorizedForCollection(); /// @dev Thrown when attempting to set a authorized operator when authorization mode is disabled. error CreatorTokenTransferValidator__AuthorizationDisabledForCollection(); /// @dev Thrown when attempting to validate a permitted transfer where the permit type does not match the collection-defined token type. error CreatorTokenTransferValidator__TokenTypesDoNotMatch(); /*************************************************************************/ /* EVENTS */ /*************************************************************************/ /// @dev Emitted when a new list is created. event CreatedList(uint256 indexed id, string name); /// @dev Emitted when a list is applied to a collection. event AppliedListToCollection(address indexed collection, uint120 indexed id); /// @dev Emitted when the ownership of a list is transferred to a new owner. event ReassignedListOwnership(uint256 indexed id, address indexed newOwner); /// @dev Emitted when an account is added to the list of frozen accounts for a collection. event AccountFrozenForCollection(address indexed collection, address indexed account); /// @dev Emitted when an account is removed from the list of frozen accounts for a collection. event AccountUnfrozenForCollection(address indexed collection, address indexed account); /// @dev Emitted when an address is added to a list. event AddedAccountToList(uint8 indexed kind, uint256 indexed id, address indexed account); /// @dev Emitted when a codehash is added to a list. event AddedCodeHashToList(uint8 indexed kind, uint256 indexed id, bytes32 indexed codehash); /// @dev Emitted when an address is removed from a list. event RemovedAccountFromList(uint8 indexed kind, uint256 indexed id, address indexed account); /// @dev Emitted when a codehash is removed from a list. event RemovedCodeHashFromList(uint8 indexed kind, uint256 indexed id, bytes32 indexed codehash); /// @dev Emitted when the security level for a collection is updated. event SetTransferSecurityLevel(address indexed collection, uint8 level); /// @dev Emitted when a collection updates its authorization mode. event SetAuthorizationModeEnabled(address indexed collection, bool disabled, bool authorizersCannotSetWildcardOperators); /// @dev Emitted when a collection turns account freezing on or off. event SetAccountFreezingModeEnabled(address indexed collection, bool enabled); /// @dev Emitted when a collection's token type is updated. event SetTokenType(address indexed collection, uint16 tokenType); /*************************************************************************/ /* STRUCTS */ /*************************************************************************/ /** * @dev This struct is internally for the storage of account and codehash lists. */ struct List { EnumerableSet.AddressSet enumerableAccounts; EnumerableSet.Bytes32Set enumerableCodehashes; mapping (address => bool) nonEnumerableAccounts; mapping (bytes32 => bool) nonEnumerableCodehashes; } /** * @dev This struct is internally for the storage of account lists. */ struct AccountList { EnumerableSet.AddressSet enumerableAccounts; mapping (address => bool) nonEnumerableAccounts; } /*************************************************************************/ /* CONSTANTS */ /*************************************************************************/ /// @dev Immutable lookup table for constant gas determination of caller constraints by security level. /// @dev Created during contract construction using defined constants. uint256 private immutable _callerConstraintsLookup; /// @dev Immutable lookup table for constant gas determination of receiver constraints by security level. /// @dev Created during contract construction using defined constants. uint256 private immutable _receiverConstraintsLookup; /// @dev The address of the EOA Registry to use to validate an account is a verified EOA. address private immutable _eoaRegistry; /// @dev The legacy Creator Token Transfer Validator Interface bytes4 private constant LEGACY_TRANSFER_VALIDATOR_INTERFACE_ID = 0x00000000; /// @dev The default admin role value for contracts that implement access control. bytes32 private constant DEFAULT_ACCESS_CONTROL_ADMIN_ROLE = 0x00; /// @dev Value representing a zero value code hash. bytes32 private constant BYTES32_ZERO = 0x0000000000000000000000000000000000000000000000000000000000000000; address private constant WILDCARD_OPERATOR_ADDRESS = address(0x01); uint16 private constant DEFAULT_TOKEN_TYPE = 0; /*************************************************************************/ /* STORAGE */ /*************************************************************************/ /// @notice Keeps track of the most recently created list id. uint120 public lastListId; /// @dev Used as a collision guard. uint256 private _transientOperatorSlotHolder; /// @notice Mapping of list ids to list owners mapping (uint120 => address) public listOwners; /// @dev Mapping of collection addresses to their security policy settings mapping (address => CollectionSecurityPolicyV3) internal collectionSecurityPolicies; /// @dev Mapping of list ids to blacklist settings mapping (uint120 => List) internal blacklists; /// @dev Mapping of list ids to whitelist settings mapping (uint120 => List) internal whitelists; /// @dev Mapping of list ids to authorizers mapping (uint120 => List) internal authorizers; /// @dev Mapping of collections to accounts that are frozen for those collections mapping (address => AccountList) internal frozenAccounts; constructor( address defaultOwner, address eoaRegistry_, string memory name, string memory version ) ZkTstorish() PermitC( name, version, defaultOwner, block.chainid == 1 ? 0.33 ether : 0.01 ether ) { if (defaultOwner == address(0) || eoaRegistry_ == address(0)) { revert CreatorTokenTransferValidator__InvalidConstructorArgs(); } _createDefaultList(defaultOwner); _eoaRegistry = eoaRegistry_; _callerConstraintsLookup = _constructCallerConstraintsTable(); _receiverConstraintsLookup = _constructReceiverConstraintsTable(); } /** * @dev This function is only called during contract construction to create the default list. */ function _createDefaultList(address defaultOwner) internal { uint120 id = 0; listOwners[id] = defaultOwner; emit CreatedList(id, "DEFAULT LIST"); emit ReassignedListOwnership(id, defaultOwner); } /** * @dev This function is only called during contract construction to create the caller constraints * @dev lookup table. */ function _constructCallerConstraintsTable() internal pure returns (uint256) { return (CALLER_CONSTRAINTS_OPERATOR_WHITELIST_ENABLE_OTC << (TRANSFER_SECURITY_LEVEL_RECOMMENDED << 3)) | (CALLER_CONSTRAINTS_NONE << (TRANSFER_SECURITY_LEVEL_ONE << 3)) | (CALLER_CONSTRAINTS_OPERATOR_BLACKLIST_ENABLE_OTC << (TRANSFER_SECURITY_LEVEL_TWO << 3)) | (CALLER_CONSTRAINTS_OPERATOR_WHITELIST_ENABLE_OTC << (TRANSFER_SECURITY_LEVEL_THREE << 3)) | (CALLER_CONSTRAINTS_OPERATOR_WHITELIST_DISABLE_OTC << (TRANSFER_SECURITY_LEVEL_FOUR << 3)) | (CALLER_CONSTRAINTS_OPERATOR_WHITELIST_ENABLE_OTC << (TRANSFER_SECURITY_LEVEL_FIVE << 3)) | (CALLER_CONSTRAINTS_OPERATOR_WHITELIST_ENABLE_OTC << (TRANSFER_SECURITY_LEVEL_SIX << 3)) | (CALLER_CONSTRAINTS_OPERATOR_WHITELIST_DISABLE_OTC << (TRANSFER_SECURITY_LEVEL_SEVEN << 3)) | (CALLER_CONSTRAINTS_OPERATOR_WHITELIST_DISABLE_OTC << (TRANSFER_SECURITY_LEVEL_EIGHT << 3)) | (CALLER_CONSTRAINTS_SBT << (TRANSFER_SECURITY_LEVEL_NINE << 3)); } /** * @dev This function is only called during contract construction to create the receiver constraints * @dev lookup table. */ function _constructReceiverConstraintsTable() internal pure returns (uint256) { return (RECEIVER_CONSTRAINTS_NONE << (TRANSFER_SECURITY_LEVEL_RECOMMENDED << 3)) | (RECEIVER_CONSTRAINTS_NONE << (TRANSFER_SECURITY_LEVEL_ONE << 3)) | (RECEIVER_CONSTRAINTS_NONE << (TRANSFER_SECURITY_LEVEL_TWO << 3)) | (RECEIVER_CONSTRAINTS_NONE << (TRANSFER_SECURITY_LEVEL_THREE << 3)) | (RECEIVER_CONSTRAINTS_NONE << (TRANSFER_SECURITY_LEVEL_FOUR << 3)) | (RECEIVER_CONSTRAINTS_NO_CODE << (TRANSFER_SECURITY_LEVEL_FIVE << 3)) | (RECEIVER_CONSTRAINTS_EOA << (TRANSFER_SECURITY_LEVEL_SIX << 3)) | (RECEIVER_CONSTRAINTS_NO_CODE << (TRANSFER_SECURITY_LEVEL_SEVEN << 3)) | (RECEIVER_CONSTRAINTS_EOA << (TRANSFER_SECURITY_LEVEL_EIGHT << 3)) | (RECEIVER_CONSTRAINTS_SBT << (TRANSFER_SECURITY_LEVEL_NINE << 3)); } /*************************************************************************/ /* MODIFIERS */ /*************************************************************************/ /** * @dev This modifier restricts a function call to the owner of the list `id`. * @dev Throws when the caller is not the list owner. */ modifier onlyListOwner(uint120 id) { _requireCallerOwnsList(id); _; } /*************************************************************************/ /* APPLY TRANSFER POLICIES */ /*************************************************************************/ /** * @notice Apply the collection transfer policy to a transfer operation of a creator token. * * @dev If the caller is self (Permit-C Processor) it means we have already applied operator validation in the * _beforeTransferFrom callback. In this case, the security policy was already applied and the operator * that used the Permit-C processor passed the security policy check and transfer can be safely allowed. * * @dev The order of checking whitelisted accounts, authorized operator check and whitelisted codehashes * is very deliberate. The order of operations is determined by the most frequently used settings that are * expected in the wild. * * @dev Throws when the collection has enabled account freezing mode and either the `from` or `to` addresses * are on the list of frozen accounts for the collection. * @dev Throws when the collection is set to Level 9 - Soulbound Token. * @dev Throws when the receiver has deployed code and isn't whitelisted, if ReceiverConstraints.NoCode is set * and the transfer is not approved by an authorizer for the collection. * @dev Throws when the receiver has never verified a signature to prove they are an EOA and the receiver * isn't whitelisted, if the ReceiverConstraints.EOA is set and the transfer is not approved by an * authorizer for the collection.. * @dev Throws when `msg.sender` is blacklisted, if CallerConstraints.OperatorBlacklistEnableOTC is set, unless * `msg.sender` is also the `from` address or the transfer is approved by an authorizer for the collection. * @dev Throws when `msg.sender` isn't whitelisted, if CallerConstraints.OperatorWhitelistEnableOTC is set, unless * `msg.sender` is also the `from` address or the transfer is approved by an authorizer for the collection. * @dev Throws when neither `msg.sender` nor `from` are whitelisted, if * CallerConstraints.OperatorWhitelistDisableOTC is set and the transfer * is not approved by an authorizer for the collection. * * @dev <h4>Postconditions:</h4> * 1. Transfer is allowed or denied based on the applied transfer policy. * * @param caller The address initiating the transfer. * @param from The address of the token owner. * @param to The address of the token receiver. */ function validateTransfer(address caller, address from, address to) public view { (bytes4 errorSelector,) = _validateTransfer(_callerAuthorizedCheckCollection, msg.sender, caller, from, to, 0); if (errorSelector != SELECTOR_NO_ERROR) { _revertCustomErrorSelectorAsm(errorSelector); } } /** * @notice Apply the collection transfer policy to a transfer operation of a creator token. * * @dev If the caller is self (Permit-C Processor) it means we have already applied operator validation in the * _beforeTransferFrom callback. In this case, the security policy was already applied and the operator * that used the Permit-C processor passed the security policy check and transfer can be safely allowed. * * @dev The order of checking whitelisted accounts, authorized operator check and whitelisted codehashes * is very deliberate. The order of operations is determined by the most frequently used settings that are * expected in the wild. * * @dev Throws when the collection has enabled account freezing mode and either the `from` or `to` addresses * are on the list of frozen accounts for the collection. * @dev Throws when the collection is set to Level 9 - Soulbound Token. * @dev Throws when the receiver has deployed code and isn't whitelisted, if ReceiverConstraints.NoCode is set * and the transfer is not approved by an authorizer for the collection. * @dev Throws when the receiver has never verified a signature to prove they are an EOA and the receiver * isn't whitelisted, if the ReceiverConstraints.EOA is set and the transfer is not approved by an * authorizer for the collection.. * @dev Throws when `msg.sender` is blacklisted, if CallerConstraints.OperatorBlacklistEnableOTC is set, unless * `msg.sender` is also the `from` address or the transfer is approved by an authorizer for the collection. * @dev Throws when `msg.sender` isn't whitelisted, if CallerConstraints.OperatorWhitelistEnableOTC is set, unless * `msg.sender` is also the `from` address or the transfer is approved by an authorizer for the collection. * @dev Throws when neither `msg.sender` nor `from` are whitelisted, if * CallerConstraints.OperatorWhitelistDisableOTC is set and the transfer * is not approved by an authorizer for the collection. * * @dev <h4>Postconditions:</h4> * 1. Transfer is allowed or denied based on the applied transfer policy. * * @param caller The address initiating the transfer. * @param from The address of the token owner. * @param to The address of the token receiver. * @param tokenId The token id being transferred. */ function validateTransfer(address caller, address from, address to, uint256 tokenId) public view { (bytes4 errorSelector,) = _validateTransfer(_callerAuthorizedCheckToken, msg.sender, caller, from, to, tokenId); if (errorSelector != SELECTOR_NO_ERROR) { _revertCustomErrorSelectorAsm(errorSelector); } } /** * @notice Apply the collection transfer policy to a transfer operation of a creator token. * * @dev If the caller is self (Permit-C Processor) it means we have already applied operator validation in the * _beforeTransferFrom callback. In this case, the security policy was already applied and the operator * that used the Permit-C processor passed the security policy check and transfer can be safely allowed. * * @dev The order of checking whitelisted accounts, authorized operator check and whitelisted codehashes * is very deliberate. The order of operations is determined by the most frequently used settings that are * expected in the wild. * * @dev Throws when the collection has enabled account freezing mode and either the `from` or `to` addresses * are on the list of frozen accounts for the collection. * @dev Throws when the collection is set to Level 9 - Soulbound Token. * @dev Throws when the receiver has deployed code and isn't whitelisted, if ReceiverConstraints.NoCode is set * and the transfer is not approved by an authorizer for the collection. * @dev Throws when the receiver has never verified a signature to prove they are an EOA and the receiver * isn't whitelisted, if the ReceiverConstraints.EOA is set and the transfer is not approved by an * authorizer for the collection.. * @dev Throws when `msg.sender` is blacklisted, if CallerConstraints.OperatorBlacklistEnableOTC is set, unless * `msg.sender` is also the `from` address or the transfer is approved by an authorizer for the collection. * @dev Throws when `msg.sender` isn't whitelisted, if CallerConstraints.OperatorWhitelistEnableOTC is set, unless * `msg.sender` is also the `from` address or the transfer is approved by an authorizer for the collection. * @dev Throws when neither `msg.sender` nor `from` are whitelisted, if * CallerConstraints.OperatorWhitelistDisableOTC is set and the transfer * is not approved by an authorizer for the collection. * * @dev <h4>Postconditions:</h4> * 1. Transfer is allowed or denied based on the applied transfer policy. * * @param caller The address initiating the transfer. * @param from The address of the token owner. * @param to The address of the token receiver. * @param tokenId The token id being transferred. */ function validateTransfer(address caller, address from, address to, uint256 tokenId, uint256 /*amount*/) external { validateTransfer(caller, from, to, tokenId); } /** * @notice Apply the collection transfer policy to a transfer operation of a creator token. * * @dev If the caller is self (Permit-C Processor) it means we have already applied operator validation in the * _beforeTransferFrom callback. In this case, the security policy was already applied and the operator * that used the Permit-C processor passed the security policy check and transfer can be safely allowed. * * @dev The order of checking whitelisted accounts, authorized operator check and whitelisted codehashes * is very deliberate. The order of operations is determined by the most frequently used settings that are * expected in the wild. * * @dev Throws when the collection has enabled account freezing mode and either the `from` or `to` addresses * are on the list of frozen accounts for the collection. * @dev Throws when the collection is set to Level 9 - Soulbound Token. * @dev Throws when the receiver has deployed code and isn't whitelisted, if ReceiverConstraints.NoCode is set * and the transfer is not approved by an authorizer for the collection. * @dev Throws when the receiver has never verified a signature to prove they are an EOA and the receiver * isn't whitelisted, if the ReceiverConstraints.EOA is set and the transfer is not approved by an * authorizer for the collection.. * @dev Throws when `msg.sender` is blacklisted, if CallerConstraints.OperatorBlacklistEnableOTC is set, unless * `msg.sender` is also the `from` address or the transfer is approved by an authorizer for the collection. * @dev Throws when `msg.sender` isn't whitelisted, if CallerConstraints.OperatorWhitelistEnableOTC is set, unless * `msg.sender` is also the `from` address or the transfer is approved by an authorizer for the collection. * @dev Throws when neither `msg.sender` nor `from` are whitelisted, if * CallerConstraints.OperatorWhitelistDisableOTC is set and the transfer * is not approved by an authorizer for the collection. * * @dev <h4>Postconditions:</h4> * 1. Transfer is allowed or denied based on the applied transfer policy. * * @param caller The address initiating the transfer. * @param from The address of the token owner. * @param to The address of the token receiver. */ function applyCollectionTransferPolicy(address caller, address from, address to) external view { validateTransfer(caller, from, to); } /** * @notice Returns the caller and receiver constraints for the specified transfer security level. * * @param level The transfer security level to return the caller and receiver constraints for. * * @return callerConstraints The `CallerConstraints` value for the level. * @return receiverConstraints The `ReceiverConstraints` value for the level. */ function transferSecurityPolicies( uint256 level ) public view returns (uint256 callerConstraints, uint256 receiverConstraints) { callerConstraints = uint8((_callerConstraintsLookup >> (level << 3))); receiverConstraints = uint8((_receiverConstraintsLookup >> (level << 3))); } /** * @notice Sets an operator for an authorized transfer that skips transfer security level * validation for caller and receiver constraints. * * @dev An authorizer *MUST* clear the authorization with a call to `afterAuthorizedTransfer` * to prevent unauthorized transfers of the token. * * @dev Throws when authorization mode is disabled for the collection. * @dev Throws when using the wildcard operator address and the collection does not allow * for wildcard authorized operators. * @dev Throws when the caller is not an allowed authorizer for the collection. * * @dev <h4>Postconditions:</h4> * 1. The `operator` is stored as an authorized operator for transfers. * * @param operator The address of the operator to set as authorized for transfers. * @param token The address of the token to authorize. * @param tokenId The token id to set the authorized operator for. */ function beforeAuthorizedTransfer(address operator, address token, uint256 tokenId) external { _setOperatorInTransientStorage(operator, token, tokenId, false); } /** * @notice Clears the authorized operator for a token to prevent additional transfers that * do not conform to the transfer security level for the token. * * @dev Throws when authorization mode is disabled for the collection. * @dev Throws when using the wildcard operator address and the collection does not allow * for wildcard authorized operators. * @dev Throws when the caller is not an allowed authorizer for the collection. * * @dev <h4>Postconditions:</h4> * 1. The authorized operator for the token is cleared from storage. * * @param token The address of the token to authorize. * @param tokenId The token id to set the authorized operator for. */ function afterAuthorizedTransfer(address token, uint256 tokenId) public { _setOperatorInTransientStorage(address(uint160(uint256(BYTES32_ZERO))), token, tokenId, false); } /** * @notice Sets an operator for an authorized transfer that skips transfer security level * validation for caller and receiver constraints. * @notice This overload of `beforeAuthorizedTransfer` defaults to a tokenId of 0. * * @dev An authorizer *MUST* clear the authorization with a call to `afterAuthorizedTransfer` * to prevent unauthorized transfers of the token. * * @dev Throws when authorization mode is disabled for the collection. * @dev Throws when using the wildcard operator address and the collection does not allow * for wildcard authorized operators. * @dev Throws when the caller is not an allowed authorizer for the collection. * * @dev <h4>Postconditions:</h4> * 1. The `operator` is stored as an authorized operator for transfers. * * @param operator The address of the operator to set as authorized for transfers. * @param token The address of the token to authorize. */ function beforeAuthorizedTransfer(address operator, address token) external { _setOperatorInTransientStorage(operator, token, 0, true); } /** * @notice Clears the authorized operator for a token to prevent additional transfers that * do not conform to the transfer security level for the token. * @notice This overload of `afterAuthorizedTransfer` defaults to a tokenId of 0. * * @dev Throws when authorization mode is disabled for the collection. * @dev Throws when using the wildcard operator address and the collection does not allow * for wildcard authorized operators. * @dev Throws when the caller is not an allowed authorizer for the collection. * * @dev <h4>Postconditions:</h4> * 1. The authorized operator for the token is cleared from storage. * * @param token The address of the token to authorize. */ function afterAuthorizedTransfer(address token) external { afterAuthorizedTransfer(token, 0); } /** * @notice Sets the wildcard operator to authorize any operator to transfer a token while * skipping transfer security level validation for caller and receiver constraints. * * @dev An authorizer *MUST* clear the authorization with a call to `afterAuthorizedTransfer` * to prevent unauthorized transfers of the token. * * @dev Throws when authorization mode is disabled for the collection. * @dev Throws when the collection does not allow for wildcard authorized operators. * @dev Throws when the caller is not an allowed authorizer for the collection. * * @dev <h4>Postconditions:</h4> * 1. The wildcard operator is stored as an authorized operator for transfers. * * @param token The address of the token to authorize. * @param tokenId The token id to set the authorized operator for. */ function beforeAuthorizedTransfer(address token, uint256 tokenId) external { _setOperatorInTransientStorage(WILDCARD_OPERATOR_ADDRESS, token, tokenId, false); } /** * @notice Sets the wildcard operator to authorize any operator to transfer a token while * skipping transfer security level validation for caller and receiver constraints. * * @dev An authorizer *MUST* clear the authorization with a call to `afterAuthorizedTransfer` * to prevent unauthorized transfers of the token. * * @dev Throws when authorization mode is disabled for the collection. * @dev Throws when the collection does not allow for wildcard authorized operators. * @dev Throws when the caller is not an allowed authorizer for the collection. * * @dev <h4>Postconditions:</h4> * 1. The wildcard operator is stored as an authorized operator for transfers. * * @param token The address of the token to authorize. * @param tokenId The token id to set the authorized operator for. */ function beforeAuthorizedTransferWithAmount(address token, uint256 tokenId, uint256 /*amount*/) external { _setOperatorInTransientStorage(WILDCARD_OPERATOR_ADDRESS, token, tokenId, false); } /** * @notice Clears the authorized operator for a token to prevent additional transfers that * do not conform to the transfer security level for the token. * * @dev Throws when authorization mode is disabled for the collection. * @dev Throws when using the wildcard operator address and the collection does not allow * for wildcard authorized operators. * @dev Throws when the caller is not an allowed authorizer for the collection. * * @dev <h4>Postconditions:</h4> * 1. The authorized operator for the token is cleared from storage. * * @param token The address of the token to authorize. * @param tokenId The token id to set the authorized operator for. */ function afterAuthorizedTransferWithAmount(address token, uint256 tokenId) external { afterAuthorizedTransfer(token, tokenId); } /*************************************************************************/ /* LIST MANAGEMENT */ /*************************************************************************/ /** * @notice Creates a new list id. The list id is a handle to allow editing of blacklisted and whitelisted accounts * and codehashes. * * @dev <h4>Postconditions:</h4> * 1. A new list with the specified name is created. * 2. The caller is set as the owner of the new list. * 3. A `CreatedList` event is emitted. * 4. A `ReassignedListOwnership` event is emitted. * * @param name The name of the new list. * @return id The id of the new list. */ function createList(string calldata name) public returns (uint120 id) { unchecked { id = ++lastListId; } listOwners[id] = msg.sender; emit CreatedList(id, name); emit ReassignedListOwnership(id, msg.sender); } /** * @notice Creates a new list id, and copies all blacklisted and whitelisted accounts and codehashes from the * specified source list. * * @dev <h4>Postconditions:</h4> * 1. A new list with the specified name is created. * 2. The caller is set as the owner of the new list. * 3. A `CreatedList` event is emitted. * 4. A `ReassignedListOwnership` event is emitted. * 5. All blacklisted and whitelisted accounts and codehashes from the specified source list are copied * to the new list. * 6. An `AddedAccountToList` event is emitted for each blacklisted and whitelisted account copied. * 7. An `AddedCodeHashToList` event is emitted for each blacklisted and whitelisted codehash copied. * * @param name The name of the new list. * @param sourceListId The id of the source list to copy from. * @return id The id of the new list. */ function createListCopy(string calldata name, uint120 sourceListId) external returns (uint120 id) { unchecked { id = ++lastListId; } unchecked { if (sourceListId > id - 1) { revert CreatorTokenTransferValidator__ListDoesNotExist(); } } listOwners[id] = msg.sender; emit CreatedList(id, name); emit ReassignedListOwnership(id, msg.sender); List storage sourceBlacklist = blacklists[sourceListId]; List storage sourceWhitelist = whitelists[sourceListId]; List storage sourceAuthorizers = authorizers[sourceListId]; List storage targetBlacklist = blacklists[id]; List storage targetWhitelist = whitelists[id]; List storage targetAuthorizers = authorizers[id]; _copyAddressSet(LIST_TYPE_BLACKLIST, id, sourceBlacklist, targetBlacklist); _copyBytes32Set(LIST_TYPE_BLACKLIST, id, sourceBlacklist, targetBlacklist); _copyAddressSet(LIST_TYPE_WHITELIST, id, sourceWhitelist, targetWhitelist); _copyBytes32Set(LIST_TYPE_WHITELIST, id, sourceWhitelist, targetWhitelist); _copyAddressSet(LIST_TYPE_AUTHORIZERS, id, sourceAuthorizers, targetAuthorizers); _copyBytes32Set(LIST_TYPE_AUTHORIZERS, id, sourceAuthorizers, targetAuthorizers); } /** * @notice Transfer ownership of a list to a new owner. * * @dev Throws when the new owner is the zero address. * @dev Throws when the caller does not own the specified list. * @dev Throws when list id is zero (default list). * * @dev <h4>Postconditions:</h4> * 1. The list ownership is transferred to the new owner. * 2. A `ReassignedListOwnership` event is emitted. * * @param id The id of the list. * @param newOwner The address of the new owner. */ function reassignOwnershipOfList(uint120 id, address newOwner) public { if(newOwner == address(0)) { revert CreatorTokenTransferValidator__ListOwnershipCannotBeTransferredToZeroAddress(); } _reassignOwnershipOfList(id, newOwner); } /** * @notice Renounce the ownership of a list, rendering the list immutable. * * @dev Throws when the caller does not own the specified list. * @dev Throws when list id is zero (default list). * * @dev <h4>Postconditions:</h4> * 1. The ownership of the specified list is renounced. * 2. A `ReassignedListOwnership` event is emitted. * * @param id The id of the list. */ function renounceOwnershipOfList(uint120 id) public { _reassignOwnershipOfList(id, address(0)); } /** * @notice Set the transfer security level, authorization mode and account freezing mode settings of a collection. * * @dev Throws when the caller is neither collection contract, nor the owner or admin of the specified collection. * * @dev <h4>Postconditions:</h4> * 1. The transfer security level of the specified collection is set to the new value. * 2. The authorization mode setting of the specified collection is set to the new value. * 3. The authorization wildcard operator mode setting of the specified collection is set to the new value. * 4. The account freezing mode setting of the specified collection is set to the new value. * 5. A `SetTransferSecurityLevel` event is emitted. * 6. A `SetAuthorizationModeEnabled` event is emitted. * 7. A `SetAccountFreezingModeEnabled` event is emitted. * * @param collection The address of the collection. * @param level The new transfer security level to apply. * @param disableAuthorizationMode Flag if the collection allows for authorizer mode. * @param disableWildcardOperators Flag if the authorizer can set wildcard operators. * @param enableAccountFreezingMode Flag if the collection is using account freezing. */ function setTransferSecurityLevelOfCollection( address collection, uint8 level, bool disableAuthorizationMode, bool disableWildcardOperators, bool enableAccountFreezingMode) external { if (level > TRANSFER_SECURITY_LEVEL_NINE) { revert CreatorTokenTransferValidator__InvalidTransferSecurityLevel(); } _requireCallerIsNFTOrContractOwnerOrAdmin(collection); collectionSecurityPolicies[collection].transferSecurityLevel = level; collectionSecurityPolicies[collection].disableAuthorizationMode = disableAuthorizationMode; collectionSecurityPolicies[collection].authorizersCannotSetWildcardOperators = disableWildcardOperators; collectionSecurityPolicies[collection].enableAccountFreezingMode = enableAccountFreezingMode; emit SetTransferSecurityLevel(collection, level); emit SetAuthorizationModeEnabled(collection, disableAuthorizationMode, disableWildcardOperators); emit SetAccountFreezingModeEnabled(collection, enableAccountFreezingMode); } /** * @notice Set the token type setting of a collection. * * @dev Throws when the caller is neither collection contract, nor the owner or admin of the specified collection. * * @dev <h4>Postconditions:</h4> * 1. The token type of the specified collection is set to the new value. * 2. A `SetTokenType` event is emitted. * * @param collection The address of the collection. * @param tokenType The new transfer security level to apply. */ function setTokenTypeOfCollection( address collection, uint16 tokenType ) external { _requireCallerIsNFTOrContractOwnerOrAdmin(collection); collectionSecurityPolicies[collection].tokenType = tokenType; emit SetTokenType(collection, tokenType); } /** * @notice Applies the specified list to a collection. * * @dev Throws when the caller is neither collection contract, nor the owner or admin of the specified collection. * @dev Throws when the specified list id does not exist. * * @dev <h4>Postconditions:</h4> * 1. The list of the specified collection is set to the new value. * 2. An `AppliedListToCollection` event is emitted. * * @param collection The address of the collection. * @param id The id of the operator whitelist. */ function applyListToCollection(address collection, uint120 id) public { _requireCallerIsNFTOrContractOwnerOrAdmin(collection); if (id > lastListId) { revert CreatorTokenTransferValidator__ListDoesNotExist(); } collectionSecurityPolicies[collection].listId = id; emit AppliedListToCollection(collection, id); } /** * @notice Adds accounts to the frozen accounts list of a collection. * * @dev Throws when the caller is neither collection contract, nor the owner or admin of the specified collection. * * @dev <h4>Postconditions:</h4> * 1. The accounts are added to the list of frozen accounts for a collection. * 2. A `AccountFrozenForCollection` event is emitted for each account added to the list. * * @param collection The address of the collection. * @param accountsToFreeze The list of accounts to added to frozen accounts. */ function freezeAccountsForCollection(address collection, address[] calldata accountsToFreeze) external { _requireCallerIsNFTOrContractOwnerOrAdmin(collection); AccountList storage accounts = frozenAccounts[collection]; for (uint256 i = 0; i < accountsToFreeze.length;) { address accountToFreeze = accountsToFreeze[i]; if (accounts.enumerableAccounts.add(accountToFreeze)) { emit AccountFrozenForCollection(collection, accountToFreeze); accounts.nonEnumerableAccounts[accountToFreeze] = true; } unchecked { ++i; } } } /** * @notice Removes accounts to the frozen accounts list of a collection. * * @dev Throws when the caller is neither collection contract, nor the owner or admin of the specified collection. * * @dev <h4>Postconditions:</h4> * 1. The accounts are removed from the list of frozen accounts for a collection. * 2. A `AccountUnfrozenForCollection` event is emitted for each account removed from the list. * * @param collection The address of the collection. * @param accountsToUnfreeze The list of accounts to remove from frozen accounts. */ function unfreezeAccountsForCollection(address collection, address[] calldata accountsToUnfreeze) external { _requireCallerIsNFTOrContractOwnerOrAdmin(collection); AccountList storage accounts = frozenAccounts[collection]; for (uint256 i = 0; i < accountsToUnfreeze.length;) { address accountToUnfreeze = accountsToUnfreeze[i]; if (accounts.enumerableAccounts.remove(accountToUnfreeze)) { emit AccountUnfrozenForCollection(collection, accountToUnfreeze); accounts.nonEnumerableAccounts[accountToUnfreeze] = false; } unchecked { ++i; } } } /** * @notice Get the security policy of the specified collection. * @param collection The address of the collection. * @return The security policy of the specified collection, which includes: * Transfer security level, operator whitelist id, permitted contract receiver allowlist id, * authorizer mode, if authorizer can set a wildcard operator, and if account freezing is * enabled. */ function getCollectionSecurityPolicy( address collection ) external view returns (CollectionSecurityPolicyV3 memory) { return collectionSecurityPolicies[collection]; } /** * @notice Adds one or more accounts to a blacklist. * * @dev Throws when the caller does not own the specified list. * @dev Throws when the accounts array is empty. * * @dev <h4>Postconditions:</h4> * 1. Accounts not previously in the list are added. * 2. An `AddedAccountToList` event is emitted for each account that is newly added to the list. * * @param id The id of the list. * @param accounts The addresses of the accounts to add. */ function addAccountsToBlacklist( uint120 id, address[] calldata accounts ) external { _addAccountsToList(blacklists[id], LIST_TYPE_BLACKLIST, id, accounts); } /** * @notice Adds one or more accounts to a whitelist. * * @dev Throws when the caller does not own the specified list. * @dev Throws when the accounts array is empty. * * @dev <h4>Postconditions:</h4> * 1. Accounts not previously in the list are added. * 2. An `AddedAccountToList` event is emitted for each account that is newly added to the list. * * @param id The id of the list. * @param accounts The addresses of the accounts to add. */ function addAccountsToWhitelist( uint120 id, address[] calldata accounts ) external { _addAccountsToList(whitelists[id], LIST_TYPE_WHITELIST, id, accounts); } /** * @notice Adds one or more accounts to authorizers. * * @dev Throws when the caller does not own the specified list. * @dev Throws when the accounts array is empty. * * @dev <h4>Postconditions:</h4> * 1. Accounts not previously in the list are added. * 2. An `AddedAccountToList` event is emitted for each account that is newly added to the list. * * @param id The id of the list. * @param accounts The addresses of the accounts to add. */ function addAccountsToAuthorizers( uint120 id, address[] calldata accounts ) external { _addAccountsToList(authorizers[id], LIST_TYPE_AUTHORIZERS, id, accounts); } /** * @notice Adds one or more codehashes to a blacklist. * * @dev Throws when the caller does not own the specified list. * @dev Throws when the codehashes array is empty. * @dev Throws when a codehash is zero. * * @dev <h4>Postconditions:</h4> * 1. Codehashes not previously in the list are added. * 2. An `AddedCodeHashToList` event is emitted for each codehash that is newly added to the list. * * @param id The id of the list. * @param codehashes The codehashes to add. */ function addCodeHashesToBlacklist( uint120 id, bytes32[] calldata codehashes ) external { _addCodeHashesToList(blacklists[id], LIST_TYPE_BLACKLIST, id, codehashes); } /** * @notice Adds one or more codehashes to a whitelist. * * @dev Throws when the caller does not own the specified list. * @dev Throws when the codehashes array is empty. * @dev Throws when a codehash is zero. * * @dev <h4>Postconditions:</h4> * 1. Codehashes not previously in the list are added. * 2. An `AddedCodeHashToList` event is emitted for each codehash that is newly added to the list. * * @param id The id of the list. * @param codehashes The codehashes to add. */ function addCodeHashesToWhitelist( uint120 id, bytes32[] calldata codehashes ) external { _addCodeHashesToList(whitelists[id], LIST_TYPE_WHITELIST, id, codehashes); } /** * @notice Removes one or more accounts from a blacklist. * * @dev Throws when the caller does not own the specified list. * @dev Throws when the accounts array is empty. * * @dev <h4>Postconditions:</h4> * 1. Accounts previously in the list are removed. * 2. A `RemovedAccountFromList` event is emitted for each account that is removed from the list. * * @param id The id of the list. * @param accounts The addresses of the accounts to remove. */ function removeAccountsFromBlacklist( uint120 id, address[] calldata accounts ) external { _removeAccountsFromList(blacklists[id], LIST_TYPE_BLACKLIST, id, accounts); } /** * @notice Removes one or more accounts from a whitelist. * * @dev Throws when the caller does not own the specified list. * @dev Throws when the accounts array is empty. * * @dev <h4>Postconditions:</h4> * 1. Accounts previously in the list are removed. * 2. A `RemovedAccountFromList` event is emitted for each account that is removed from the list. * * @param id The id of the list. * @param accounts The addresses of the accounts to remove. */ function removeAccountsFromWhitelist( uint120 id, address[] calldata accounts ) external { _removeAccountsFromList(whitelists[id], LIST_TYPE_WHITELIST, id, accounts); } /** * @notice Removes one or more accounts from authorizers. * * @dev Throws when the caller does not own the specified list. * @dev Throws when the accounts array is empty. * * @dev <h4>Postconditions:</h4> * 1. Accounts previously in the list are removed. * 2. A `RemovedAccountFromList` event is emitted for each account that is removed from the list. * * @param id The id of the list. * @param accounts The addresses of the accounts to remove. */ function removeAccountsFromAuthorizers( uint120 id, address[] calldata accounts ) external { _removeAccountsFromList(authorizers[id], LIST_TYPE_AUTHORIZERS, id, accounts); } /** * @notice Removes one or more codehashes from a blacklist. * * @dev Throws when the caller does not own the specified list. * @dev Throws when the codehashes array is empty. * * @dev <h4>Postconditions:</h4> * 1. Codehashes previously in the list are removed. * 2. A `RemovedCodeHashFromList` event is emitted for each codehash that is removed from the list. * * @param id The id of the list. * @param codehashes The codehashes to remove. */ function removeCodeHashesFromBlacklist( uint120 id, bytes32[] calldata codehashes ) external { _removeCodeHashesFromList(blacklists[id], LIST_TYPE_BLACKLIST, id, codehashes); } /** * @notice Removes one or more codehashes from a whitelist. * * @dev Throws when the caller does not own the specified list. * @dev Throws when the codehashes array is empty. * * @dev <h4>Postconditions:</h4> * 1. Codehashes previously in the list are removed. * 2. A `RemovedCodeHashFromList` event is emitted for each codehash that is removed from the list. * * @param id The id of the list. * @param codehashes The codehashes to remove. */ function removeCodeHashesFromWhitelist( uint120 id, bytes32[] calldata codehashes ) external { _removeCodeHashesFromList(whitelists[id], LIST_TYPE_WHITELIST, id, codehashes); } /** * @notice Get blacklisted accounts by list id. * @param id The id of the list. * @return An array of blacklisted accounts. */ function getBlacklistedAccounts(uint120 id) public view returns (address[] memory) { return blacklists[id].enumerableAccounts.values(); } /** * @notice Get whitelisted accounts by list id. * @param id The id of the list. * @return An array of whitelisted accounts. */ function getWhitelistedAccounts(uint120 id) public view returns (address[] memory) { return whitelists[id].enumerableAccounts.values(); } /** * @notice Get authorizor accounts by list id. * @param id The id of the list. * @return An array of authorizer accounts. */ function getAuthorizerAccounts(uint120 id) public view returns (address[] memory) { return authorizers[id].enumerableAccounts.values(); } /** * @notice Get blacklisted codehashes by list id. * @param id The id of the list. * @return An array of blacklisted codehashes. */ function getBlacklistedCodeHashes(uint120 id) public view returns (bytes32[] memory) { return blacklists[id].enumerableCodehashes.values(); } /** * @notice Get whitelisted codehashes by list id. * @param id The id of the list. * @return An array of whitelisted codehashes. */ function getWhitelistedCodeHashes(uint120 id) public view returns (bytes32[] memory) { return whitelists[id].enumerableCodehashes.values(); } /** * @notice Check if an account is blacklisted in a specified list. * @param id The id of the list. * @param account The address of the account to check. * @return True if the account is blacklisted in the specified list, false otherwise. */ function isAccountBlacklisted(uint120 id, address account) public view returns (bool) { return blacklists[id].nonEnumerableAccounts[account]; } /** * @notice Check if an account is whitelisted in a specified list. * @param id The id of the list. * @param account The address of the account to check. * @return True if the account is whitelisted in the specified list, false otherwise. */ function isAccountWhitelisted(uint120 id, address account) public view returns (bool) { return whitelists[id].nonEnumerableAccounts[account]; } /** * @notice Check if an account is an authorizer in a specified list. * @param id The id of the list. * @param account The address of the account to check. * @return True if the account is an authorizer in the specified list, false otherwise. */ function isAccountAuthorizer(uint120 id, address account) public view returns (bool) { return authorizers[id].nonEnumerableAccounts[account]; } /** * @notice Check if a codehash is blacklisted in a specified list. * @param id The id of the list. * @param codehash The codehash to check. * @return True if the codehash is blacklisted in the specified list, false otherwise. */ function isCodeHashBlacklisted(uint120 id, bytes32 codehash) public view returns (bool) { return blacklists[id].nonEnumerableCodehashes[codehash]; } /** * @notice Check if a codehash is whitelisted in a specified list. * @param id The id of the list. * @param codehash The codehash to check. * @return True if the codehash is whitelisted in the specified list, false otherwise. */ function isCodeHashWhitelisted(uint120 id, bytes32 codehash) public view returns (bool) { return whitelists[id].nonEnumerableCodehashes[codehash]; } /** * @notice Get blacklisted accounts by collection. * @param collection The address of the collection. * @return An array of blacklisted accounts. */ function getBlacklistedAccountsByCollection(address collection) external view returns (address[] memory) { return getBlacklistedAccounts(collectionSecurityPolicies[collection].listId); } /** * @notice Get whitelisted accounts by collection. * @param collection The address of the collection. * @return An array of whitelisted accounts. */ function getWhitelistedAccountsByCollection(address collection) external view returns (address[] memory) { return getWhitelistedAccounts(collectionSecurityPolicies[collection].listId); } /** * @notice Get authorizer accounts by collection. * @param collection The address of the collection. * @return An array of authorizer accounts. */ function getAuthorizerAccountsByCollection(address collection) external view returns (address[] memory) { return getAuthorizerAccounts(collectionSecurityPolicies[collection].listId); } /** * @notice Get frozen accounts by collection. * @param collection The address of the collection. * @return An array of frozen accounts. */ function getFrozenAccountsByCollection(address collection) external view returns (address[] memory) { return frozenAccounts[collection].enumerableAccounts.values(); } /** * @notice Get blacklisted codehashes by collection. * @param collection The address of the collection. * @return An array of blacklisted codehashes. */ function getBlacklistedCodeHashesByCollection(address collection) external view returns (bytes32[] memory) { return getBlacklistedCodeHashes(collectionSecurityPolicies[collection].listId); } /** * @notice Get whitelisted codehashes by collection. * @param collection The address of the collection. * @return An array of whitelisted codehashes. */ function getWhitelistedCodeHashesByCollection(address collection) external view returns (bytes32[] memory) { return getWhitelistedCodeHashes(collectionSecurityPolicies[collection].listId); } /** * @notice Check if an account is blacklisted by a specified collection. * @param collection The address of the collection. * @param account The address of the account to check. * @return True if the account is blacklisted by the specified collection, false otherwise. */ function isAccountBlacklistedByCollection(address collection, address account) external view returns (bool) { return isAccountBlacklisted(collectionSecurityPolicies[collection].listId, account); } /** * @notice Check if an account is whitelisted by a specified collection. * @param collection The address of the collection. * @param account The address of the account to check. * @return True if the account is whitelisted by the specified collection, false otherwise. */ function isAccountWhitelistedByCollection(address collection, address account) external view returns (bool) { return isAccountWhitelisted(collectionSecurityPolicies[collection].listId, account); } /** * @notice Check if an account is an authorizer of a specified collection. * @param collection The address of the collection. * @param account The address of the account to check. * @return True if the account is an authorizer by the specified collection, false otherwise. */ function isAccountAuthorizerOfCollection(address collection, address account) external view returns (bool) { return isAccountAuthorizer(collectionSecurityPolicies[collection].listId, account); } /** * @notice Check if an account is frozen for a specified collection. * @param collection The address of the collection. * @param account The address of the account to check. * @return True if the account is frozen by the specified collection, false otherwise. */ function isAccountFrozenForCollection(address collection, address account) external view returns (bool) { return frozenAccounts[collection].nonEnumerableAccounts[account]; } /** * @notice Check if a codehash is blacklisted by a specified collection. * @param collection The address of the collection. * @param codehash The codehash to check. * @return True if the codehash is blacklisted by the specified collection, false otherwise. */ function isCodeHashBlacklistedByCollection(address collection, bytes32 codehash) external view returns (bool) { return isCodeHashBlacklisted(collectionSecurityPolicies[collection].listId, codehash); } /** * @notice Check if a codehash is whitelisted by a specified collection. * @param collection The address of the collection. * @param codehash The codehash to check. * @return True if the codehash is whitelisted by the specified collection, false otherwise. */ function isCodeHashWhitelistedByCollection(address collection, bytes32 codehash) external view returns (bool) { return isCodeHashWhitelisted(collectionSecurityPolicies[collection].listId, codehash); } /// @notice Returns true if the specified account has verified a signature on the registry, false otherwise. function isVerifiedEOA(address account) public view returns (bool) { return IEOARegistry(_eoaRegistry).isVerifiedEOA(account); } /// @notice ERC-165 Interface Support /// @dev Do not remove LEGACY from this contract or future contracts. /// Doing so will break backwards compatibility with V1 and V2 creator tokens. function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == LEGACY_TRANSFER_VALIDATOR_INTERFACE_ID || interfaceId == type(ITransferValidator).interfaceId || interfaceId == type(IPermitC).interfaceId || interfaceId == type(IEOARegistry).interfaceId || super.supportsInterface(interfaceId); } /*************************************************************************/ /* HELPERS */ /*************************************************************************/ /** * @notice Reverts the transaction if the caller is not the owner or assigned the default * @notice admin role of the contract at `tokenAddress`. * * @dev Throws when the caller is neither owner nor assigned the default admin role. * * @param tokenAddress The contract address of the token to check permissions for. */ function _requireCallerIsNFTOrContractOwnerOrAdmin(address tokenAddress) internal view { address caller = msg.sender; if(caller == tokenAddress) { return; } (address contractOwner,) = _safeOwner(tokenAddress); if(caller == contractOwner) { return; } (bool callerIsContractAdmin,) = _safeHasRole(tokenAddress, DEFAULT_ACCESS_CONTROL_ADMIN_ROLE, caller); if(callerIsContractAdmin) { return; } revert CreatorTokenTransferValidator__CallerMustHaveElevatedPermissionsForSpecifiedNFT(); } /** * @notice Copies all addresses in `ptrFromList` to `ptrToList`. * * @dev This function will copy all addresses from one list to another list. * @dev Note: If used to copy adddresses to an existing list the current list contents will not be * @dev deleted before copying. New addresses will be appeneded to the end of the list and the * @dev non-enumerable mapping key value will be set to true. * * @dev <h4>Postconditions:</h4> * 1. Addresses in from list that are not already present in to list are added to the to list. * 2. Emits an `AddedAccountToList` event for each address copied to the list. * * @param listType The type of list addresses are being copied from and to. * @param destinationListId The id of the list being copied to. * @param ptrFromList The storage pointer for the list being copied from. * @param ptrToList The storage pointer for the list being copied to. */ function _copyAddressSet( uint8 listType, uint120 destinationListId, List storage ptrFromList, List storage ptrToList ) private { EnumerableSet.AddressSet storage ptrFromSet = ptrFromList.enumerableAccounts; EnumerableSet.AddressSet storage ptrToSet = ptrToList.enumerableAccounts; mapping (address => bool) storage ptrToNonEnumerableSet = ptrToList.nonEnumerableAccounts; uint256 sourceLength = ptrFromSet.length(); address account; for (uint256 i = 0; i < sourceLength;) { account = ptrFromSet.at(i); if (ptrToSet.add(account)) { emit AddedAccountToList(listType, destinationListId, account); ptrToNonEnumerableSet[account] = true; } unchecked { ++i; } } } /** * @notice Copies all codehashes in `ptrFromList` to `ptrToList`. * * @dev This function will copy all codehashes from one list to another list. * @dev Note: If used to copy codehashes to an existing list the current list contents will not be * @dev deleted before copying. New codehashes will be appeneded to the end of the list and the * @dev non-enumerable mapping key value will be set to true. * * @dev <h4>Postconditions:</h4> * 1. Codehashes in from list that are not already present in to list are added to the to list. * 2. Emits an `AddedCodeHashToList` event for each codehash copied to the list. * * @param listType The type of list codehashes are being copied from and to. * @param destinationListId The id of the list being copied to. * @param ptrFromList The storage pointer for the list being copied from. * @param ptrToList The storage pointer for the list being copied to. */ function _copyBytes32Set( uint8 listType, uint120 destinationListId, List storage ptrFromList, List storage ptrToList ) private { EnumerableSet.Bytes32Set storage ptrFromSet = ptrFromList.enumerableCodehashes; EnumerableSet.Bytes32Set storage ptrToSet = ptrToList.enumerableCodehashes; mapping (bytes32 => bool) storage ptrToNonEnumerableSet = ptrToList.nonEnumerableCodehashes; uint256 sourceLength = ptrFromSet.length(); bytes32 codehash; for (uint256 i = 0; i < sourceLength;) { codehash = ptrFromSet.at(i); if (ptrToSet.add(codehash)) { emit AddedCodeHashToList(listType, destinationListId, codehash); ptrToNonEnumerableSet[codehash] = true; } unchecked { ++i; } } } /** * @notice Adds one or more accounts to a list. * * @dev <h4>Postconditions:</h4> * 1. Accounts that were not previously in the list are added to the list. * 2. An `AddedAccountToList` event is emitted for each account that was not * previously on the list. * * @param list The storage pointer for the list to add accounts to. * @param listType The type of list the accounts are being added to. * @param id The id of the list the accounts are being added to. * @param accounts An array of accounts to add to the list. */ function _addAccountsToList( List storage list, uint8 listType, uint120 id, address[] calldata accounts ) internal onlyListOwner(id) { address account; for (uint256 i = 0; i < accounts.length;) { account = accounts[i]; if (list.enumerableAccounts.add(account)) { emit AddedAccountToList(listType, id, account); list.nonEnumerableAccounts[account] = true; } unchecked { ++i; } } } /** * @notice Adds one or more codehashes to a list. * * @dev <h4>Postconditions:</h4> * 1. Codehashes that were not previously in the list are added to the list. * 2. An `AddedCodeHashToList` event is emitted for each codehash that was not * previously on the list. * * @param list The storage pointer for the list to add codehashes to. * @param listType The type of list the codehashes are being added to. * @param id The id of the list the codehashes are being added to. * @param codehashes An array of codehashes to add to the list. */ function _addCodeHashesToList( List storage list, uint8 listType, uint120 id, bytes32[] calldata codehashes ) internal onlyListOwner(id) { bytes32 codehash; for (uint256 i = 0; i < codehashes.length;) { codehash = codehashes[i]; if (list.enumerableCodehashes.add(codehash)) { emit AddedCodeHashToList(listType, id, codehash); list.nonEnumerableCodehashes[codehash] = true; } unchecked { ++i; } } } /** * @notice Removes one or more accounts from a list. * * @dev <h4>Postconditions:</h4> * 1. Accounts that were previously in the list are removed from the list. * 2. An `RemovedAccountFromList` event is emitted for each account that was * previously on the list. * * @param list The storage pointer for the list to remove accounts from. * @param listType The type of list the accounts are being removed from. * @param id The id of the list the accounts are being removed from. * @param accounts An array of accounts to remove from the list. */ function _removeAccountsFromList( List storage list, uint8 listType, uint120 id, address[] memory accounts ) internal onlyListOwner(id) { address account; for (uint256 i = 0; i < accounts.length;) { account = accounts[i]; if (list.enumerableAccounts.remove(account)) { emit RemovedAccountFromList(listType, id, account); delete list.nonEnumerableAccounts[account]; } unchecked { ++i; } } } /** * @notice Removes one or more codehashes from a list. * * @dev <h4>Postconditions:</h4> * 1. Codehashes that were previously in the list are removed from the list. * 2. An `RemovedCodeHashFromList` event is emitted for each codehash that was * previously on the list. * * @param list The storage pointer for the list to remove codehashes from. * @param listType The type of list the codehashes are being removed from. * @param id The id of the list the codehashes are being removed from. * @param codehashes An array of codehashes to remove from the list. */ function _removeCodeHashesFromList( List storage list, uint8 listType, uint120 id, bytes32[] calldata codehashes ) internal onlyListOwner(id) { bytes32 codehash; for (uint256 i = 0; i < codehashes.length;) { codehash = codehashes[i]; if (list.enumerableCodehashes.remove(codehash)) { emit RemovedCodeHashFromList(listType, id, codehash); delete list.nonEnumerableCodehashes[codehash]; } unchecked { ++i; } } } /** * @notice Sets the owner of list `id` to `newOwner`. * * @dev Throws when the caller is not the owner of the list. * * @dev <h4>Postconditions:</h4> * 1. The owner of list `id` is set to `newOwner`. * 2. Emits a `ReassignedListOwnership` event. * * @param id The id of the list to reassign ownership of. * @param newOwner The account to assign ownership of the list to. */ function _reassignOwnershipOfList(uint120 id, address newOwner) private { if (id == DEFAULT_LIST_ID) { revert CreatorTokenTransferValidator__CannotReassignOwnershipOfDefaultList(); } _requireCallerOwnsList(id); listOwners[id] = newOwner; emit ReassignedListOwnership(id, newOwner); } /** * @notice Requires the caller to be the owner of list `id`. * * @dev Throws when the caller is not the owner of the list. * * @param id The id of the list to check ownership of. */ function _requireCallerOwnsList(uint120 id) private view { if (msg.sender != listOwners[id]) { revert CreatorTokenTransferValidator__CallerDoesNotOwnList(); } } /** * @dev Internal function used to efficiently retrieve the code length of `account`. * * @param account The address to get the deployed code length for. * * @return length The length of deployed code at the address. */ function _getCodeLengthAsm(address account) internal view returns (uint256 length) { assembly { length := extcodesize(account) } } /** * @dev Internal function used to efficiently retrieve the codehash of `account`. * * @param account The address to get the deployed codehash for. * * @return codehash The codehash of the deployed code at the address. */ function _getCodeHashAsm(address account) internal view returns (bytes32 codehash) { assembly { codehash := extcodehash(account) } } /** * @dev Hook that is called before any permitted token transfer that goes through Permit-C. * Applies the collection transfer policy, using the operator that called Permit-C as the caller. * This allows creator token standard protections to extend to permitted transfers. * * @param token The collection address of the token being transferred. * @param from The address of the token owner. * @param to The address of the token receiver. * @param id The token id being transferred. */ function _beforeTransferFrom( uint256 tokenType, address token, address from, address to, uint256 id, uint256 /*amount*/ ) internal override returns (bool isError) { (bytes4 selector, uint16 collectionTokenType) = _validateTransfer(_callerAuthorizedCheckToken, token, msg.sender, from, to, id); if (collectionTokenType == DEFAULT_TOKEN_TYPE || collectionTokenType == tokenType) { isError = SELECTOR_NO_ERROR != selector; } else { revert CreatorTokenTransferValidator__TokenTypesDoNotMatch(); } } /** * @notice Apply the collection transfer policy to a transfer operation of a creator token. * * @dev If the caller is self (Permit-C Processor) it means we have already applied operator validation in the * _beforeTransferFrom callback. In this case, the security policy was already applied and the operator * that used the Permit-C processor passed the security policy check and transfer can be safely allowed. * * @dev The order of checking whitelisted accounts, authorized operator check and whitelisted codehashes * is very deliberate. The order of operations is determined by the most frequently used settings that are * expected in the wild. * * @dev Throws when the collection has enabled account freezing mode and either the `from` or `to` addresses * are on the list of frozen accounts for the collection. * @dev Throws when the collection is set to Level 9 - Soulbound Token. * @dev Throws when the receiver has deployed code and isn't whitelisted, if ReceiverConstraints.NoCode is set * and the transfer is not approved by an authorizer for the collection. * @dev Throws when the receiver has never verified a signature to prove they are an EOA and the receiver * isn't whitelisted, if the ReceiverConstraints.EOA is set and the transfer is not approved by an * authorizer for the collection.. * @dev Throws when `msg.sender` is blacklisted, if CallerConstraints.OperatorBlacklistEnableOTC is set, unless * `msg.sender` is also the `from` address or the transfer is approved by an authorizer for the collection. * @dev Throws when `msg.sender` isn't whitelisted, if CallerConstraints.OperatorWhitelistEnableOTC is set, unless * `msg.sender` is also the `from` address or the transfer is approved by an authorizer for the collection. * @dev Throws when neither `msg.sender` nor `from` are whitelisted, if * CallerConstraints.OperatorWhitelistDisableOTC is set and the transfer * is not approved by an authorizer for the collection. * * @dev <h4>Postconditions:</h4> * 1. Transfer is allowed or denied based on the applied transfer policy. * * @param collection The collection address of the token being transferred. * @param caller The address initiating the transfer. * @param from The address of the token owner. * @param to The address of the token receiver. * @param tokenId The token id being transferred. * * @return The selector value for an error if the transfer is not allowed, `SELECTOR_NO_ERROR` if the transfer is allowed. */ function _validateTransfer( function(address,address,uint256) internal view returns(bool) _callerAuthorizedParam, address collection, address caller, address from, address to, uint256 tokenId ) internal view returns (bytes4,uint16) { if (caller == address(this)) { // If the caller is self (Permit-C Processor) it means we have already applied operator validation in the // _beforeTransferFrom callback. In this case, the security policy was already applied and the operator // that used the Permit-C processor passed the security policy check and transfer can be safely allowed. return (SELECTOR_NO_ERROR, DEFAULT_TOKEN_TYPE); } CollectionSecurityPolicyV3 storage collectionSecurityPolicy = collectionSecurityPolicies[collection]; uint120 listId = collectionSecurityPolicy.listId; (uint256 callerConstraints, uint256 receiverConstraints) = transferSecurityPolicies(collectionSecurityPolicy.transferSecurityLevel); if (collectionSecurityPolicy.enableAccountFreezingMode) { AccountList storage frozenAccountList = frozenAccounts[collection]; if (frozenAccountList.nonEnumerableAccounts[from]) { return (CreatorTokenTransferValidator__SenderAccountIsFrozen.selector, DEFAULT_TOKEN_TYPE); } if (frozenAccountList.nonEnumerableAccounts[to]) { return (CreatorTokenTransferValidator__ReceiverAccountIsFrozen.selector, DEFAULT_TOKEN_TYPE); } } if (callerConstraints == CALLER_CONSTRAINTS_SBT) { return (CreatorTokenTransferValidator__TokenIsSoulbound.selector, DEFAULT_TOKEN_TYPE); } List storage whitelist = whitelists[listId]; if (receiverConstraints == RECEIVER_CONSTRAINTS_NO_CODE) { if (_getCodeLengthAsm(to) > 0) { if (!whitelist.nonEnumerableAccounts[to]) { // Cache _callerAuthorizedParam on stack to avoid stack too deep function(address,address,uint256) internal view returns(bool) _callerAuthorized = _callerAuthorizedParam; if(!_callerAuthorized(collection, caller, tokenId)) { if (!whitelist.nonEnumerableCodehashes[_getCodeHashAsm(to)]) { return (CreatorTokenTransferValidator__ReceiverMustNotHaveDeployedCode.selector, DEFAULT_TOKEN_TYPE); } } } } } else if (receiverConstraints == RECEIVER_CONSTRAINTS_EOA) { if (!isVerifiedEOA(to)) { if (!whitelist.nonEnumerableAccounts[to]) { // Cache _callerAuthorizedParam on stack to avoid stack too deep function(address,address,uint256) internal view returns(bool) _callerAuthorized = _callerAuthorizedParam; if(!_callerAuthorized(collection, caller, tokenId)) { if (!whitelist.nonEnumerableCodehashes[_getCodeHashAsm(to)]) { return (CreatorTokenTransferValidator__ReceiverProofOfEOASignatureUnverified.selector, DEFAULT_TOKEN_TYPE); } } } } } if (caller == from) { if (callerConstraints != CALLER_CONSTRAINTS_OPERATOR_WHITELIST_DISABLE_OTC) { return (SELECTOR_NO_ERROR, collectionSecurityPolicy.tokenType); } } if (callerConstraints == CALLER_CONSTRAINTS_OPERATOR_BLACKLIST_ENABLE_OTC) { // Cache _callerAuthorizedParam on stack to avoid stack too deep function(address,address,uint256) internal view returns(bool) _callerAuthorized = _callerAuthorizedParam; if(_callerAuthorized(collection, caller, tokenId)) { return (SELECTOR_NO_ERROR, collectionSecurityPolicy.tokenType); } List storage blacklist = blacklists[listId]; if (blacklist.nonEnumerableAccounts[caller]) { return (CreatorTokenTransferValidator__OperatorIsBlacklisted.selector, DEFAULT_TOKEN_TYPE); } if (blacklist.nonEnumerableCodehashes[_getCodeHashAsm(caller)]) { return (CreatorTokenTransferValidator__OperatorIsBlacklisted.selector, DEFAULT_TOKEN_TYPE); } } else if (callerConstraints == CALLER_CONSTRAINTS_OPERATOR_WHITELIST_ENABLE_OTC) { if (whitelist.nonEnumerableAccounts[caller]) { return (SELECTOR_NO_ERROR, collectionSecurityPolicy.tokenType); } // Cache _callerAuthorizedParam on stack to avoid stack too deep function(address,address,uint256) internal view returns(bool) _callerAuthorized = _callerAuthorizedParam; if( _callerAuthorized(collection, caller, tokenId)) { return (SELECTOR_NO_ERROR, collectionSecurityPolicy.tokenType); } if (whitelist.nonEnumerableCodehashes[_getCodeHashAsm(caller)]) { return (SELECTOR_NO_ERROR, collectionSecurityPolicy.tokenType); } return (CreatorTokenTransferValidator__CallerMustBeWhitelisted.selector, DEFAULT_TOKEN_TYPE); } else if (callerConstraints == CALLER_CONSTRAINTS_OPERATOR_WHITELIST_DISABLE_OTC) { mapping(address => bool) storage accountWhitelist = whitelist.nonEnumerableAccounts; if (accountWhitelist[caller]) { return (SELECTOR_NO_ERROR, collectionSecurityPolicy.tokenType); } if (accountWhitelist[from]) { return (SELECTOR_NO_ERROR, collectionSecurityPolicy.tokenType); } // Cache _callerAuthorizedParam on stack to avoid stack too deep function(address,address,uint256) internal view returns(bool) _callerAuthorized = _callerAuthorizedParam; if(_callerAuthorized(collection, caller, tokenId)) { return (SELECTOR_NO_ERROR, collectionSecurityPolicy.tokenType); } mapping(bytes32 => bool) storage codehashWhitelist = whitelist.nonEnumerableCodehashes; // Cache caller on stack to avoid stack too deep address tmpAddress = caller; if (codehashWhitelist[_getCodeHashAsm(tmpAddress)]) { return (SELECTOR_NO_ERROR, collectionSecurityPolicy.tokenType); } // Cache from on stack to avoid stack too deep tmpAddress = from; if (codehashWhitelist[_getCodeHashAsm(tmpAddress)]) { return (SELECTOR_NO_ERROR, collectionSecurityPolicy.tokenType); } return (CreatorTokenTransferValidator__CallerMustBeWhitelisted.selector, DEFAULT_TOKEN_TYPE); } return (SELECTOR_NO_ERROR, collectionSecurityPolicy.tokenType); } /** * @dev Internal function used to efficiently revert with a custom error selector. * * @param errorSelector The error selector to revert with. */ function _revertCustomErrorSelectorAsm(bytes4 errorSelector) internal pure { assembly { mstore(0x00, errorSelector) revert(0x00, 0x04) } } /** * @dev Internal function used to check if authorization mode can be activated for a transfer. * * @dev Throws when the collection has not enabled authorization mode. * @dev Throws when the wildcard operator is being set for a collection that does not * allow wildcard operators. * @dev Throws when the authorizer is not in the list of approved authorizers for * the collection. * * @param collection The collection address to activate authorization mode for a transfer. * @param operator The operator specified by the authorizer to allow transfers. * @param authorizer The address of the authorizer making the call. */ function _checkCollectionAllowsAuthorizerAndOperator( address collection, address operator, address authorizer ) internal view { CollectionSecurityPolicyV3 storage collectionSecurityPolicy = collectionSecurityPolicies[collection]; if (collectionSecurityPolicy.disableAuthorizationMode) { revert CreatorTokenTransferValidator__AuthorizationDisabledForCollection(); } if (collectionSecurityPolicy.authorizersCannotSetWildcardOperators) { if (operator == WILDCARD_OPERATOR_ADDRESS) { revert CreatorTokenTransferValidator__WildcardOperatorsCannotBeAuthorizedForCollection(); } } if (!authorizers[collectionSecurityPolicy.listId].nonEnumerableAccounts[authorizer]) { revert CreatorTokenTransferValidator__CallerMustBeAnAuthorizer(); } } /** * @dev Modifier to apply the allowed authorizer and operator for collection checks. * * @dev Throws when the collection has not enabled authorization mode. * @dev Throws when the wildcard operator is being set for a collection that does not * allow wildcard operators. * @dev Throws when the authorizer is not in the list of approved authorizers for * the collection. * * @param collection The collection address to activate authorization mode for a transfer. * @param operator The operator specified by the authorizer to allow transfers. * @param authorizer The address of the authorizer making the call. */ modifier whenAuthorizerAndOperatorEnabledForCollection( address collection, address operator, address authorizer ) { _checkCollectionAllowsAuthorizerAndOperator(collection, operator, authorizer); _; } /** * @dev Internal function for setting the authorized operator in storage for a token and collection. * * @param operator The allowed operator for an authorized transfer. * @param collection The address of the collection that the operator is authorized for. * @param tokenId The id of the token that is authorized. * @param allowAnyTokenId Flag if the authorizer is enabling transfers for any token id */ function _setOperatorInTransientStorage( address operator, address collection, uint256 tokenId, bool allowAnyTokenId ) internal whenAuthorizerAndOperatorEnabledForCollection(collection, operator, msg.sender) { _setTstorish(_getTransientOperatorSlot(collection), (allowAnyTokenId ? 1 << 255 : 0) | uint256(uint160(operator))); _setTstorish(_getTransientOperatorSlot(collection, tokenId), uint256(uint160(operator))); } /** * @dev Internal function to check if a caller is an authorized operator for the token being transferred. * * @param caller The caller of the token transfer. * @param collection The collection address of the token being transferred. * @param tokenId The id of the token being transferred. * * @return isAuthorized True if the caller is authorized to transfer the token, false otherwise. */ function _callerAuthorizedCheckToken( address collection, address caller, uint256 tokenId ) internal view returns (bool isAuthorized) { uint256 slotValue; (isAuthorized, ) = _callerAuthorized(caller, _getTransientOperatorSlot(collection, tokenId)); if (isAuthorized) return true; (isAuthorized, slotValue) = _callerAuthorized(caller, _getTransientOperatorSlot(collection)); isAuthorized = isAuthorized && slotValue >> 255 == 1; } /** * @dev Internal function to check if a caller is an authorized operator for the collection being transferred. * * @param caller The caller of the token transfer. * @param collection The collection address of the token being transferred. * * @return isAuthorized True if the caller is authorized to transfer the collection, false otherwise. */ function _callerAuthorizedCheckCollection( address collection, address caller, uint256 /*tokenId*/ ) internal view returns (bool isAuthorized) { (isAuthorized, ) = _callerAuthorized(caller, _getTransientOperatorSlot(collection)); } /** * @dev Internal function to check if a caller is an authorized operator. * @dev This overload of `_callerAuthorized` checks a specific storage slot for the caller address. * * @param caller The caller of the token transfer. * @param slot The storage slot to check for the caller address. * * @return isAuthorized True if the caller is authorized to transfer the token, false otherwise. * @return slotValue The transient storage value in `slot`, used to check for allow any token id flag if necessary. */ function _callerAuthorized(address caller, uint256 slot) internal view returns (bool isAuthorized, uint256 slotValue) { slotValue = _getTstorish(slot); address authorizedOperator = address(uint160(slotValue)); isAuthorized = authorizedOperator == WILDCARD_OPERATOR_ADDRESS || authorizedOperator == caller; } /** * @dev Internal function used to compute the transient storage slot for the authorized * operator of a token in a collection. * * @param collection The collection address of the token being transferred. * @param tokenId The id of the token being transferred. * * @return operatorSlot The storage slot location for the authorized operator value. */ function _getTransientOperatorSlot( address collection, uint256 tokenId ) internal pure returns (uint256 operatorSlot) { assembly { mstore(0x00, collection) mstore(0x20, tokenId) operatorSlot := shr(4, keccak256(0x00, 0x40)) } } /** * @dev Internal function used to compute the transient storage slot for the authorized operator of a collection. * * @param collection The collection address of the token being transferred. * * @return operatorSlot The storage slot location for the authorized operator value. */ function _getTransientOperatorSlot(address collection) internal pure returns (uint256 operatorSlot) { assembly { mstore(0x00, collection) mstore(0x20, _transientOperatorSlotHolder.slot) operatorSlot := keccak256(0x00, 0x40) } } /** * @dev A gas efficient, and fallback-safe way to call the owner function on a token contract. * This will get the owner if it exists - and when the function is unimplemented, the * presence of a fallback function will not result in halted execution. * * @param tokenAddress The address of the token collection to get the owner of. * * @return owner The owner of the token collection contract. * @return isError True if there was an error in retrieving the owner, false if the call was successful. */ function _safeOwner( address tokenAddress ) internal view returns(address owner, bool isError) { assembly { function _callOwner(_tokenAddress) -> _owner, _isError { mstore(0x00, 0x8da5cb5b) if and(iszero(lt(returndatasize(), 0x20)), staticcall(gas(), _tokenAddress, 0x1C, 0x04, 0x00, 0x20)) { _owner := mload(0x00) leave } _isError := true } owner, isError := _callOwner(tokenAddress) } } /** * @dev A gas efficient, and fallback-safe way to call the hasRole function on a token contract. * This will check if the account `hasRole` if `hasRole` exists - and when the function is unimplemented, the * presence of a fallback function will not result in halted execution. * * @param tokenAddress The address of the token collection to call hasRole on. * @param role The role to check if the account has on the collection. * @param account The address of the account to check if they have a specified role. * * @return hasRole The owner of the token collection contract. * @return isError True if there was an error in retrieving the owner, false if the call was successful. */ function _safeHasRole( address tokenAddress, bytes32 role, address account ) internal view returns(bool hasRole, bool isError) { assembly { function _callHasRole(_tokenAddress, _role, _account) -> _hasRole, _isError { let ptr := mload(0x40) mstore(0x40, add(ptr, 0x60)) mstore(ptr, 0x91d14854) mstore(add(0x20, ptr), _role) mstore(add(0x40, ptr), _account) if and(iszero(lt(returndatasize(), 0x20)), staticcall(gas(), _tokenAddress, add(ptr, 0x1C), 0x44, 0x00, 0x20)) { _hasRole := mload(0x00) leave } _isError := true } hasRole, isError := _callHasRole(tokenAddress, role, account) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC1155.sol) pragma solidity ^0.8.0; import "../token/ERC1155/IERC1155.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC1271.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC1271 standard signature validation method for * contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271]. * * _Available since v4.1._ */ interface IERC1271 { /** * @dev Should return whether the signature provided is valid for the provided data * @param hash Hash of the data to be signed * @param signature Signature byte array associated with _data */ function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol) pragma solidity ^0.8.0; import "../token/ERC20/IERC20.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC721.sol) pragma solidity ^0.8.0; import "../token/ERC721/IERC721.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch( address[] calldata accounts, uint256[] calldata ids ) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @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`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol) pragma solidity ^0.8.0; import "./math/Math.sol"; import "./math/SignedMath.sol"; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value)))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @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] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; import "../Strings.sol"; /** * @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 // Deprecated in v4.8 } 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"); } } /** * @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) { 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. /// @solidity memory-safe-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 { 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 = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 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 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 message) { // 32 is the length in bytes of hash, // enforced by the type signature above /// @solidity memory-safe-assembly assembly { mstore(0x00, "\x19Ethereum Signed Message:\n32") mstore(0x1c, hash) message := keccak256(0x00, 0x3c) } } /** * @dev Returns an Ethereum Signed Message, created from `s`. 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(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @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 data) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) mstore(ptr, "\x19\x01") mstore(add(ptr, 0x02), domainSeparator) mstore(add(ptr, 0x22), structHash) data := keccak256(ptr, 0x42) } } /** * @dev Returns an Ethereum Signed Data with intended validator, created from a * `validator` and `data` according to the version 0 of EIP-191. * * See {recover}. */ function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x00", validator, data)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.24; /* @@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@( @@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@ #@@@@@@@@@@@@@@ @@@@@@@@@@@@ @@@@@@@@@@@@@@* @@@@@@@@@@@@ @@@@@@@@@@@@@@@ @ @@@@@@@@@@@@ @@@@@@@@@@@@@@@ @ @@@@@@@@@@@ @@@@@@@@@@@@@@@ @@ @@@@@@@@@@@@ @@@@@@@@@@@@@@@ #@@ @@@@@@@@@@@@/ @@@@@@@@@@@@@@. @@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@&%%%%%%%%&&@@@@@@@@@@@@@@ @@@@@@@@@@@@@@ @@@@@ @@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@ @@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@ @@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@ @@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@ @@@@@@@@@@@& @@@@@@@@@@@@@@ *@@@@@@@ (@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@ @@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ .@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@% @@@@@@@@@@@@@@@@@@@@@@@@( @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@& @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ * @title CollateralizedPausableFlags * @custom:version 1.0.0 * @author Limit Break, Inc. * @description Collateralized Pausable Flags is an extension for contracts * that require features to be pausable in the event of potential * or actual threats without incurring a storage read overhead cost * during normal operations by using contract starting balance as * a signal for checking the paused state. * * Using contract balance to enable checking paused state creates an * economic penalty for developers that deploy code that can be * exploited as well as an economic incentive (recovery of collateral) * for them to mitigate the threat. * * Developers implementing Collateralized Pausable Flags should consider * their risk mitigation strategy and ensure funds are readily available * for pausing if ever necessary by setting an appropriate threshold * value and considering use of an escrow contract that can initiate the * pause with funds. * * There is no restriction on the depositor as this can be easily * circumvented through a `SELFDESTRUCT` opcode. * * Developers must be aware of potential outflows from the contract that * could reduce collateral below the pausable check threshold and protect * against those methods when pausing is required. */ abstract contract CollateralizedPausableFlags { /// @dev Emitted when the pausable flags are updated event PausableFlagsUpdated(uint256 previousFlags, uint256 newFlags); /// @dev Thrown when an execution path requires a flag to not be paused but it is paused error CollateralizedPausableFlags__Paused(); /// @dev Thrown when an executin path requires a flag to be paused but it is not paused error CollateralizedPausableFlags__NotPaused(); /// @dev Thrown when a call to withdraw funds fails error CollateralizedPausableFlags__WithdrawFailed(); /// @dev Immutable variable that defines the native funds threshold before flags are checked uint256 private immutable nativeValueToCheckPauseState; /// @dev Flags for current pausable state, each bit is considered a separate flag uint256 private pausableFlags; /// @dev Immutable pointer for the _requireNotPaused function to use based on value threshold function(uint256) internal view immutable _requireNotPaused; /// @dev Immutable pointer for the _requirePaused function to use based on value threshold function(uint256) internal view immutable _requirePaused; /// @dev Immutable pointer for the _getPausableFlags function to use based on value threshold function() internal view returns (uint256) immutable _getPausableFlags; constructor(uint256 _nativeValueToCheckPauseState) { // Optimizes value check at runtime by reducing the stored immutable // value by 1 so that greater than can be used instead of greater // than or equal while allowing the deployment parameter to reflect // the value at which the deployer wants to trigger pause checking. // Example: // Constructed with a value of 1000 // Immutable value stored is 999 // State checking enabled at 1000 units deposited because // 1000 > 999 evaluates true if (_nativeValueToCheckPauseState > 0) { unchecked { _nativeValueToCheckPauseState -= 1; } _requireNotPaused = _requireNotPausedWithCollateralCheck; _requirePaused = _requirePausedWithCollateralCheck; _getPausableFlags = _getPausableFlagsWithCollateralCheck; } else { _requireNotPaused = _requireNotPausedWithoutCollateralCheck; _requirePaused = _requirePausedWithoutCollateralCheck; _getPausableFlags = _getPausableFlagsWithoutCollateralCheck; } nativeValueToCheckPauseState = _nativeValueToCheckPauseState; } /** * @dev Modifier to make a function callable only when the specified flags are not paused * @dev Throws when any of the flags specified are paused * * @param _flags The flags to check for pause state */ modifier whenNotPaused(uint256 _flags) { _requireNotPaused(_flags); _; } /** * @dev Modifier to make a function callable only when the specified flags are paused * @dev Throws when any of the flags specified are not paused * * @param _flags The flags to check for pause state */ modifier whenPaused(uint256 _flags) { _requirePaused(_flags); _; } /** * @dev Modifier to make a function callable only by a permissioned account * @dev Throws when the caller does not have permission */ modifier onlyPausePermissionedCaller() { _requireCallerHasPausePermissions(); _; } /** * @notice Updates the pausable flags settings * * @dev Throws when the caller does not have permission * @dev **NOTE:** Pausable flag settings will only take effect if contract balance exceeds * @dev `nativeValueToPause` * * @dev <h4>Postconditions:</h4> * @dev 1. address(this).balance increases by msg.value * @dev 2. `pausableFlags` is set to the new value * @dev 3. Emits a PausableFlagsUpdated event * * @param _pausableFlags The new pausable flags to set */ function pause(uint256 _pausableFlags) external payable onlyPausePermissionedCaller { _setPausableFlags(_pausableFlags); } /** * @notice Allows any account to supply funds for enabling the pausable checks * * @dev **NOTE:** The threshold check for pausable collateral does not pause * @dev any functions unless the associated pausable flag is set. */ function pausableDepositCollateral() external payable { // thank you for your contribution to safety } /** * @notice Resets all pausable flags to unpaused and withdraws funds * * @dev Throws when the caller does not have permission * * @dev <h4>Postconditions:</h4> * @dev 1. `pausableFlags` is set to zero * @dev 2. Emits a PausableFlagsUpdated event * @dev 3. Transfers `withdrawAmount` of native funds to `withdrawTo` if non-zero * * @param withdrawTo The address to withdraw the collateral to * @param withdrawAmount The amount of collateral to withdraw */ function unpause(address withdrawTo, uint256 withdrawAmount) external onlyPausePermissionedCaller { _setPausableFlags(0); if (withdrawAmount > 0) { (bool success, ) = withdrawTo.call{value: withdrawAmount}(""); if(!success) revert CollateralizedPausableFlags__WithdrawFailed(); } } /** * @notice Returns collateralized pausable configuration information * * @return _nativeValueToCheckPauseState The collateral required to enable pause state checking * @return _pausableFlags The current pausable flags set, only checked when collateral met */ function pausableConfigurationSettings() external view returns( uint256 _nativeValueToCheckPauseState, uint256 _pausableFlags ) { unchecked { _nativeValueToCheckPauseState = nativeValueToCheckPauseState + 1; _pausableFlags = pausableFlags; } } /** * @notice Updates the `pausableFlags` variable and emits a PausableFlagsUpdated event * * @param _pausableFlags The new pausable flags to set */ function _setPausableFlags(uint256 _pausableFlags) internal { uint256 previousFlags = pausableFlags; pausableFlags = _pausableFlags; emit PausableFlagsUpdated(previousFlags, _pausableFlags); } /** * @notice Checks the current pause state of the supplied flags and reverts if any are paused * * @dev *Should* be called prior to any transfers of native funds out of the contract for efficiency * @dev Throws when the native funds balance is greater than the value to enable pausing AND * @dev one or more of the supplied `_flags` is paused. * * @param _flags The flags to check for pause state */ function _requireNotPausedWithCollateralCheck(uint256 _flags) private view { if (_nativeBalanceSubMsgValue() > nativeValueToCheckPauseState) { if (pausableFlags & _flags > 0) { revert CollateralizedPausableFlags__Paused(); } } } /** * @notice Checks the current pause state of the supplied flags and reverts if any are paused * * @dev Throws when one or more of the supplied `_flags` is paused. * * @param _flags The flags to check for pause state */ function _requireNotPausedWithoutCollateralCheck(uint256 _flags) private view { if (pausableFlags & _flags > 0) { revert CollateralizedPausableFlags__Paused(); } } /** * @notice Checks the current pause state of the supplied flags and reverts if none are paused * * @dev *Should* be called prior to any transfers of native funds out of the contract for efficiency * @dev Throws when the native funds balance is not greater than the value to enable pausing OR * @dev none of the supplied `_flags` are paused. * * @param _flags The flags to check for pause state */ function _requirePausedWithCollateralCheck(uint256 _flags) private view { if (_nativeBalanceSubMsgValue() <= nativeValueToCheckPauseState) { revert CollateralizedPausableFlags__NotPaused(); } else if (pausableFlags & _flags == 0) { revert CollateralizedPausableFlags__NotPaused(); } } /** * @notice Checks the current pause state of the supplied flags and reverts if none are paused * * @dev Throws when none of the supplied `_flags` are paused. * * @param _flags The flags to check for pause state */ function _requirePausedWithoutCollateralCheck(uint256 _flags) private view { if (pausableFlags & _flags == 0) { revert CollateralizedPausableFlags__NotPaused(); } } /** * @notice Returns the current state of the pausable flags * * @dev Will return zero if the native funds balance is not greater than the value to enable pausing * * @return _pausableFlags The current state of the pausable flags */ function _getPausableFlagsWithCollateralCheck() private view returns(uint256 _pausableFlags) { if (_nativeBalanceSubMsgValue() > nativeValueToCheckPauseState) { _pausableFlags = pausableFlags; } } /** * @notice Returns the current state of the pausable flags * * @return _pausableFlags The current state of the pausable flags */ function _getPausableFlagsWithoutCollateralCheck() private view returns(uint256 _pausableFlags) { _pausableFlags = pausableFlags; } /** * @notice Returns the current contract balance minus the value sent with the call * * @dev This is expected to be the contract balance at the beginning of a function call * @dev to efficiently determine whether a contract has the necessary collateral to enable * @dev the pausable flags checking for contracts that hold native token funds. * @dev This should **NOT** be used in any way to determine current balance for contract logic * @dev other than its intended purpose for pause state checking activation. */ function _nativeBalanceSubMsgValue() private view returns (uint256 _value) { unchecked { _value = address(this).balance - msg.value; } } /** * @dev To be implemented by an inheriting contract for authorization to `pause` and `unpause` * @dev functions as well as any functions in the inheriting contract that utilize the * @dev `onlyPausePermissionedCaller` modifier. * * @dev Implementing contract function **MUST** throw when the caller is not permissioned */ function _requireCallerHasPausePermissions() internal view virtual; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /// @dev Constant bytes32 value of 0x000...000 bytes32 constant ZERO_BYTES32 = bytes32(0); /// @dev Constant value of 0 uint256 constant ZERO = 0; /// @dev Constant value of 1 uint256 constant ONE = 1; /// @dev Constant value representing an open order in storage uint8 constant ORDER_STATE_OPEN = 0; /// @dev Constant value representing a filled order in storage uint8 constant ORDER_STATE_FILLED = 1; /// @dev Constant value representing a cancelled order in storage uint8 constant ORDER_STATE_CANCELLED = 2; /// @dev Constant value representing the ERC721 token type for signatures and transfer hooks uint256 constant TOKEN_TYPE_ERC721 = 721; /// @dev Constant value representing the ERC1155 token type for signatures and transfer hooks uint256 constant TOKEN_TYPE_ERC1155 = 1155; /// @dev Constant value representing the ERC20 token type for signatures and transfer hooks uint256 constant TOKEN_TYPE_ERC20 = 20; /// @dev Constant value to mask the upper bits of a signature that uses a packed `vs` value to extract `s` bytes32 constant UPPER_BIT_MASK = 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff; /// @dev EIP-712 typehash used for validating signature based stored approvals bytes32 constant UPDATE_APPROVAL_TYPEHASH = keccak256("UpdateApprovalBySignature(uint256 tokenType,address token,uint256 id,uint256 amount,uint256 nonce,address operator,uint256 approvalExpiration,uint256 sigDeadline,uint256 masterNonce)"); /// @dev EIP-712 typehash used for validating a single use permit without additional data bytes32 constant SINGLE_USE_PERMIT_TYPEHASH = keccak256("PermitTransferFrom(uint256 tokenType,address token,uint256 id,uint256 amount,uint256 nonce,address operator,uint256 expiration,uint256 masterNonce)"); /// @dev EIP-712 typehash used for validating a single use permit with additional data string constant SINGLE_USE_PERMIT_TRANSFER_ADVANCED_TYPEHASH_STUB = "PermitTransferFromWithAdditionalData(uint256 tokenType,address token,uint256 id,uint256 amount,uint256 nonce,address operator,uint256 expiration,uint256 masterNonce,"; /// @dev EIP-712 typehash used for validating an order permit that updates storage as it fills string constant PERMIT_ORDER_ADVANCED_TYPEHASH_STUB = "PermitOrderWithAdditionalData(uint256 tokenType,address token,uint256 id,uint256 amount,uint256 salt,address operator,uint256 expiration,uint256 masterNonce,"; /// @dev Pausable flag for stored approval transfers of ERC721 assets uint256 constant PAUSABLE_APPROVAL_TRANSFER_FROM_ERC721 = 1 << 0; /// @dev Pausable flag for stored approval transfers of ERC1155 assets uint256 constant PAUSABLE_APPROVAL_TRANSFER_FROM_ERC1155 = 1 << 1; /// @dev Pausable flag for stored approval transfers of ERC20 assets uint256 constant PAUSABLE_APPROVAL_TRANSFER_FROM_ERC20 = 1 << 2; /// @dev Pausable flag for single use permit transfers of ERC721 assets uint256 constant PAUSABLE_PERMITTED_TRANSFER_FROM_ERC721 = 1 << 3; /// @dev Pausable flag for single use permit transfers of ERC1155 assets uint256 constant PAUSABLE_PERMITTED_TRANSFER_FROM_ERC1155 = 1 << 4; /// @dev Pausable flag for single use permit transfers of ERC20 assets uint256 constant PAUSABLE_PERMITTED_TRANSFER_FROM_ERC20 = 1 << 5; /// @dev Pausable flag for order fill transfers of ERC1155 assets uint256 constant PAUSABLE_ORDER_TRANSFER_FROM_ERC1155 = 1 << 6; /// @dev Pausable flag for order fill transfers of ERC20 assets uint256 constant PAUSABLE_ORDER_TRANSFER_FROM_ERC20 = 1 << 7;
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /// @dev Storage data struct for stored approvals and order approvals struct PackedApproval { // Only used for partial fill position 1155 transfers uint8 state; // Amount allowed uint200 amount; // Permission expiry uint48 expiration; } /// @dev Calldata data struct for order fill amounts struct OrderFillAmounts { uint256 orderStartAmount; uint256 requestedFillAmount; uint256 minimumFillAmount; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /// @dev Thrown when a stored approval exceeds type(uint200).max error PermitC__AmountExceedsStorageMaximum(); /// @dev Thrown when a transfer amount requested exceeds the permitted amount error PermitC__ApprovalTransferExceededPermittedAmount(); /// @dev Thrown when a transfer is requested after the permit has expired error PermitC__ApprovalTransferPermitExpiredOrUnset(); /// @dev Thrown when attempting to close an order by an account that is not the owner or operator error PermitC__CallerMustBeOwnerOrOperator(); /// @dev Thrown when attempting to approve a token type that is not valid for PermitC error PermitC__InvalidTokenType(); /// @dev Thrown when attempting to invalidate a nonce that has already been used error PermitC__NonceAlreadyUsedOrRevoked(); /// @dev Thrown when attempting to restore a nonce that has not been used error PermitC__NonceNotUsedOrRevoked(); /// @dev Thrown when attempting to fill an order that has already been filled or cancelled error PermitC__OrderIsEitherCancelledOrFilled(); /// @dev Thrown when a transfer amount requested exceeds the permitted amount error PermitC__SignatureTransferExceededPermittedAmount(); /// @dev Thrown when a transfer is requested after the permit has expired error PermitC__SignatureTransferExceededPermitExpired(); /// @dev Thrown when attempting to use an advanced permit typehash that is not registered error PermitC__SignatureTransferPermitHashNotRegistered(); /// @dev Thrown when a permit signature is invalid error PermitC__SignatureTransferInvalidSignature(); /// @dev Thrown when the remaining fill amount is less than the requested minimum fill error PermitC__UnableToFillMinimumRequestedQuantity();
// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; import "./Errors.sol"; import {IERC20} from "@openzeppelin/contracts/interfaces/IERC20.sol"; import {IERC721} from "@openzeppelin/contracts/interfaces/IERC721.sol"; import {IERC1155} from "@openzeppelin/contracts/interfaces/IERC1155.sol"; import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol"; import {Ownable} from "./openzeppelin-optimized/Ownable.sol"; import {EIP712} from "./openzeppelin-optimized/EIP712.sol"; import { ZERO_BYTES32, ZERO, ONE, ORDER_STATE_OPEN, ORDER_STATE_FILLED, ORDER_STATE_CANCELLED, SINGLE_USE_PERMIT_TRANSFER_ADVANCED_TYPEHASH_STUB, PERMIT_ORDER_ADVANCED_TYPEHASH_STUB, UPPER_BIT_MASK, TOKEN_TYPE_ERC1155, TOKEN_TYPE_ERC20, TOKEN_TYPE_ERC721, PAUSABLE_APPROVAL_TRANSFER_FROM_ERC721, PAUSABLE_APPROVAL_TRANSFER_FROM_ERC1155, PAUSABLE_APPROVAL_TRANSFER_FROM_ERC20, PAUSABLE_PERMITTED_TRANSFER_FROM_ERC721, PAUSABLE_PERMITTED_TRANSFER_FROM_ERC1155, PAUSABLE_PERMITTED_TRANSFER_FROM_ERC20, PAUSABLE_ORDER_TRANSFER_FROM_ERC1155, PAUSABLE_ORDER_TRANSFER_FROM_ERC20 } from "./Constants.sol"; import {PackedApproval, OrderFillAmounts} from "./DataTypes.sol"; import {PermitHash} from './libraries/PermitHash.sol'; import {IPermitC} from './interfaces/IPermitC.sol'; import {CollateralizedPausableFlags} from './CollateralizedPausableFlags.sol'; /* @@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@( @@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@ #@@@@@@@@@@@@@@ @@@@@@@@@@@@ @@@@@@@@@@@@@@* @@@@@@@@@@@@ @@@@@@@@@@@@@@@ @ @@@@@@@@@@@@ @@@@@@@@@@@@@@@ @ @@@@@@@@@@@ @@@@@@@@@@@@@@@ @@ @@@@@@@@@@@@ @@@@@@@@@@@@@@@ #@@ @@@@@@@@@@@@/ @@@@@@@@@@@@@@. @@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@&%%%%%%%%&&@@@@@@@@@@@@@@ @@@@@@@@@@@@@@ @@@@@ @@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@ @@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@ @@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@ @@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@ @@@@@@@@@@@& @@@@@@@@@@@@@@ *@@@@@@@ (@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@ @@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ .@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@% @@@@@@@@@@@@@@@@@@@@@@@@( @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@& @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ * @title PermitC * @custom:version 1.0.0 * @author Limit Break, Inc. * @description Advanced approval management for ERC20, ERC721 and ERC1155 tokens * allowing for single use permit transfers, time-bound approvals * and order ID based transfers. */ contract PermitC is Ownable, CollateralizedPausableFlags, EIP712, IPermitC { /** * @notice Map of approval details for the provided bytes32 hash to allow for multiple accessors * * @dev keccak256(abi.encode(owner, tokenType, token, id, orderId, masterNonce)) => * @dev operator => (state, amount, expiration) * @dev Utilized for stored approvals by an owner's direct call to `approve` and * @dev approvals by signature in `updateApprovalBySignature`. Both methods use a * @dev bytes32(0) value for the `orderId`. */ mapping(bytes32 => mapping(address => PackedApproval)) private _transferApprovals; /** * @notice Map of approval details for the provided bytes32 hash to allow for multiple accessors * * @dev keccak256(abi.encode(owner, tokenType, token, id, orderId, masterNonce)) => * @dev operator => (state, amount, expiration) * @dev Utilized for order approvals by `fillPermittedOrderERC20` and `fillPermittedOrderERC1155` * @dev with the `orderId` provided by the sender. */ mapping(bytes32 => mapping(address => PackedApproval)) private _orderApprovals; /** * @notice Map of registered additional data hashes for transfer permits. * * @dev This is used to prevent someone from providing an invalid EIP712 envelope label * @dev and tricking a user into signing a different message than they expect. */ mapping(bytes32 => bool) private _registeredTransferHashes; /** * @notice Map of registered additional data hashes for order permits. * * @dev This is used to prevent someone from providing an invalid EIP712 envelope label * @dev and tricking a user into signing a different message than they expect. */ mapping(bytes32 => bool) private _registeredOrderHashes; /// @dev Map of an address to a bitmap (slot => status) mapping(address => mapping(uint256 => uint256)) private _unorderedNonces; /** * @notice Master nonce used to invalidate all outstanding approvals for an owner * * @dev owner => masterNonce * @dev This is incremented when the owner calls lockdown() */ mapping(address => uint256) private _masterNonces; constructor( string memory name, string memory version, address _defaultContractOwner, uint256 _nativeValueToCheckPauseState ) CollateralizedPausableFlags(_nativeValueToCheckPauseState) EIP712(name, version) { _transferOwnership(_defaultContractOwner); } /** * ================================================= * ================= Modifiers ===================== * ================================================= */ modifier onlyRegisteredTransferAdvancedTypeHash(bytes32 advancedPermitHash) { _requireTransferAdvancedPermitHashIsRegistered(advancedPermitHash); _; } modifier onlyRegisteredOrderAdvancedTypeHash(bytes32 advancedPermitHash) { _requireOrderAdvancedPermitHashIsRegistered(advancedPermitHash); _; } /** * ================================================= * ============== Approval Transfers =============== * ================================================= */ /** * @notice Approve an operator to spend a specific token / ID combination * @notice This function is compatible with ERC20, ERC721 and ERC1155 * @notice To give unlimited approval for ERC20 and ERC1155, set amount to type(uint200).max * @notice When approving an ERC721, you MUST set amount to `1` * @notice When approving an ERC20, you MUST set id to `0` * * @dev <h4>Postconditions:</h4> * @dev 1. Updates the approval for an operator to use an amount of a specific token / ID combination * @dev 2. If the expiration is 0, the approval is valid only in the context of the current block * @dev 3. If the expiration is not 0, the approval is valid until the expiration timestamp * @dev 4. If the provided amount is type(uint200).max, the approval is unlimited * * @param tokenType The type of token being approved - must be 20, 721 or 1155. * @param token The address of the token contract * @param id The token ID * @param operator The address of the operator * @param amount The amount of tokens to approve * @param expiration The expiration timestamp of the approval */ function approve( uint256 tokenType, address token, uint256 id, address operator, uint200 amount, uint48 expiration ) external { _requireValidTokenType(tokenType); _storeApproval(tokenType, token, id, amount, expiration, msg.sender, operator); } /** * @notice Use a signed permit to increase the allowance for a provided operator * @notice This function is compatible with ERC20, ERC721 and ERC1155 * @notice To give unlimited approval for ERC20 and ERC1155, set amount to type(uint200).max * @notice When approving an ERC721, you MUST set amount to `1` * @notice When approving an ERC20, you MUST set id to `0` * @notice An `approvalExpiration` of zero is considered an atomic permit which will use the * @notice current block time as the expiration time when storing the permit data. * * @dev - Throws if the permit has expired * @dev - Throws if the permit's nonce has already been used * @dev - Throws if the permit signature is does not recover to the provided owner * * @dev <h4>Postconditions:</h4> * @dev 1. Updates the approval for an operator to use an amount of a specific token / ID combination * @dev 3. Sets the expiration of the approval to the expiration timestamp of the permit * @dev 4. If the provided amount is type(uint200).max, the approval is unlimited * * @param tokenType The type of token being approved - must be 20, 721 or 1155. * @param token Address of the token to approve * @param id The token ID * @param nonce The nonce of the permit * @param amount The amount of tokens to approve * @param operator The address of the operator * @param approvalExpiration The expiration timestamp of the approval * @param sigDeadline The deadline timestamp for the permit signature * @param owner The owner of the tokens * @param signedPermit The permit signature, signed by the owner */ function updateApprovalBySignature( uint256 tokenType, address token, uint256 id, uint256 nonce, uint200 amount, address operator, uint48 approvalExpiration, uint48 sigDeadline, address owner, bytes calldata signedPermit ) external { if (block.timestamp > sigDeadline) { revert PermitC__ApprovalTransferPermitExpiredOrUnset(); } _requireValidTokenType(tokenType); _checkAndInvalidateNonce(owner, nonce); _verifyPermitSignature( _hashTypedDataV4( PermitHash.hashOnChainApproval( tokenType, token, id, amount, nonce, operator, approvalExpiration, sigDeadline, _masterNonces[owner] ) ), signedPermit, owner ); // Expiration of zero is considered an atomic permit which is only valid in the // current block. approvalExpiration = approvalExpiration == 0 ? uint48(block.timestamp) : approvalExpiration; _storeApproval(tokenType, token, id, amount, approvalExpiration, owner, operator); } /** * @notice Returns the amount of allowance an operator has and it's expiration for a specific token and id * @notice If the expiration on the allowance has expired, returns 0 * @notice To retrieve allowance for ERC20, set id to `0` * * @param owner The owner of the token * @param operator The operator of the token * @param tokenType The type of token the allowance is for * @param token The address of the token contract * @param id The token ID * * @return allowedAmount The amount of allowance the operator has * @return expiration The expiration timestamp of the allowance */ function allowance( address owner, address operator, uint256 tokenType, address token, uint256 id ) external view returns (uint256 allowedAmount, uint256 expiration) { return _allowance(_transferApprovals, owner, operator, tokenType, token, id, ZERO_BYTES32); } /** * ================================================= * ================ Signed Transfers =============== * ================================================= */ /** * @notice Registers the combination of a provided string with the `SINGLE_USE_PERMIT_TRANSFER_ADVANCED_TYPEHASH_STUB` * @notice and `PERMIT_ORDER_ADVANCED_TYPEHASH_STUB` to create valid additional data hashes * * @dev This function prevents malicious actors from changing the label of the EIP712 hash * @dev to a value that would fool an external user into signing a different message. * * @dev <h4>Postconditions:</h4> * @dev 1. The provided string is combined with the `SINGLE_USE_PERMIT_TRANSFER_ADVANCED_TYPEHASH_STUB` string * @dev 2. The combined string is hashed using keccak256 * @dev 3. The resulting hash is added to the `_registeredTransferHashes` mapping * @dev 4. The provided string is combined with the `PERMIT_ORDER_ADVANCED_TYPEHASH_STUB` string * @dev 5. The combined string is hashed using keccak256 * @dev 6. The resulting hash is added to the `_registeredOrderHashes` mapping * * @param additionalDataTypeString The string to register as a valid additional data hash */ function registerAdditionalDataHash(string calldata additionalDataTypeString) external { _registeredTransferHashes[ keccak256( bytes( string.concat( SINGLE_USE_PERMIT_TRANSFER_ADVANCED_TYPEHASH_STUB, additionalDataTypeString ) ) ) ] = true; _registeredOrderHashes[ keccak256( bytes( string.concat( PERMIT_ORDER_ADVANCED_TYPEHASH_STUB, additionalDataTypeString ) ) ) ] = true; } /** * @notice Transfer an ERC721 token from the owner to the recipient using a permit signature. * * @dev Be advised that the permitted amount for ERC721 is always inferred to be 1, so signed permitted amount * @dev MUST always be set to 1. * * @dev - Throws if the permit is expired * @dev - Throws if the nonce has already been used * @dev - Throws if the permit is not signed by the owner * @dev - Throws if the requested amount exceeds the permitted amount * @dev - Throws if the provided token address does not implement ERC721 transferFrom function * @dev - Returns `false` if the transfer fails * * @dev <h4>Postconditions:</h4> * @dev 1. Transfers the token from the owner to the recipient * @dev 2. The nonce of the permit is marked as used * @dev 3. Performs any additional checks in the before and after hooks * * @param token The address of the token * @param id The ID of the token * @param nonce The nonce of the permit * @param expiration The expiration timestamp of the permit * @param owner The owner of the token * @param to The address to transfer the tokens to * @param signedPermit The permit signature, signed by the owner * * @return isError True if the transfer failed, false otherwise */ function permitTransferFromERC721( address token, uint256 id, uint256 nonce, uint256 expiration, address owner, address to, bytes calldata signedPermit ) external returns (bool isError) { _requireNotPaused(PAUSABLE_PERMITTED_TRANSFER_FROM_ERC721); _checkPermitApproval(TOKEN_TYPE_ERC721, token, id, ONE, nonce, expiration, owner, ONE, signedPermit); isError = _transferFromERC721(owner, to, token, id); if (isError) { _restoreNonce(owner, nonce); } } /** * @notice Transfers an ERC721 token from the owner to the recipient using a permit signature * @notice This function includes additional data to verify on the signature, allowing * @notice protocols to extend the validation in one function call. NOTE: before calling this * @notice function you MUST register the stub end of the additional data typestring using * @notice the `registerAdditionalDataHash` function. * * @dev Be advised that the permitted amount for ERC721 is always inferred to be 1, so signed permitted amount * @dev MUST always be set to 1. * * @dev - Throws for any reason permitTransferFromERC721 would. * @dev - Throws if the additional data does not match the signature * @dev - Throws if the provided hash has not been registered as a valid additional data hash * @dev - Throws if the provided hash does not match the provided additional data * * @dev <h4>Postconditions:</h4> * @dev 1. Transfers the token from the owner to the recipient * @dev 2. Performs any additional checks in the before and after hooks * @dev 3. The nonce of the permit is marked as used * * @param token The address of the token * @param id The ID of the token * @param nonce The nonce of the permit * @param expiration The expiration timestamp of the permit * @param owner The owner of the token * @param to The address to transfer the tokens to * @param additionalData The additional data to verify on the signature * @param advancedPermitHash The hash of the additional data * @param signedPermit The permit signature, signed by the owner * * @return isError True if the transfer failed, false otherwise */ function permitTransferFromWithAdditionalDataERC721( address token, uint256 id, uint256 nonce, uint256 expiration, address owner, address to, bytes32 additionalData, bytes32 advancedPermitHash, bytes calldata signedPermit ) external onlyRegisteredTransferAdvancedTypeHash(advancedPermitHash) returns (bool isError) { _requireNotPaused(PAUSABLE_PERMITTED_TRANSFER_FROM_ERC721); _checkPermitApprovalWithAdditionalDataERC721( token, id, ONE, nonce, expiration, owner, ONE, signedPermit, additionalData, advancedPermitHash ); isError = _transferFromERC721(owner, to, token, id); if (isError) { _restoreNonce(owner, nonce); } } /** * @notice Transfer an ERC1155 token from the owner to the recipient using a permit signature * * @dev - Throws if the permit is expired * @dev - Throws if the nonce has already been used * @dev - Throws if the permit is not signed by the owner * @dev - Throws if the requested amount exceeds the permitted amount * @dev - Throws if the provided token address does not implement ERC1155 safeTransferFrom function * @dev - Returns `false` if the transfer fails * * @dev <h4>Postconditions:</h4> * @dev 1. Transfers the token (in the requested amount) from the owner to the recipient * @dev 2. The nonce of the permit is marked as used * @dev 3. Performs any additional checks in the before and after hooks * * @param token The address of the token * @param id The ID of the token * @param nonce The nonce of the permit * @param permitAmount The amount of tokens permitted by the owner * @param expiration The expiration timestamp of the permit * @param owner The owner of the token * @param to The address to transfer the tokens to * @param transferAmount The amount of tokens to transfer * @param signedPermit The permit signature, signed by the owner * * @return isError True if the transfer failed, false otherwise */ function permitTransferFromERC1155( address token, uint256 id, uint256 nonce, uint256 permitAmount, uint256 expiration, address owner, address to, uint256 transferAmount, bytes calldata signedPermit ) external returns (bool isError) { _requireNotPaused(PAUSABLE_PERMITTED_TRANSFER_FROM_ERC1155); _checkPermitApproval(TOKEN_TYPE_ERC1155, token, id, permitAmount, nonce, expiration, owner, transferAmount, signedPermit); isError = _transferFromERC1155(token, owner, to, id, transferAmount); if (isError) { _restoreNonce(owner, nonce); } } /** * @notice Transfers a token from the owner to the recipient using a permit signature * @notice This function includes additional data to verify on the signature, allowing * @notice protocols to extend the validation in one function call. NOTE: before calling this * @notice function you MUST register the stub end of the additional data typestring using * @notice the `registerAdditionalDataHash` function. * * @dev - Throws for any reason permitTransferFrom would. * @dev - Throws if the additional data does not match the signature * @dev - Throws if the provided hash has not been registered as a valid additional data hash * @dev - Throws if the provided hash does not match the provided additional data * @dev - Throws if the provided hash has not been registered as a valid additional data hash * @dev - Returns `false` if the transfer fails * * @dev <h4>Postconditions:</h4> * @dev 1. Transfers the token (in the requested amount) from the owner to the recipient * @dev 2. Performs any additional checks in the before and after hooks * @dev 3. The nonce of the permit is marked as used * * @param token The address of the token * @param id The ID of the token * @param nonce The nonce of the permit * @param permitAmount The amount of tokens permitted by the owner * @param expiration The expiration timestamp of the permit * @param owner The owner of the token * @param to The address to transfer the tokens to * @param transferAmount The amount of tokens to transfer * @param additionalData The additional data to verify on the signature * @param advancedPermitHash The hash of the additional data * @param signedPermit The permit signature, signed by the owner * * @return isError True if the transfer failed, false otherwise */ function permitTransferFromWithAdditionalDataERC1155( address token, uint256 id, uint256 nonce, uint256 permitAmount, uint256 expiration, address owner, address to, uint256 transferAmount, bytes32 additionalData, bytes32 advancedPermitHash, bytes calldata signedPermit ) external onlyRegisteredTransferAdvancedTypeHash(advancedPermitHash) returns (bool isError) { _requireNotPaused(PAUSABLE_PERMITTED_TRANSFER_FROM_ERC1155); _checkPermitApprovalWithAdditionalDataERC1155( token, id, permitAmount, nonce, expiration, owner, transferAmount, signedPermit, additionalData, advancedPermitHash ); // copy id to top of stack to avoid stack too deep uint256 tmpId = id; isError = _transferFromERC1155(token, owner, to, tmpId, transferAmount); if (isError) { _restoreNonce(owner, nonce); } } /** * @notice Transfer an ERC20 token from the owner to the recipient using a permit signature. * * @dev Be advised that the token ID for ERC20 is always inferred to be 0, so signed token ID * @dev MUST always be set to 0. * * @dev - Throws if the permit is expired * @dev - Throws if the nonce has already been used * @dev - Throws if the permit is not signed by the owner * @dev - Throws if the requested amount exceeds the permitted amount * @dev - Throws if the provided token address does not implement ERC20 transferFrom function * @dev - Returns `false` if the transfer fails * * @dev <h4>Postconditions:</h4> * @dev 1. Transfers the token in the requested amount from the owner to the recipient * @dev 2. The nonce of the permit is marked as used * @dev 3. Performs any additional checks in the before and after hooks * * @param token The address of the token * @param nonce The nonce of the permit * @param permitAmount The amount of tokens permitted by the owner * @param expiration The expiration timestamp of the permit * @param owner The owner of the token * @param to The address to transfer the tokens to * @param signedPermit The permit signature, signed by the owner * * @return isError True if the transfer failed, false otherwise */ function permitTransferFromERC20( address token, uint256 nonce, uint256 permitAmount, uint256 expiration, address owner, address to, uint256 transferAmount, bytes calldata signedPermit ) external returns (bool isError) { _requireNotPaused(PAUSABLE_PERMITTED_TRANSFER_FROM_ERC20); _checkPermitApproval(TOKEN_TYPE_ERC20, token, ZERO, permitAmount, nonce, expiration, owner, transferAmount, signedPermit); isError = _transferFromERC20(token, owner, to, ZERO, transferAmount); if (isError) { _restoreNonce(owner, nonce); } } /** * @notice Transfers an ERC20 token from the owner to the recipient using a permit signature * @notice This function includes additional data to verify on the signature, allowing * @notice protocols to extend the validation in one function call. NOTE: before calling this * @notice function you MUST register the stub end of the additional data typestring using * @notice the `registerAdditionalDataHash` function. * * @dev Be advised that the token ID for ERC20 is always inferred to be 0, so signed token ID * @dev MUST always be set to 0. * * @dev - Throws for any reason permitTransferFromERC20 would. * @dev - Throws if the additional data does not match the signature * @dev - Throws if the provided hash has not been registered as a valid additional data hash * @dev - Throws if the provided hash does not match the provided additional data * @dev - Returns `false` if the transfer fails * * @dev <h4>Postconditions:</h4> * @dev 1. Transfers the token (in the requested amount) from the owner to the recipient * @dev 2. Performs any additional checks in the before and after hooks * @dev 3. The nonce of the permit is marked as used * * @param token The address of the token * @param nonce The nonce of the permit * @param permitAmount The amount of tokens permitted by the owner * @param expiration The expiration timestamp of the permit * @param owner The owner of the token * @param to The address to transfer the tokens to * @param transferAmount The amount of tokens to transfer * @param additionalData The additional data to verify on the signature * @param advancedPermitHash The hash of the additional data * @param signedPermit The permit signature, signed by the owner * * @return isError True if the transfer failed, false otherwise */ function permitTransferFromWithAdditionalDataERC20( address token, uint256 nonce, uint256 permitAmount, uint256 expiration, address owner, address to, uint256 transferAmount, bytes32 additionalData, bytes32 advancedPermitHash, bytes calldata signedPermit ) external onlyRegisteredTransferAdvancedTypeHash(advancedPermitHash) returns (bool isError) { _requireNotPaused(PAUSABLE_PERMITTED_TRANSFER_FROM_ERC20); _checkPermitApprovalWithAdditionalDataERC20( token, ZERO, permitAmount, nonce, expiration, owner, transferAmount, signedPermit, additionalData, advancedPermitHash ); isError = _transferFromERC20(token, owner, to, ZERO, transferAmount); if (isError) { _restoreNonce(owner, nonce); } } /** * @notice Returns true if the provided hash has been registered as a valid additional data hash for transfers. * * @param hash The hash to check * * @return isRegistered true if the hash is valid, false otherwise */ function isRegisteredTransferAdditionalDataHash(bytes32 hash) external view returns (bool isRegistered) { isRegistered = _registeredTransferHashes[hash]; } /** * @notice Returns true if the provided hash has been registered as a valid additional data hash for orders. * * @param hash The hash to check * * @return isRegistered true if the hash is valid, false otherwise */ function isRegisteredOrderAdditionalDataHash(bytes32 hash) external view returns (bool isRegistered) { isRegistered = _registeredOrderHashes[hash]; } /** * ================================================= * =============== Order Transfers ================= * ================================================= */ /** * @notice Transfers an ERC1155 token from the owner to the recipient using a permit signature * @notice Order transfers are used to transfer a specific amount of a token from a specific order * @notice and allow for multiple uses of the same permit up to the allocated amount. NOTE: before calling this * @notice function you MUST register the stub end of the additional data typestring using * @notice the `registerAdditionalDataHash` function. * * @dev - Throws if the permit is expired * @dev - Throws if the permit is not signed by the owner * @dev - Throws if the requested amount + amount already filled exceeds the permitted amount * @dev - Throws if the requested amount is less than the minimum fill amount * @dev - Throws if the provided token address does not implement ERC1155 safeTransferFrom function * @dev - Throws if the provided advanced permit hash has not been registered * @dev - Returns `false` if the transfer fails * * @dev <h4>Postconditions:</h4> * @dev 1. Transfers the token (in the requested amount) from the owner to the recipient * @dev 2. Updates the amount filled for the order ID * @dev 3. If completely filled, marks the order as filled * * @param signedPermit The permit signature, signed by the owner * @param orderFillAmounts The amount of tokens to transfer * @param token The address of the token * @param id The ID of the token * @param owner The owner of the token * @param to The address to transfer the tokens to * @param salt The salt of the permit * @param expiration The expiration timestamp of the permit * @param orderId The order ID * @param advancedPermitHash The hash of the additional data * * @return quantityFilled The amount of tokens filled * @return isError True if the transfer failed, false otherwise */ function fillPermittedOrderERC1155( bytes calldata signedPermit, OrderFillAmounts calldata orderFillAmounts, address token, uint256 id, address owner, address to, uint256 salt, uint48 expiration, bytes32 orderId, bytes32 advancedPermitHash ) external onlyRegisteredOrderAdvancedTypeHash(advancedPermitHash) returns (uint256 quantityFilled, bool isError) { _requireNotPaused(PAUSABLE_ORDER_TRANSFER_FROM_ERC1155); PackedApproval storage orderStatus = _checkOrderTransferERC1155( signedPermit, orderFillAmounts, token, id, owner, salt, expiration, orderId, advancedPermitHash ); ( quantityFilled, isError ) = _orderTransfer( orderStatus, orderFillAmounts, token, id, owner, to, orderId, _transferFromERC1155 ); if (isError) { _restoreFillableItems(orderStatus, owner, orderId, quantityFilled, true); } } /** * @notice Transfers an ERC20 token from the owner to the recipient using a permit signature * @notice Order transfers are used to transfer a specific amount of a token from a specific order * @notice and allow for multiple uses of the same permit up to the allocated amount. NOTE: before calling this * @notice function you MUST register the stub end of the additional data typestring using * @notice the `registerAdditionalDataHash` function. * * @dev - Throws if the permit is expired * @dev - Throws if the permit is not signed by the owner * @dev - Throws if the requested amount + amount already filled exceeds the permitted amount * @dev - Throws if the requested amount is less than the minimum fill amount * @dev - Throws if the provided token address does not implement ERC20 transferFrom function * @dev - Throws if the provided advanced permit hash has not been registered * @dev - Returns `false` if the transfer fails * * @dev <h4>Postconditions:</h4> * @dev 1. Transfers the token (in the requested amount) from the owner to the recipient * @dev 2. Updates the amount filled for the order ID * @dev 3. If completely filled, marks the order as filled * * @param signedPermit The permit signature, signed by the owner * @param orderFillAmounts The amount of tokens to transfer * @param token The address of the token * @param owner The owner of the token * @param to The address to transfer the tokens to * @param salt The salt of the permit * @param expiration The expiration timestamp of the permit * @param orderId The order ID * @param advancedPermitHash The hash of the additional data * * @return quantityFilled The amount of tokens filled * @return isError True if the transfer failed, false otherwise */ function fillPermittedOrderERC20( bytes calldata signedPermit, OrderFillAmounts calldata orderFillAmounts, address token, address owner, address to, uint256 salt, uint48 expiration, bytes32 orderId, bytes32 advancedPermitHash ) external onlyRegisteredOrderAdvancedTypeHash(advancedPermitHash) returns (uint256 quantityFilled, bool isError) { _requireNotPaused(PAUSABLE_ORDER_TRANSFER_FROM_ERC20); PackedApproval storage orderStatus = _checkOrderTransferERC20( signedPermit, orderFillAmounts, token, ZERO, owner, salt, expiration, orderId, advancedPermitHash ); ( quantityFilled, isError ) = _orderTransfer( orderStatus, orderFillAmounts, token, ZERO, owner, to, orderId, _transferFromERC20 ); if (isError) { _restoreFillableItems(orderStatus, owner, orderId, quantityFilled, true); } } /** * @notice Closes an outstanding order to prevent further execution of transfers. * * @dev - Throws if the order is not in the open state * * @dev <h4>Postconditions:</h4> * @dev 1. Marks the order as cancelled * @dev 2. Sets the order amount to 0 * @dev 3. Sets the order expiration to 0 * @dev 4. Emits a OrderClosed event * * @param owner The owner of the token * @param operator The operator allowed to transfer the token * @param tokenType The type of token the order is for - must be 20, 721 or 1155. * @param token The address of the token contract * @param id The token ID * @param orderId The order ID */ function closePermittedOrder( address owner, address operator, uint256 tokenType, address token, uint256 id, bytes32 orderId ) external { if(!(msg.sender == owner || msg.sender == operator)) { revert PermitC__CallerMustBeOwnerOrOperator(); } _requireValidTokenType(tokenType); PackedApproval storage orderStatus = _getPackedApprovalPtr(_orderApprovals, owner, tokenType, token, id, orderId, operator); if (orderStatus.state == ORDER_STATE_OPEN) { orderStatus.state = ORDER_STATE_CANCELLED; orderStatus.amount = 0; orderStatus.expiration = 0; emit OrderClosed(orderId, owner, operator, true); } else { revert PermitC__OrderIsEitherCancelledOrFilled(); } } /** * @notice Returns the amount of allowance an operator has for a specific token and id * @notice If the expiration on the allowance has expired, returns 0 * * @dev Overload of the on chain allowance function for approvals with a specified order ID * * @param owner The owner of the token * @param operator The operator of the token * @param token The address of the token contract * @param id The token ID * * @return allowedAmount The amount of allowance the operator has */ function allowance( address owner, address operator, uint256 tokenType, address token, uint256 id, bytes32 orderId ) external view returns (uint256 allowedAmount, uint256 expiration) { return _allowance(_orderApprovals, owner, operator, tokenType, token, id, orderId); } /** * ================================================= * ================ Nonce Management =============== * ================================================= */ /** * @notice Invalidates the provided nonce * * @dev - Throws if the provided nonce has already been used * * @dev <h4>Postconditions:</h4> * @dev 1. Sets the provided nonce as used for the sender * * @param nonce Nonce to invalidate */ function invalidateUnorderedNonce(uint256 nonce) external { _checkAndInvalidateNonce(msg.sender, nonce); } /** * @notice Returns if the provided nonce has been used * * @param owner The owner of the token * @param nonce The nonce to check * * @return isValid true if the nonce is valid, false otherwise */ function isValidUnorderedNonce(address owner, uint256 nonce) external view returns (bool isValid) { isValid = ((_unorderedNonces[owner][uint248(nonce >> 8)] >> uint8(nonce)) & ONE) == ZERO; } /** * @notice Revokes all outstanding approvals for the sender * * @dev <h4>Postconditions:</h4> * @dev 1. Increments the master nonce for the sender * @dev 2. All outstanding approvals for the sender are invalidated */ function lockdown() external { unchecked { _masterNonces[msg.sender]++; } emit Lockdown(msg.sender); } /** * @notice Returns the master nonce for the provided owner address * * @param owner The owner address * * @return The master nonce */ function masterNonce(address owner) external view returns (uint256) { return _masterNonces[owner]; } /** * ================================================= * ============== Transfer Functions =============== * ================================================= */ /** * @notice Transfer an ERC721 token from the owner to the recipient using on chain approvals * * @dev Public transfer function overload for approval transfers * @dev - Throws if the provided token address does not implement ERC721 transferFrom function * @dev - Throws if the requested amount exceeds the approved amount * @dev - Throws if the approval is expired * @dev - Returns `false` if the transfer fails * * @dev <h4>Postconditions:</h4> * @dev 1. Transfers the token (in the requested amount) from the owner to the recipient * @dev 2. Decrements the approval amount by the requested amount * @dev 3. Performs any additional checks in the before and after hooks * * @param owner The owner of the token * @param to The recipient of the token * @param token The address of the token * @param id The id of the token * * @return isError True if the transfer failed, false otherwise */ function transferFromERC721( address owner, address to, address token, uint256 id ) external returns (bool isError) { _requireNotPaused(PAUSABLE_APPROVAL_TRANSFER_FROM_ERC721); PackedApproval storage approval = _checkAndUpdateApproval(owner, TOKEN_TYPE_ERC721, token, id, ONE, true); isError = _transferFromERC721(owner, to, token, id); if (isError) { _restoreFillableItems(approval, owner, ZERO_BYTES32, ONE, false); } } /** * @notice Transfer an ERC1155 token from the owner to the recipient using on chain approvals * * @dev Public transfer function overload for approval transfers * @dev - Throws if the provided token address does not implement ERC1155 safeTransferFrom function * @dev - Throws if the requested amount exceeds the approved amount * @dev - Throws if the approval is expired * @dev - Returns `false` if the transfer fails * * @dev <h4>Postconditions:</h4> * @dev 1. Transfers the token (in the requested amount) from the owner to the recipient * @dev 2. Decrements the approval amount by the requested amount * @dev 3. Performs any additional checks in the before and after hooks * * @param owner The owner of the token * @param to The recipient of the token * @param amount The amount of the token to transfer * @param token The address of the token * @param id The id of the token * * @return isError True if the transfer failed, false otherwise */ function transferFromERC1155( address owner, address to, address token, uint256 id, uint256 amount ) external returns (bool isError) { _requireNotPaused(PAUSABLE_APPROVAL_TRANSFER_FROM_ERC1155); PackedApproval storage approval = _checkAndUpdateApproval(owner, TOKEN_TYPE_ERC1155, token, id, amount, false); isError = _transferFromERC1155(token, owner, to, id, amount); if (isError) { _restoreFillableItems(approval, owner, ZERO_BYTES32, amount, false); } } /** * @notice Transfer an ERC20 token from the owner to the recipient using on chain approvals * * @dev Public transfer function overload for approval transfers * @dev - Throws if the provided token address does not implement ERC20 transferFrom function * @dev - Throws if the requested amount exceeds the approved amount * @dev - Throws if the approval is expired * @dev - Returns `false` if the transfer fails * * @dev <h4>Postconditions:</h4> * @dev 1. Transfers the token (in the requested amount) from the owner to the recipient * @dev 2. Decrements the approval amount by the requested amount * @dev 3. Performs any additional checks in the before and after hooks * * @param owner The owner of the token * @param to The recipient of the token * @param amount The amount of the token to transfer * @param token The address of the token * * @return isError True if the transfer failed, false otherwise */ function transferFromERC20( address owner, address to, address token, uint256 amount ) external returns (bool isError) { _requireNotPaused(PAUSABLE_APPROVAL_TRANSFER_FROM_ERC20); PackedApproval storage approval = _checkAndUpdateApproval(owner, TOKEN_TYPE_ERC20, token, ZERO, amount, false); isError = _transferFromERC20(token, owner, to, ZERO, amount); if (isError) { _restoreFillableItems(approval, owner, ZERO_BYTES32, amount, false); } } /** * @notice Performs a transfer of an ERC721 token. * * @dev Will **NOT** attempt transfer if `_beforeTransferFrom` hook returns false. * @dev Will **NOT** revert if the transfer is unsucessful. * @dev Invokers **MUST** check `isError` return value to determine success. * * @param owner The owner of the token being transferred * @param to The address to transfer the token to * @param token The token address of the token being transferred * @param id The token id being transferred * * @return isError True if the token was not transferred, false if token was transferred */ function _transferFromERC721( address owner, address to, address token, uint256 id ) private returns (bool isError) { isError = _beforeTransferFrom(TOKEN_TYPE_ERC721, token, owner, to, id, ONE); if (!isError) { try IERC721(token).transferFrom(owner, to, id) { } catch { isError = true; } } } /** * @notice Performs a transfer of an ERC1155 token. * * @dev Will **NOT** attempt transfer if `_beforeTransferFrom` hook returns false. * @dev Will **NOT** revert if the transfer is unsucessful. * @dev Invokers **MUST** check `isError` return value to determine success. * * @param token The token address of the token being transferred * @param owner The owner of the token being transferred * @param to The address to transfer the token to * @param id The token id being transferred * @param amount The quantity of token id to transfer * * @return isError True if the token was not transferred, false if token was transferred */ function _transferFromERC1155( address token, address owner, address to, uint256 id, uint256 amount ) private returns (bool isError) { isError = _beforeTransferFrom(TOKEN_TYPE_ERC1155, token, owner, to, id, amount); if (!isError) { try IERC1155(token).safeTransferFrom(owner, to, id, amount, "") { } catch { isError = true; } } } /** * @notice Performs a transfer of an ERC20 token. * * @dev Will **NOT** attempt transfer if `_beforeTransferFrom` hook returns false. * @dev Will **NOT** revert if the transfer is unsucessful. * @dev Invokers **MUST** check `isError` return value to determine success. * * @param token The token address of the token being transferred * @param owner The owner of the token being transferred * @param to The address to transfer the token to * @param amount The quantity of token id to transfer * * @return isError True if the token was not transferred, false if token was transferred */ function _transferFromERC20( address token, address owner, address to, uint256 /*id*/, uint256 amount ) private returns (bool isError) { isError = _beforeTransferFrom(TOKEN_TYPE_ERC20, token, owner, to, ZERO, amount); if (!isError) { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, owner, to, amount)); if (!success) { isError = true; } else if (data.length > 0) { isError = !abi.decode(data, (bool)); } } } /** * ================================================= * ============ Signature Verification ============= * ================================================= */ /** * @notice Returns the domain separator used in the permit signature * * @return domainSeparator The domain separator */ function domainSeparatorV4() external view returns (bytes32 domainSeparator) { domainSeparator = _domainSeparatorV4(); } /** * @notice Verifies a permit signature based on the bytes length of the signature provided. * * @dev Throws when - * @dev The bytes signature length is 64 or 65 bytes AND * @dev The ECDSA recovered signer is not the owner AND * @dev The owner's code length is zero OR the owner does not return a valid EIP-1271 response * @dev * @dev OR * @dev * @dev The bytes signature length is not 64 or 65 bytes AND * @dev The owner's code length is zero OR the owner does not return a valid EIP-1271 response */ function _verifyPermitSignature(bytes32 digest, bytes calldata signature, address owner) private view { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // Divide the signature in r, s and v variables /// @solidity memory-safe-assembly assembly { r := calldataload(signature.offset) s := calldataload(add(signature.offset, 32)) v := byte(0, calldataload(add(signature.offset, 64))) } (bool isError, address signer) = _ecdsaRecover(digest, v, r, s); if (owner != signer || isError) { _verifyEIP1271Signature(owner, digest, signature); } } else if (signature.length == 64) { bytes32 r; bytes32 vs; // Divide the signature in r and vs variables /// @solidity memory-safe-assembly assembly { r := calldataload(signature.offset) vs := calldataload(add(signature.offset, 32)) } (bool isError, address signer) = _ecdsaRecover(digest, r, vs); if (owner != signer || isError) { _verifyEIP1271Signature(owner, digest, signature); } } else { _verifyEIP1271Signature(owner, digest, signature); } } /** * @notice Verifies an EIP-1271 signature. * * @dev Throws when `signer` code length is zero OR the EIP-1271 call does not * @dev return the correct magic value. * * @param signer The signer address to verify a signature with * @param hash The hash digest to verify with the signer * @param signature The signature to verify */ function _verifyEIP1271Signature(address signer, bytes32 hash, bytes calldata signature) private view { if(signer.code.length == 0) { revert PermitC__SignatureTransferInvalidSignature(); } if (!_safeIsValidSignature(signer, hash, signature)) { revert PermitC__SignatureTransferInvalidSignature(); } } /** * @notice Overload of the `_ecdsaRecover` function to unpack the `v` and `s` values * * @param digest The hash digest that was signed * @param r The `r` value of the signature * @param vs The packed `v` and `s` values of the signature * * @return isError True if the ECDSA function is provided invalid inputs * @return signer The recovered address from ECDSA */ function _ecdsaRecover(bytes32 digest, bytes32 r, bytes32 vs) private pure returns (bool isError, address signer) { unchecked { bytes32 s = vs & UPPER_BIT_MASK; uint8 v = uint8(uint256(vs >> 255)) + 27; (isError, signer) = _ecdsaRecover(digest, v, r, s); } } /** * @notice Recovers the signer address using ECDSA * * @dev Does **NOT** revert if invalid input values are provided or `signer` is recovered as address(0) * @dev Returns an `isError` value in those conditions that is handled upstream * * @param digest The hash digest that was signed * @param v The `v` value of the signature * @param r The `r` value of the signature * @param s The `s` value of the signature * * @return isError True if the ECDSA function is provided invalid inputs * @return signer The recovered address from ECDSA */ function _ecdsaRecover(bytes32 digest, uint8 v, bytes32 r, bytes32 s) private pure returns (bool isError, address signer) { if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { // Invalid signature `s` value - return isError = true and signer = address(0) to check EIP-1271 return (true, address(0)); } signer = ecrecover(digest, v, r, s); isError = (signer == address(0)); } /** * @notice A gas efficient, and fallback-safe way to call the isValidSignature function for EIP-1271. * * @param signer The EIP-1271 signer to call to check for a valid signature. * @param hash The hash digest to verify with the EIP-1271 signer. * @param signature The supplied signature to verify. * * @return isValid True if the EIP-1271 signer returns the EIP-1271 magic value. */ function _safeIsValidSignature( address signer, bytes32 hash, bytes calldata signature ) private view returns(bool isValid) { assembly { function _callIsValidSignature(_signer, _hash, _signatureOffset, _signatureLength) -> _isValid { let ptr := mload(0x40) // store isValidSignature(bytes32,bytes) selector mstore(ptr, hex"1626ba7e") // store bytes32 hash value in abi encoded location mstore(add(ptr, 0x04), _hash) // store abi encoded location of the bytes signature data mstore(add(ptr, 0x24), 0x40) // store bytes signature length mstore(add(ptr, 0x44), _signatureLength) // copy calldata bytes signature to memory calldatacopy(add(ptr, 0x64), _signatureOffset, _signatureLength) // calculate data length based on abi encoded data with rounded up signature length let dataLength := add(0x64, and(add(_signatureLength, 0x1F), not(0x1F))) // update free memory pointer mstore(0x40, add(ptr, dataLength)) // static call _signer with abi encoded data // skip return data check if call failed or return data size is not at least 32 bytes if and(iszero(lt(returndatasize(), 0x20)), staticcall(gas(), _signer, ptr, dataLength, 0x00, 0x20)) { // check if return data is equal to isValidSignature magic value _isValid := eq(mload(0x00), hex"1626ba7e") leave } } isValid := _callIsValidSignature(signer, hash, signature.offset, signature.length) } } /** * ================================================= * ===================== Hooks ===================== * ================================================= */ /** * @dev This function is empty by default. Override it to add additional logic after the approval transfer. * @dev The function returns a boolean value instead of reverting to indicate if there is an error for more granular control in inheriting protocols. */ function _beforeTransferFrom(uint256 tokenType, address token, address owner, address to, uint256 id, uint256 amount) internal virtual returns (bool isError) {} /** * ================================================= * ==================== Internal =================== * ================================================= */ /** * @notice Checks if an advanced permit typehash has been registered with PermitC * * @dev Throws when the typehash has not been registered * * @param advancedPermitHash The permit typehash to check */ function _requireTransferAdvancedPermitHashIsRegistered(bytes32 advancedPermitHash) private view { if (!_registeredTransferHashes[advancedPermitHash]) { revert PermitC__SignatureTransferPermitHashNotRegistered(); } } /** * @notice Checks if an advanced permit typehash has been registered with PermitC * * @dev Throws when the typehash has not been registered * * @param advancedPermitHash The permit typehash to check */ function _requireOrderAdvancedPermitHashIsRegistered(bytes32 advancedPermitHash) private view { if (!_registeredOrderHashes[advancedPermitHash]) { revert PermitC__SignatureTransferPermitHashNotRegistered(); } } /** * @notice Invalidates an account nonce if it has not been previously used * * @dev Throws when the nonce was previously used * * @param account The account to invalidate the nonce of * @param nonce The nonce to invalidate */ function _checkAndInvalidateNonce(address account, uint256 nonce) private { unchecked { if (uint256(_unorderedNonces[account][uint248(nonce >> 8)] ^= (ONE << uint8(nonce))) & (ONE << uint8(nonce)) == ZERO) { revert PermitC__NonceAlreadyUsedOrRevoked(); } } } /** * @notice Checks an approval to ensure it is sufficient for the `amount` to send * * @dev Throws when the approval is expired * @dev Throws when the approved amount is insufficient * * @param owner The owner of the token * @param tokenType The type of token * @param token The address of the token * @param id The id of the token * @param amount The amount to deduct from the approval * @param zeroOutApproval True if the approval should be set to zero * * @return approval Storage pointer for the approval data */ function _checkAndUpdateApproval( address owner, uint256 tokenType, address token, uint256 id, uint256 amount, bool zeroOutApproval ) private returns (PackedApproval storage approval) { approval = _getPackedApprovalPtr(_transferApprovals, owner, tokenType, token, id, ZERO_BYTES32, msg.sender); if (approval.expiration < block.timestamp) { revert PermitC__ApprovalTransferPermitExpiredOrUnset(); } if (approval.amount < amount) { revert PermitC__ApprovalTransferExceededPermittedAmount(); } if(zeroOutApproval) { approval.amount = 0; } else if (approval.amount < type(uint200).max) { unchecked { approval.amount -= uint200(amount); } } } /** * @notice Gets the storage pointer for an approval * * @param _approvals The mapping to retrieve the approval from * @param account The account the approval is from * @param tokenType The type of token the approval is for * @param token The address of the token * @param id The id of the token * @param orderId The order id for the approval * @param operator The operator for the approval * * @return approval Storage pointer for the approval data */ function _getPackedApprovalPtr( mapping(bytes32 => mapping(address => PackedApproval)) storage _approvals, address account, uint256 tokenType, address token, uint256 id, bytes32 orderId, address operator ) private view returns (PackedApproval storage approval) { approval = _approvals[_getPackedApprovalKey(account, tokenType, token, id, orderId)][operator]; } /** * @notice Gets the storage key for the mapping for a specific approval * * @param owner The owner of the token * @param tokenType The type of token * @param token The address of the token * @param id The id of the token * @param orderId The order id of the approval * * @return key The key value to use to access the approval in the mapping */ function _getPackedApprovalKey(address owner, uint256 tokenType, address token, uint256 id, bytes32 orderId) private view returns (bytes32 key) { key = keccak256(abi.encode(owner, tokenType, token, id, orderId, _masterNonces[owner])); } /** * @notice Checks the permit approval for a single use permit without additional data * * @dev Throws when the `nonce` has already been consumed * @dev Throws when the permit amount is less than the transfer amount * @dev Throws when the permit is expired * @dev Throws when the signature is invalid * * @param tokenType The type of token * @param token The address of the token * @param id The id of the token * @param permitAmount The amount authorized by the owner signature * @param nonce The nonce of the permit * @param expiration The time the permit expires * @param owner The owner of the token * @param transferAmount The amount of tokens requested to transfer * @param signedPermit The signature for the permit */ function _checkPermitApproval( uint256 tokenType, address token, uint256 id, uint256 permitAmount, uint256 nonce, uint256 expiration, address owner, uint256 transferAmount, bytes calldata signedPermit ) private { bytes32 digest = _hashTypedDataV4( PermitHash.hashSingleUsePermit( tokenType, token, id, permitAmount, nonce, expiration, _masterNonces[owner] ) ); _checkPermitData( nonce, expiration, transferAmount, permitAmount, owner, digest, signedPermit ); } /** * @notice Overload of `_checkPermitApprovalWithAdditionalData` to supply TOKEN_TYPE_ERC1155 * * @dev Prevents stack too deep in `permitTransferFromWithAdditionalDataERC1155` * @dev Throws when the `nonce` has already been consumed * @dev Throws when the permit amount is less than the transfer amount * @dev Throws when the permit is expired * @dev Throws when the signature is invalid * * @param token The address of the token * @param id The id of the token * @param permitAmount The amount authorized by the owner signature * @param nonce The nonce of the permit * @param expiration The time the permit expires * @param owner The owner of the token * @param transferAmount The amount of tokens requested to transfer * @param signedPermit The signature for the permit * @param additionalData The additional data to validate with the permit signature * @param advancedPermitHash The typehash of the permit to use for validating the signature */ function _checkPermitApprovalWithAdditionalDataERC1155( address token, uint256 id, uint256 permitAmount, uint256 nonce, uint256 expiration, address owner, uint256 transferAmount, bytes calldata signedPermit, bytes32 additionalData, bytes32 advancedPermitHash ) private { _checkPermitApprovalWithAdditionalData( TOKEN_TYPE_ERC1155, token, id, permitAmount, nonce, expiration, owner, transferAmount, signedPermit, additionalData, advancedPermitHash ); } /** * @notice Overload of `_checkPermitApprovalWithAdditionalData` to supply TOKEN_TYPE_ERC20 * * @dev Prevents stack too deep in `permitTransferFromWithAdditionalDataERC220` * @dev Throws when the `nonce` has already been consumed * @dev Throws when the permit amount is less than the transfer amount * @dev Throws when the permit is expired * @dev Throws when the signature is invalid * * @param token The address of the token * @param id The id of the token * @param permitAmount The amount authorized by the owner signature * @param nonce The nonce of the permit * @param expiration The time the permit expires * @param owner The owner of the token * @param transferAmount The amount of tokens requested to transfer * @param signedPermit The signature for the permit * @param additionalData The additional data to validate with the permit signature * @param advancedPermitHash The typehash of the permit to use for validating the signature */ function _checkPermitApprovalWithAdditionalDataERC20( address token, uint256 id, uint256 permitAmount, uint256 nonce, uint256 expiration, address owner, uint256 transferAmount, bytes calldata signedPermit, bytes32 additionalData, bytes32 advancedPermitHash ) private { _checkPermitApprovalWithAdditionalData( TOKEN_TYPE_ERC20, token, id, permitAmount, nonce, expiration, owner, transferAmount, signedPermit, additionalData, advancedPermitHash ); } /** * @notice Overload of `_checkPermitApprovalWithAdditionalData` to supply TOKEN_TYPE_ERC721 * * @dev Prevents stack too deep in `permitTransferFromWithAdditionalDataERC721` * @dev Throws when the `nonce` has already been consumed * @dev Throws when the permit amount is less than the transfer amount * @dev Throws when the permit is expired * @dev Throws when the signature is invalid * * @param token The address of the token * @param id The id of the token * @param permitAmount The amount authorized by the owner signature * @param nonce The nonce of the permit * @param expiration The time the permit expires * @param owner The owner of the token * @param transferAmount The amount of tokens requested to transfer * @param signedPermit The signature for the permit * @param additionalData The additional data to validate with the permit signature * @param advancedPermitHash The typehash of the permit to use for validating the signature */ function _checkPermitApprovalWithAdditionalDataERC721( address token, uint256 id, uint256 permitAmount, uint256 nonce, uint256 expiration, address owner, uint256 transferAmount, bytes calldata signedPermit, bytes32 additionalData, bytes32 advancedPermitHash ) private { _checkPermitApprovalWithAdditionalData( TOKEN_TYPE_ERC721, token, id, permitAmount, nonce, expiration, owner, transferAmount, signedPermit, additionalData, advancedPermitHash ); } /** * @notice Checks the permit approval for a single use permit with additional data * * @dev Throws when the `nonce` has already been consumed * @dev Throws when the permit amount is less than the transfer amount * @dev Throws when the permit is expired * @dev Throws when the signature is invalid * * @param tokenType The type of token * @param token The address of the token * @param id The id of the token * @param permitAmount The amount authorized by the owner signature * @param nonce The nonce of the permit * @param expiration The time the permit expires * @param owner The owner of the token * @param transferAmount The amount of tokens requested to transfer * @param signedPermit The signature for the permit * @param additionalData The additional data to validate with the permit signature * @param advancedPermitHash The typehash of the permit to use for validating the signature */ function _checkPermitApprovalWithAdditionalData( uint256 tokenType, address token, uint256 id, uint256 permitAmount, uint256 nonce, uint256 expiration, address owner, uint256 transferAmount, bytes calldata signedPermit, bytes32 additionalData, bytes32 advancedPermitHash ) private { bytes32 digest = _getAdvancedTypedDataV4PermitHash( tokenType, token, id, permitAmount, owner, nonce, expiration, additionalData, advancedPermitHash ); _checkPermitData( nonce, expiration, transferAmount, permitAmount, owner, digest, signedPermit ); } /** * @notice Checks that a single use permit has not expired, was authorized for the amount * @notice being transferred, has a valid nonce and has a valid signature. * * @dev Throws when the `nonce` has already been consumed * @dev Throws when the permit amount is less than the transfer amount * @dev Throws when the permit is expired * @dev Throws when the signature is invalid * * @param nonce The nonce of the permit * @param expiration The time the permit expires * @param transferAmount The amount of tokens requested to transfer * @param permitAmount The amount authorized by the owner signature * @param owner The owner of the token * @param digest The digest that was signed by the owner * @param signedPermit The signature for the permit */ function _checkPermitData( uint256 nonce, uint256 expiration, uint256 transferAmount, uint256 permitAmount, address owner, bytes32 digest, bytes calldata signedPermit ) private { if (block.timestamp > expiration) { revert PermitC__SignatureTransferExceededPermitExpired(); } if (transferAmount > permitAmount) { revert PermitC__SignatureTransferExceededPermittedAmount(); } _checkAndInvalidateNonce(owner, nonce); _verifyPermitSignature(digest, signedPermit, owner); } /** * @notice Stores an approval for future use by `operator` to move tokens on behalf of `owner` * * @param tokenType The type of token * @param token The address of the token * @param id The id of the token * @param amount The amount authorized by the owner * @param expiration The time the permit expires * @param owner The owner of the token * @param operator The account allowed to transfer the tokens */ function _storeApproval( uint256 tokenType, address token, uint256 id, uint200 amount, uint48 expiration, address owner, address operator ) private { PackedApproval storage approval = _getPackedApprovalPtr(_transferApprovals, owner, tokenType, token, id, ZERO_BYTES32, operator); approval.expiration = expiration; approval.amount = amount; emit Approval(owner, token, operator, id, amount, expiration); } /** * @notice Overload of `_checkOrderTransfer` to supply TOKEN_TYPE_ERC1155 * * @dev Prevents stack too deep in `fillPermittedOrderERC1155` * @dev Throws when the order start amount is greater than type(uint200).max * @dev Throws when the order status is not open * @dev Throws when the signature is invalid * @dev Throws when the permit is expired * * @param signedPermit The signature for the permit * @param orderFillAmounts A struct containing the order start, requested fill and minimum fill amounts * @param token The address of the token * @param id The id of the token * @param owner The owner of the token * @param salt The salt value for the permit * @param expiration The time the permit expires * @param orderId The order id for the permit * @param advancedPermitHash The typehash of the permit to use for validating the signature * * @return orderStatus Storage pointer for the approval data */ function _checkOrderTransferERC1155( bytes calldata signedPermit, OrderFillAmounts calldata orderFillAmounts, address token, uint256 id, address owner, uint256 salt, uint48 expiration, bytes32 orderId, bytes32 advancedPermitHash ) private returns (PackedApproval storage orderStatus) { orderStatus = _checkOrderTransfer( signedPermit, orderFillAmounts, TOKEN_TYPE_ERC1155, token, id, owner, salt, expiration, orderId, advancedPermitHash ); } /** * @notice Overload of `_checkOrderTransfer` to supply TOKEN_TYPE_ERC20 * * @dev Prevents stack too deep in `fillPermittedOrderERC20` * @dev Throws when the order start amount is greater than type(uint200).max * @dev Throws when the order status is not open * @dev Throws when the signature is invalid * @dev Throws when the permit is expired * * @param signedPermit The signature for the permit * @param orderFillAmounts A struct containing the order start, requested fill and minimum fill amounts * @param token The address of the token * @param id The id of the token * @param owner The owner of the token * @param salt The salt value for the permit * @param expiration The time the permit expires * @param orderId The order id for the permit * @param advancedPermitHash The typehash of the permit to use for validating the signature * * @return orderStatus Storage pointer for the approval data */ function _checkOrderTransferERC20( bytes calldata signedPermit, OrderFillAmounts calldata orderFillAmounts, address token, uint256 id, address owner, uint256 salt, uint48 expiration, bytes32 orderId, bytes32 advancedPermitHash ) private returns (PackedApproval storage orderStatus) { orderStatus = _checkOrderTransfer( signedPermit, orderFillAmounts, TOKEN_TYPE_ERC20, token, id, owner, salt, expiration, orderId, advancedPermitHash ); } /** * @notice Validates an order transfer to check order start amount, status, signature if not previously * @notice opened, and expiration. * * @dev Throws when the order start amount is greater than type(uint200).max * @dev Throws when the order status is not open * @dev Throws when the signature is invalid * @dev Throws when the permit is expired * * @param signedPermit The signature for the permit * @param orderFillAmounts A struct containing the order start, requested fill and minimum fill amounts * @param tokenType The type of token * @param token The address of the token * @param id The id of the token * @param owner The owner of the token * @param salt The salt value for the permit * @param expiration The time the permit expires * @param orderId The order id for the permit * @param advancedPermitHash The typehash of the permit to use for validating the signature * * @return orderStatus Storage pointer for the approval data */ function _checkOrderTransfer( bytes calldata signedPermit, OrderFillAmounts calldata orderFillAmounts, uint256 tokenType, address token, uint256 id, address owner, uint256 salt, uint48 expiration, bytes32 orderId, bytes32 advancedPermitHash ) private returns (PackedApproval storage orderStatus) { if (orderFillAmounts.orderStartAmount > type(uint200).max) { revert PermitC__AmountExceedsStorageMaximum(); } orderStatus = _getPackedApprovalPtr(_orderApprovals, owner, tokenType, token, id, orderId, msg.sender); if (orderStatus.state == ORDER_STATE_OPEN) { if (orderStatus.amount == 0) { _verifyPermitSignature( _getAdvancedTypedDataV4PermitHash( tokenType, token, id, orderFillAmounts.orderStartAmount, owner, salt, expiration, orderId, advancedPermitHash ), signedPermit, owner ); orderStatus.amount = uint200(orderFillAmounts.orderStartAmount); orderStatus.expiration = expiration; emit OrderOpened(orderId, owner, msg.sender, orderFillAmounts.orderStartAmount); } if (block.timestamp > orderStatus.expiration) { revert PermitC__SignatureTransferExceededPermitExpired(); } } else { revert PermitC__OrderIsEitherCancelledOrFilled(); } } /** * @notice Checks the order fill amounts against approval data and transfers tokens, updates * @notice approval if the fill results in the order being closed. * * @dev Throws when the amount to fill is less than the minimum fill amount * * @param orderStatus Storage pointer for the approval data * @param orderFillAmounts A struct containing the order start, requested fill and minimum fill amounts * @param token The address of the token * @param id The id of the token * @param owner The owner of the token * @param to The address to send the tokens to * @param orderId The order id for the permit * @param _transferFrom Function pointer of the transfer function to send tokens with * * @return quantityFilled The number of tokens filled in the order * @return isError True if there was an error transferring tokens, false otherwise */ function _orderTransfer( PackedApproval storage orderStatus, OrderFillAmounts calldata orderFillAmounts, address token, uint256 id, address owner, address to, bytes32 orderId, function (address, address, address, uint256, uint256) internal returns (bool) _transferFrom ) private returns (uint256 quantityFilled, bool isError) { quantityFilled = orderFillAmounts.requestedFillAmount; if (quantityFilled > orderStatus.amount) { quantityFilled = orderStatus.amount; } if (quantityFilled < orderFillAmounts.minimumFillAmount) { revert PermitC__UnableToFillMinimumRequestedQuantity(); } unchecked { orderStatus.amount -= uint200(quantityFilled); emit OrderFilled(orderId, owner, msg.sender, quantityFilled); } if (orderStatus.amount == 0) { orderStatus.state = ORDER_STATE_FILLED; emit OrderClosed(orderId, owner, msg.sender, false); } isError = _transferFrom(token, owner, to, id, quantityFilled); } /** * @notice Restores an account's nonce when a transfer was not successful * * @dev Throws when the nonce was not already consumed * * @param account The account to restore the nonce of * @param nonce The nonce to restore */ function _restoreNonce(address account, uint256 nonce) private { unchecked { if (uint256(_unorderedNonces[account][uint248(nonce >> 8)] ^= (ONE << uint8(nonce))) & (ONE << uint8(nonce)) != ZERO) { revert PermitC__NonceNotUsedOrRevoked(); } } } /** * @notice Restores an approval amount when a transfer was not successful * * @param approval Storage pointer for the approval data * @param owner The owner of the tokens * @param orderId The order id to restore approval amount on * @param unfilledAmount The amount that was not filled on the order * @param isOrderPermit True if the fill restoration is for an permit order */ function _restoreFillableItems( PackedApproval storage approval, address owner, bytes32 orderId, uint256 unfilledAmount, bool isOrderPermit ) private { if (unfilledAmount > 0) { if (isOrderPermit) { // Order permits always deduct amount and must be restored unchecked { approval.amount += uint200(unfilledAmount); } approval.state = ORDER_STATE_OPEN; emit OrderRestored(orderId, owner, unfilledAmount); } else if (approval.amount < type(uint200).max) { // Stored approvals only deduct amount unchecked { approval.amount += uint200(unfilledAmount); } } } } function _requireValidTokenType(uint256 tokenType) private pure { if(!( tokenType == TOKEN_TYPE_ERC721 || tokenType == TOKEN_TYPE_ERC1155 || tokenType == TOKEN_TYPE_ERC20 ) ) { revert PermitC__InvalidTokenType(); } } /** * @notice Generates an EIP-712 digest for a permit * * @param tokenType The type of token * @param token The address of the token * @param id The id of the token * @param amount The amount authorized by the owner signature * @param owner The owner of the token * @param nonce The nonce for the permit * @param expiration The time the permit expires * @param additionalData The additional data to validate with the permit signature * @param advancedPermitHash The typehash of the permit to use for validating the signature * * @return digest The EIP-712 digest of the permit data */ function _getAdvancedTypedDataV4PermitHash( uint256 tokenType, address token, uint256 id, uint256 amount, address owner, uint256 nonce, uint256 expiration, bytes32 additionalData, bytes32 advancedPermitHash ) private view returns (bytes32 digest) { // cache masterNonce on stack to avoid stack too deep uint256 masterNonce_ = _masterNonces[owner]; digest = _hashTypedDataV4( PermitHash.hashSingleUsePermitWithAdditionalData( tokenType, token, id, amount, nonce, expiration, additionalData, advancedPermitHash, masterNonce_ ) ); } /** * @notice Returns the current allowed amount and expiration for a stored permit * * @dev Returns zero allowed if the permit has expired * * @param _approvals The mapping to retrieve the approval from * @param owner The account the approval is from * @param operator The operator for the approval * @param tokenType The type of token the approval is for * @param token The address of the token * @param id The id of the token * @param orderId The order id for the approval * * @return allowedAmount The amount authorized by the approval, zero if the permit has expired * @return expiration The expiration of the approval */ function _allowance( mapping(bytes32 => mapping(address => PackedApproval)) storage _approvals, address owner, address operator, uint256 tokenType, address token, uint256 id, bytes32 orderId ) private view returns (uint256 allowedAmount, uint256 expiration) { PackedApproval storage allowed = _getPackedApprovalPtr(_approvals, owner, tokenType, token, id, orderId, operator); allowedAmount = allowed.expiration < block.timestamp ? 0 : allowed.amount; expiration = allowed.expiration; } /** * @notice Allows the owner of the PermitC contract to access pausable admin functions * * @dev May be overriden by an inheriting contract to provide alternative permission structure */ function _requireCallerHasPausePermissions() internal view virtual override { _checkOwner(); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import {OrderFillAmounts} from "../DataTypes.sol"; interface IPermitC { /** * ================================================= * ==================== Events ===================== * ================================================= */ /// @dev Emitted when an approval is stored event Approval( address indexed owner, address indexed token, address indexed operator, uint256 id, uint200 amount, uint48 expiration ); /// @dev Emitted when a user increases their master nonce event Lockdown(address indexed owner); /// @dev Emitted when an order is opened event OrderOpened( bytes32 indexed orderId, address indexed owner, address indexed operator, uint256 fillableQuantity ); /// @dev Emitted when an order has a fill event OrderFilled( bytes32 indexed orderId, address indexed owner, address indexed operator, uint256 amount ); /// @dev Emitted when an order has been fully filled or cancelled event OrderClosed( bytes32 indexed orderId, address indexed owner, address indexed operator, bool wasCancellation); /// @dev Emitted when an order has an amount restored due to a failed transfer event OrderRestored( bytes32 indexed orderId, address indexed owner, uint256 amountRestoredToOrder ); /** * ================================================= * ============== Approval Transfers =============== * ================================================= */ function approve(uint256 tokenType, address token, uint256 id, address operator, uint200 amount, uint48 expiration) external; function updateApprovalBySignature( uint256 tokenType, address token, uint256 id, uint256 nonce, uint200 amount, address operator, uint48 approvalExpiration, uint48 sigDeadline, address owner, bytes calldata signedPermit ) external; function allowance( address owner, address operator, uint256 tokenType, address token, uint256 id ) external view returns (uint256 amount, uint256 expiration); /** * ================================================= * ================ Signed Transfers =============== * ================================================= */ function registerAdditionalDataHash(string memory additionalDataTypeString) external; function permitTransferFromERC721( address token, uint256 id, uint256 nonce, uint256 expiration, address owner, address to, bytes calldata signedPermit ) external returns (bool isError); function permitTransferFromWithAdditionalDataERC721( address token, uint256 id, uint256 nonce, uint256 expiration, address owner, address to, bytes32 additionalData, bytes32 advancedPermitHash, bytes calldata signedPermit ) external returns (bool isError); function permitTransferFromERC1155( address token, uint256 id, uint256 nonce, uint256 permitAmount, uint256 expiration, address owner, address to, uint256 transferAmount, bytes calldata signedPermit ) external returns (bool isError); function permitTransferFromWithAdditionalDataERC1155( address token, uint256 id, uint256 nonce, uint256 permitAmount, uint256 expiration, address owner, address to, uint256 transferAmount, bytes32 additionalData, bytes32 advancedPermitHash, bytes calldata signedPermit ) external returns (bool isError); function permitTransferFromERC20( address token, uint256 nonce, uint256 permitAmount, uint256 expiration, address owner, address to, uint256 transferAmount, bytes calldata signedPermit ) external returns (bool isError); function permitTransferFromWithAdditionalDataERC20( address token, uint256 nonce, uint256 permitAmount, uint256 expiration, address owner, address to, uint256 transferAmount, bytes32 additionalData, bytes32 advancedPermitHash, bytes calldata signedPermit ) external returns (bool isError); function isRegisteredTransferAdditionalDataHash(bytes32 hash) external view returns (bool isRegistered); function isRegisteredOrderAdditionalDataHash(bytes32 hash) external view returns (bool isRegistered); /** * ================================================= * =============== Order Transfers ================= * ================================================= */ function fillPermittedOrderERC1155( bytes calldata signedPermit, OrderFillAmounts calldata orderFillAmounts, address token, uint256 id, address owner, address to, uint256 nonce, uint48 expiration, bytes32 orderId, bytes32 advancedPermitHash ) external returns (uint256 quantityFilled, bool isError); function fillPermittedOrderERC20( bytes calldata signedPermit, OrderFillAmounts calldata orderFillAmounts, address token, address owner, address to, uint256 nonce, uint48 expiration, bytes32 orderId, bytes32 advancedPermitHash ) external returns (uint256 quantityFilled, bool isError); function closePermittedOrder( address owner, address operator, uint256 tokenType, address token, uint256 id, bytes32 orderId ) external; function allowance( address owner, address operator, uint256 tokenType, address token, uint256 id, bytes32 orderId ) external view returns (uint256 amount, uint256 expiration); /** * ================================================= * ================ Nonce Management =============== * ================================================= */ function invalidateUnorderedNonce(uint256 nonce) external; function isValidUnorderedNonce(address owner, uint256 nonce) external view returns (bool isValid); function lockdown() external; function masterNonce(address owner) external view returns (uint256); /** * ================================================= * ============== Transfer Functions =============== * ================================================= */ function transferFromERC721( address from, address to, address token, uint256 id ) external returns (bool isError); function transferFromERC1155( address from, address to, address token, uint256 id, uint256 amount ) external returns (bool isError); function transferFromERC20( address from, address to, address token, uint256 amount ) external returns (bool isError); /** * ================================================= * ============ Signature Verification ============= * ================================================= */ function domainSeparatorV4() external view returns (bytes32); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; import {SINGLE_USE_PERMIT_TYPEHASH, UPDATE_APPROVAL_TYPEHASH} from "../Constants.sol"; library PermitHash { /** * @notice Hashes the permit data for a stored approval * * @param tokenType The type of token * @param token The address of the token * @param id The id of the token * @param amount The amount authorized by the owner signature * @param nonce The nonce for the permit * @param operator The account that is allowed to use the permit * @param approvalExpiration The time the permit approval expires * @param sigDeadline The deadline for submitting the permit onchain * @param masterNonce The signers master nonce * * @return hash The hash of the permit data */ function hashOnChainApproval( uint256 tokenType, address token, uint256 id, uint256 amount, uint256 nonce, address operator, uint256 approvalExpiration, uint256 sigDeadline, uint256 masterNonce ) internal pure returns (bytes32 hash) { hash = keccak256( abi.encode( UPDATE_APPROVAL_TYPEHASH, tokenType, token, id, amount, nonce, operator, approvalExpiration, sigDeadline, masterNonce ) ); } /** * @notice Hashes the permit data with the single user permit without additional data typehash * * @param tokenType The type of token * @param token The address of the token * @param id The id of the token * @param amount The amount authorized by the owner signature * @param nonce The nonce for the permit * @param expiration The time the permit expires * @param masterNonce The signers master nonce * * @return hash The hash of the permit data */ function hashSingleUsePermit( uint256 tokenType, address token, uint256 id, uint256 amount, uint256 nonce, uint256 expiration, uint256 masterNonce ) internal view returns (bytes32 hash) { hash = keccak256( abi.encode( SINGLE_USE_PERMIT_TYPEHASH, tokenType, token, id, amount, nonce, msg.sender, expiration, masterNonce ) ); } /** * @notice Hashes the permit data with the supplied typehash * * @param tokenType The type of token * @param token The address of the token * @param id The id of the token * @param amount The amount authorized by the owner signature * @param nonce The nonce for the permit * @param expiration The time the permit expires * @param additionalData The additional data to validate with the permit signature * @param additionalDataTypeHash The typehash of the permit to use for validating the signature * @param masterNonce The signers master nonce * * @return hash The hash of the permit data with the supplied typehash */ function hashSingleUsePermitWithAdditionalData( uint256 tokenType, address token, uint256 id, uint256 amount, uint256 nonce, uint256 expiration, bytes32 additionalData, bytes32 additionalDataTypeHash, uint256 masterNonce ) internal view returns (bytes32 hash) { hash = keccak256( abi.encode( additionalDataTypeHash, tokenType, token, id, amount, nonce, msg.sender, expiration, masterNonce, additionalData ) ); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/EIP712.sol) pragma solidity ^0.8.8; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * NOTE: In the upgradeable version of this contract, the cached values will correspond to the address, and the domain * separator of the implementation contract. This will cause the `_domainSeparatorV4` function to always rebuild the * separator from the immutable values, which is cheaper than accessing a cached version in cold storage. * * _Available since v3.4._ * * @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment */ abstract contract EIP712 { bytes32 private constant _TYPE_HASH = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"); // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private immutable _cachedDomainSeparator; uint256 private immutable _cachedChainId; bytes32 private immutable _hashedName; bytes32 private immutable _hashedVersion; /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ constructor(string memory name, string memory version) { _hashedName = keccak256(bytes(name)); _hashedVersion = keccak256(bytes(version)); _cachedChainId = block.chainid; _cachedDomainSeparator = _buildDomainSeparator(); } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (block.chainid == _cachedChainId) { return _cachedDomainSeparator; } else { return _buildDomainSeparator(); } } function _buildDomainSeparator() private view returns (bytes32) { return keccak256(abi.encode(_TYPE_HASH, _hashedName, _hashedVersion, block.chainid, address(this))); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; import {Context} from "@openzeppelin/contracts/utils/Context.sol"; /** * @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 { error Ownable__CallerIsNotOwner(); error Ownable__NewOwnerIsZeroAddress(); address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if(owner() != _msgSender()) revert Ownable__CallerIsNotOwner(); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if(newOwner == address(0)) revert Ownable__NewOwnerIsZeroAddress(); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.9.0; import {StdStorage} from "./StdStorage.sol"; import {Vm, VmSafe} from "./Vm.sol"; abstract contract CommonBase { // Cheat code address, 0x7109709ECfa91a80626fF3989D68f67F5b1DD12D. address internal constant VM_ADDRESS = address(uint160(uint256(keccak256("hevm cheat code")))); // console.sol and console2.sol work by executing a staticcall to this address. address internal constant CONSOLE = 0x000000000000000000636F6e736F6c652e6c6f67; // Used when deploying with create2, https://github.com/Arachnid/deterministic-deployment-proxy. address internal constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C; // Default address for tx.origin and msg.sender, 0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38. address internal constant DEFAULT_SENDER = address(uint160(uint256(keccak256("foundry default caller")))); // Address of the test contract, deployed by the DEFAULT_SENDER. address internal constant DEFAULT_TEST_CONTRACT = 0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f; // Deterministic deployment address of the Multicall3 contract. address internal constant MULTICALL3_ADDRESS = 0xcA11bde05977b3631167028862bE2a173976CA11; // The order of the secp256k1 curve. uint256 internal constant SECP256K1_ORDER = 115792089237316195423570985008687907852837564279074904382605163141518161494337; uint256 internal constant UINT256_MAX = 115792089237316195423570985008687907853269984665640564039457584007913129639935; Vm internal constant vm = Vm(VM_ADDRESS); StdStorage internal stdstore; } abstract contract TestBase is CommonBase {} abstract contract ScriptBase is CommonBase { VmSafe internal constant vmSafe = VmSafe(VM_ADDRESS); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.9.0; // 💬 ABOUT // Forge Std's default Script. // 🧩 MODULES import {console} from "./console.sol"; import {console2} from "./console2.sol"; import {safeconsole} from "./safeconsole.sol"; import {StdChains} from "./StdChains.sol"; import {StdCheatsSafe} from "./StdCheats.sol"; import {stdJson} from "./StdJson.sol"; import {stdMath} from "./StdMath.sol"; import {StdStorage, stdStorageSafe} from "./StdStorage.sol"; import {StdStyle} from "./StdStyle.sol"; import {StdUtils} from "./StdUtils.sol"; import {VmSafe} from "./Vm.sol"; // 📦 BOILERPLATE import {ScriptBase} from "./Base.sol"; // ⭐️ SCRIPT abstract contract Script is ScriptBase, StdChains, StdCheatsSafe, StdUtils { // Note: IS_SCRIPT() must return true. bool public IS_SCRIPT = true; }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.9.0; import {VmSafe} from "./Vm.sol"; /** * StdChains provides information about EVM compatible chains that can be used in scripts/tests. * For each chain, the chain's name, chain ID, and a default RPC URL are provided. Chains are * identified by their alias, which is the same as the alias in the `[rpc_endpoints]` section of * the `foundry.toml` file. For best UX, ensure the alias in the `foundry.toml` file match the * alias used in this contract, which can be found as the first argument to the * `setChainWithDefaultRpcUrl` call in the `initializeStdChains` function. * * There are two main ways to use this contract: * 1. Set a chain with `setChain(string memory chainAlias, ChainData memory chain)` or * `setChain(string memory chainAlias, Chain memory chain)` * 2. Get a chain with `getChain(string memory chainAlias)` or `getChain(uint256 chainId)`. * * The first time either of those are used, chains are initialized with the default set of RPC URLs. * This is done in `initializeStdChains`, which uses `setChainWithDefaultRpcUrl`. Defaults are recorded in * `defaultRpcUrls`. * * The `setChain` function is straightforward, and it simply saves off the given chain data. * * The `getChain` methods use `getChainWithUpdatedRpcUrl` to return a chain. For example, let's say * we want to retrieve the RPC URL for `mainnet`: * - If you have specified data with `setChain`, it will return that. * - If you have configured a mainnet RPC URL in `foundry.toml`, it will return the URL, provided it * is valid (e.g. a URL is specified, or an environment variable is given and exists). * - If neither of the above conditions is met, the default data is returned. * * Summarizing the above, the prioritization hierarchy is `setChain` -> `foundry.toml` -> environment variable -> defaults. */ abstract contract StdChains { VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code"))))); bool private stdChainsInitialized; struct ChainData { string name; uint256 chainId; string rpcUrl; } struct Chain { // The chain name. string name; // The chain's Chain ID. uint256 chainId; // The chain's alias. (i.e. what gets specified in `foundry.toml`). string chainAlias; // A default RPC endpoint for this chain. // NOTE: This default RPC URL is included for convenience to facilitate quick tests and // experimentation. Do not use this RPC URL for production test suites, CI, or other heavy // usage as you will be throttled and this is a disservice to others who need this endpoint. string rpcUrl; } // Maps from the chain's alias (matching the alias in the `foundry.toml` file) to chain data. mapping(string => Chain) private chains; // Maps from the chain's alias to it's default RPC URL. mapping(string => string) private defaultRpcUrls; // Maps from a chain ID to it's alias. mapping(uint256 => string) private idToAlias; bool private fallbackToDefaultRpcUrls = true; // The RPC URL will be fetched from config or defaultRpcUrls if possible. function getChain(string memory chainAlias) internal virtual returns (Chain memory chain) { require(bytes(chainAlias).length != 0, "StdChains getChain(string): Chain alias cannot be the empty string."); initializeStdChains(); chain = chains[chainAlias]; require( chain.chainId != 0, string(abi.encodePacked("StdChains getChain(string): Chain with alias \"", chainAlias, "\" not found.")) ); chain = getChainWithUpdatedRpcUrl(chainAlias, chain); } function getChain(uint256 chainId) internal virtual returns (Chain memory chain) { require(chainId != 0, "StdChains getChain(uint256): Chain ID cannot be 0."); initializeStdChains(); string memory chainAlias = idToAlias[chainId]; chain = chains[chainAlias]; require( chain.chainId != 0, string(abi.encodePacked("StdChains getChain(uint256): Chain with ID ", vm.toString(chainId), " not found.")) ); chain = getChainWithUpdatedRpcUrl(chainAlias, chain); } // set chain info, with priority to argument's rpcUrl field. function setChain(string memory chainAlias, ChainData memory chain) internal virtual { require( bytes(chainAlias).length != 0, "StdChains setChain(string,ChainData): Chain alias cannot be the empty string." ); require(chain.chainId != 0, "StdChains setChain(string,ChainData): Chain ID cannot be 0."); initializeStdChains(); string memory foundAlias = idToAlias[chain.chainId]; require( bytes(foundAlias).length == 0 || keccak256(bytes(foundAlias)) == keccak256(bytes(chainAlias)), string( abi.encodePacked( "StdChains setChain(string,ChainData): Chain ID ", vm.toString(chain.chainId), " already used by \"", foundAlias, "\"." ) ) ); uint256 oldChainId = chains[chainAlias].chainId; delete idToAlias[oldChainId]; chains[chainAlias] = Chain({name: chain.name, chainId: chain.chainId, chainAlias: chainAlias, rpcUrl: chain.rpcUrl}); idToAlias[chain.chainId] = chainAlias; } // set chain info, with priority to argument's rpcUrl field. function setChain(string memory chainAlias, Chain memory chain) internal virtual { setChain(chainAlias, ChainData({name: chain.name, chainId: chain.chainId, rpcUrl: chain.rpcUrl})); } function _toUpper(string memory str) private pure returns (string memory) { bytes memory strb = bytes(str); bytes memory copy = new bytes(strb.length); for (uint256 i = 0; i < strb.length; i++) { bytes1 b = strb[i]; if (b >= 0x61 && b <= 0x7A) { copy[i] = bytes1(uint8(b) - 32); } else { copy[i] = b; } } return string(copy); } // lookup rpcUrl, in descending order of priority: // current -> config (foundry.toml) -> environment variable -> default function getChainWithUpdatedRpcUrl(string memory chainAlias, Chain memory chain) private view returns (Chain memory) { if (bytes(chain.rpcUrl).length == 0) { try vm.rpcUrl(chainAlias) returns (string memory configRpcUrl) { chain.rpcUrl = configRpcUrl; } catch (bytes memory err) { string memory envName = string(abi.encodePacked(_toUpper(chainAlias), "_RPC_URL")); if (fallbackToDefaultRpcUrls) { chain.rpcUrl = vm.envOr(envName, defaultRpcUrls[chainAlias]); } else { chain.rpcUrl = vm.envString(envName); } // Distinguish 'not found' from 'cannot read' // The upstream error thrown by forge for failing cheats changed so we check both the old and new versions bytes memory oldNotFoundError = abi.encodeWithSignature("CheatCodeError", string(abi.encodePacked("invalid rpc url ", chainAlias))); bytes memory newNotFoundError = abi.encodeWithSignature( "CheatcodeError(string)", string(abi.encodePacked("invalid rpc url: ", chainAlias)) ); bytes32 errHash = keccak256(err); if ( (errHash != keccak256(oldNotFoundError) && errHash != keccak256(newNotFoundError)) || bytes(chain.rpcUrl).length == 0 ) { /// @solidity memory-safe-assembly assembly { revert(add(32, err), mload(err)) } } } } return chain; } function setFallbackToDefaultRpcUrls(bool useDefault) internal { fallbackToDefaultRpcUrls = useDefault; } function initializeStdChains() private { if (stdChainsInitialized) return; stdChainsInitialized = true; // If adding an RPC here, make sure to test the default RPC URL in `test_Rpcs` in `StdChains.t.sol` setChainWithDefaultRpcUrl("anvil", ChainData("Anvil", 31337, "http://127.0.0.1:8545")); setChainWithDefaultRpcUrl( "mainnet", ChainData("Mainnet", 1, "https://eth-mainnet.alchemyapi.io/v2/pwc5rmJhrdoaSEfimoKEmsvOjKSmPDrP") ); setChainWithDefaultRpcUrl( "sepolia", ChainData("Sepolia", 11155111, "https://sepolia.infura.io/v3/b9794ad1ddf84dfb8c34d6bb5dca2001") ); setChainWithDefaultRpcUrl("holesky", ChainData("Holesky", 17000, "https://rpc.holesky.ethpandaops.io")); setChainWithDefaultRpcUrl("optimism", ChainData("Optimism", 10, "https://mainnet.optimism.io")); setChainWithDefaultRpcUrl( "optimism_sepolia", ChainData("Optimism Sepolia", 11155420, "https://sepolia.optimism.io") ); setChainWithDefaultRpcUrl("arbitrum_one", ChainData("Arbitrum One", 42161, "https://arb1.arbitrum.io/rpc")); setChainWithDefaultRpcUrl( "arbitrum_one_sepolia", ChainData("Arbitrum One Sepolia", 421614, "https://sepolia-rollup.arbitrum.io/rpc") ); setChainWithDefaultRpcUrl("arbitrum_nova", ChainData("Arbitrum Nova", 42170, "https://nova.arbitrum.io/rpc")); setChainWithDefaultRpcUrl("polygon", ChainData("Polygon", 137, "https://polygon-rpc.com")); setChainWithDefaultRpcUrl( "polygon_amoy", ChainData("Polygon Amoy", 80002, "https://rpc-amoy.polygon.technology") ); setChainWithDefaultRpcUrl("avalanche", ChainData("Avalanche", 43114, "https://api.avax.network/ext/bc/C/rpc")); setChainWithDefaultRpcUrl( "avalanche_fuji", ChainData("Avalanche Fuji", 43113, "https://api.avax-test.network/ext/bc/C/rpc") ); setChainWithDefaultRpcUrl( "bnb_smart_chain", ChainData("BNB Smart Chain", 56, "https://bsc-dataseed1.binance.org") ); setChainWithDefaultRpcUrl( "bnb_smart_chain_testnet", ChainData("BNB Smart Chain Testnet", 97, "https://rpc.ankr.com/bsc_testnet_chapel") ); setChainWithDefaultRpcUrl("gnosis_chain", ChainData("Gnosis Chain", 100, "https://rpc.gnosischain.com")); setChainWithDefaultRpcUrl("moonbeam", ChainData("Moonbeam", 1284, "https://rpc.api.moonbeam.network")); setChainWithDefaultRpcUrl( "moonriver", ChainData("Moonriver", 1285, "https://rpc.api.moonriver.moonbeam.network") ); setChainWithDefaultRpcUrl("moonbase", ChainData("Moonbase", 1287, "https://rpc.testnet.moonbeam.network")); setChainWithDefaultRpcUrl("base_sepolia", ChainData("Base Sepolia", 84532, "https://sepolia.base.org")); setChainWithDefaultRpcUrl("base", ChainData("Base", 8453, "https://mainnet.base.org")); setChainWithDefaultRpcUrl("blast_sepolia", ChainData("Blast Sepolia", 168587773, "https://sepolia.blast.io")); setChainWithDefaultRpcUrl("blast", ChainData("Blast", 81457, "https://rpc.blast.io")); setChainWithDefaultRpcUrl("fantom_opera", ChainData("Fantom Opera", 250, "https://rpc.ankr.com/fantom/")); setChainWithDefaultRpcUrl( "fantom_opera_testnet", ChainData("Fantom Opera Testnet", 4002, "https://rpc.ankr.com/fantom_testnet/") ); setChainWithDefaultRpcUrl("fraxtal", ChainData("Fraxtal", 252, "https://rpc.frax.com")); setChainWithDefaultRpcUrl("fraxtal_testnet", ChainData("Fraxtal Testnet", 2522, "https://rpc.testnet.frax.com")); setChainWithDefaultRpcUrl( "berachain_bartio_testnet", ChainData("Berachain bArtio Testnet", 80084, "https://bartio.rpc.berachain.com") ); } // set chain info, with priority to chainAlias' rpc url in foundry.toml function setChainWithDefaultRpcUrl(string memory chainAlias, ChainData memory chain) private { string memory rpcUrl = chain.rpcUrl; defaultRpcUrls[chainAlias] = rpcUrl; chain.rpcUrl = ""; setChain(chainAlias, chain); chain.rpcUrl = rpcUrl; // restore argument } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.9.0; pragma experimental ABIEncoderV2; import {StdStorage, stdStorage} from "./StdStorage.sol"; import {console2} from "./console2.sol"; import {Vm} from "./Vm.sol"; abstract contract StdCheatsSafe { Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); uint256 private constant UINT256_MAX = 115792089237316195423570985008687907853269984665640564039457584007913129639935; bool private gasMeteringOff; // Data structures to parse Transaction objects from the broadcast artifact // that conform to EIP1559. The Raw structs is what is parsed from the JSON // and then converted to the one that is used by the user for better UX. struct RawTx1559 { string[] arguments; address contractAddress; string contractName; // json value name = function string functionSig; bytes32 hash; // json value name = tx RawTx1559Detail txDetail; // json value name = type string opcode; } struct RawTx1559Detail { AccessList[] accessList; bytes data; address from; bytes gas; bytes nonce; address to; bytes txType; bytes value; } struct Tx1559 { string[] arguments; address contractAddress; string contractName; string functionSig; bytes32 hash; Tx1559Detail txDetail; string opcode; } struct Tx1559Detail { AccessList[] accessList; bytes data; address from; uint256 gas; uint256 nonce; address to; uint256 txType; uint256 value; } // Data structures to parse Transaction objects from the broadcast artifact // that DO NOT conform to EIP1559. The Raw structs is what is parsed from the JSON // and then converted to the one that is used by the user for better UX. struct TxLegacy { string[] arguments; address contractAddress; string contractName; string functionSig; string hash; string opcode; TxDetailLegacy transaction; } struct TxDetailLegacy { AccessList[] accessList; uint256 chainId; bytes data; address from; uint256 gas; uint256 gasPrice; bytes32 hash; uint256 nonce; bytes1 opcode; bytes32 r; bytes32 s; uint256 txType; address to; uint8 v; uint256 value; } struct AccessList { address accessAddress; bytes32[] storageKeys; } // Data structures to parse Receipt objects from the broadcast artifact. // The Raw structs is what is parsed from the JSON // and then converted to the one that is used by the user for better UX. struct RawReceipt { bytes32 blockHash; bytes blockNumber; address contractAddress; bytes cumulativeGasUsed; bytes effectiveGasPrice; address from; bytes gasUsed; RawReceiptLog[] logs; bytes logsBloom; bytes status; address to; bytes32 transactionHash; bytes transactionIndex; } struct Receipt { bytes32 blockHash; uint256 blockNumber; address contractAddress; uint256 cumulativeGasUsed; uint256 effectiveGasPrice; address from; uint256 gasUsed; ReceiptLog[] logs; bytes logsBloom; uint256 status; address to; bytes32 transactionHash; uint256 transactionIndex; } // Data structures to parse the entire broadcast artifact, assuming the // transactions conform to EIP1559. struct EIP1559ScriptArtifact { string[] libraries; string path; string[] pending; Receipt[] receipts; uint256 timestamp; Tx1559[] transactions; TxReturn[] txReturns; } struct RawEIP1559ScriptArtifact { string[] libraries; string path; string[] pending; RawReceipt[] receipts; TxReturn[] txReturns; uint256 timestamp; RawTx1559[] transactions; } struct RawReceiptLog { // json value = address address logAddress; bytes32 blockHash; bytes blockNumber; bytes data; bytes logIndex; bool removed; bytes32[] topics; bytes32 transactionHash; bytes transactionIndex; bytes transactionLogIndex; } struct ReceiptLog { // json value = address address logAddress; bytes32 blockHash; uint256 blockNumber; bytes data; uint256 logIndex; bytes32[] topics; uint256 transactionIndex; uint256 transactionLogIndex; bool removed; } struct TxReturn { string internalType; string value; } struct Account { address addr; uint256 key; } enum AddressType { Payable, NonPayable, ZeroAddress, Precompile, ForgeAddress } // Checks that `addr` is not blacklisted by token contracts that have a blacklist. function assumeNotBlacklisted(address token, address addr) internal view virtual { // Nothing to check if `token` is not a contract. uint256 tokenCodeSize; assembly { tokenCodeSize := extcodesize(token) } require(tokenCodeSize > 0, "StdCheats assumeNotBlacklisted(address,address): Token address is not a contract."); bool success; bytes memory returnData; // 4-byte selector for `isBlacklisted(address)`, used by USDC. (success, returnData) = token.staticcall(abi.encodeWithSelector(0xfe575a87, addr)); vm.assume(!success || abi.decode(returnData, (bool)) == false); // 4-byte selector for `isBlackListed(address)`, used by USDT. (success, returnData) = token.staticcall(abi.encodeWithSelector(0xe47d6060, addr)); vm.assume(!success || abi.decode(returnData, (bool)) == false); } // Checks that `addr` is not blacklisted by token contracts that have a blacklist. // This is identical to `assumeNotBlacklisted(address,address)` but with a different name, for // backwards compatibility, since this name was used in the original PR which has already has // a release. This function can be removed in a future release once we want a breaking change. function assumeNoBlacklisted(address token, address addr) internal view virtual { assumeNotBlacklisted(token, addr); } function assumeAddressIsNot(address addr, AddressType addressType) internal virtual { if (addressType == AddressType.Payable) { assumeNotPayable(addr); } else if (addressType == AddressType.NonPayable) { assumePayable(addr); } else if (addressType == AddressType.ZeroAddress) { assumeNotZeroAddress(addr); } else if (addressType == AddressType.Precompile) { assumeNotPrecompile(addr); } else if (addressType == AddressType.ForgeAddress) { assumeNotForgeAddress(addr); } } function assumeAddressIsNot(address addr, AddressType addressType1, AddressType addressType2) internal virtual { assumeAddressIsNot(addr, addressType1); assumeAddressIsNot(addr, addressType2); } function assumeAddressIsNot( address addr, AddressType addressType1, AddressType addressType2, AddressType addressType3 ) internal virtual { assumeAddressIsNot(addr, addressType1); assumeAddressIsNot(addr, addressType2); assumeAddressIsNot(addr, addressType3); } function assumeAddressIsNot( address addr, AddressType addressType1, AddressType addressType2, AddressType addressType3, AddressType addressType4 ) internal virtual { assumeAddressIsNot(addr, addressType1); assumeAddressIsNot(addr, addressType2); assumeAddressIsNot(addr, addressType3); assumeAddressIsNot(addr, addressType4); } // This function checks whether an address, `addr`, is payable. It works by sending 1 wei to // `addr` and checking the `success` return value. // NOTE: This function may result in state changes depending on the fallback/receive logic // implemented by `addr`, which should be taken into account when this function is used. function _isPayable(address addr) private returns (bool) { require( addr.balance < UINT256_MAX, "StdCheats _isPayable(address): Balance equals max uint256, so it cannot receive any more funds" ); uint256 origBalanceTest = address(this).balance; uint256 origBalanceAddr = address(addr).balance; vm.deal(address(this), 1); (bool success,) = payable(addr).call{value: 1}(""); // reset balances vm.deal(address(this), origBalanceTest); vm.deal(addr, origBalanceAddr); return success; } // NOTE: This function may result in state changes depending on the fallback/receive logic // implemented by `addr`, which should be taken into account when this function is used. See the // `_isPayable` method for more information. function assumePayable(address addr) internal virtual { vm.assume(_isPayable(addr)); } function assumeNotPayable(address addr) internal virtual { vm.assume(!_isPayable(addr)); } function assumeNotZeroAddress(address addr) internal pure virtual { vm.assume(addr != address(0)); } function assumeNotPrecompile(address addr) internal pure virtual { assumeNotPrecompile(addr, _pureChainId()); } function assumeNotPrecompile(address addr, uint256 chainId) internal pure virtual { // Note: For some chains like Optimism these are technically predeploys (i.e. bytecode placed at a specific // address), but the same rationale for excluding them applies so we include those too. // These should be present on all EVM-compatible chains. vm.assume(addr < address(0x1) || addr > address(0x9)); // forgefmt: disable-start if (chainId == 10 || chainId == 420) { // https://github.com/ethereum-optimism/optimism/blob/eaa371a0184b56b7ca6d9eb9cb0a2b78b2ccd864/op-bindings/predeploys/addresses.go#L6-L21 vm.assume(addr < address(0x4200000000000000000000000000000000000000) || addr > address(0x4200000000000000000000000000000000000800)); } else if (chainId == 42161 || chainId == 421613) { // https://developer.arbitrum.io/useful-addresses#arbitrum-precompiles-l2-same-on-all-arb-chains vm.assume(addr < address(0x0000000000000000000000000000000000000064) || addr > address(0x0000000000000000000000000000000000000068)); } else if (chainId == 43114 || chainId == 43113) { // https://github.com/ava-labs/subnet-evm/blob/47c03fd007ecaa6de2c52ea081596e0a88401f58/precompile/params.go#L18-L59 vm.assume(addr < address(0x0100000000000000000000000000000000000000) || addr > address(0x01000000000000000000000000000000000000ff)); vm.assume(addr < address(0x0200000000000000000000000000000000000000) || addr > address(0x02000000000000000000000000000000000000FF)); vm.assume(addr < address(0x0300000000000000000000000000000000000000) || addr > address(0x03000000000000000000000000000000000000Ff)); } // forgefmt: disable-end } function assumeNotForgeAddress(address addr) internal pure virtual { // vm, console, and Create2Deployer addresses vm.assume( addr != address(vm) && addr != 0x000000000000000000636F6e736F6c652e6c6f67 && addr != 0x4e59b44847b379578588920cA78FbF26c0B4956C ); } function readEIP1559ScriptArtifact(string memory path) internal view virtual returns (EIP1559ScriptArtifact memory) { string memory data = vm.readFile(path); bytes memory parsedData = vm.parseJson(data); RawEIP1559ScriptArtifact memory rawArtifact = abi.decode(parsedData, (RawEIP1559ScriptArtifact)); EIP1559ScriptArtifact memory artifact; artifact.libraries = rawArtifact.libraries; artifact.path = rawArtifact.path; artifact.timestamp = rawArtifact.timestamp; artifact.pending = rawArtifact.pending; artifact.txReturns = rawArtifact.txReturns; artifact.receipts = rawToConvertedReceipts(rawArtifact.receipts); artifact.transactions = rawToConvertedEIPTx1559s(rawArtifact.transactions); return artifact; } function rawToConvertedEIPTx1559s(RawTx1559[] memory rawTxs) internal pure virtual returns (Tx1559[] memory) { Tx1559[] memory txs = new Tx1559[](rawTxs.length); for (uint256 i; i < rawTxs.length; i++) { txs[i] = rawToConvertedEIPTx1559(rawTxs[i]); } return txs; } function rawToConvertedEIPTx1559(RawTx1559 memory rawTx) internal pure virtual returns (Tx1559 memory) { Tx1559 memory transaction; transaction.arguments = rawTx.arguments; transaction.contractName = rawTx.contractName; transaction.functionSig = rawTx.functionSig; transaction.hash = rawTx.hash; transaction.txDetail = rawToConvertedEIP1559Detail(rawTx.txDetail); transaction.opcode = rawTx.opcode; return transaction; } function rawToConvertedEIP1559Detail(RawTx1559Detail memory rawDetail) internal pure virtual returns (Tx1559Detail memory) { Tx1559Detail memory txDetail; txDetail.data = rawDetail.data; txDetail.from = rawDetail.from; txDetail.to = rawDetail.to; txDetail.nonce = _bytesToUint(rawDetail.nonce); txDetail.txType = _bytesToUint(rawDetail.txType); txDetail.value = _bytesToUint(rawDetail.value); txDetail.gas = _bytesToUint(rawDetail.gas); txDetail.accessList = rawDetail.accessList; return txDetail; } function readTx1559s(string memory path) internal view virtual returns (Tx1559[] memory) { string memory deployData = vm.readFile(path); bytes memory parsedDeployData = vm.parseJson(deployData, ".transactions"); RawTx1559[] memory rawTxs = abi.decode(parsedDeployData, (RawTx1559[])); return rawToConvertedEIPTx1559s(rawTxs); } function readTx1559(string memory path, uint256 index) internal view virtual returns (Tx1559 memory) { string memory deployData = vm.readFile(path); string memory key = string(abi.encodePacked(".transactions[", vm.toString(index), "]")); bytes memory parsedDeployData = vm.parseJson(deployData, key); RawTx1559 memory rawTx = abi.decode(parsedDeployData, (RawTx1559)); return rawToConvertedEIPTx1559(rawTx); } // Analogous to readTransactions, but for receipts. function readReceipts(string memory path) internal view virtual returns (Receipt[] memory) { string memory deployData = vm.readFile(path); bytes memory parsedDeployData = vm.parseJson(deployData, ".receipts"); RawReceipt[] memory rawReceipts = abi.decode(parsedDeployData, (RawReceipt[])); return rawToConvertedReceipts(rawReceipts); } function readReceipt(string memory path, uint256 index) internal view virtual returns (Receipt memory) { string memory deployData = vm.readFile(path); string memory key = string(abi.encodePacked(".receipts[", vm.toString(index), "]")); bytes memory parsedDeployData = vm.parseJson(deployData, key); RawReceipt memory rawReceipt = abi.decode(parsedDeployData, (RawReceipt)); return rawToConvertedReceipt(rawReceipt); } function rawToConvertedReceipts(RawReceipt[] memory rawReceipts) internal pure virtual returns (Receipt[] memory) { Receipt[] memory receipts = new Receipt[](rawReceipts.length); for (uint256 i; i < rawReceipts.length; i++) { receipts[i] = rawToConvertedReceipt(rawReceipts[i]); } return receipts; } function rawToConvertedReceipt(RawReceipt memory rawReceipt) internal pure virtual returns (Receipt memory) { Receipt memory receipt; receipt.blockHash = rawReceipt.blockHash; receipt.to = rawReceipt.to; receipt.from = rawReceipt.from; receipt.contractAddress = rawReceipt.contractAddress; receipt.effectiveGasPrice = _bytesToUint(rawReceipt.effectiveGasPrice); receipt.cumulativeGasUsed = _bytesToUint(rawReceipt.cumulativeGasUsed); receipt.gasUsed = _bytesToUint(rawReceipt.gasUsed); receipt.status = _bytesToUint(rawReceipt.status); receipt.transactionIndex = _bytesToUint(rawReceipt.transactionIndex); receipt.blockNumber = _bytesToUint(rawReceipt.blockNumber); receipt.logs = rawToConvertedReceiptLogs(rawReceipt.logs); receipt.logsBloom = rawReceipt.logsBloom; receipt.transactionHash = rawReceipt.transactionHash; return receipt; } function rawToConvertedReceiptLogs(RawReceiptLog[] memory rawLogs) internal pure virtual returns (ReceiptLog[] memory) { ReceiptLog[] memory logs = new ReceiptLog[](rawLogs.length); for (uint256 i; i < rawLogs.length; i++) { logs[i].logAddress = rawLogs[i].logAddress; logs[i].blockHash = rawLogs[i].blockHash; logs[i].blockNumber = _bytesToUint(rawLogs[i].blockNumber); logs[i].data = rawLogs[i].data; logs[i].logIndex = _bytesToUint(rawLogs[i].logIndex); logs[i].topics = rawLogs[i].topics; logs[i].transactionIndex = _bytesToUint(rawLogs[i].transactionIndex); logs[i].transactionLogIndex = _bytesToUint(rawLogs[i].transactionLogIndex); logs[i].removed = rawLogs[i].removed; } return logs; } // Deploy a contract by fetching the contract bytecode from // the artifacts directory // e.g. `deployCode(code, abi.encode(arg1,arg2,arg3))` function deployCode(string memory what, bytes memory args) internal virtual returns (address addr) { bytes memory bytecode = abi.encodePacked(vm.getCode(what), args); /// @solidity memory-safe-assembly assembly { addr := create(0, add(bytecode, 0x20), mload(bytecode)) } require(addr != address(0), "StdCheats deployCode(string,bytes): Deployment failed."); } function deployCode(string memory what) internal virtual returns (address addr) { bytes memory bytecode = vm.getCode(what); /// @solidity memory-safe-assembly assembly { addr := create(0, add(bytecode, 0x20), mload(bytecode)) } require(addr != address(0), "StdCheats deployCode(string): Deployment failed."); } /// @dev deploy contract with value on construction function deployCode(string memory what, bytes memory args, uint256 val) internal virtual returns (address addr) { bytes memory bytecode = abi.encodePacked(vm.getCode(what), args); /// @solidity memory-safe-assembly assembly { addr := create(val, add(bytecode, 0x20), mload(bytecode)) } require(addr != address(0), "StdCheats deployCode(string,bytes,uint256): Deployment failed."); } function deployCode(string memory what, uint256 val) internal virtual returns (address addr) { bytes memory bytecode = vm.getCode(what); /// @solidity memory-safe-assembly assembly { addr := create(val, add(bytecode, 0x20), mload(bytecode)) } require(addr != address(0), "StdCheats deployCode(string,uint256): Deployment failed."); } // creates a labeled address and the corresponding private key function makeAddrAndKey(string memory name) internal virtual returns (address addr, uint256 privateKey) { privateKey = uint256(keccak256(abi.encodePacked(name))); addr = vm.addr(privateKey); vm.label(addr, name); } // creates a labeled address function makeAddr(string memory name) internal virtual returns (address addr) { (addr,) = makeAddrAndKey(name); } // Destroys an account immediately, sending the balance to beneficiary. // Destroying means: balance will be zero, code will be empty, and nonce will be 0 // This is similar to selfdestruct but not identical: selfdestruct destroys code and nonce // only after tx ends, this will run immediately. function destroyAccount(address who, address beneficiary) internal virtual { uint256 currBalance = who.balance; vm.etch(who, abi.encode()); vm.deal(who, 0); vm.resetNonce(who); uint256 beneficiaryBalance = beneficiary.balance; vm.deal(beneficiary, currBalance + beneficiaryBalance); } // creates a struct containing both a labeled address and the corresponding private key function makeAccount(string memory name) internal virtual returns (Account memory account) { (account.addr, account.key) = makeAddrAndKey(name); } function deriveRememberKey(string memory mnemonic, uint32 index) internal virtual returns (address who, uint256 privateKey) { privateKey = vm.deriveKey(mnemonic, index); who = vm.rememberKey(privateKey); } function _bytesToUint(bytes memory b) private pure returns (uint256) { require(b.length <= 32, "StdCheats _bytesToUint(bytes): Bytes length exceeds 32."); return abi.decode(abi.encodePacked(new bytes(32 - b.length), b), (uint256)); } function isFork() internal view virtual returns (bool status) { try vm.activeFork() { status = true; } catch (bytes memory) {} } modifier skipWhenForking() { if (!isFork()) { _; } } modifier skipWhenNotForking() { if (isFork()) { _; } } modifier noGasMetering() { vm.pauseGasMetering(); // To prevent turning gas monitoring back on with nested functions that use this modifier, // we check if gasMetering started in the off position. If it did, we don't want to turn // it back on until we exit the top level function that used the modifier // // i.e. funcA() noGasMetering { funcB() }, where funcB has noGasMetering as well. // funcA will have `gasStartedOff` as false, funcB will have it as true, // so we only turn metering back on at the end of the funcA bool gasStartedOff = gasMeteringOff; gasMeteringOff = true; _; // if gas metering was on when this modifier was called, turn it back on at the end if (!gasStartedOff) { gasMeteringOff = false; vm.resumeGasMetering(); } } // We use this complex approach of `_viewChainId` and `_pureChainId` to ensure there are no // compiler warnings when accessing chain ID in any solidity version supported by forge-std. We // can't simply access the chain ID in a normal view or pure function because the solc View Pure // Checker changed `chainid` from pure to view in 0.8.0. function _viewChainId() private view returns (uint256 chainId) { // Assembly required since `block.chainid` was introduced in 0.8.0. assembly { chainId := chainid() } address(this); // Silence warnings in older Solc versions. } function _pureChainId() private pure returns (uint256 chainId) { function() internal view returns (uint256) fnIn = _viewChainId; function() internal pure returns (uint256) pureChainId; assembly { pureChainId := fnIn } chainId = pureChainId(); } } // Wrappers around cheatcodes to avoid footguns abstract contract StdCheats is StdCheatsSafe { using stdStorage for StdStorage; StdStorage private stdstore; Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); address private constant CONSOLE2_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67; // Skip forward or rewind time by the specified number of seconds function skip(uint256 time) internal virtual { vm.warp(block.timestamp + time); } function rewind(uint256 time) internal virtual { vm.warp(block.timestamp - time); } // Setup a prank from an address that has some ether function hoax(address msgSender) internal virtual { vm.deal(msgSender, 1 << 128); vm.prank(msgSender); } function hoax(address msgSender, uint256 give) internal virtual { vm.deal(msgSender, give); vm.prank(msgSender); } function hoax(address msgSender, address origin) internal virtual { vm.deal(msgSender, 1 << 128); vm.prank(msgSender, origin); } function hoax(address msgSender, address origin, uint256 give) internal virtual { vm.deal(msgSender, give); vm.prank(msgSender, origin); } // Start perpetual prank from an address that has some ether function startHoax(address msgSender) internal virtual { vm.deal(msgSender, 1 << 128); vm.startPrank(msgSender); } function startHoax(address msgSender, uint256 give) internal virtual { vm.deal(msgSender, give); vm.startPrank(msgSender); } // Start perpetual prank from an address that has some ether // tx.origin is set to the origin parameter function startHoax(address msgSender, address origin) internal virtual { vm.deal(msgSender, 1 << 128); vm.startPrank(msgSender, origin); } function startHoax(address msgSender, address origin, uint256 give) internal virtual { vm.deal(msgSender, give); vm.startPrank(msgSender, origin); } function changePrank(address msgSender) internal virtual { console2_log_StdCheats("changePrank is deprecated. Please use vm.startPrank instead."); vm.stopPrank(); vm.startPrank(msgSender); } function changePrank(address msgSender, address txOrigin) internal virtual { vm.stopPrank(); vm.startPrank(msgSender, txOrigin); } // The same as Vm's `deal` // Use the alternative signature for ERC20 tokens function deal(address to, uint256 give) internal virtual { vm.deal(to, give); } // Set the balance of an account for any ERC20 token // Use the alternative signature to update `totalSupply` function deal(address token, address to, uint256 give) internal virtual { deal(token, to, give, false); } // Set the balance of an account for any ERC1155 token // Use the alternative signature to update `totalSupply` function dealERC1155(address token, address to, uint256 id, uint256 give) internal virtual { dealERC1155(token, to, id, give, false); } function deal(address token, address to, uint256 give, bool adjust) internal virtual { // get current balance (, bytes memory balData) = token.staticcall(abi.encodeWithSelector(0x70a08231, to)); uint256 prevBal = abi.decode(balData, (uint256)); // update balance stdstore.target(token).sig(0x70a08231).with_key(to).checked_write(give); // update total supply if (adjust) { (, bytes memory totSupData) = token.staticcall(abi.encodeWithSelector(0x18160ddd)); uint256 totSup = abi.decode(totSupData, (uint256)); if (give < prevBal) { totSup -= (prevBal - give); } else { totSup += (give - prevBal); } stdstore.target(token).sig(0x18160ddd).checked_write(totSup); } } function dealERC1155(address token, address to, uint256 id, uint256 give, bool adjust) internal virtual { // get current balance (, bytes memory balData) = token.staticcall(abi.encodeWithSelector(0x00fdd58e, to, id)); uint256 prevBal = abi.decode(balData, (uint256)); // update balance stdstore.target(token).sig(0x00fdd58e).with_key(to).with_key(id).checked_write(give); // update total supply if (adjust) { (, bytes memory totSupData) = token.staticcall(abi.encodeWithSelector(0xbd85b039, id)); require( totSupData.length != 0, "StdCheats deal(address,address,uint,uint,bool): target contract is not ERC1155Supply." ); uint256 totSup = abi.decode(totSupData, (uint256)); if (give < prevBal) { totSup -= (prevBal - give); } else { totSup += (give - prevBal); } stdstore.target(token).sig(0xbd85b039).with_key(id).checked_write(totSup); } } function dealERC721(address token, address to, uint256 id) internal virtual { // check if token id is already minted and the actual owner. (bool successMinted, bytes memory ownerData) = token.staticcall(abi.encodeWithSelector(0x6352211e, id)); require(successMinted, "StdCheats deal(address,address,uint,bool): id not minted."); // get owner current balance (, bytes memory fromBalData) = token.staticcall(abi.encodeWithSelector(0x70a08231, abi.decode(ownerData, (address)))); uint256 fromPrevBal = abi.decode(fromBalData, (uint256)); // get new user current balance (, bytes memory toBalData) = token.staticcall(abi.encodeWithSelector(0x70a08231, to)); uint256 toPrevBal = abi.decode(toBalData, (uint256)); // update balances stdstore.target(token).sig(0x70a08231).with_key(abi.decode(ownerData, (address))).checked_write(--fromPrevBal); stdstore.target(token).sig(0x70a08231).with_key(to).checked_write(++toPrevBal); // update owner stdstore.target(token).sig(0x6352211e).with_key(id).checked_write(to); } function deployCodeTo(string memory what, address where) internal virtual { deployCodeTo(what, "", 0, where); } function deployCodeTo(string memory what, bytes memory args, address where) internal virtual { deployCodeTo(what, args, 0, where); } function deployCodeTo(string memory what, bytes memory args, uint256 value, address where) internal virtual { bytes memory creationCode = vm.getCode(what); vm.etch(where, abi.encodePacked(creationCode, args)); (bool success, bytes memory runtimeBytecode) = where.call{value: value}(""); require(success, "StdCheats deployCodeTo(string,bytes,uint256,address): Failed to create runtime bytecode."); vm.etch(where, runtimeBytecode); } // Used to prevent the compilation of console, which shortens the compilation time when console is not used elsewhere. function console2_log_StdCheats(string memory p0) private view { (bool status,) = address(CONSOLE2_ADDRESS).staticcall(abi.encodeWithSignature("log(string)", p0)); status; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.9.0; pragma experimental ABIEncoderV2; import {VmSafe} from "./Vm.sol"; // Helpers for parsing and writing JSON files // To parse: // ``` // using stdJson for string; // string memory json = vm.readFile("<some_path>"); // json.readUint("<json_path>"); // ``` // To write: // ``` // using stdJson for string; // string memory json = "json"; // json.serialize("a", uint256(123)); // string memory semiFinal = json.serialize("b", string("test")); // string memory finalJson = json.serialize("c", semiFinal); // finalJson.write("<some_path>"); // ``` library stdJson { VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code"))))); function parseRaw(string memory json, string memory key) internal pure returns (bytes memory) { return vm.parseJson(json, key); } function readUint(string memory json, string memory key) internal pure returns (uint256) { return vm.parseJsonUint(json, key); } function readUintArray(string memory json, string memory key) internal pure returns (uint256[] memory) { return vm.parseJsonUintArray(json, key); } function readInt(string memory json, string memory key) internal pure returns (int256) { return vm.parseJsonInt(json, key); } function readIntArray(string memory json, string memory key) internal pure returns (int256[] memory) { return vm.parseJsonIntArray(json, key); } function readBytes32(string memory json, string memory key) internal pure returns (bytes32) { return vm.parseJsonBytes32(json, key); } function readBytes32Array(string memory json, string memory key) internal pure returns (bytes32[] memory) { return vm.parseJsonBytes32Array(json, key); } function readString(string memory json, string memory key) internal pure returns (string memory) { return vm.parseJsonString(json, key); } function readStringArray(string memory json, string memory key) internal pure returns (string[] memory) { return vm.parseJsonStringArray(json, key); } function readAddress(string memory json, string memory key) internal pure returns (address) { return vm.parseJsonAddress(json, key); } function readAddressArray(string memory json, string memory key) internal pure returns (address[] memory) { return vm.parseJsonAddressArray(json, key); } function readBool(string memory json, string memory key) internal pure returns (bool) { return vm.parseJsonBool(json, key); } function readBoolArray(string memory json, string memory key) internal pure returns (bool[] memory) { return vm.parseJsonBoolArray(json, key); } function readBytes(string memory json, string memory key) internal pure returns (bytes memory) { return vm.parseJsonBytes(json, key); } function readBytesArray(string memory json, string memory key) internal pure returns (bytes[] memory) { return vm.parseJsonBytesArray(json, key); } function serialize(string memory jsonKey, string memory rootObject) internal returns (string memory) { return vm.serializeJson(jsonKey, rootObject); } function serialize(string memory jsonKey, string memory key, bool value) internal returns (string memory) { return vm.serializeBool(jsonKey, key, value); } function serialize(string memory jsonKey, string memory key, bool[] memory value) internal returns (string memory) { return vm.serializeBool(jsonKey, key, value); } function serialize(string memory jsonKey, string memory key, uint256 value) internal returns (string memory) { return vm.serializeUint(jsonKey, key, value); } function serialize(string memory jsonKey, string memory key, uint256[] memory value) internal returns (string memory) { return vm.serializeUint(jsonKey, key, value); } function serialize(string memory jsonKey, string memory key, int256 value) internal returns (string memory) { return vm.serializeInt(jsonKey, key, value); } function serialize(string memory jsonKey, string memory key, int256[] memory value) internal returns (string memory) { return vm.serializeInt(jsonKey, key, value); } function serialize(string memory jsonKey, string memory key, address value) internal returns (string memory) { return vm.serializeAddress(jsonKey, key, value); } function serialize(string memory jsonKey, string memory key, address[] memory value) internal returns (string memory) { return vm.serializeAddress(jsonKey, key, value); } function serialize(string memory jsonKey, string memory key, bytes32 value) internal returns (string memory) { return vm.serializeBytes32(jsonKey, key, value); } function serialize(string memory jsonKey, string memory key, bytes32[] memory value) internal returns (string memory) { return vm.serializeBytes32(jsonKey, key, value); } function serialize(string memory jsonKey, string memory key, bytes memory value) internal returns (string memory) { return vm.serializeBytes(jsonKey, key, value); } function serialize(string memory jsonKey, string memory key, bytes[] memory value) internal returns (string memory) { return vm.serializeBytes(jsonKey, key, value); } function serialize(string memory jsonKey, string memory key, string memory value) internal returns (string memory) { return vm.serializeString(jsonKey, key, value); } function serialize(string memory jsonKey, string memory key, string[] memory value) internal returns (string memory) { return vm.serializeString(jsonKey, key, value); } function write(string memory jsonKey, string memory path) internal { vm.writeJson(jsonKey, path); } function write(string memory jsonKey, string memory path, string memory valueKey) internal { vm.writeJson(jsonKey, path, valueKey); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.9.0; library stdMath { int256 private constant INT256_MIN = -57896044618658097711785492504343953926634992332820282019728792003956564819968; function abs(int256 a) internal pure returns (uint256) { // Required or it will fail when `a = type(int256).min` if (a == INT256_MIN) { return 57896044618658097711785492504343953926634992332820282019728792003956564819968; } return uint256(a > 0 ? a : -a); } function delta(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a - b : b - a; } function delta(int256 a, int256 b) internal pure returns (uint256) { // a and b are of the same sign // this works thanks to two's complement, the left-most bit is the sign bit if ((a ^ b) > -1) { return delta(abs(a), abs(b)); } // a and b are of opposite signs return abs(a) + abs(b); } function percentDelta(uint256 a, uint256 b) internal pure returns (uint256) { uint256 absDelta = delta(a, b); return absDelta * 1e18 / b; } function percentDelta(int256 a, int256 b) internal pure returns (uint256) { uint256 absDelta = delta(a, b); uint256 absB = abs(b); return absDelta * 1e18 / absB; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.9.0; import {Vm} from "./Vm.sol"; struct FindData { uint256 slot; uint256 offsetLeft; uint256 offsetRight; bool found; } struct StdStorage { mapping(address => mapping(bytes4 => mapping(bytes32 => FindData))) finds; bytes32[] _keys; bytes4 _sig; uint256 _depth; address _target; bytes32 _set; bool _enable_packed_slots; bytes _calldata; } library stdStorageSafe { event SlotFound(address who, bytes4 fsig, bytes32 keysHash, uint256 slot); event WARNING_UninitedSlot(address who, uint256 slot); Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); uint256 constant UINT256_MAX = 115792089237316195423570985008687907853269984665640564039457584007913129639935; function sigs(string memory sigStr) internal pure returns (bytes4) { return bytes4(keccak256(bytes(sigStr))); } function getCallParams(StdStorage storage self) internal view returns (bytes memory) { if (self._calldata.length == 0) { return flatten(self._keys); } else { return self._calldata; } } // Calls target contract with configured parameters function callTarget(StdStorage storage self) internal view returns (bool, bytes32) { bytes memory cald = abi.encodePacked(self._sig, getCallParams(self)); (bool success, bytes memory rdat) = self._target.staticcall(cald); bytes32 result = bytesToBytes32(rdat, 32 * self._depth); return (success, result); } // Tries mutating slot value to determine if the targeted value is stored in it. // If current value is 0, then we are setting slot value to type(uint256).max // Otherwise, we set it to 0. That way, return value should always be affected. function checkSlotMutatesCall(StdStorage storage self, bytes32 slot) internal returns (bool) { bytes32 prevSlotValue = vm.load(self._target, slot); (bool success, bytes32 prevReturnValue) = callTarget(self); bytes32 testVal = prevReturnValue == bytes32(0) ? bytes32(UINT256_MAX) : bytes32(0); vm.store(self._target, slot, testVal); (, bytes32 newReturnValue) = callTarget(self); vm.store(self._target, slot, prevSlotValue); return (success && (prevReturnValue != newReturnValue)); } // Tries setting one of the bits in slot to 1 until return value changes. // Index of resulted bit is an offset packed slot has from left/right side function findOffset(StdStorage storage self, bytes32 slot, bool left) internal returns (bool, uint256) { for (uint256 offset = 0; offset < 256; offset++) { uint256 valueToPut = left ? (1 << (255 - offset)) : (1 << offset); vm.store(self._target, slot, bytes32(valueToPut)); (bool success, bytes32 data) = callTarget(self); if (success && (uint256(data) > 0)) { return (true, offset); } } return (false, 0); } function findOffsets(StdStorage storage self, bytes32 slot) internal returns (bool, uint256, uint256) { bytes32 prevSlotValue = vm.load(self._target, slot); (bool foundLeft, uint256 offsetLeft) = findOffset(self, slot, true); (bool foundRight, uint256 offsetRight) = findOffset(self, slot, false); // `findOffset` may mutate slot value, so we are setting it to initial value vm.store(self._target, slot, prevSlotValue); return (foundLeft && foundRight, offsetLeft, offsetRight); } function find(StdStorage storage self) internal returns (FindData storage) { return find(self, true); } /// @notice find an arbitrary storage slot given a function sig, input data, address of the contract and a value to check against // slot complexity: // if flat, will be bytes32(uint256(uint)); // if map, will be keccak256(abi.encode(key, uint(slot))); // if deep map, will be keccak256(abi.encode(key1, keccak256(abi.encode(key0, uint(slot))))); // if map struct, will be bytes32(uint256(keccak256(abi.encode(key1, keccak256(abi.encode(key0, uint(slot)))))) + structFieldDepth); function find(StdStorage storage self, bool _clear) internal returns (FindData storage) { address who = self._target; bytes4 fsig = self._sig; uint256 field_depth = self._depth; bytes memory params = getCallParams(self); // calldata to test against if (self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))].found) { if (_clear) { clear(self); } return self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))]; } vm.record(); (, bytes32 callResult) = callTarget(self); (bytes32[] memory reads,) = vm.accesses(address(who)); if (reads.length == 0) { revert("stdStorage find(StdStorage): No storage use detected for target."); } else { for (uint256 i = reads.length; --i >= 0;) { bytes32 prev = vm.load(who, reads[i]); if (prev == bytes32(0)) { emit WARNING_UninitedSlot(who, uint256(reads[i])); } if (!checkSlotMutatesCall(self, reads[i])) { continue; } (uint256 offsetLeft, uint256 offsetRight) = (0, 0); if (self._enable_packed_slots) { bool found; (found, offsetLeft, offsetRight) = findOffsets(self, reads[i]); if (!found) { continue; } } // Check that value between found offsets is equal to the current call result uint256 curVal = (uint256(prev) & getMaskByOffsets(offsetLeft, offsetRight)) >> offsetRight; if (uint256(callResult) != curVal) { continue; } emit SlotFound(who, fsig, keccak256(abi.encodePacked(params, field_depth)), uint256(reads[i])); self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))] = FindData(uint256(reads[i]), offsetLeft, offsetRight, true); break; } } require( self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))].found, "stdStorage find(StdStorage): Slot(s) not found." ); if (_clear) { clear(self); } return self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))]; } function target(StdStorage storage self, address _target) internal returns (StdStorage storage) { self._target = _target; return self; } function sig(StdStorage storage self, bytes4 _sig) internal returns (StdStorage storage) { self._sig = _sig; return self; } function sig(StdStorage storage self, string memory _sig) internal returns (StdStorage storage) { self._sig = sigs(_sig); return self; } function with_calldata(StdStorage storage self, bytes memory _calldata) internal returns (StdStorage storage) { self._calldata = _calldata; return self; } function with_key(StdStorage storage self, address who) internal returns (StdStorage storage) { self._keys.push(bytes32(uint256(uint160(who)))); return self; } function with_key(StdStorage storage self, uint256 amt) internal returns (StdStorage storage) { self._keys.push(bytes32(amt)); return self; } function with_key(StdStorage storage self, bytes32 key) internal returns (StdStorage storage) { self._keys.push(key); return self; } function enable_packed_slots(StdStorage storage self) internal returns (StdStorage storage) { self._enable_packed_slots = true; return self; } function depth(StdStorage storage self, uint256 _depth) internal returns (StdStorage storage) { self._depth = _depth; return self; } function read(StdStorage storage self) private returns (bytes memory) { FindData storage data = find(self, false); uint256 mask = getMaskByOffsets(data.offsetLeft, data.offsetRight); uint256 value = (uint256(vm.load(self._target, bytes32(data.slot))) & mask) >> data.offsetRight; clear(self); return abi.encode(value); } function read_bytes32(StdStorage storage self) internal returns (bytes32) { return abi.decode(read(self), (bytes32)); } function read_bool(StdStorage storage self) internal returns (bool) { int256 v = read_int(self); if (v == 0) return false; if (v == 1) return true; revert("stdStorage read_bool(StdStorage): Cannot decode. Make sure you are reading a bool."); } function read_address(StdStorage storage self) internal returns (address) { return abi.decode(read(self), (address)); } function read_uint(StdStorage storage self) internal returns (uint256) { return abi.decode(read(self), (uint256)); } function read_int(StdStorage storage self) internal returns (int256) { return abi.decode(read(self), (int256)); } function parent(StdStorage storage self) internal returns (uint256, bytes32) { address who = self._target; uint256 field_depth = self._depth; vm.startMappingRecording(); uint256 child = find(self, true).slot - field_depth; (bool found, bytes32 key, bytes32 parent_slot) = vm.getMappingKeyAndParentOf(who, bytes32(child)); if (!found) { revert( "stdStorage read_bool(StdStorage): Cannot find parent. Make sure you give a slot and startMappingRecording() has been called." ); } return (uint256(parent_slot), key); } function root(StdStorage storage self) internal returns (uint256) { address who = self._target; uint256 field_depth = self._depth; vm.startMappingRecording(); uint256 child = find(self, true).slot - field_depth; bool found; bytes32 root_slot; bytes32 parent_slot; (found,, parent_slot) = vm.getMappingKeyAndParentOf(who, bytes32(child)); if (!found) { revert( "stdStorage read_bool(StdStorage): Cannot find parent. Make sure you give a slot and startMappingRecording() has been called." ); } while (found) { root_slot = parent_slot; (found,, parent_slot) = vm.getMappingKeyAndParentOf(who, bytes32(root_slot)); } return uint256(root_slot); } function bytesToBytes32(bytes memory b, uint256 offset) private pure returns (bytes32) { bytes32 out; uint256 max = b.length > 32 ? 32 : b.length; for (uint256 i = 0; i < max; i++) { out |= bytes32(b[offset + i] & 0xFF) >> (i * 8); } return out; } function flatten(bytes32[] memory b) private pure returns (bytes memory) { bytes memory result = new bytes(b.length * 32); for (uint256 i = 0; i < b.length; i++) { bytes32 k = b[i]; /// @solidity memory-safe-assembly assembly { mstore(add(result, add(32, mul(32, i))), k) } } return result; } function clear(StdStorage storage self) internal { delete self._target; delete self._sig; delete self._keys; delete self._depth; delete self._enable_packed_slots; delete self._calldata; } // Returns mask which contains non-zero bits for values between `offsetLeft` and `offsetRight` // (slotValue & mask) >> offsetRight will be the value of the given packed variable function getMaskByOffsets(uint256 offsetLeft, uint256 offsetRight) internal pure returns (uint256 mask) { // mask = ((1 << (256 - (offsetRight + offsetLeft))) - 1) << offsetRight; // using assembly because (1 << 256) causes overflow assembly { mask := shl(offsetRight, sub(shl(sub(256, add(offsetRight, offsetLeft)), 1), 1)) } } // Returns slot value with updated packed variable. function getUpdatedSlotValue(bytes32 curValue, uint256 varValue, uint256 offsetLeft, uint256 offsetRight) internal pure returns (bytes32 newValue) { return bytes32((uint256(curValue) & ~getMaskByOffsets(offsetLeft, offsetRight)) | (varValue << offsetRight)); } } library stdStorage { Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); function sigs(string memory sigStr) internal pure returns (bytes4) { return stdStorageSafe.sigs(sigStr); } function find(StdStorage storage self) internal returns (uint256) { return find(self, true); } function find(StdStorage storage self, bool _clear) internal returns (uint256) { return stdStorageSafe.find(self, _clear).slot; } function target(StdStorage storage self, address _target) internal returns (StdStorage storage) { return stdStorageSafe.target(self, _target); } function sig(StdStorage storage self, bytes4 _sig) internal returns (StdStorage storage) { return stdStorageSafe.sig(self, _sig); } function sig(StdStorage storage self, string memory _sig) internal returns (StdStorage storage) { return stdStorageSafe.sig(self, _sig); } function with_key(StdStorage storage self, address who) internal returns (StdStorage storage) { return stdStorageSafe.with_key(self, who); } function with_key(StdStorage storage self, uint256 amt) internal returns (StdStorage storage) { return stdStorageSafe.with_key(self, amt); } function with_key(StdStorage storage self, bytes32 key) internal returns (StdStorage storage) { return stdStorageSafe.with_key(self, key); } function with_calldata(StdStorage storage self, bytes memory _calldata) internal returns (StdStorage storage) { return stdStorageSafe.with_calldata(self, _calldata); } function enable_packed_slots(StdStorage storage self) internal returns (StdStorage storage) { return stdStorageSafe.enable_packed_slots(self); } function depth(StdStorage storage self, uint256 _depth) internal returns (StdStorage storage) { return stdStorageSafe.depth(self, _depth); } function clear(StdStorage storage self) internal { stdStorageSafe.clear(self); } function checked_write(StdStorage storage self, address who) internal { checked_write(self, bytes32(uint256(uint160(who)))); } function checked_write(StdStorage storage self, uint256 amt) internal { checked_write(self, bytes32(amt)); } function checked_write_int(StdStorage storage self, int256 val) internal { checked_write(self, bytes32(uint256(val))); } function checked_write(StdStorage storage self, bool write) internal { bytes32 t; /// @solidity memory-safe-assembly assembly { t := write } checked_write(self, t); } function checked_write(StdStorage storage self, bytes32 set) internal { address who = self._target; bytes4 fsig = self._sig; uint256 field_depth = self._depth; bytes memory params = stdStorageSafe.getCallParams(self); if (!self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))].found) { find(self, false); } FindData storage data = self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))]; if ((data.offsetLeft + data.offsetRight) > 0) { uint256 maxVal = 2 ** (256 - (data.offsetLeft + data.offsetRight)); require( uint256(set) < maxVal, string( abi.encodePacked( "stdStorage find(StdStorage): Packed slot. We can't fit value greater than ", vm.toString(maxVal) ) ) ); } bytes32 curVal = vm.load(who, bytes32(data.slot)); bytes32 valToSet = stdStorageSafe.getUpdatedSlotValue(curVal, uint256(set), data.offsetLeft, data.offsetRight); vm.store(who, bytes32(data.slot), valToSet); (bool success, bytes32 callResult) = stdStorageSafe.callTarget(self); if (!success || callResult != set) { vm.store(who, bytes32(data.slot), curVal); revert("stdStorage find(StdStorage): Failed to write value."); } clear(self); } function read_bytes32(StdStorage storage self) internal returns (bytes32) { return stdStorageSafe.read_bytes32(self); } function read_bool(StdStorage storage self) internal returns (bool) { return stdStorageSafe.read_bool(self); } function read_address(StdStorage storage self) internal returns (address) { return stdStorageSafe.read_address(self); } function read_uint(StdStorage storage self) internal returns (uint256) { return stdStorageSafe.read_uint(self); } function read_int(StdStorage storage self) internal returns (int256) { return stdStorageSafe.read_int(self); } function parent(StdStorage storage self) internal returns (uint256, bytes32) { return stdStorageSafe.parent(self); } function root(StdStorage storage self) internal returns (uint256) { return stdStorageSafe.root(self); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.4.22 <0.9.0; import {VmSafe} from "./Vm.sol"; library StdStyle { VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code"))))); string constant RED = "\u001b[91m"; string constant GREEN = "\u001b[92m"; string constant YELLOW = "\u001b[93m"; string constant BLUE = "\u001b[94m"; string constant MAGENTA = "\u001b[95m"; string constant CYAN = "\u001b[96m"; string constant BOLD = "\u001b[1m"; string constant DIM = "\u001b[2m"; string constant ITALIC = "\u001b[3m"; string constant UNDERLINE = "\u001b[4m"; string constant INVERSE = "\u001b[7m"; string constant RESET = "\u001b[0m"; function styleConcat(string memory style, string memory self) private pure returns (string memory) { return string(abi.encodePacked(style, self, RESET)); } function red(string memory self) internal pure returns (string memory) { return styleConcat(RED, self); } function red(uint256 self) internal pure returns (string memory) { return red(vm.toString(self)); } function red(int256 self) internal pure returns (string memory) { return red(vm.toString(self)); } function red(address self) internal pure returns (string memory) { return red(vm.toString(self)); } function red(bool self) internal pure returns (string memory) { return red(vm.toString(self)); } function redBytes(bytes memory self) internal pure returns (string memory) { return red(vm.toString(self)); } function redBytes32(bytes32 self) internal pure returns (string memory) { return red(vm.toString(self)); } function green(string memory self) internal pure returns (string memory) { return styleConcat(GREEN, self); } function green(uint256 self) internal pure returns (string memory) { return green(vm.toString(self)); } function green(int256 self) internal pure returns (string memory) { return green(vm.toString(self)); } function green(address self) internal pure returns (string memory) { return green(vm.toString(self)); } function green(bool self) internal pure returns (string memory) { return green(vm.toString(self)); } function greenBytes(bytes memory self) internal pure returns (string memory) { return green(vm.toString(self)); } function greenBytes32(bytes32 self) internal pure returns (string memory) { return green(vm.toString(self)); } function yellow(string memory self) internal pure returns (string memory) { return styleConcat(YELLOW, self); } function yellow(uint256 self) internal pure returns (string memory) { return yellow(vm.toString(self)); } function yellow(int256 self) internal pure returns (string memory) { return yellow(vm.toString(self)); } function yellow(address self) internal pure returns (string memory) { return yellow(vm.toString(self)); } function yellow(bool self) internal pure returns (string memory) { return yellow(vm.toString(self)); } function yellowBytes(bytes memory self) internal pure returns (string memory) { return yellow(vm.toString(self)); } function yellowBytes32(bytes32 self) internal pure returns (string memory) { return yellow(vm.toString(self)); } function blue(string memory self) internal pure returns (string memory) { return styleConcat(BLUE, self); } function blue(uint256 self) internal pure returns (string memory) { return blue(vm.toString(self)); } function blue(int256 self) internal pure returns (string memory) { return blue(vm.toString(self)); } function blue(address self) internal pure returns (string memory) { return blue(vm.toString(self)); } function blue(bool self) internal pure returns (string memory) { return blue(vm.toString(self)); } function blueBytes(bytes memory self) internal pure returns (string memory) { return blue(vm.toString(self)); } function blueBytes32(bytes32 self) internal pure returns (string memory) { return blue(vm.toString(self)); } function magenta(string memory self) internal pure returns (string memory) { return styleConcat(MAGENTA, self); } function magenta(uint256 self) internal pure returns (string memory) { return magenta(vm.toString(self)); } function magenta(int256 self) internal pure returns (string memory) { return magenta(vm.toString(self)); } function magenta(address self) internal pure returns (string memory) { return magenta(vm.toString(self)); } function magenta(bool self) internal pure returns (string memory) { return magenta(vm.toString(self)); } function magentaBytes(bytes memory self) internal pure returns (string memory) { return magenta(vm.toString(self)); } function magentaBytes32(bytes32 self) internal pure returns (string memory) { return magenta(vm.toString(self)); } function cyan(string memory self) internal pure returns (string memory) { return styleConcat(CYAN, self); } function cyan(uint256 self) internal pure returns (string memory) { return cyan(vm.toString(self)); } function cyan(int256 self) internal pure returns (string memory) { return cyan(vm.toString(self)); } function cyan(address self) internal pure returns (string memory) { return cyan(vm.toString(self)); } function cyan(bool self) internal pure returns (string memory) { return cyan(vm.toString(self)); } function cyanBytes(bytes memory self) internal pure returns (string memory) { return cyan(vm.toString(self)); } function cyanBytes32(bytes32 self) internal pure returns (string memory) { return cyan(vm.toString(self)); } function bold(string memory self) internal pure returns (string memory) { return styleConcat(BOLD, self); } function bold(uint256 self) internal pure returns (string memory) { return bold(vm.toString(self)); } function bold(int256 self) internal pure returns (string memory) { return bold(vm.toString(self)); } function bold(address self) internal pure returns (string memory) { return bold(vm.toString(self)); } function bold(bool self) internal pure returns (string memory) { return bold(vm.toString(self)); } function boldBytes(bytes memory self) internal pure returns (string memory) { return bold(vm.toString(self)); } function boldBytes32(bytes32 self) internal pure returns (string memory) { return bold(vm.toString(self)); } function dim(string memory self) internal pure returns (string memory) { return styleConcat(DIM, self); } function dim(uint256 self) internal pure returns (string memory) { return dim(vm.toString(self)); } function dim(int256 self) internal pure returns (string memory) { return dim(vm.toString(self)); } function dim(address self) internal pure returns (string memory) { return dim(vm.toString(self)); } function dim(bool self) internal pure returns (string memory) { return dim(vm.toString(self)); } function dimBytes(bytes memory self) internal pure returns (string memory) { return dim(vm.toString(self)); } function dimBytes32(bytes32 self) internal pure returns (string memory) { return dim(vm.toString(self)); } function italic(string memory self) internal pure returns (string memory) { return styleConcat(ITALIC, self); } function italic(uint256 self) internal pure returns (string memory) { return italic(vm.toString(self)); } function italic(int256 self) internal pure returns (string memory) { return italic(vm.toString(self)); } function italic(address self) internal pure returns (string memory) { return italic(vm.toString(self)); } function italic(bool self) internal pure returns (string memory) { return italic(vm.toString(self)); } function italicBytes(bytes memory self) internal pure returns (string memory) { return italic(vm.toString(self)); } function italicBytes32(bytes32 self) internal pure returns (string memory) { return italic(vm.toString(self)); } function underline(string memory self) internal pure returns (string memory) { return styleConcat(UNDERLINE, self); } function underline(uint256 self) internal pure returns (string memory) { return underline(vm.toString(self)); } function underline(int256 self) internal pure returns (string memory) { return underline(vm.toString(self)); } function underline(address self) internal pure returns (string memory) { return underline(vm.toString(self)); } function underline(bool self) internal pure returns (string memory) { return underline(vm.toString(self)); } function underlineBytes(bytes memory self) internal pure returns (string memory) { return underline(vm.toString(self)); } function underlineBytes32(bytes32 self) internal pure returns (string memory) { return underline(vm.toString(self)); } function inverse(string memory self) internal pure returns (string memory) { return styleConcat(INVERSE, self); } function inverse(uint256 self) internal pure returns (string memory) { return inverse(vm.toString(self)); } function inverse(int256 self) internal pure returns (string memory) { return inverse(vm.toString(self)); } function inverse(address self) internal pure returns (string memory) { return inverse(vm.toString(self)); } function inverse(bool self) internal pure returns (string memory) { return inverse(vm.toString(self)); } function inverseBytes(bytes memory self) internal pure returns (string memory) { return inverse(vm.toString(self)); } function inverseBytes32(bytes32 self) internal pure returns (string memory) { return inverse(vm.toString(self)); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.9.0; pragma experimental ABIEncoderV2; import {IMulticall3} from "./interfaces/IMulticall3.sol"; import {MockERC20} from "./mocks/MockERC20.sol"; import {MockERC721} from "./mocks/MockERC721.sol"; import {VmSafe} from "./Vm.sol"; abstract contract StdUtils { /*////////////////////////////////////////////////////////////////////////// CONSTANTS //////////////////////////////////////////////////////////////////////////*/ IMulticall3 private constant multicall = IMulticall3(0xcA11bde05977b3631167028862bE2a173976CA11); VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code"))))); address private constant CONSOLE2_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67; uint256 private constant INT256_MIN_ABS = 57896044618658097711785492504343953926634992332820282019728792003956564819968; uint256 private constant SECP256K1_ORDER = 115792089237316195423570985008687907852837564279074904382605163141518161494337; uint256 private constant UINT256_MAX = 115792089237316195423570985008687907853269984665640564039457584007913129639935; // Used by default when deploying with create2, https://github.com/Arachnid/deterministic-deployment-proxy. address private constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C; /*////////////////////////////////////////////////////////////////////////// INTERNAL FUNCTIONS //////////////////////////////////////////////////////////////////////////*/ function _bound(uint256 x, uint256 min, uint256 max) internal pure virtual returns (uint256 result) { require(min <= max, "StdUtils bound(uint256,uint256,uint256): Max is less than min."); // If x is between min and max, return x directly. This is to ensure that dictionary values // do not get shifted if the min is nonzero. More info: https://github.com/foundry-rs/forge-std/issues/188 if (x >= min && x <= max) return x; uint256 size = max - min + 1; // If the value is 0, 1, 2, 3, wrap that to min, min+1, min+2, min+3. Similarly for the UINT256_MAX side. // This helps ensure coverage of the min/max values. if (x <= 3 && size > x) return min + x; if (x >= UINT256_MAX - 3 && size > UINT256_MAX - x) return max - (UINT256_MAX - x); // Otherwise, wrap x into the range [min, max], i.e. the range is inclusive. if (x > max) { uint256 diff = x - max; uint256 rem = diff % size; if (rem == 0) return max; result = min + rem - 1; } else if (x < min) { uint256 diff = min - x; uint256 rem = diff % size; if (rem == 0) return min; result = max - rem + 1; } } function bound(uint256 x, uint256 min, uint256 max) internal pure virtual returns (uint256 result) { result = _bound(x, min, max); console2_log_StdUtils("Bound result", result); } function _bound(int256 x, int256 min, int256 max) internal pure virtual returns (int256 result) { require(min <= max, "StdUtils bound(int256,int256,int256): Max is less than min."); // Shifting all int256 values to uint256 to use _bound function. The range of two types are: // int256 : -(2**255) ~ (2**255 - 1) // uint256: 0 ~ (2**256 - 1) // So, add 2**255, INT256_MIN_ABS to the integer values. // // If the given integer value is -2**255, we cannot use `-uint256(-x)` because of the overflow. // So, use `~uint256(x) + 1` instead. uint256 _x = x < 0 ? (INT256_MIN_ABS - ~uint256(x) - 1) : (uint256(x) + INT256_MIN_ABS); uint256 _min = min < 0 ? (INT256_MIN_ABS - ~uint256(min) - 1) : (uint256(min) + INT256_MIN_ABS); uint256 _max = max < 0 ? (INT256_MIN_ABS - ~uint256(max) - 1) : (uint256(max) + INT256_MIN_ABS); uint256 y = _bound(_x, _min, _max); // To move it back to int256 value, subtract INT256_MIN_ABS at here. result = y < INT256_MIN_ABS ? int256(~(INT256_MIN_ABS - y) + 1) : int256(y - INT256_MIN_ABS); } function bound(int256 x, int256 min, int256 max) internal pure virtual returns (int256 result) { result = _bound(x, min, max); console2_log_StdUtils("Bound result", vm.toString(result)); } function boundPrivateKey(uint256 privateKey) internal pure virtual returns (uint256 result) { result = _bound(privateKey, 1, SECP256K1_ORDER - 1); } function bytesToUint(bytes memory b) internal pure virtual returns (uint256) { require(b.length <= 32, "StdUtils bytesToUint(bytes): Bytes length exceeds 32."); return abi.decode(abi.encodePacked(new bytes(32 - b.length), b), (uint256)); } /// @dev Compute the address a contract will be deployed at for a given deployer address and nonce /// @notice adapted from Solmate implementation (https://github.com/Rari-Capital/solmate/blob/main/src/utils/LibRLP.sol) function computeCreateAddress(address deployer, uint256 nonce) internal pure virtual returns (address) { console2_log_StdUtils("computeCreateAddress is deprecated. Please use vm.computeCreateAddress instead."); return vm.computeCreateAddress(deployer, nonce); } function computeCreate2Address(bytes32 salt, bytes32 initcodeHash, address deployer) internal pure virtual returns (address) { console2_log_StdUtils("computeCreate2Address is deprecated. Please use vm.computeCreate2Address instead."); return vm.computeCreate2Address(salt, initcodeHash, deployer); } /// @dev returns the address of a contract created with CREATE2 using the default CREATE2 deployer function computeCreate2Address(bytes32 salt, bytes32 initCodeHash) internal pure returns (address) { console2_log_StdUtils("computeCreate2Address is deprecated. Please use vm.computeCreate2Address instead."); return vm.computeCreate2Address(salt, initCodeHash); } /// @dev returns an initialized mock ERC20 contract function deployMockERC20(string memory name, string memory symbol, uint8 decimals) internal returns (MockERC20 mock) { mock = new MockERC20(); mock.initialize(name, symbol, decimals); } /// @dev returns an initialized mock ERC721 contract function deployMockERC721(string memory name, string memory symbol) internal returns (MockERC721 mock) { mock = new MockERC721(); mock.initialize(name, symbol); } /// @dev returns the hash of the init code (creation code + no args) used in CREATE2 with no constructor arguments /// @param creationCode the creation code of a contract C, as returned by type(C).creationCode function hashInitCode(bytes memory creationCode) internal pure returns (bytes32) { return hashInitCode(creationCode, ""); } /// @dev returns the hash of the init code (creation code + ABI-encoded args) used in CREATE2 /// @param creationCode the creation code of a contract C, as returned by type(C).creationCode /// @param args the ABI-encoded arguments to the constructor of C function hashInitCode(bytes memory creationCode, bytes memory args) internal pure returns (bytes32) { return keccak256(abi.encodePacked(creationCode, args)); } // Performs a single call with Multicall3 to query the ERC-20 token balances of the given addresses. function getTokenBalances(address token, address[] memory addresses) internal virtual returns (uint256[] memory balances) { uint256 tokenCodeSize; assembly { tokenCodeSize := extcodesize(token) } require(tokenCodeSize > 0, "StdUtils getTokenBalances(address,address[]): Token address is not a contract."); // ABI encode the aggregate call to Multicall3. uint256 length = addresses.length; IMulticall3.Call[] memory calls = new IMulticall3.Call[](length); for (uint256 i = 0; i < length; ++i) { // 0x70a08231 = bytes4("balanceOf(address)")) calls[i] = IMulticall3.Call({target: token, callData: abi.encodeWithSelector(0x70a08231, (addresses[i]))}); } // Make the aggregate call. (, bytes[] memory returnData) = multicall.aggregate(calls); // ABI decode the return data and return the balances. balances = new uint256[](length); for (uint256 i = 0; i < length; ++i) { balances[i] = abi.decode(returnData[i], (uint256)); } } /*////////////////////////////////////////////////////////////////////////// PRIVATE FUNCTIONS //////////////////////////////////////////////////////////////////////////*/ function addressFromLast20Bytes(bytes32 bytesValue) private pure returns (address) { return address(uint160(uint256(bytesValue))); } // This section is used to prevent the compilation of console, which shortens the compilation time when console is // not used elsewhere. We also trick the compiler into letting us make the console log methods as `pure` to avoid // any breaking changes to function signatures. function _castLogPayloadViewToPure(function(bytes memory) internal view fnIn) internal pure returns (function(bytes memory) internal pure fnOut) { assembly { fnOut := fnIn } } function _sendLogPayload(bytes memory payload) internal pure { _castLogPayloadViewToPure(_sendLogPayloadView)(payload); } function _sendLogPayloadView(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE2_ADDRESS; /// @solidity memory-safe-assembly assembly { let payloadStart := add(payload, 32) let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) } } function console2_log_StdUtils(string memory p0) private pure { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function console2_log_StdUtils(string memory p0, uint256 p1) private pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1)); } function console2_log_StdUtils(string memory p0, string memory p1) private pure { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } }
// Automatically @generated by scripts/vm.py. Do not modify manually. // SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity >=0.6.2 <0.9.0; pragma experimental ABIEncoderV2; /// The `VmSafe` interface does not allow manipulation of the EVM state or other actions that may /// result in Script simulations differing from on-chain execution. It is recommended to only use /// these cheats in scripts. interface VmSafe { /// A modification applied to either `msg.sender` or `tx.origin`. Returned by `readCallers`. enum CallerMode { // No caller modification is currently active. None, // A one time broadcast triggered by a `vm.broadcast()` call is currently active. Broadcast, // A recurrent broadcast triggered by a `vm.startBroadcast()` call is currently active. RecurrentBroadcast, // A one time prank triggered by a `vm.prank()` call is currently active. Prank, // A recurrent prank triggered by a `vm.startPrank()` call is currently active. RecurrentPrank } /// The kind of account access that occurred. enum AccountAccessKind { // The account was called. Call, // The account was called via delegatecall. DelegateCall, // The account was called via callcode. CallCode, // The account was called via staticcall. StaticCall, // The account was created. Create, // The account was selfdestructed. SelfDestruct, // Synthetic access indicating the current context has resumed after a previous sub-context (AccountAccess). Resume, // The account's balance was read. Balance, // The account's codesize was read. Extcodesize, // The account's codehash was read. Extcodehash, // The account's code was copied. Extcodecopy } /// Forge execution contexts. enum ForgeContext { // Test group execution context (test, coverage or snapshot). TestGroup, // `forge test` execution context. Test, // `forge coverage` execution context. Coverage, // `forge snapshot` execution context. Snapshot, // Script group execution context (dry run, broadcast or resume). ScriptGroup, // `forge script` execution context. ScriptDryRun, // `forge script --broadcast` execution context. ScriptBroadcast, // `forge script --resume` execution context. ScriptResume, // Unknown `forge` execution context. Unknown } /// An Ethereum log. Returned by `getRecordedLogs`. struct Log { // The topics of the log, including the signature, if any. bytes32[] topics; // The raw data of the log. bytes data; // The address of the log's emitter. address emitter; } /// An RPC URL and its alias. Returned by `rpcUrlStructs`. struct Rpc { // The alias of the RPC URL. string key; // The RPC URL. string url; } /// An RPC log object. Returned by `eth_getLogs`. struct EthGetLogs { // The address of the log's emitter. address emitter; // The topics of the log, including the signature, if any. bytes32[] topics; // The raw data of the log. bytes data; // The block hash. bytes32 blockHash; // The block number. uint64 blockNumber; // The transaction hash. bytes32 transactionHash; // The transaction index in the block. uint64 transactionIndex; // The log index. uint256 logIndex; // Whether the log was removed. bool removed; } /// A single entry in a directory listing. Returned by `readDir`. struct DirEntry { // The error message, if any. string errorMessage; // The path of the entry. string path; // The depth of the entry. uint64 depth; // Whether the entry is a directory. bool isDir; // Whether the entry is a symlink. bool isSymlink; } /// Metadata information about a file. /// This structure is returned from the `fsMetadata` function and represents known /// metadata about a file such as its permissions, size, modification /// times, etc. struct FsMetadata { // True if this metadata is for a directory. bool isDir; // True if this metadata is for a symlink. bool isSymlink; // The size of the file, in bytes, this metadata is for. uint256 length; // True if this metadata is for a readonly (unwritable) file. bool readOnly; // The last modification time listed in this metadata. uint256 modified; // The last access time of this metadata. uint256 accessed; // The creation time listed in this metadata. uint256 created; } /// A wallet with a public and private key. struct Wallet { // The wallet's address. address addr; // The wallet's public key `X`. uint256 publicKeyX; // The wallet's public key `Y`. uint256 publicKeyY; // The wallet's private key. uint256 privateKey; } /// The result of a `tryFfi` call. struct FfiResult { // The exit code of the call. int32 exitCode; // The optionally hex-decoded `stdout` data. bytes stdout; // The `stderr` data. bytes stderr; } /// Information on the chain and fork. struct ChainInfo { // The fork identifier. Set to zero if no fork is active. uint256 forkId; // The chain ID of the current fork. uint256 chainId; } /// The result of a `stopAndReturnStateDiff` call. struct AccountAccess { // The chain and fork the access occurred. ChainInfo chainInfo; // The kind of account access that determines what the account is. // If kind is Call, DelegateCall, StaticCall or CallCode, then the account is the callee. // If kind is Create, then the account is the newly created account. // If kind is SelfDestruct, then the account is the selfdestruct recipient. // If kind is a Resume, then account represents a account context that has resumed. AccountAccessKind kind; // The account that was accessed. // It's either the account created, callee or a selfdestruct recipient for CREATE, CALL or SELFDESTRUCT. address account; // What accessed the account. address accessor; // If the account was initialized or empty prior to the access. // An account is considered initialized if it has code, a // non-zero nonce, or a non-zero balance. bool initialized; // The previous balance of the accessed account. uint256 oldBalance; // The potential new balance of the accessed account. // That is, all balance changes are recorded here, even if reverts occurred. uint256 newBalance; // Code of the account deployed by CREATE. bytes deployedCode; // Value passed along with the account access uint256 value; // Input data provided to the CREATE or CALL bytes data; // If this access reverted in either the current or parent context. bool reverted; // An ordered list of storage accesses made during an account access operation. StorageAccess[] storageAccesses; // Call depth traversed during the recording of state differences uint64 depth; } /// The storage accessed during an `AccountAccess`. struct StorageAccess { // The account whose storage was accessed. address account; // The slot that was accessed. bytes32 slot; // If the access was a write. bool isWrite; // The previous value of the slot. bytes32 previousValue; // The new value of the slot. bytes32 newValue; // If the access was reverted. bool reverted; } /// Gas used. Returned by `lastCallGas`. struct Gas { // The gas limit of the call. uint64 gasLimit; // The total gas used. uint64 gasTotalUsed; // DEPRECATED: The amount of gas used for memory expansion. Ref: <https://github.com/foundry-rs/foundry/pull/7934#pullrequestreview-2069236939> uint64 gasMemoryUsed; // The amount of gas refunded. int64 gasRefunded; // The amount of gas remaining. uint64 gasRemaining; } // ======== Crypto ======== /// Derives a private key from the name, labels the account with that name, and returns the wallet. function createWallet(string calldata walletLabel) external returns (Wallet memory wallet); /// Generates a wallet from the private key and returns the wallet. function createWallet(uint256 privateKey) external returns (Wallet memory wallet); /// Generates a wallet from the private key, labels the account with that name, and returns the wallet. function createWallet(uint256 privateKey, string calldata walletLabel) external returns (Wallet memory wallet); /// Derive a private key from a provided mnenomic string (or mnenomic file path) /// at the derivation path `m/44'/60'/0'/0/{index}`. function deriveKey(string calldata mnemonic, uint32 index) external pure returns (uint256 privateKey); /// Derive a private key from a provided mnenomic string (or mnenomic file path) /// at `{derivationPath}{index}`. function deriveKey(string calldata mnemonic, string calldata derivationPath, uint32 index) external pure returns (uint256 privateKey); /// Derive a private key from a provided mnenomic string (or mnenomic file path) in the specified language /// at the derivation path `m/44'/60'/0'/0/{index}`. function deriveKey(string calldata mnemonic, uint32 index, string calldata language) external pure returns (uint256 privateKey); /// Derive a private key from a provided mnenomic string (or mnenomic file path) in the specified language /// at `{derivationPath}{index}`. function deriveKey(string calldata mnemonic, string calldata derivationPath, uint32 index, string calldata language) external pure returns (uint256 privateKey); /// Adds a private key to the local forge wallet and returns the address. function rememberKey(uint256 privateKey) external returns (address keyAddr); /// Signs data with a `Wallet`. /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the /// signature's `s` value, and the recovery id `v` in a single bytes32. /// This format reduces the signature size from 65 to 64 bytes. function signCompact(Wallet calldata wallet, bytes32 digest) external returns (bytes32 r, bytes32 vs); /// Signs `digest` with `privateKey` using the secp256k1 curve. /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the /// signature's `s` value, and the recovery id `v` in a single bytes32. /// This format reduces the signature size from 65 to 64 bytes. function signCompact(uint256 privateKey, bytes32 digest) external pure returns (bytes32 r, bytes32 vs); /// Signs `digest` with signer provided to script using the secp256k1 curve. /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the /// signature's `s` value, and the recovery id `v` in a single bytes32. /// This format reduces the signature size from 65 to 64 bytes. /// If `--sender` is provided, the signer with provided address is used, otherwise, /// if exactly one signer is provided to the script, that signer is used. /// Raises error if signer passed through `--sender` does not match any unlocked signers or /// if `--sender` is not provided and not exactly one signer is passed to the script. function signCompact(bytes32 digest) external pure returns (bytes32 r, bytes32 vs); /// Signs `digest` with signer provided to script using the secp256k1 curve. /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the /// signature's `s` value, and the recovery id `v` in a single bytes32. /// This format reduces the signature size from 65 to 64 bytes. /// Raises error if none of the signers passed into the script have provided address. function signCompact(address signer, bytes32 digest) external pure returns (bytes32 r, bytes32 vs); /// Signs `digest` with `privateKey` using the secp256r1 curve. function signP256(uint256 privateKey, bytes32 digest) external pure returns (bytes32 r, bytes32 s); /// Signs data with a `Wallet`. function sign(Wallet calldata wallet, bytes32 digest) external returns (uint8 v, bytes32 r, bytes32 s); /// Signs `digest` with `privateKey` using the secp256k1 curve. function sign(uint256 privateKey, bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s); /// Signs `digest` with signer provided to script using the secp256k1 curve. /// If `--sender` is provided, the signer with provided address is used, otherwise, /// if exactly one signer is provided to the script, that signer is used. /// Raises error if signer passed through `--sender` does not match any unlocked signers or /// if `--sender` is not provided and not exactly one signer is passed to the script. function sign(bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s); /// Signs `digest` with signer provided to script using the secp256k1 curve. /// Raises error if none of the signers passed into the script have provided address. function sign(address signer, bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s); // ======== Environment ======== /// Gets the environment variable `name` and parses it as `address`. /// Reverts if the variable was not found or could not be parsed. function envAddress(string calldata name) external view returns (address value); /// Gets the environment variable `name` and parses it as an array of `address`, delimited by `delim`. /// Reverts if the variable was not found or could not be parsed. function envAddress(string calldata name, string calldata delim) external view returns (address[] memory value); /// Gets the environment variable `name` and parses it as `bool`. /// Reverts if the variable was not found or could not be parsed. function envBool(string calldata name) external view returns (bool value); /// Gets the environment variable `name` and parses it as an array of `bool`, delimited by `delim`. /// Reverts if the variable was not found or could not be parsed. function envBool(string calldata name, string calldata delim) external view returns (bool[] memory value); /// Gets the environment variable `name` and parses it as `bytes32`. /// Reverts if the variable was not found or could not be parsed. function envBytes32(string calldata name) external view returns (bytes32 value); /// Gets the environment variable `name` and parses it as an array of `bytes32`, delimited by `delim`. /// Reverts if the variable was not found or could not be parsed. function envBytes32(string calldata name, string calldata delim) external view returns (bytes32[] memory value); /// Gets the environment variable `name` and parses it as `bytes`. /// Reverts if the variable was not found or could not be parsed. function envBytes(string calldata name) external view returns (bytes memory value); /// Gets the environment variable `name` and parses it as an array of `bytes`, delimited by `delim`. /// Reverts if the variable was not found or could not be parsed. function envBytes(string calldata name, string calldata delim) external view returns (bytes[] memory value); /// Gets the environment variable `name` and returns true if it exists, else returns false. function envExists(string calldata name) external view returns (bool result); /// Gets the environment variable `name` and parses it as `int256`. /// Reverts if the variable was not found or could not be parsed. function envInt(string calldata name) external view returns (int256 value); /// Gets the environment variable `name` and parses it as an array of `int256`, delimited by `delim`. /// Reverts if the variable was not found or could not be parsed. function envInt(string calldata name, string calldata delim) external view returns (int256[] memory value); /// Gets the environment variable `name` and parses it as `bool`. /// Reverts if the variable could not be parsed. /// Returns `defaultValue` if the variable was not found. function envOr(string calldata name, bool defaultValue) external view returns (bool value); /// Gets the environment variable `name` and parses it as `uint256`. /// Reverts if the variable could not be parsed. /// Returns `defaultValue` if the variable was not found. function envOr(string calldata name, uint256 defaultValue) external view returns (uint256 value); /// Gets the environment variable `name` and parses it as an array of `address`, delimited by `delim`. /// Reverts if the variable could not be parsed. /// Returns `defaultValue` if the variable was not found. function envOr(string calldata name, string calldata delim, address[] calldata defaultValue) external view returns (address[] memory value); /// Gets the environment variable `name` and parses it as an array of `bytes32`, delimited by `delim`. /// Reverts if the variable could not be parsed. /// Returns `defaultValue` if the variable was not found. function envOr(string calldata name, string calldata delim, bytes32[] calldata defaultValue) external view returns (bytes32[] memory value); /// Gets the environment variable `name` and parses it as an array of `string`, delimited by `delim`. /// Reverts if the variable could not be parsed. /// Returns `defaultValue` if the variable was not found. function envOr(string calldata name, string calldata delim, string[] calldata defaultValue) external view returns (string[] memory value); /// Gets the environment variable `name` and parses it as an array of `bytes`, delimited by `delim`. /// Reverts if the variable could not be parsed. /// Returns `defaultValue` if the variable was not found. function envOr(string calldata name, string calldata delim, bytes[] calldata defaultValue) external view returns (bytes[] memory value); /// Gets the environment variable `name` and parses it as `int256`. /// Reverts if the variable could not be parsed. /// Returns `defaultValue` if the variable was not found. function envOr(string calldata name, int256 defaultValue) external view returns (int256 value); /// Gets the environment variable `name` and parses it as `address`. /// Reverts if the variable could not be parsed. /// Returns `defaultValue` if the variable was not found. function envOr(string calldata name, address defaultValue) external view returns (address value); /// Gets the environment variable `name` and parses it as `bytes32`. /// Reverts if the variable could not be parsed. /// Returns `defaultValue` if the variable was not found. function envOr(string calldata name, bytes32 defaultValue) external view returns (bytes32 value); /// Gets the environment variable `name` and parses it as `string`. /// Reverts if the variable could not be parsed. /// Returns `defaultValue` if the variable was not found. function envOr(string calldata name, string calldata defaultValue) external view returns (string memory value); /// Gets the environment variable `name` and parses it as `bytes`. /// Reverts if the variable could not be parsed. /// Returns `defaultValue` if the variable was not found. function envOr(string calldata name, bytes calldata defaultValue) external view returns (bytes memory value); /// Gets the environment variable `name` and parses it as an array of `bool`, delimited by `delim`. /// Reverts if the variable could not be parsed. /// Returns `defaultValue` if the variable was not found. function envOr(string calldata name, string calldata delim, bool[] calldata defaultValue) external view returns (bool[] memory value); /// Gets the environment variable `name` and parses it as an array of `uint256`, delimited by `delim`. /// Reverts if the variable could not be parsed. /// Returns `defaultValue` if the variable was not found. function envOr(string calldata name, string calldata delim, uint256[] calldata defaultValue) external view returns (uint256[] memory value); /// Gets the environment variable `name` and parses it as an array of `int256`, delimited by `delim`. /// Reverts if the variable could not be parsed. /// Returns `defaultValue` if the variable was not found. function envOr(string calldata name, string calldata delim, int256[] calldata defaultValue) external view returns (int256[] memory value); /// Gets the environment variable `name` and parses it as `string`. /// Reverts if the variable was not found or could not be parsed. function envString(string calldata name) external view returns (string memory value); /// Gets the environment variable `name` and parses it as an array of `string`, delimited by `delim`. /// Reverts if the variable was not found or could not be parsed. function envString(string calldata name, string calldata delim) external view returns (string[] memory value); /// Gets the environment variable `name` and parses it as `uint256`. /// Reverts if the variable was not found or could not be parsed. function envUint(string calldata name) external view returns (uint256 value); /// Gets the environment variable `name` and parses it as an array of `uint256`, delimited by `delim`. /// Reverts if the variable was not found or could not be parsed. function envUint(string calldata name, string calldata delim) external view returns (uint256[] memory value); /// Returns true if `forge` command was executed in given context. function isContext(ForgeContext context) external view returns (bool result); /// Sets environment variables. function setEnv(string calldata name, string calldata value) external; // ======== EVM ======== /// Gets all accessed reads and write slot from a `vm.record` session, for a given address. function accesses(address target) external returns (bytes32[] memory readSlots, bytes32[] memory writeSlots); /// Gets the address for a given private key. function addr(uint256 privateKey) external pure returns (address keyAddr); /// Gets all the logs according to specified filter. function eth_getLogs(uint256 fromBlock, uint256 toBlock, address target, bytes32[] calldata topics) external returns (EthGetLogs[] memory logs); /// Gets the current `block.blobbasefee`. /// You should use this instead of `block.blobbasefee` if you use `vm.blobBaseFee`, as `block.blobbasefee` is assumed to be constant across a transaction, /// and as a result will get optimized out by the compiler. /// See https://github.com/foundry-rs/foundry/issues/6180 function getBlobBaseFee() external view returns (uint256 blobBaseFee); /// Gets the current `block.number`. /// You should use this instead of `block.number` if you use `vm.roll`, as `block.number` is assumed to be constant across a transaction, /// and as a result will get optimized out by the compiler. /// See https://github.com/foundry-rs/foundry/issues/6180 function getBlockNumber() external view returns (uint256 height); /// Gets the current `block.timestamp`. /// You should use this instead of `block.timestamp` if you use `vm.warp`, as `block.timestamp` is assumed to be constant across a transaction, /// and as a result will get optimized out by the compiler. /// See https://github.com/foundry-rs/foundry/issues/6180 function getBlockTimestamp() external view returns (uint256 timestamp); /// Gets the map key and parent of a mapping at a given slot, for a given address. function getMappingKeyAndParentOf(address target, bytes32 elementSlot) external returns (bool found, bytes32 key, bytes32 parent); /// Gets the number of elements in the mapping at the given slot, for a given address. function getMappingLength(address target, bytes32 mappingSlot) external returns (uint256 length); /// Gets the elements at index idx of the mapping at the given slot, for a given address. The /// index must be less than the length of the mapping (i.e. the number of keys in the mapping). function getMappingSlotAt(address target, bytes32 mappingSlot, uint256 idx) external returns (bytes32 value); /// Gets the nonce of an account. function getNonce(address account) external view returns (uint64 nonce); /// Get the nonce of a `Wallet`. function getNonce(Wallet calldata wallet) external returns (uint64 nonce); /// Gets all the recorded logs. function getRecordedLogs() external returns (Log[] memory logs); /// Gets the gas used in the last call. function lastCallGas() external view returns (Gas memory gas); /// Loads a storage slot from an address. function load(address target, bytes32 slot) external view returns (bytes32 data); /// Pauses gas metering (i.e. gas usage is not counted). Noop if already paused. function pauseGasMetering() external; /// Records all storage reads and writes. function record() external; /// Record all the transaction logs. function recordLogs() external; /// Resumes gas metering (i.e. gas usage is counted again). Noop if already on. function resumeGasMetering() external; /// Performs an Ethereum JSON-RPC request to the current fork URL. function rpc(string calldata method, string calldata params) external returns (bytes memory data); /// Performs an Ethereum JSON-RPC request to the given endpoint. function rpc(string calldata urlOrAlias, string calldata method, string calldata params) external returns (bytes memory data); /// Starts recording all map SSTOREs for later retrieval. function startMappingRecording() external; /// Record all account accesses as part of CREATE, CALL or SELFDESTRUCT opcodes in order, /// along with the context of the calls function startStateDiffRecording() external; /// Returns an ordered array of all account accesses from a `vm.startStateDiffRecording` session. function stopAndReturnStateDiff() external returns (AccountAccess[] memory accountAccesses); /// Stops recording all map SSTOREs for later retrieval and clears the recorded data. function stopMappingRecording() external; // ======== Filesystem ======== /// Closes file for reading, resetting the offset and allowing to read it from beginning with readLine. /// `path` is relative to the project root. function closeFile(string calldata path) external; /// Copies the contents of one file to another. This function will **overwrite** the contents of `to`. /// On success, the total number of bytes copied is returned and it is equal to the length of the `to` file as reported by `metadata`. /// Both `from` and `to` are relative to the project root. function copyFile(string calldata from, string calldata to) external returns (uint64 copied); /// Creates a new, empty directory at the provided path. /// This cheatcode will revert in the following situations, but is not limited to just these cases: /// - User lacks permissions to modify `path`. /// - A parent of the given path doesn't exist and `recursive` is false. /// - `path` already exists and `recursive` is false. /// `path` is relative to the project root. function createDir(string calldata path, bool recursive) external; /// Deploys a contract from an artifact file. Takes in the relative path to the json file or the path to the /// artifact in the form of <path>:<contract>:<version> where <contract> and <version> parts are optional. function deployCode(string calldata artifactPath) external returns (address deployedAddress); /// Deploys a contract from an artifact file. Takes in the relative path to the json file or the path to the /// artifact in the form of <path>:<contract>:<version> where <contract> and <version> parts are optional. /// Additionaly accepts abi-encoded constructor arguments. function deployCode(string calldata artifactPath, bytes calldata constructorArgs) external returns (address deployedAddress); /// Returns true if the given path points to an existing entity, else returns false. function exists(string calldata path) external returns (bool result); /// Performs a foreign function call via the terminal. function ffi(string[] calldata commandInput) external returns (bytes memory result); /// Given a path, query the file system to get information about a file, directory, etc. function fsMetadata(string calldata path) external view returns (FsMetadata memory metadata); /// Gets the creation bytecode from an artifact file. Takes in the relative path to the json file or the path to the /// artifact in the form of <path>:<contract>:<version> where <contract> and <version> parts are optional. function getCode(string calldata artifactPath) external view returns (bytes memory creationBytecode); /// Gets the deployed bytecode from an artifact file. Takes in the relative path to the json file or the path to the /// artifact in the form of <path>:<contract>:<version> where <contract> and <version> parts are optional. function getDeployedCode(string calldata artifactPath) external view returns (bytes memory runtimeBytecode); /// Returns true if the path exists on disk and is pointing at a directory, else returns false. function isDir(string calldata path) external returns (bool result); /// Returns true if the path exists on disk and is pointing at a regular file, else returns false. function isFile(string calldata path) external returns (bool result); /// Get the path of the current project root. function projectRoot() external view returns (string memory path); /// Prompts the user for a string value in the terminal. function prompt(string calldata promptText) external returns (string memory input); /// Prompts the user for an address in the terminal. function promptAddress(string calldata promptText) external returns (address); /// Prompts the user for a hidden string value in the terminal. function promptSecret(string calldata promptText) external returns (string memory input); /// Prompts the user for hidden uint256 in the terminal (usually pk). function promptSecretUint(string calldata promptText) external returns (uint256); /// Prompts the user for uint256 in the terminal. function promptUint(string calldata promptText) external returns (uint256); /// Reads the directory at the given path recursively, up to `maxDepth`. /// `maxDepth` defaults to 1, meaning only the direct children of the given directory will be returned. /// Follows symbolic links if `followLinks` is true. function readDir(string calldata path) external view returns (DirEntry[] memory entries); /// See `readDir(string)`. function readDir(string calldata path, uint64 maxDepth) external view returns (DirEntry[] memory entries); /// See `readDir(string)`. function readDir(string calldata path, uint64 maxDepth, bool followLinks) external view returns (DirEntry[] memory entries); /// Reads the entire content of file to string. `path` is relative to the project root. function readFile(string calldata path) external view returns (string memory data); /// Reads the entire content of file as binary. `path` is relative to the project root. function readFileBinary(string calldata path) external view returns (bytes memory data); /// Reads next line of file to string. function readLine(string calldata path) external view returns (string memory line); /// Reads a symbolic link, returning the path that the link points to. /// This cheatcode will revert in the following situations, but is not limited to just these cases: /// - `path` is not a symbolic link. /// - `path` does not exist. function readLink(string calldata linkPath) external view returns (string memory targetPath); /// Removes a directory at the provided path. /// This cheatcode will revert in the following situations, but is not limited to just these cases: /// - `path` doesn't exist. /// - `path` isn't a directory. /// - User lacks permissions to modify `path`. /// - The directory is not empty and `recursive` is false. /// `path` is relative to the project root. function removeDir(string calldata path, bool recursive) external; /// Removes a file from the filesystem. /// This cheatcode will revert in the following situations, but is not limited to just these cases: /// - `path` points to a directory. /// - The file doesn't exist. /// - The user lacks permissions to remove the file. /// `path` is relative to the project root. function removeFile(string calldata path) external; /// Performs a foreign function call via terminal and returns the exit code, stdout, and stderr. function tryFfi(string[] calldata commandInput) external returns (FfiResult memory result); /// Returns the time since unix epoch in milliseconds. function unixTime() external returns (uint256 milliseconds); /// Writes data to file, creating a file if it does not exist, and entirely replacing its contents if it does. /// `path` is relative to the project root. function writeFile(string calldata path, string calldata data) external; /// Writes binary data to a file, creating a file if it does not exist, and entirely replacing its contents if it does. /// `path` is relative to the project root. function writeFileBinary(string calldata path, bytes calldata data) external; /// Writes line to file, creating a file if it does not exist. /// `path` is relative to the project root. function writeLine(string calldata path, string calldata data) external; // ======== JSON ======== /// Checks if `key` exists in a JSON object /// `keyExists` is being deprecated in favor of `keyExistsJson`. It will be removed in future versions. function keyExists(string calldata json, string calldata key) external view returns (bool); /// Checks if `key` exists in a JSON object. function keyExistsJson(string calldata json, string calldata key) external view returns (bool); /// Parses a string of JSON data at `key` and coerces it to `address`. function parseJsonAddress(string calldata json, string calldata key) external pure returns (address); /// Parses a string of JSON data at `key` and coerces it to `address[]`. function parseJsonAddressArray(string calldata json, string calldata key) external pure returns (address[] memory); /// Parses a string of JSON data at `key` and coerces it to `bool`. function parseJsonBool(string calldata json, string calldata key) external pure returns (bool); /// Parses a string of JSON data at `key` and coerces it to `bool[]`. function parseJsonBoolArray(string calldata json, string calldata key) external pure returns (bool[] memory); /// Parses a string of JSON data at `key` and coerces it to `bytes`. function parseJsonBytes(string calldata json, string calldata key) external pure returns (bytes memory); /// Parses a string of JSON data at `key` and coerces it to `bytes32`. function parseJsonBytes32(string calldata json, string calldata key) external pure returns (bytes32); /// Parses a string of JSON data at `key` and coerces it to `bytes32[]`. function parseJsonBytes32Array(string calldata json, string calldata key) external pure returns (bytes32[] memory); /// Parses a string of JSON data at `key` and coerces it to `bytes[]`. function parseJsonBytesArray(string calldata json, string calldata key) external pure returns (bytes[] memory); /// Parses a string of JSON data at `key` and coerces it to `int256`. function parseJsonInt(string calldata json, string calldata key) external pure returns (int256); /// Parses a string of JSON data at `key` and coerces it to `int256[]`. function parseJsonIntArray(string calldata json, string calldata key) external pure returns (int256[] memory); /// Returns an array of all the keys in a JSON object. function parseJsonKeys(string calldata json, string calldata key) external pure returns (string[] memory keys); /// Parses a string of JSON data at `key` and coerces it to `string`. function parseJsonString(string calldata json, string calldata key) external pure returns (string memory); /// Parses a string of JSON data at `key` and coerces it to `string[]`. function parseJsonStringArray(string calldata json, string calldata key) external pure returns (string[] memory); /// Parses a string of JSON data at `key` and coerces it to type array corresponding to `typeDescription`. function parseJsonTypeArray(string calldata json, string calldata key, string calldata typeDescription) external pure returns (bytes memory); /// Parses a string of JSON data and coerces it to type corresponding to `typeDescription`. function parseJsonType(string calldata json, string calldata typeDescription) external pure returns (bytes memory); /// Parses a string of JSON data at `key` and coerces it to type corresponding to `typeDescription`. function parseJsonType(string calldata json, string calldata key, string calldata typeDescription) external pure returns (bytes memory); /// Parses a string of JSON data at `key` and coerces it to `uint256`. function parseJsonUint(string calldata json, string calldata key) external pure returns (uint256); /// Parses a string of JSON data at `key` and coerces it to `uint256[]`. function parseJsonUintArray(string calldata json, string calldata key) external pure returns (uint256[] memory); /// ABI-encodes a JSON object. function parseJson(string calldata json) external pure returns (bytes memory abiEncodedData); /// ABI-encodes a JSON object at `key`. function parseJson(string calldata json, string calldata key) external pure returns (bytes memory abiEncodedData); /// See `serializeJson`. function serializeAddress(string calldata objectKey, string calldata valueKey, address value) external returns (string memory json); /// See `serializeJson`. function serializeAddress(string calldata objectKey, string calldata valueKey, address[] calldata values) external returns (string memory json); /// See `serializeJson`. function serializeBool(string calldata objectKey, string calldata valueKey, bool value) external returns (string memory json); /// See `serializeJson`. function serializeBool(string calldata objectKey, string calldata valueKey, bool[] calldata values) external returns (string memory json); /// See `serializeJson`. function serializeBytes32(string calldata objectKey, string calldata valueKey, bytes32 value) external returns (string memory json); /// See `serializeJson`. function serializeBytes32(string calldata objectKey, string calldata valueKey, bytes32[] calldata values) external returns (string memory json); /// See `serializeJson`. function serializeBytes(string calldata objectKey, string calldata valueKey, bytes calldata value) external returns (string memory json); /// See `serializeJson`. function serializeBytes(string calldata objectKey, string calldata valueKey, bytes[] calldata values) external returns (string memory json); /// See `serializeJson`. function serializeInt(string calldata objectKey, string calldata valueKey, int256 value) external returns (string memory json); /// See `serializeJson`. function serializeInt(string calldata objectKey, string calldata valueKey, int256[] calldata values) external returns (string memory json); /// Serializes a key and value to a JSON object stored in-memory that can be later written to a file. /// Returns the stringified version of the specific JSON file up to that moment. function serializeJson(string calldata objectKey, string calldata value) external returns (string memory json); /// See `serializeJson`. function serializeJsonType(string calldata typeDescription, bytes calldata value) external pure returns (string memory json); /// See `serializeJson`. function serializeJsonType( string calldata objectKey, string calldata valueKey, string calldata typeDescription, bytes calldata value ) external returns (string memory json); /// See `serializeJson`. function serializeString(string calldata objectKey, string calldata valueKey, string calldata value) external returns (string memory json); /// See `serializeJson`. function serializeString(string calldata objectKey, string calldata valueKey, string[] calldata values) external returns (string memory json); /// See `serializeJson`. function serializeUintToHex(string calldata objectKey, string calldata valueKey, uint256 value) external returns (string memory json); /// See `serializeJson`. function serializeUint(string calldata objectKey, string calldata valueKey, uint256 value) external returns (string memory json); /// See `serializeJson`. function serializeUint(string calldata objectKey, string calldata valueKey, uint256[] calldata values) external returns (string memory json); /// Write a serialized JSON object to a file. If the file exists, it will be overwritten. function writeJson(string calldata json, string calldata path) external; /// Write a serialized JSON object to an **existing** JSON file, replacing a value with key = <value_key.> /// This is useful to replace a specific value of a JSON file, without having to parse the entire thing. function writeJson(string calldata json, string calldata path, string calldata valueKey) external; // ======== Scripting ======== /// Takes a signed transaction and broadcasts it to the network. function broadcastRawTransaction(bytes calldata data) external; /// Has the next call (at this call depth only) create transactions that can later be signed and sent onchain. /// Broadcasting address is determined by checking the following in order: /// 1. If `--sender` argument was provided, that address is used. /// 2. If exactly one signer (e.g. private key, hw wallet, keystore) is set when `forge broadcast` is invoked, that signer is used. /// 3. Otherwise, default foundry sender (1804c8AB1F12E6bbf3894d4083f33e07309d1f38) is used. function broadcast() external; /// Has the next call (at this call depth only) create a transaction with the address provided /// as the sender that can later be signed and sent onchain. function broadcast(address signer) external; /// Has the next call (at this call depth only) create a transaction with the private key /// provided as the sender that can later be signed and sent onchain. function broadcast(uint256 privateKey) external; /// Has all subsequent calls (at this call depth only) create transactions that can later be signed and sent onchain. /// Broadcasting address is determined by checking the following in order: /// 1. If `--sender` argument was provided, that address is used. /// 2. If exactly one signer (e.g. private key, hw wallet, keystore) is set when `forge broadcast` is invoked, that signer is used. /// 3. Otherwise, default foundry sender (1804c8AB1F12E6bbf3894d4083f33e07309d1f38) is used. function startBroadcast() external; /// Has all subsequent calls (at this call depth only) create transactions with the address /// provided that can later be signed and sent onchain. function startBroadcast(address signer) external; /// Has all subsequent calls (at this call depth only) create transactions with the private key /// provided that can later be signed and sent onchain. function startBroadcast(uint256 privateKey) external; /// Stops collecting onchain transactions. function stopBroadcast() external; // ======== String ======== /// Returns the index of the first occurrence of a `key` in an `input` string. /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `key` is not found. /// Returns 0 in case of an empty `key`. function indexOf(string calldata input, string calldata key) external pure returns (uint256); /// Parses the given `string` into an `address`. function parseAddress(string calldata stringifiedValue) external pure returns (address parsedValue); /// Parses the given `string` into a `bool`. function parseBool(string calldata stringifiedValue) external pure returns (bool parsedValue); /// Parses the given `string` into `bytes`. function parseBytes(string calldata stringifiedValue) external pure returns (bytes memory parsedValue); /// Parses the given `string` into a `bytes32`. function parseBytes32(string calldata stringifiedValue) external pure returns (bytes32 parsedValue); /// Parses the given `string` into a `int256`. function parseInt(string calldata stringifiedValue) external pure returns (int256 parsedValue); /// Parses the given `string` into a `uint256`. function parseUint(string calldata stringifiedValue) external pure returns (uint256 parsedValue); /// Replaces occurrences of `from` in the given `string` with `to`. function replace(string calldata input, string calldata from, string calldata to) external pure returns (string memory output); /// Splits the given `string` into an array of strings divided by the `delimiter`. function split(string calldata input, string calldata delimiter) external pure returns (string[] memory outputs); /// Converts the given `string` value to Lowercase. function toLowercase(string calldata input) external pure returns (string memory output); /// Converts the given value to a `string`. function toString(address value) external pure returns (string memory stringifiedValue); /// Converts the given value to a `string`. function toString(bytes calldata value) external pure returns (string memory stringifiedValue); /// Converts the given value to a `string`. function toString(bytes32 value) external pure returns (string memory stringifiedValue); /// Converts the given value to a `string`. function toString(bool value) external pure returns (string memory stringifiedValue); /// Converts the given value to a `string`. function toString(uint256 value) external pure returns (string memory stringifiedValue); /// Converts the given value to a `string`. function toString(int256 value) external pure returns (string memory stringifiedValue); /// Converts the given `string` value to Uppercase. function toUppercase(string calldata input) external pure returns (string memory output); /// Trims leading and trailing whitespace from the given `string` value. function trim(string calldata input) external pure returns (string memory output); // ======== Testing ======== /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`. /// Formats values with decimals in failure message. function assertApproxEqAbsDecimal(uint256 left, uint256 right, uint256 maxDelta, uint256 decimals) external pure; /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`. /// Formats values with decimals in failure message. Includes error message into revert string on failure. function assertApproxEqAbsDecimal( uint256 left, uint256 right, uint256 maxDelta, uint256 decimals, string calldata error ) external pure; /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`. /// Formats values with decimals in failure message. function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals) external pure; /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`. /// Formats values with decimals in failure message. Includes error message into revert string on failure. function assertApproxEqAbsDecimal( int256 left, int256 right, uint256 maxDelta, uint256 decimals, string calldata error ) external pure; /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`. function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta) external pure; /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`. /// Includes error message into revert string on failure. function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta, string calldata error) external pure; /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`. function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta) external pure; /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`. /// Includes error message into revert string on failure. function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta, string calldata error) external pure; /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% /// Formats values with decimals in failure message. function assertApproxEqRelDecimal(uint256 left, uint256 right, uint256 maxPercentDelta, uint256 decimals) external pure; /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% /// Formats values with decimals in failure message. Includes error message into revert string on failure. function assertApproxEqRelDecimal( uint256 left, uint256 right, uint256 maxPercentDelta, uint256 decimals, string calldata error ) external pure; /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% /// Formats values with decimals in failure message. function assertApproxEqRelDecimal(int256 left, int256 right, uint256 maxPercentDelta, uint256 decimals) external pure; /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% /// Formats values with decimals in failure message. Includes error message into revert string on failure. function assertApproxEqRelDecimal( int256 left, int256 right, uint256 maxPercentDelta, uint256 decimals, string calldata error ) external pure; /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% function assertApproxEqRel(uint256 left, uint256 right, uint256 maxPercentDelta) external pure; /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% /// Includes error message into revert string on failure. function assertApproxEqRel(uint256 left, uint256 right, uint256 maxPercentDelta, string calldata error) external pure; /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta) external pure; /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% /// Includes error message into revert string on failure. function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta, string calldata error) external pure; /// Asserts that two `uint256` values are equal, formatting them with decimals in failure message. function assertEqDecimal(uint256 left, uint256 right, uint256 decimals) external pure; /// Asserts that two `uint256` values are equal, formatting them with decimals in failure message. /// Includes error message into revert string on failure. function assertEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; /// Asserts that two `int256` values are equal, formatting them with decimals in failure message. function assertEqDecimal(int256 left, int256 right, uint256 decimals) external pure; /// Asserts that two `int256` values are equal, formatting them with decimals in failure message. /// Includes error message into revert string on failure. function assertEqDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; /// Asserts that two `bool` values are equal. function assertEq(bool left, bool right) external pure; /// Asserts that two `bool` values are equal and includes error message into revert string on failure. function assertEq(bool left, bool right, string calldata error) external pure; /// Asserts that two `string` values are equal. function assertEq(string calldata left, string calldata right) external pure; /// Asserts that two `string` values are equal and includes error message into revert string on failure. function assertEq(string calldata left, string calldata right, string calldata error) external pure; /// Asserts that two `bytes` values are equal. function assertEq(bytes calldata left, bytes calldata right) external pure; /// Asserts that two `bytes` values are equal and includes error message into revert string on failure. function assertEq(bytes calldata left, bytes calldata right, string calldata error) external pure; /// Asserts that two arrays of `bool` values are equal. function assertEq(bool[] calldata left, bool[] calldata right) external pure; /// Asserts that two arrays of `bool` values are equal and includes error message into revert string on failure. function assertEq(bool[] calldata left, bool[] calldata right, string calldata error) external pure; /// Asserts that two arrays of `uint256 values are equal. function assertEq(uint256[] calldata left, uint256[] calldata right) external pure; /// Asserts that two arrays of `uint256` values are equal and includes error message into revert string on failure. function assertEq(uint256[] calldata left, uint256[] calldata right, string calldata error) external pure; /// Asserts that two arrays of `int256` values are equal. function assertEq(int256[] calldata left, int256[] calldata right) external pure; /// Asserts that two arrays of `int256` values are equal and includes error message into revert string on failure. function assertEq(int256[] calldata left, int256[] calldata right, string calldata error) external pure; /// Asserts that two `uint256` values are equal. function assertEq(uint256 left, uint256 right) external pure; /// Asserts that two arrays of `address` values are equal. function assertEq(address[] calldata left, address[] calldata right) external pure; /// Asserts that two arrays of `address` values are equal and includes error message into revert string on failure. function assertEq(address[] calldata left, address[] calldata right, string calldata error) external pure; /// Asserts that two arrays of `bytes32` values are equal. function assertEq(bytes32[] calldata left, bytes32[] calldata right) external pure; /// Asserts that two arrays of `bytes32` values are equal and includes error message into revert string on failure. function assertEq(bytes32[] calldata left, bytes32[] calldata right, string calldata error) external pure; /// Asserts that two arrays of `string` values are equal. function assertEq(string[] calldata left, string[] calldata right) external pure; /// Asserts that two arrays of `string` values are equal and includes error message into revert string on failure. function assertEq(string[] calldata left, string[] calldata right, string calldata error) external pure; /// Asserts that two arrays of `bytes` values are equal. function assertEq(bytes[] calldata left, bytes[] calldata right) external pure; /// Asserts that two arrays of `bytes` values are equal and includes error message into revert string on failure. function assertEq(bytes[] calldata left, bytes[] calldata right, string calldata error) external pure; /// Asserts that two `uint256` values are equal and includes error message into revert string on failure. function assertEq(uint256 left, uint256 right, string calldata error) external pure; /// Asserts that two `int256` values are equal. function assertEq(int256 left, int256 right) external pure; /// Asserts that two `int256` values are equal and includes error message into revert string on failure. function assertEq(int256 left, int256 right, string calldata error) external pure; /// Asserts that two `address` values are equal. function assertEq(address left, address right) external pure; /// Asserts that two `address` values are equal and includes error message into revert string on failure. function assertEq(address left, address right, string calldata error) external pure; /// Asserts that two `bytes32` values are equal. function assertEq(bytes32 left, bytes32 right) external pure; /// Asserts that two `bytes32` values are equal and includes error message into revert string on failure. function assertEq(bytes32 left, bytes32 right, string calldata error) external pure; /// Asserts that the given condition is false. function assertFalse(bool condition) external pure; /// Asserts that the given condition is false and includes error message into revert string on failure. function assertFalse(bool condition, string calldata error) external pure; /// Compares two `uint256` values. Expects first value to be greater than or equal to second. /// Formats values with decimals in failure message. function assertGeDecimal(uint256 left, uint256 right, uint256 decimals) external pure; /// Compares two `uint256` values. Expects first value to be greater than or equal to second. /// Formats values with decimals in failure message. Includes error message into revert string on failure. function assertGeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; /// Compares two `int256` values. Expects first value to be greater than or equal to second. /// Formats values with decimals in failure message. function assertGeDecimal(int256 left, int256 right, uint256 decimals) external pure; /// Compares two `int256` values. Expects first value to be greater than or equal to second. /// Formats values with decimals in failure message. Includes error message into revert string on failure. function assertGeDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; /// Compares two `uint256` values. Expects first value to be greater than or equal to second. function assertGe(uint256 left, uint256 right) external pure; /// Compares two `uint256` values. Expects first value to be greater than or equal to second. /// Includes error message into revert string on failure. function assertGe(uint256 left, uint256 right, string calldata error) external pure; /// Compares two `int256` values. Expects first value to be greater than or equal to second. function assertGe(int256 left, int256 right) external pure; /// Compares two `int256` values. Expects first value to be greater than or equal to second. /// Includes error message into revert string on failure. function assertGe(int256 left, int256 right, string calldata error) external pure; /// Compares two `uint256` values. Expects first value to be greater than second. /// Formats values with decimals in failure message. function assertGtDecimal(uint256 left, uint256 right, uint256 decimals) external pure; /// Compares two `uint256` values. Expects first value to be greater than second. /// Formats values with decimals in failure message. Includes error message into revert string on failure. function assertGtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; /// Compares two `int256` values. Expects first value to be greater than second. /// Formats values with decimals in failure message. function assertGtDecimal(int256 left, int256 right, uint256 decimals) external pure; /// Compares two `int256` values. Expects first value to be greater than second. /// Formats values with decimals in failure message. Includes error message into revert string on failure. function assertGtDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; /// Compares two `uint256` values. Expects first value to be greater than second. function assertGt(uint256 left, uint256 right) external pure; /// Compares two `uint256` values. Expects first value to be greater than second. /// Includes error message into revert string on failure. function assertGt(uint256 left, uint256 right, string calldata error) external pure; /// Compares two `int256` values. Expects first value to be greater than second. function assertGt(int256 left, int256 right) external pure; /// Compares two `int256` values. Expects first value to be greater than second. /// Includes error message into revert string on failure. function assertGt(int256 left, int256 right, string calldata error) external pure; /// Compares two `uint256` values. Expects first value to be less than or equal to second. /// Formats values with decimals in failure message. function assertLeDecimal(uint256 left, uint256 right, uint256 decimals) external pure; /// Compares two `uint256` values. Expects first value to be less than or equal to second. /// Formats values with decimals in failure message. Includes error message into revert string on failure. function assertLeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; /// Compares two `int256` values. Expects first value to be less than or equal to second. /// Formats values with decimals in failure message. function assertLeDecimal(int256 left, int256 right, uint256 decimals) external pure; /// Compares two `int256` values. Expects first value to be less than or equal to second. /// Formats values with decimals in failure message. Includes error message into revert string on failure. function assertLeDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; /// Compares two `uint256` values. Expects first value to be less than or equal to second. function assertLe(uint256 left, uint256 right) external pure; /// Compares two `uint256` values. Expects first value to be less than or equal to second. /// Includes error message into revert string on failure. function assertLe(uint256 left, uint256 right, string calldata error) external pure; /// Compares two `int256` values. Expects first value to be less than or equal to second. function assertLe(int256 left, int256 right) external pure; /// Compares two `int256` values. Expects first value to be less than or equal to second. /// Includes error message into revert string on failure. function assertLe(int256 left, int256 right, string calldata error) external pure; /// Compares two `uint256` values. Expects first value to be less than second. /// Formats values with decimals in failure message. function assertLtDecimal(uint256 left, uint256 right, uint256 decimals) external pure; /// Compares two `uint256` values. Expects first value to be less than second. /// Formats values with decimals in failure message. Includes error message into revert string on failure. function assertLtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; /// Compares two `int256` values. Expects first value to be less than second. /// Formats values with decimals in failure message. function assertLtDecimal(int256 left, int256 right, uint256 decimals) external pure; /// Compares two `int256` values. Expects first value to be less than second. /// Formats values with decimals in failure message. Includes error message into revert string on failure. function assertLtDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; /// Compares two `uint256` values. Expects first value to be less than second. function assertLt(uint256 left, uint256 right) external pure; /// Compares two `uint256` values. Expects first value to be less than second. /// Includes error message into revert string on failure. function assertLt(uint256 left, uint256 right, string calldata error) external pure; /// Compares two `int256` values. Expects first value to be less than second. function assertLt(int256 left, int256 right) external pure; /// Compares two `int256` values. Expects first value to be less than second. /// Includes error message into revert string on failure. function assertLt(int256 left, int256 right, string calldata error) external pure; /// Asserts that two `uint256` values are not equal, formatting them with decimals in failure message. function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals) external pure; /// Asserts that two `uint256` values are not equal, formatting them with decimals in failure message. /// Includes error message into revert string on failure. function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; /// Asserts that two `int256` values are not equal, formatting them with decimals in failure message. function assertNotEqDecimal(int256 left, int256 right, uint256 decimals) external pure; /// Asserts that two `int256` values are not equal, formatting them with decimals in failure message. /// Includes error message into revert string on failure. function assertNotEqDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; /// Asserts that two `bool` values are not equal. function assertNotEq(bool left, bool right) external pure; /// Asserts that two `bool` values are not equal and includes error message into revert string on failure. function assertNotEq(bool left, bool right, string calldata error) external pure; /// Asserts that two `string` values are not equal. function assertNotEq(string calldata left, string calldata right) external pure; /// Asserts that two `string` values are not equal and includes error message into revert string on failure. function assertNotEq(string calldata left, string calldata right, string calldata error) external pure; /// Asserts that two `bytes` values are not equal. function assertNotEq(bytes calldata left, bytes calldata right) external pure; /// Asserts that two `bytes` values are not equal and includes error message into revert string on failure. function assertNotEq(bytes calldata left, bytes calldata right, string calldata error) external pure; /// Asserts that two arrays of `bool` values are not equal. function assertNotEq(bool[] calldata left, bool[] calldata right) external pure; /// Asserts that two arrays of `bool` values are not equal and includes error message into revert string on failure. function assertNotEq(bool[] calldata left, bool[] calldata right, string calldata error) external pure; /// Asserts that two arrays of `uint256` values are not equal. function assertNotEq(uint256[] calldata left, uint256[] calldata right) external pure; /// Asserts that two arrays of `uint256` values are not equal and includes error message into revert string on failure. function assertNotEq(uint256[] calldata left, uint256[] calldata right, string calldata error) external pure; /// Asserts that two arrays of `int256` values are not equal. function assertNotEq(int256[] calldata left, int256[] calldata right) external pure; /// Asserts that two arrays of `int256` values are not equal and includes error message into revert string on failure. function assertNotEq(int256[] calldata left, int256[] calldata right, string calldata error) external pure; /// Asserts that two `uint256` values are not equal. function assertNotEq(uint256 left, uint256 right) external pure; /// Asserts that two arrays of `address` values are not equal. function assertNotEq(address[] calldata left, address[] calldata right) external pure; /// Asserts that two arrays of `address` values are not equal and includes error message into revert string on failure. function assertNotEq(address[] calldata left, address[] calldata right, string calldata error) external pure; /// Asserts that two arrays of `bytes32` values are not equal. function assertNotEq(bytes32[] calldata left, bytes32[] calldata right) external pure; /// Asserts that two arrays of `bytes32` values are not equal and includes error message into revert string on failure. function assertNotEq(bytes32[] calldata left, bytes32[] calldata right, string calldata error) external pure; /// Asserts that two arrays of `string` values are not equal. function assertNotEq(string[] calldata left, string[] calldata right) external pure; /// Asserts that two arrays of `string` values are not equal and includes error message into revert string on failure. function assertNotEq(string[] calldata left, string[] calldata right, string calldata error) external pure; /// Asserts that two arrays of `bytes` values are not equal. function assertNotEq(bytes[] calldata left, bytes[] calldata right) external pure; /// Asserts that two arrays of `bytes` values are not equal and includes error message into revert string on failure. function assertNotEq(bytes[] calldata left, bytes[] calldata right, string calldata error) external pure; /// Asserts that two `uint256` values are not equal and includes error message into revert string on failure. function assertNotEq(uint256 left, uint256 right, string calldata error) external pure; /// Asserts that two `int256` values are not equal. function assertNotEq(int256 left, int256 right) external pure; /// Asserts that two `int256` values are not equal and includes error message into revert string on failure. function assertNotEq(int256 left, int256 right, string calldata error) external pure; /// Asserts that two `address` values are not equal. function assertNotEq(address left, address right) external pure; /// Asserts that two `address` values are not equal and includes error message into revert string on failure. function assertNotEq(address left, address right, string calldata error) external pure; /// Asserts that two `bytes32` values are not equal. function assertNotEq(bytes32 left, bytes32 right) external pure; /// Asserts that two `bytes32` values are not equal and includes error message into revert string on failure. function assertNotEq(bytes32 left, bytes32 right, string calldata error) external pure; /// Asserts that the given condition is true. function assertTrue(bool condition) external pure; /// Asserts that the given condition is true and includes error message into revert string on failure. function assertTrue(bool condition, string calldata error) external pure; /// If the condition is false, discard this run's fuzz inputs and generate new ones. function assume(bool condition) external pure; /// Writes a breakpoint to jump to in the debugger. function breakpoint(string calldata char) external; /// Writes a conditional breakpoint to jump to in the debugger. function breakpoint(string calldata char, bool value) external; /// Returns the Foundry version. /// Format: <cargo_version>+<git_sha>+<build_timestamp> /// Sample output: 0.2.0+faa94c384+202407110019 /// Note: Build timestamps may vary slightly across platforms due to separate CI jobs. /// For reliable version comparisons, use YYYYMMDD0000 format (e.g., >= 202407110000) /// to compare timestamps while ignoring minor time differences. function getFoundryVersion() external view returns (string memory version); /// Returns the RPC url for the given alias. function rpcUrl(string calldata rpcAlias) external view returns (string memory json); /// Returns all rpc urls and their aliases as structs. function rpcUrlStructs() external view returns (Rpc[] memory urls); /// Returns all rpc urls and their aliases `[alias, url][]`. function rpcUrls() external view returns (string[2][] memory urls); /// Suspends execution of the main thread for `duration` milliseconds. function sleep(uint256 duration) external; // ======== Toml ======== /// Checks if `key` exists in a TOML table. function keyExistsToml(string calldata toml, string calldata key) external view returns (bool); /// Parses a string of TOML data at `key` and coerces it to `address`. function parseTomlAddress(string calldata toml, string calldata key) external pure returns (address); /// Parses a string of TOML data at `key` and coerces it to `address[]`. function parseTomlAddressArray(string calldata toml, string calldata key) external pure returns (address[] memory); /// Parses a string of TOML data at `key` and coerces it to `bool`. function parseTomlBool(string calldata toml, string calldata key) external pure returns (bool); /// Parses a string of TOML data at `key` and coerces it to `bool[]`. function parseTomlBoolArray(string calldata toml, string calldata key) external pure returns (bool[] memory); /// Parses a string of TOML data at `key` and coerces it to `bytes`. function parseTomlBytes(string calldata toml, string calldata key) external pure returns (bytes memory); /// Parses a string of TOML data at `key` and coerces it to `bytes32`. function parseTomlBytes32(string calldata toml, string calldata key) external pure returns (bytes32); /// Parses a string of TOML data at `key` and coerces it to `bytes32[]`. function parseTomlBytes32Array(string calldata toml, string calldata key) external pure returns (bytes32[] memory); /// Parses a string of TOML data at `key` and coerces it to `bytes[]`. function parseTomlBytesArray(string calldata toml, string calldata key) external pure returns (bytes[] memory); /// Parses a string of TOML data at `key` and coerces it to `int256`. function parseTomlInt(string calldata toml, string calldata key) external pure returns (int256); /// Parses a string of TOML data at `key` and coerces it to `int256[]`. function parseTomlIntArray(string calldata toml, string calldata key) external pure returns (int256[] memory); /// Returns an array of all the keys in a TOML table. function parseTomlKeys(string calldata toml, string calldata key) external pure returns (string[] memory keys); /// Parses a string of TOML data at `key` and coerces it to `string`. function parseTomlString(string calldata toml, string calldata key) external pure returns (string memory); /// Parses a string of TOML data at `key` and coerces it to `string[]`. function parseTomlStringArray(string calldata toml, string calldata key) external pure returns (string[] memory); /// Parses a string of TOML data at `key` and coerces it to `uint256`. function parseTomlUint(string calldata toml, string calldata key) external pure returns (uint256); /// Parses a string of TOML data at `key` and coerces it to `uint256[]`. function parseTomlUintArray(string calldata toml, string calldata key) external pure returns (uint256[] memory); /// ABI-encodes a TOML table. function parseToml(string calldata toml) external pure returns (bytes memory abiEncodedData); /// ABI-encodes a TOML table at `key`. function parseToml(string calldata toml, string calldata key) external pure returns (bytes memory abiEncodedData); /// Takes serialized JSON, converts to TOML and write a serialized TOML to a file. function writeToml(string calldata json, string calldata path) external; /// Takes serialized JSON, converts to TOML and write a serialized TOML table to an **existing** TOML file, replacing a value with key = <value_key.> /// This is useful to replace a specific value of a TOML file, without having to parse the entire thing. function writeToml(string calldata json, string calldata path, string calldata valueKey) external; // ======== Utilities ======== /// Compute the address of a contract created with CREATE2 using the given CREATE2 deployer. function computeCreate2Address(bytes32 salt, bytes32 initCodeHash, address deployer) external pure returns (address); /// Compute the address of a contract created with CREATE2 using the default CREATE2 deployer. function computeCreate2Address(bytes32 salt, bytes32 initCodeHash) external pure returns (address); /// Compute the address a contract will be deployed at for a given deployer address and nonce. function computeCreateAddress(address deployer, uint256 nonce) external pure returns (address); /// Returns ENS namehash for provided string. function ensNamehash(string calldata name) external pure returns (bytes32); /// Gets the label for the specified address. function getLabel(address account) external view returns (string memory currentLabel); /// Labels an address in call traces. function label(address account, string calldata newLabel) external; /// Returns a random `address`. function randomAddress() external returns (address); /// Returns a random uint256 value. function randomUint() external returns (uint256); /// Returns random uin256 value between the provided range (=min..=max). function randomUint(uint256 min, uint256 max) external returns (uint256); /// Encodes a `bytes` value to a base64url string. function toBase64URL(bytes calldata data) external pure returns (string memory); /// Encodes a `string` value to a base64url string. function toBase64URL(string calldata data) external pure returns (string memory); /// Encodes a `bytes` value to a base64 string. function toBase64(bytes calldata data) external pure returns (string memory); /// Encodes a `string` value to a base64 string. function toBase64(string calldata data) external pure returns (string memory); } /// The `Vm` interface does allow manipulation of the EVM state. These are all intended to be used /// in tests, but it is not recommended to use these cheats in scripts. interface Vm is VmSafe { // ======== EVM ======== /// Returns the identifier of the currently active fork. Reverts if no fork is currently active. function activeFork() external view returns (uint256 forkId); /// In forking mode, explicitly grant the given address cheatcode access. function allowCheatcodes(address account) external; /// Sets `block.blobbasefee` function blobBaseFee(uint256 newBlobBaseFee) external; /// Sets the blobhashes in the transaction. /// Not available on EVM versions before Cancun. /// If used on unsupported EVM versions it will revert. function blobhashes(bytes32[] calldata hashes) external; /// Sets `block.chainid`. function chainId(uint256 newChainId) external; /// Clears all mocked calls. function clearMockedCalls() external; /// Sets `block.coinbase`. function coinbase(address newCoinbase) external; /// Creates a new fork with the given endpoint and the _latest_ block and returns the identifier of the fork. function createFork(string calldata urlOrAlias) external returns (uint256 forkId); /// Creates a new fork with the given endpoint and block and returns the identifier of the fork. function createFork(string calldata urlOrAlias, uint256 blockNumber) external returns (uint256 forkId); /// Creates a new fork with the given endpoint and at the block the given transaction was mined in, /// replays all transaction mined in the block before the transaction, and returns the identifier of the fork. function createFork(string calldata urlOrAlias, bytes32 txHash) external returns (uint256 forkId); /// Creates and also selects a new fork with the given endpoint and the latest block and returns the identifier of the fork. function createSelectFork(string calldata urlOrAlias) external returns (uint256 forkId); /// Creates and also selects a new fork with the given endpoint and block and returns the identifier of the fork. function createSelectFork(string calldata urlOrAlias, uint256 blockNumber) external returns (uint256 forkId); /// Creates and also selects new fork with the given endpoint and at the block the given transaction was mined in, /// replays all transaction mined in the block before the transaction, returns the identifier of the fork. function createSelectFork(string calldata urlOrAlias, bytes32 txHash) external returns (uint256 forkId); /// Sets an address' balance. function deal(address account, uint256 newBalance) external; /// Removes the snapshot with the given ID created by `snapshot`. /// Takes the snapshot ID to delete. /// Returns `true` if the snapshot was successfully deleted. /// Returns `false` if the snapshot does not exist. function deleteSnapshot(uint256 snapshotId) external returns (bool success); /// Removes _all_ snapshots previously created by `snapshot`. function deleteSnapshots() external; /// Sets `block.difficulty`. /// Not available on EVM versions from Paris onwards. Use `prevrandao` instead. /// Reverts if used on unsupported EVM versions. function difficulty(uint256 newDifficulty) external; /// Dump a genesis JSON file's `allocs` to disk. function dumpState(string calldata pathToStateJson) external; /// Sets an address' code. function etch(address target, bytes calldata newRuntimeBytecode) external; /// Sets `block.basefee`. function fee(uint256 newBasefee) external; /// Gets the blockhashes from the current transaction. /// Not available on EVM versions before Cancun. /// If used on unsupported EVM versions it will revert. function getBlobhashes() external view returns (bytes32[] memory hashes); /// Returns true if the account is marked as persistent. function isPersistent(address account) external view returns (bool persistent); /// Load a genesis JSON file's `allocs` into the in-memory revm state. function loadAllocs(string calldata pathToAllocsJson) external; /// Marks that the account(s) should use persistent storage across fork swaps in a multifork setup /// Meaning, changes made to the state of this account will be kept when switching forks. function makePersistent(address account) external; /// See `makePersistent(address)`. function makePersistent(address account0, address account1) external; /// See `makePersistent(address)`. function makePersistent(address account0, address account1, address account2) external; /// See `makePersistent(address)`. function makePersistent(address[] calldata accounts) external; /// Reverts a call to an address with specified revert data. function mockCallRevert(address callee, bytes calldata data, bytes calldata revertData) external; /// Reverts a call to an address with a specific `msg.value`, with specified revert data. function mockCallRevert(address callee, uint256 msgValue, bytes calldata data, bytes calldata revertData) external; /// Mocks a call to an address, returning specified data. /// Calldata can either be strict or a partial match, e.g. if you only /// pass a Solidity selector to the expected calldata, then the entire Solidity /// function will be mocked. function mockCall(address callee, bytes calldata data, bytes calldata returnData) external; /// Mocks a call to an address with a specific `msg.value`, returning specified data. /// Calldata match takes precedence over `msg.value` in case of ambiguity. function mockCall(address callee, uint256 msgValue, bytes calldata data, bytes calldata returnData) external; /// Sets the *next* call's `msg.sender` to be the input address. function prank(address msgSender) external; /// Sets the *next* call's `msg.sender` to be the input address, and the `tx.origin` to be the second input. function prank(address msgSender, address txOrigin) external; /// Sets `block.prevrandao`. /// Not available on EVM versions before Paris. Use `difficulty` instead. /// If used on unsupported EVM versions it will revert. function prevrandao(bytes32 newPrevrandao) external; /// Sets `block.prevrandao`. /// Not available on EVM versions before Paris. Use `difficulty` instead. /// If used on unsupported EVM versions it will revert. function prevrandao(uint256 newPrevrandao) external; /// Reads the current `msg.sender` and `tx.origin` from state and reports if there is any active caller modification. function readCallers() external returns (CallerMode callerMode, address msgSender, address txOrigin); /// Resets the nonce of an account to 0 for EOAs and 1 for contract accounts. function resetNonce(address account) external; /// Revert the state of the EVM to a previous snapshot /// Takes the snapshot ID to revert to. /// Returns `true` if the snapshot was successfully reverted. /// Returns `false` if the snapshot does not exist. /// **Note:** This does not automatically delete the snapshot. To delete the snapshot use `deleteSnapshot`. function revertTo(uint256 snapshotId) external returns (bool success); /// Revert the state of the EVM to a previous snapshot and automatically deletes the snapshots /// Takes the snapshot ID to revert to. /// Returns `true` if the snapshot was successfully reverted and deleted. /// Returns `false` if the snapshot does not exist. function revertToAndDelete(uint256 snapshotId) external returns (bool success); /// Revokes persistent status from the address, previously added via `makePersistent`. function revokePersistent(address account) external; /// See `revokePersistent(address)`. function revokePersistent(address[] calldata accounts) external; /// Sets `block.height`. function roll(uint256 newHeight) external; /// Updates the currently active fork to given block number /// This is similar to `roll` but for the currently active fork. function rollFork(uint256 blockNumber) external; /// Updates the currently active fork to given transaction. This will `rollFork` with the number /// of the block the transaction was mined in and replays all transaction mined before it in the block. function rollFork(bytes32 txHash) external; /// Updates the given fork to given block number. function rollFork(uint256 forkId, uint256 blockNumber) external; /// Updates the given fork to block number of the given transaction and replays all transaction mined before it in the block. function rollFork(uint256 forkId, bytes32 txHash) external; /// Takes a fork identifier created by `createFork` and sets the corresponding forked state as active. function selectFork(uint256 forkId) external; /// Set blockhash for the current block. /// It only sets the blockhash for blocks where `block.number - 256 <= number < block.number`. function setBlockhash(uint256 blockNumber, bytes32 blockHash) external; /// Sets the nonce of an account. Must be higher than the current nonce of the account. function setNonce(address account, uint64 newNonce) external; /// Sets the nonce of an account to an arbitrary value. function setNonceUnsafe(address account, uint64 newNonce) external; /// Snapshot the current state of the evm. /// Returns the ID of the snapshot that was created. /// To revert a snapshot use `revertTo`. function snapshot() external returns (uint256 snapshotId); /// Sets all subsequent calls' `msg.sender` to be the input address until `stopPrank` is called. function startPrank(address msgSender) external; /// Sets all subsequent calls' `msg.sender` to be the input address until `stopPrank` is called, and the `tx.origin` to be the second input. function startPrank(address msgSender, address txOrigin) external; /// Resets subsequent calls' `msg.sender` to be `address(this)`. function stopPrank() external; /// Stores a value to an address' storage slot. function store(address target, bytes32 slot, bytes32 value) external; /// Fetches the given transaction from the active fork and executes it on the current state. function transact(bytes32 txHash) external; /// Fetches the given transaction from the given fork and executes it on the current state. function transact(uint256 forkId, bytes32 txHash) external; /// Sets `tx.gasprice`. function txGasPrice(uint256 newGasPrice) external; /// Sets `block.timestamp`. function warp(uint256 newTimestamp) external; // ======== Testing ======== /// Expect a call to an address with the specified `msg.value` and calldata, and a *minimum* amount of gas. function expectCallMinGas(address callee, uint256 msgValue, uint64 minGas, bytes calldata data) external; /// Expect given number of calls to an address with the specified `msg.value` and calldata, and a *minimum* amount of gas. function expectCallMinGas(address callee, uint256 msgValue, uint64 minGas, bytes calldata data, uint64 count) external; /// Expects a call to an address with the specified calldata. /// Calldata can either be a strict or a partial match. function expectCall(address callee, bytes calldata data) external; /// Expects given number of calls to an address with the specified calldata. function expectCall(address callee, bytes calldata data, uint64 count) external; /// Expects a call to an address with the specified `msg.value` and calldata. function expectCall(address callee, uint256 msgValue, bytes calldata data) external; /// Expects given number of calls to an address with the specified `msg.value` and calldata. function expectCall(address callee, uint256 msgValue, bytes calldata data, uint64 count) external; /// Expect a call to an address with the specified `msg.value`, gas, and calldata. function expectCall(address callee, uint256 msgValue, uint64 gas, bytes calldata data) external; /// Expects given number of calls to an address with the specified `msg.value`, gas, and calldata. function expectCall(address callee, uint256 msgValue, uint64 gas, bytes calldata data, uint64 count) external; /// Prepare an expected anonymous log with (bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData.). /// Call this function, then emit an anonymous event, then call a function. Internally after the call, we check if /// logs were emitted in the expected order with the expected topics and data (as specified by the booleans). function expectEmitAnonymous(bool checkTopic0, bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData) external; /// Same as the previous method, but also checks supplied address against emitting contract. function expectEmitAnonymous( bool checkTopic0, bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData, address emitter ) external; /// Prepare an expected anonymous log with all topic and data checks enabled. /// Call this function, then emit an anonymous event, then call a function. Internally after the call, we check if /// logs were emitted in the expected order with the expected topics and data. function expectEmitAnonymous() external; /// Same as the previous method, but also checks supplied address against emitting contract. function expectEmitAnonymous(address emitter) external; /// Prepare an expected log with (bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData.). /// Call this function, then emit an event, then call a function. Internally after the call, we check if /// logs were emitted in the expected order with the expected topics and data (as specified by the booleans). function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData) external; /// Same as the previous method, but also checks supplied address against emitting contract. function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData, address emitter) external; /// Prepare an expected log with all topic and data checks enabled. /// Call this function, then emit an event, then call a function. Internally after the call, we check if /// logs were emitted in the expected order with the expected topics and data. function expectEmit() external; /// Same as the previous method, but also checks supplied address against emitting contract. function expectEmit(address emitter) external; /// Expects an error on next call with any revert data. function expectRevert() external; /// Expects an error on next call that starts with the revert data. function expectRevert(bytes4 revertData) external; /// Expects an error on next call that exactly matches the revert data. function expectRevert(bytes calldata revertData) external; /// Only allows memory writes to offsets [0x00, 0x60) ∪ [min, max) in the current subcontext. If any other /// memory is written to, the test will fail. Can be called multiple times to add more ranges to the set. function expectSafeMemory(uint64 min, uint64 max) external; /// Only allows memory writes to offsets [0x00, 0x60) ∪ [min, max) in the next created subcontext. /// If any other memory is written to, the test will fail. Can be called multiple times to add more ranges /// to the set. function expectSafeMemoryCall(uint64 min, uint64 max) external; /// Marks a test as skipped. Must be called at the top of the test. function skip(bool skipTest) external; /// Stops all safe memory expectation in the current subcontext. function stopExpectSafeMemory() external; }
// SPDX-License-Identifier: MIT pragma solidity >=0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function _castLogPayloadViewToPure( function(bytes memory) internal view fnIn ) internal pure returns (function(bytes memory) internal pure fnOut) { assembly { fnOut := fnIn } } function _sendLogPayload(bytes memory payload) internal pure { _castLogPayloadViewToPure(_sendLogPayloadView)(payload); } function _sendLogPayloadView(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE_ADDRESS; /// @solidity memory-safe-assembly assembly { let payloadStart := add(payload, 32) let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) } } function log() internal pure { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(int)", p0)); } function logUint(uint p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function logString(string memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function log(int p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(int)", p0)); } function log(string memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint p0, uint p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1)); } function log(uint p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1)); } function log(uint p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1)); } function log(uint p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1)); } function log(string memory p0, uint p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1)); } function log(string memory p0, int p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,int)", p0, p1)); } function log(string memory p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1)); } function log(bool p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1)); } function log(address p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint p0, uint p1, uint p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2)); } function log(uint p0, uint p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2)); } function log(uint p0, uint p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2)); } function log(uint p0, uint p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2)); } function log(uint p0, string memory p1, uint p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2)); } function log(uint p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2)); } function log(uint p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2)); } function log(uint p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2)); } function log(uint p0, bool p1, uint p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2)); } function log(uint p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2)); } function log(uint p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2)); } function log(uint p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2)); } function log(uint p0, address p1, uint p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2)); } function log(uint p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2)); } function log(uint p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2)); } function log(uint p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2)); } function log(string memory p0, uint p1, uint p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2)); } function log(string memory p0, uint p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2)); } function log(string memory p0, uint p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2)); } function log(string memory p0, uint p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint p1, uint p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2)); } function log(bool p0, uint p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2)); } function log(bool p0, uint p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2)); } function log(bool p0, uint p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint p1, uint p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2)); } function log(address p0, uint p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2)); } function log(address p0, uint p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2)); } function log(address p0, uint p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint p0, uint p1, uint p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.4.22 <0.9.0; import {console as console2} from "./console.sol";
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2; interface IERC165 { /// @notice Query if a contract implements an interface /// @param interfaceID The interface identifier, as specified in ERC-165 /// @dev Interface identification is specified in ERC-165. This function /// uses less than 30,000 gas. /// @return `true` if the contract implements `interfaceID` and /// `interfaceID` is not 0xffffffff, `false` otherwise function supportsInterface(bytes4 interfaceID) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2; /// @dev Interface of the ERC20 standard as defined in the EIP. /// @dev This includes the optional name, symbol, and decimals metadata. interface IERC20 { /// @dev Emitted when `value` tokens are moved from one account (`from`) to another (`to`). event Transfer(address indexed from, address indexed to, uint256 value); /// @dev Emitted when the allowance of a `spender` for an `owner` is set, where `value` /// is the new allowance. event Approval(address indexed owner, address indexed spender, uint256 value); /// @notice Returns the amount of tokens in existence. function totalSupply() external view returns (uint256); /// @notice Returns the amount of tokens owned by `account`. function balanceOf(address account) external view returns (uint256); /// @notice Moves `amount` tokens from the caller's account to `to`. function transfer(address to, uint256 amount) external returns (bool); /// @notice Returns the remaining number of tokens that `spender` is allowed /// to spend on behalf of `owner` function allowance(address owner, address spender) external view returns (uint256); /// @notice Sets `amount` as the allowance of `spender` over the caller's tokens. /// @dev Be aware of front-running risks: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 function approve(address spender, uint256 amount) external returns (bool); /// @notice Moves `amount` tokens from `from` to `to` using the allowance mechanism. /// `amount` is then deducted from the caller's allowance. function transferFrom(address from, address to, uint256 amount) external returns (bool); /// @notice Returns the name of the token. function name() external view returns (string memory); /// @notice Returns the symbol of the token. function symbol() external view returns (string memory); /// @notice Returns the decimals places of the token. function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2; import "./IERC165.sol"; /// @title ERC-721 Non-Fungible Token Standard /// @dev See https://eips.ethereum.org/EIPS/eip-721 /// Note: the ERC-165 identifier for this interface is 0x80ac58cd. interface IERC721 is IERC165 { /// @dev This emits when ownership of any NFT changes by any mechanism. /// This event emits when NFTs are created (`from` == 0) and destroyed /// (`to` == 0). Exception: during contract creation, any number of NFTs /// may be created and assigned without emitting Transfer. At the time of /// any transfer, the approved address for that NFT (if any) is reset to none. event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId); /// @dev This emits when the approved address for an NFT is changed or /// reaffirmed. The zero address indicates there is no approved address. /// When a Transfer event emits, this also indicates that the approved /// address for that NFT (if any) is reset to none. event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId); /// @dev This emits when an operator is enabled or disabled for an owner. /// The operator can manage all NFTs of the owner. event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); /// @notice Count all NFTs assigned to an owner /// @dev NFTs assigned to the zero address are considered invalid, and this /// function throws for queries about the zero address. /// @param _owner An address for whom to query the balance /// @return The number of NFTs owned by `_owner`, possibly zero function balanceOf(address _owner) external view returns (uint256); /// @notice Find the owner of an NFT /// @dev NFTs assigned to zero address are considered invalid, and queries /// about them do throw. /// @param _tokenId The identifier for an NFT /// @return The address of the owner of the NFT function ownerOf(uint256 _tokenId) external view returns (address); /// @notice Transfers the ownership of an NFT from one address to another address /// @dev Throws unless `msg.sender` is the current owner, an authorized /// operator, or the approved address for this NFT. Throws if `_from` is /// not the current owner. Throws if `_to` is the zero address. Throws if /// `_tokenId` is not a valid NFT. When transfer is complete, this function /// checks if `_to` is a smart contract (code size > 0). If so, it calls /// `onERC721Received` on `_to` and throws if the return value is not /// `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`. /// @param _from The current owner of the NFT /// @param _to The new owner /// @param _tokenId The NFT to transfer /// @param data Additional data with no specified format, sent in call to `_to` function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) external payable; /// @notice Transfers the ownership of an NFT from one address to another address /// @dev This works identically to the other function with an extra data parameter, /// except this function just sets data to "". /// @param _from The current owner of the NFT /// @param _to The new owner /// @param _tokenId The NFT to transfer function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable; /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE /// TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE /// THEY MAY BE PERMANENTLY LOST /// @dev Throws unless `msg.sender` is the current owner, an authorized /// operator, or the approved address for this NFT. Throws if `_from` is /// not the current owner. Throws if `_to` is the zero address. Throws if /// `_tokenId` is not a valid NFT. /// @param _from The current owner of the NFT /// @param _to The new owner /// @param _tokenId The NFT to transfer function transferFrom(address _from, address _to, uint256 _tokenId) external payable; /// @notice Change or reaffirm the approved address for an NFT /// @dev The zero address indicates there is no approved address. /// Throws unless `msg.sender` is the current NFT owner, or an authorized /// operator of the current owner. /// @param _approved The new approved NFT controller /// @param _tokenId The NFT to approve function approve(address _approved, uint256 _tokenId) external payable; /// @notice Enable or disable approval for a third party ("operator") to manage /// all of `msg.sender`'s assets /// @dev Emits the ApprovalForAll event. The contract MUST allow /// multiple operators per owner. /// @param _operator Address to add to the set of authorized operators /// @param _approved True if the operator is approved, false to revoke approval function setApprovalForAll(address _operator, bool _approved) external; /// @notice Get the approved address for a single NFT /// @dev Throws if `_tokenId` is not a valid NFT. /// @param _tokenId The NFT to find the approved address for /// @return The approved address for this NFT, or the zero address if there is none function getApproved(uint256 _tokenId) external view returns (address); /// @notice Query if an address is an authorized operator for another address /// @param _owner The address that owns the NFTs /// @param _operator The address that acts on behalf of the owner /// @return True if `_operator` is an approved operator for `_owner`, false otherwise function isApprovedForAll(address _owner, address _operator) external view returns (bool); } /// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02. interface IERC721TokenReceiver { /// @notice Handle the receipt of an NFT /// @dev The ERC721 smart contract calls this function on the recipient /// after a `transfer`. This function MAY throw to revert and reject the /// transfer. Return of other than the magic value MUST result in the /// transaction being reverted. /// Note: the contract address is always the message sender. /// @param _operator The address which called `safeTransferFrom` function /// @param _from The address which previously owned the token /// @param _tokenId The NFT identifier which is being transferred /// @param _data Additional data with no specified format /// @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` /// unless throwing function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) external returns (bytes4); } /// @title ERC-721 Non-Fungible Token Standard, optional metadata extension /// @dev See https://eips.ethereum.org/EIPS/eip-721 /// Note: the ERC-165 identifier for this interface is 0x5b5e139f. interface IERC721Metadata is IERC721 { /// @notice A descriptive name for a collection of NFTs in this contract function name() external view returns (string memory _name); /// @notice An abbreviated name for NFTs in this contract function symbol() external view returns (string memory _symbol); /// @notice A distinct Uniform Resource Identifier (URI) for a given asset. /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC /// 3986. The URI may point to a JSON file that conforms to the "ERC721 /// Metadata JSON Schema". function tokenURI(uint256 _tokenId) external view returns (string memory); } /// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension /// @dev See https://eips.ethereum.org/EIPS/eip-721 /// Note: the ERC-165 identifier for this interface is 0x780e9d63. interface IERC721Enumerable is IERC721 { /// @notice Count NFTs tracked by this contract /// @return A count of valid NFTs tracked by this contract, where each one of /// them has an assigned and queryable owner not equal to the zero address function totalSupply() external view returns (uint256); /// @notice Enumerate valid NFTs /// @dev Throws if `_index` >= `totalSupply()`. /// @param _index A counter less than `totalSupply()` /// @return The token identifier for the `_index`th NFT, /// (sort order not specified) function tokenByIndex(uint256 _index) external view returns (uint256); /// @notice Enumerate NFTs assigned to an owner /// @dev Throws if `_index` >= `balanceOf(_owner)` or if /// `_owner` is the zero address, representing invalid NFTs. /// @param _owner An address where we are interested in NFTs owned by them /// @param _index A counter less than `balanceOf(_owner)` /// @return The token identifier for the `_index`th NFT assigned to `_owner`, /// (sort order not specified) function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.9.0; pragma experimental ABIEncoderV2; interface IMulticall3 { struct Call { address target; bytes callData; } struct Call3 { address target; bool allowFailure; bytes callData; } struct Call3Value { address target; bool allowFailure; uint256 value; bytes callData; } struct Result { bool success; bytes returnData; } function aggregate(Call[] calldata calls) external payable returns (uint256 blockNumber, bytes[] memory returnData); function aggregate3(Call3[] calldata calls) external payable returns (Result[] memory returnData); function aggregate3Value(Call3Value[] calldata calls) external payable returns (Result[] memory returnData); function blockAndAggregate(Call[] calldata calls) external payable returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData); function getBasefee() external view returns (uint256 basefee); function getBlockHash(uint256 blockNumber) external view returns (bytes32 blockHash); function getBlockNumber() external view returns (uint256 blockNumber); function getChainId() external view returns (uint256 chainid); function getCurrentBlockCoinbase() external view returns (address coinbase); function getCurrentBlockDifficulty() external view returns (uint256 difficulty); function getCurrentBlockGasLimit() external view returns (uint256 gaslimit); function getCurrentBlockTimestamp() external view returns (uint256 timestamp); function getEthBalance(address addr) external view returns (uint256 balance); function getLastBlockHash() external view returns (bytes32 blockHash); function tryAggregate(bool requireSuccess, Call[] calldata calls) external payable returns (Result[] memory returnData); function tryBlockAndAggregate(bool requireSuccess, Call[] calldata calls) external payable returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.9.0; import {IERC20} from "../interfaces/IERC20.sol"; /// @notice This is a mock contract of the ERC20 standard for testing purposes only, it SHOULD NOT be used in production. /// @dev Forked from: https://github.com/transmissions11/solmate/blob/0384dbaaa4fcb5715738a9254a7c0a4cb62cf458/src/tokens/ERC20.sol contract MockERC20 is IERC20 { /*////////////////////////////////////////////////////////////// METADATA STORAGE //////////////////////////////////////////////////////////////*/ string internal _name; string internal _symbol; uint8 internal _decimals; function name() external view override returns (string memory) { return _name; } function symbol() external view override returns (string memory) { return _symbol; } function decimals() external view override returns (uint8) { return _decimals; } /*////////////////////////////////////////////////////////////// ERC20 STORAGE //////////////////////////////////////////////////////////////*/ uint256 internal _totalSupply; mapping(address => uint256) internal _balanceOf; mapping(address => mapping(address => uint256)) internal _allowance; function totalSupply() external view override returns (uint256) { return _totalSupply; } function balanceOf(address owner) external view override returns (uint256) { return _balanceOf[owner]; } function allowance(address owner, address spender) external view override returns (uint256) { return _allowance[owner][spender]; } /*////////////////////////////////////////////////////////////// EIP-2612 STORAGE //////////////////////////////////////////////////////////////*/ uint256 internal INITIAL_CHAIN_ID; bytes32 internal INITIAL_DOMAIN_SEPARATOR; mapping(address => uint256) public nonces; /*////////////////////////////////////////////////////////////// INITIALIZE //////////////////////////////////////////////////////////////*/ /// @dev A bool to track whether the contract has been initialized. bool private initialized; /// @dev To hide constructor warnings across solc versions due to different constructor visibility requirements and /// syntaxes, we add an initialization function that can be called only once. function initialize(string memory name_, string memory symbol_, uint8 decimals_) public { require(!initialized, "ALREADY_INITIALIZED"); _name = name_; _symbol = symbol_; _decimals = decimals_; INITIAL_CHAIN_ID = _pureChainId(); INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); initialized = true; } /*////////////////////////////////////////////////////////////// ERC20 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 amount) public virtual override returns (bool) { _allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function transfer(address to, uint256 amount) public virtual override returns (bool) { _balanceOf[msg.sender] = _sub(_balanceOf[msg.sender], amount); _balanceOf[to] = _add(_balanceOf[to], amount); emit Transfer(msg.sender, to, amount); return true; } function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) { uint256 allowed = _allowance[from][msg.sender]; // Saves gas for limited approvals. if (allowed != ~uint256(0)) _allowance[from][msg.sender] = _sub(allowed, amount); _balanceOf[from] = _sub(_balanceOf[from], amount); _balanceOf[to] = _add(_balanceOf[to], amount); emit Transfer(from, to, amount); return true; } /*////////////////////////////////////////////////////////////// EIP-2612 LOGIC //////////////////////////////////////////////////////////////*/ function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual { require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); address recoveredAddress = ecrecover( keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR(), keccak256( abi.encode( keccak256( "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" ), owner, spender, value, nonces[owner]++, deadline ) ) ) ), v, r, s ); require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); _allowance[recoveredAddress][spender] = value; emit Approval(owner, spender, value); } function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { return _pureChainId() == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); } function computeDomainSeparator() internal view virtual returns (bytes32) { return keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(_name)), keccak256("1"), _pureChainId(), address(this) ) ); } /*////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 amount) internal virtual { _totalSupply = _add(_totalSupply, amount); _balanceOf[to] = _add(_balanceOf[to], amount); emit Transfer(address(0), to, amount); } function _burn(address from, uint256 amount) internal virtual { _balanceOf[from] = _sub(_balanceOf[from], amount); _totalSupply = _sub(_totalSupply, amount); emit Transfer(from, address(0), amount); } /*////////////////////////////////////////////////////////////// INTERNAL SAFE MATH LOGIC //////////////////////////////////////////////////////////////*/ function _add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "ERC20: addition overflow"); return c; } function _sub(uint256 a, uint256 b) internal pure returns (uint256) { require(a >= b, "ERC20: subtraction underflow"); return a - b; } /*////////////////////////////////////////////////////////////// HELPERS //////////////////////////////////////////////////////////////*/ // We use this complex approach of `_viewChainId` and `_pureChainId` to ensure there are no // compiler warnings when accessing chain ID in any solidity version supported by forge-std. We // can't simply access the chain ID in a normal view or pure function because the solc View Pure // Checker changed `chainid` from pure to view in 0.8.0. function _viewChainId() private view returns (uint256 chainId) { // Assembly required since `block.chainid` was introduced in 0.8.0. assembly { chainId := chainid() } address(this); // Silence warnings in older Solc versions. } function _pureChainId() private pure returns (uint256 chainId) { function() internal view returns (uint256) fnIn = _viewChainId; function() internal pure returns (uint256) pureChainId; assembly { pureChainId := fnIn } chainId = pureChainId(); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.9.0; import {IERC721Metadata, IERC721TokenReceiver} from "../interfaces/IERC721.sol"; /// @notice This is a mock contract of the ERC721 standard for testing purposes only, it SHOULD NOT be used in production. /// @dev Forked from: https://github.com/transmissions11/solmate/blob/0384dbaaa4fcb5715738a9254a7c0a4cb62cf458/src/tokens/ERC721.sol contract MockERC721 is IERC721Metadata { /*////////////////////////////////////////////////////////////// METADATA STORAGE/LOGIC //////////////////////////////////////////////////////////////*/ string internal _name; string internal _symbol; function name() external view override returns (string memory) { return _name; } function symbol() external view override returns (string memory) { return _symbol; } function tokenURI(uint256 id) public view virtual override returns (string memory) {} /*////////////////////////////////////////////////////////////// ERC721 BALANCE/OWNER STORAGE //////////////////////////////////////////////////////////////*/ mapping(uint256 => address) internal _ownerOf; mapping(address => uint256) internal _balanceOf; function ownerOf(uint256 id) public view virtual override returns (address owner) { require((owner = _ownerOf[id]) != address(0), "NOT_MINTED"); } function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ZERO_ADDRESS"); return _balanceOf[owner]; } /*////////////////////////////////////////////////////////////// ERC721 APPROVAL STORAGE //////////////////////////////////////////////////////////////*/ mapping(uint256 => address) internal _getApproved; mapping(address => mapping(address => bool)) internal _isApprovedForAll; function getApproved(uint256 id) public view virtual override returns (address) { return _getApproved[id]; } function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _isApprovedForAll[owner][operator]; } /*////////////////////////////////////////////////////////////// INITIALIZE //////////////////////////////////////////////////////////////*/ /// @dev A bool to track whether the contract has been initialized. bool private initialized; /// @dev To hide constructor warnings across solc versions due to different constructor visibility requirements and /// syntaxes, we add an initialization function that can be called only once. function initialize(string memory name_, string memory symbol_) public { require(!initialized, "ALREADY_INITIALIZED"); _name = name_; _symbol = symbol_; initialized = true; } /*////////////////////////////////////////////////////////////// ERC721 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 id) public payable virtual override { address owner = _ownerOf[id]; require(msg.sender == owner || _isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED"); _getApproved[id] = spender; emit Approval(owner, spender, id); } function setApprovalForAll(address operator, bool approved) public virtual override { _isApprovedForAll[msg.sender][operator] = approved; emit ApprovalForAll(msg.sender, operator, approved); } function transferFrom(address from, address to, uint256 id) public payable virtual override { require(from == _ownerOf[id], "WRONG_FROM"); require(to != address(0), "INVALID_RECIPIENT"); require( msg.sender == from || _isApprovedForAll[from][msg.sender] || msg.sender == _getApproved[id], "NOT_AUTHORIZED" ); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. _balanceOf[from]--; _balanceOf[to]++; _ownerOf[id] = to; delete _getApproved[id]; emit Transfer(from, to, id); } function safeTransferFrom(address from, address to, uint256 id) public payable virtual override { transferFrom(from, to, id); require( !_isContract(to) || IERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") == IERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } function safeTransferFrom(address from, address to, uint256 id, bytes memory data) public payable virtual override { transferFrom(from, to, id); require( !_isContract(to) || IERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) == IERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } /*////////////////////////////////////////////////////////////// ERC165 LOGIC //////////////////////////////////////////////////////////////*/ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == 0x01ffc9a7 // ERC165 Interface ID for ERC165 || interfaceId == 0x80ac58cd // ERC165 Interface ID for ERC721 || interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata } /*////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 id) internal virtual { require(to != address(0), "INVALID_RECIPIENT"); require(_ownerOf[id] == address(0), "ALREADY_MINTED"); // Counter overflow is incredibly unrealistic. _balanceOf[to]++; _ownerOf[id] = to; emit Transfer(address(0), to, id); } function _burn(uint256 id) internal virtual { address owner = _ownerOf[id]; require(owner != address(0), "NOT_MINTED"); _balanceOf[owner]--; delete _ownerOf[id]; delete _getApproved[id]; emit Transfer(owner, address(0), id); } /*////////////////////////////////////////////////////////////// INTERNAL SAFE MINT LOGIC //////////////////////////////////////////////////////////////*/ function _safeMint(address to, uint256 id) internal virtual { _mint(to, id); require( !_isContract(to) || IERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") == IERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } function _safeMint(address to, uint256 id, bytes memory data) internal virtual { _mint(to, id); require( !_isContract(to) || IERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) == IERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } /*////////////////////////////////////////////////////////////// HELPERS //////////////////////////////////////////////////////////////*/ function _isContract(address _addr) private view returns (bool) { uint256 codeLength; // Assembly required for versions < 0.8.0 to check extcodesize. assembly { codeLength := extcodesize(_addr) } return codeLength > 0; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.9.0; /// @author philogy <https://github.com/philogy> /// @dev Code generated automatically by script. library safeconsole { uint256 constant CONSOLE_ADDR = 0x000000000000000000000000000000000000000000636F6e736F6c652e6c6f67; // Credit to [0age](https://twitter.com/z0age/status/1654922202930888704) and [0xdapper](https://github.com/foundry-rs/forge-std/pull/374) // for the view-to-pure log trick. function _sendLogPayload(uint256 offset, uint256 size) private pure { function(uint256, uint256) internal view fnIn = _sendLogPayloadView; function(uint256, uint256) internal pure pureSendLogPayload; /// @solidity memory-safe-assembly assembly { pureSendLogPayload := fnIn } pureSendLogPayload(offset, size); } function _sendLogPayloadView(uint256 offset, uint256 size) private view { /// @solidity memory-safe-assembly assembly { pop(staticcall(gas(), CONSOLE_ADDR, offset, size, 0x0, 0x0)) } } function _memcopy(uint256 fromOffset, uint256 toOffset, uint256 length) private pure { function(uint256, uint256, uint256) internal view fnIn = _memcopyView; function(uint256, uint256, uint256) internal pure pureMemcopy; /// @solidity memory-safe-assembly assembly { pureMemcopy := fnIn } pureMemcopy(fromOffset, toOffset, length); } function _memcopyView(uint256 fromOffset, uint256 toOffset, uint256 length) private view { /// @solidity memory-safe-assembly assembly { pop(staticcall(gas(), 0x4, fromOffset, length, toOffset, length)) } } function logMemory(uint256 offset, uint256 length) internal pure { if (offset >= 0x60) { // Sufficient memory before slice to prepare call header. bytes32 m0; bytes32 m1; bytes32 m2; /// @solidity memory-safe-assembly assembly { m0 := mload(sub(offset, 0x60)) m1 := mload(sub(offset, 0x40)) m2 := mload(sub(offset, 0x20)) // Selector of `log(bytes)`. mstore(sub(offset, 0x60), 0x0be77f56) mstore(sub(offset, 0x40), 0x20) mstore(sub(offset, 0x20), length) } _sendLogPayload(offset - 0x44, length + 0x44); /// @solidity memory-safe-assembly assembly { mstore(sub(offset, 0x60), m0) mstore(sub(offset, 0x40), m1) mstore(sub(offset, 0x20), m2) } } else { // Insufficient space, so copy slice forward, add header and reverse. bytes32 m0; bytes32 m1; bytes32 m2; uint256 endOffset = offset + length; /// @solidity memory-safe-assembly assembly { m0 := mload(add(endOffset, 0x00)) m1 := mload(add(endOffset, 0x20)) m2 := mload(add(endOffset, 0x40)) } _memcopy(offset, offset + 0x60, length); /// @solidity memory-safe-assembly assembly { // Selector of `log(bytes)`. mstore(add(offset, 0x00), 0x0be77f56) mstore(add(offset, 0x20), 0x20) mstore(add(offset, 0x40), length) } _sendLogPayload(offset + 0x1c, length + 0x44); _memcopy(offset + 0x60, offset, length); /// @solidity memory-safe-assembly assembly { mstore(add(endOffset, 0x00), m0) mstore(add(endOffset, 0x20), m1) mstore(add(endOffset, 0x40), m2) } } } function log(address p0) internal pure { bytes32 m0; bytes32 m1; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) // Selector of `log(address)`. mstore(0x00, 0x2c2ecbc2) mstore(0x20, p0) } _sendLogPayload(0x1c, 0x24); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) } } function log(bool p0) internal pure { bytes32 m0; bytes32 m1; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) // Selector of `log(bool)`. mstore(0x00, 0x32458eed) mstore(0x20, p0) } _sendLogPayload(0x1c, 0x24); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) } } function log(uint256 p0) internal pure { bytes32 m0; bytes32 m1; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) // Selector of `log(uint256)`. mstore(0x00, 0xf82c50f1) mstore(0x20, p0) } _sendLogPayload(0x1c, 0x24); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) } } function log(bytes32 p0) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(string)`. mstore(0x00, 0x41304fac) mstore(0x20, 0x20) writeString(0x40, p0) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(address p0, address p1) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) // Selector of `log(address,address)`. mstore(0x00, 0xdaf0d4aa) mstore(0x20, p0) mstore(0x40, p1) } _sendLogPayload(0x1c, 0x44); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) } } function log(address p0, bool p1) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) // Selector of `log(address,bool)`. mstore(0x00, 0x75b605d3) mstore(0x20, p0) mstore(0x40, p1) } _sendLogPayload(0x1c, 0x44); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) } } function log(address p0, uint256 p1) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) // Selector of `log(address,uint256)`. mstore(0x00, 0x8309e8a8) mstore(0x20, p0) mstore(0x40, p1) } _sendLogPayload(0x1c, 0x44); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) } } function log(address p0, bytes32 p1) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,string)`. mstore(0x00, 0x759f86bb) mstore(0x20, p0) mstore(0x40, 0x40) writeString(0x60, p1) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, address p1) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) // Selector of `log(bool,address)`. mstore(0x00, 0x853c4849) mstore(0x20, p0) mstore(0x40, p1) } _sendLogPayload(0x1c, 0x44); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) } } function log(bool p0, bool p1) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) // Selector of `log(bool,bool)`. mstore(0x00, 0x2a110e83) mstore(0x20, p0) mstore(0x40, p1) } _sendLogPayload(0x1c, 0x44); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) } } function log(bool p0, uint256 p1) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) // Selector of `log(bool,uint256)`. mstore(0x00, 0x399174d3) mstore(0x20, p0) mstore(0x40, p1) } _sendLogPayload(0x1c, 0x44); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) } } function log(bool p0, bytes32 p1) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,string)`. mstore(0x00, 0x8feac525) mstore(0x20, p0) mstore(0x40, 0x40) writeString(0x60, p1) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, address p1) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) // Selector of `log(uint256,address)`. mstore(0x00, 0x69276c86) mstore(0x20, p0) mstore(0x40, p1) } _sendLogPayload(0x1c, 0x44); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) } } function log(uint256 p0, bool p1) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) // Selector of `log(uint256,bool)`. mstore(0x00, 0x1c9d7eb3) mstore(0x20, p0) mstore(0x40, p1) } _sendLogPayload(0x1c, 0x44); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) } } function log(uint256 p0, uint256 p1) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) // Selector of `log(uint256,uint256)`. mstore(0x00, 0xf666715a) mstore(0x20, p0) mstore(0x40, p1) } _sendLogPayload(0x1c, 0x44); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) } } function log(uint256 p0, bytes32 p1) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,string)`. mstore(0x00, 0x643fd0df) mstore(0x20, p0) mstore(0x40, 0x40) writeString(0x60, p1) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bytes32 p0, address p1) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(string,address)`. mstore(0x00, 0x319af333) mstore(0x20, 0x40) mstore(0x40, p1) writeString(0x60, p0) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bytes32 p0, bool p1) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(string,bool)`. mstore(0x00, 0xc3b55635) mstore(0x20, 0x40) mstore(0x40, p1) writeString(0x60, p0) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bytes32 p0, uint256 p1) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(string,uint256)`. mstore(0x00, 0xb60e72cc) mstore(0x20, 0x40) mstore(0x40, p1) writeString(0x60, p0) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bytes32 p0, bytes32 p1) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,string)`. mstore(0x00, 0x4b5c4277) mstore(0x20, 0x40) mstore(0x40, 0x80) writeString(0x60, p0) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, address p1, address p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(address,address,address)`. mstore(0x00, 0x018c84c2) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(address p0, address p1, bool p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(address,address,bool)`. mstore(0x00, 0xf2a66286) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(address p0, address p1, uint256 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(address,address,uint256)`. mstore(0x00, 0x17fe6185) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(address p0, address p1, bytes32 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(address,address,string)`. mstore(0x00, 0x007150be) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x60) writeString(0x80, p2) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(address p0, bool p1, address p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(address,bool,address)`. mstore(0x00, 0xf11699ed) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(address p0, bool p1, bool p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(address,bool,bool)`. mstore(0x00, 0xeb830c92) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(address p0, bool p1, uint256 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(address,bool,uint256)`. mstore(0x00, 0x9c4f99fb) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(address p0, bool p1, bytes32 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(address,bool,string)`. mstore(0x00, 0x212255cc) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x60) writeString(0x80, p2) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(address p0, uint256 p1, address p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(address,uint256,address)`. mstore(0x00, 0x7bc0d848) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(address p0, uint256 p1, bool p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(address,uint256,bool)`. mstore(0x00, 0x678209a8) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(address p0, uint256 p1, uint256 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(address,uint256,uint256)`. mstore(0x00, 0xb69bcaf6) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(address p0, uint256 p1, bytes32 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(address,uint256,string)`. mstore(0x00, 0xa1f2e8aa) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x60) writeString(0x80, p2) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(address p0, bytes32 p1, address p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(address,string,address)`. mstore(0x00, 0xf08744e8) mstore(0x20, p0) mstore(0x40, 0x60) mstore(0x60, p2) writeString(0x80, p1) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(address p0, bytes32 p1, bool p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(address,string,bool)`. mstore(0x00, 0xcf020fb1) mstore(0x20, p0) mstore(0x40, 0x60) mstore(0x60, p2) writeString(0x80, p1) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(address p0, bytes32 p1, uint256 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(address,string,uint256)`. mstore(0x00, 0x67dd6ff1) mstore(0x20, p0) mstore(0x40, 0x60) mstore(0x60, p2) writeString(0x80, p1) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(address p0, bytes32 p1, bytes32 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) // Selector of `log(address,string,string)`. mstore(0x00, 0xfb772265) mstore(0x20, p0) mstore(0x40, 0x60) mstore(0x60, 0xa0) writeString(0x80, p1) writeString(0xc0, p2) } _sendLogPayload(0x1c, 0xe4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) } } function log(bool p0, address p1, address p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(bool,address,address)`. mstore(0x00, 0xd2763667) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(bool p0, address p1, bool p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(bool,address,bool)`. mstore(0x00, 0x18c9c746) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(bool p0, address p1, uint256 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(bool,address,uint256)`. mstore(0x00, 0x5f7b9afb) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(bool p0, address p1, bytes32 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(bool,address,string)`. mstore(0x00, 0xde9a9270) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x60) writeString(0x80, p2) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(bool p0, bool p1, address p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(bool,bool,address)`. mstore(0x00, 0x1078f68d) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(bool p0, bool p1, bool p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(bool,bool,bool)`. mstore(0x00, 0x50709698) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(bool p0, bool p1, uint256 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(bool,bool,uint256)`. mstore(0x00, 0x12f21602) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(bool p0, bool p1, bytes32 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(bool,bool,string)`. mstore(0x00, 0x2555fa46) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x60) writeString(0x80, p2) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(bool p0, uint256 p1, address p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(bool,uint256,address)`. mstore(0x00, 0x088ef9d2) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(bool p0, uint256 p1, bool p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(bool,uint256,bool)`. mstore(0x00, 0xe8defba9) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(bool p0, uint256 p1, uint256 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(bool,uint256,uint256)`. mstore(0x00, 0x37103367) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(bool p0, uint256 p1, bytes32 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(bool,uint256,string)`. mstore(0x00, 0xc3fc3970) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x60) writeString(0x80, p2) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(bool p0, bytes32 p1, address p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(bool,string,address)`. mstore(0x00, 0x9591b953) mstore(0x20, p0) mstore(0x40, 0x60) mstore(0x60, p2) writeString(0x80, p1) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(bool p0, bytes32 p1, bool p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(bool,string,bool)`. mstore(0x00, 0xdbb4c247) mstore(0x20, p0) mstore(0x40, 0x60) mstore(0x60, p2) writeString(0x80, p1) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(bool p0, bytes32 p1, uint256 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(bool,string,uint256)`. mstore(0x00, 0x1093ee11) mstore(0x20, p0) mstore(0x40, 0x60) mstore(0x60, p2) writeString(0x80, p1) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(bool p0, bytes32 p1, bytes32 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) // Selector of `log(bool,string,string)`. mstore(0x00, 0xb076847f) mstore(0x20, p0) mstore(0x40, 0x60) mstore(0x60, 0xa0) writeString(0x80, p1) writeString(0xc0, p2) } _sendLogPayload(0x1c, 0xe4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) } } function log(uint256 p0, address p1, address p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(uint256,address,address)`. mstore(0x00, 0xbcfd9be0) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(uint256 p0, address p1, bool p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(uint256,address,bool)`. mstore(0x00, 0x9b6ec042) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(uint256 p0, address p1, uint256 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(uint256,address,uint256)`. mstore(0x00, 0x5a9b5ed5) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(uint256 p0, address p1, bytes32 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(uint256,address,string)`. mstore(0x00, 0x63cb41f9) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x60) writeString(0x80, p2) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(uint256 p0, bool p1, address p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(uint256,bool,address)`. mstore(0x00, 0x35085f7b) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(uint256 p0, bool p1, bool p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(uint256,bool,bool)`. mstore(0x00, 0x20718650) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(uint256 p0, bool p1, uint256 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(uint256,bool,uint256)`. mstore(0x00, 0x20098014) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(uint256 p0, bool p1, bytes32 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(uint256,bool,string)`. mstore(0x00, 0x85775021) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x60) writeString(0x80, p2) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(uint256 p0, uint256 p1, address p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(uint256,uint256,address)`. mstore(0x00, 0x5c96b331) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(uint256 p0, uint256 p1, bool p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(uint256,uint256,bool)`. mstore(0x00, 0x4766da72) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(uint256 p0, uint256 p1, uint256 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(uint256,uint256,uint256)`. mstore(0x00, 0xd1ed7a3c) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(uint256 p0, uint256 p1, bytes32 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(uint256,uint256,string)`. mstore(0x00, 0x71d04af2) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x60) writeString(0x80, p2) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(uint256 p0, bytes32 p1, address p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(uint256,string,address)`. mstore(0x00, 0x7afac959) mstore(0x20, p0) mstore(0x40, 0x60) mstore(0x60, p2) writeString(0x80, p1) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(uint256 p0, bytes32 p1, bool p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(uint256,string,bool)`. mstore(0x00, 0x4ceda75a) mstore(0x20, p0) mstore(0x40, 0x60) mstore(0x60, p2) writeString(0x80, p1) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(uint256 p0, bytes32 p1, uint256 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(uint256,string,uint256)`. mstore(0x00, 0x37aa7d4c) mstore(0x20, p0) mstore(0x40, 0x60) mstore(0x60, p2) writeString(0x80, p1) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(uint256 p0, bytes32 p1, bytes32 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) // Selector of `log(uint256,string,string)`. mstore(0x00, 0xb115611f) mstore(0x20, p0) mstore(0x40, 0x60) mstore(0x60, 0xa0) writeString(0x80, p1) writeString(0xc0, p2) } _sendLogPayload(0x1c, 0xe4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) } } function log(bytes32 p0, address p1, address p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(string,address,address)`. mstore(0x00, 0xfcec75e0) mstore(0x20, 0x60) mstore(0x40, p1) mstore(0x60, p2) writeString(0x80, p0) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(bytes32 p0, address p1, bool p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(string,address,bool)`. mstore(0x00, 0xc91d5ed4) mstore(0x20, 0x60) mstore(0x40, p1) mstore(0x60, p2) writeString(0x80, p0) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(bytes32 p0, address p1, uint256 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(string,address,uint256)`. mstore(0x00, 0x0d26b925) mstore(0x20, 0x60) mstore(0x40, p1) mstore(0x60, p2) writeString(0x80, p0) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(bytes32 p0, address p1, bytes32 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) // Selector of `log(string,address,string)`. mstore(0x00, 0xe0e9ad4f) mstore(0x20, 0x60) mstore(0x40, p1) mstore(0x60, 0xa0) writeString(0x80, p0) writeString(0xc0, p2) } _sendLogPayload(0x1c, 0xe4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) } } function log(bytes32 p0, bool p1, address p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(string,bool,address)`. mstore(0x00, 0x932bbb38) mstore(0x20, 0x60) mstore(0x40, p1) mstore(0x60, p2) writeString(0x80, p0) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(bytes32 p0, bool p1, bool p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(string,bool,bool)`. mstore(0x00, 0x850b7ad6) mstore(0x20, 0x60) mstore(0x40, p1) mstore(0x60, p2) writeString(0x80, p0) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(bytes32 p0, bool p1, uint256 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(string,bool,uint256)`. mstore(0x00, 0xc95958d6) mstore(0x20, 0x60) mstore(0x40, p1) mstore(0x60, p2) writeString(0x80, p0) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(bytes32 p0, bool p1, bytes32 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) // Selector of `log(string,bool,string)`. mstore(0x00, 0xe298f47d) mstore(0x20, 0x60) mstore(0x40, p1) mstore(0x60, 0xa0) writeString(0x80, p0) writeString(0xc0, p2) } _sendLogPayload(0x1c, 0xe4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) } } function log(bytes32 p0, uint256 p1, address p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(string,uint256,address)`. mstore(0x00, 0x1c7ec448) mstore(0x20, 0x60) mstore(0x40, p1) mstore(0x60, p2) writeString(0x80, p0) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(bytes32 p0, uint256 p1, bool p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(string,uint256,bool)`. mstore(0x00, 0xca7733b1) mstore(0x20, 0x60) mstore(0x40, p1) mstore(0x60, p2) writeString(0x80, p0) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(bytes32 p0, uint256 p1, uint256 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(string,uint256,uint256)`. mstore(0x00, 0xca47c4eb) mstore(0x20, 0x60) mstore(0x40, p1) mstore(0x60, p2) writeString(0x80, p0) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(bytes32 p0, uint256 p1, bytes32 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) // Selector of `log(string,uint256,string)`. mstore(0x00, 0x5970e089) mstore(0x20, 0x60) mstore(0x40, p1) mstore(0x60, 0xa0) writeString(0x80, p0) writeString(0xc0, p2) } _sendLogPayload(0x1c, 0xe4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) } } function log(bytes32 p0, bytes32 p1, address p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) // Selector of `log(string,string,address)`. mstore(0x00, 0x95ed0195) mstore(0x20, 0x60) mstore(0x40, 0xa0) mstore(0x60, p2) writeString(0x80, p0) writeString(0xc0, p1) } _sendLogPayload(0x1c, 0xe4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) } } function log(bytes32 p0, bytes32 p1, bool p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) // Selector of `log(string,string,bool)`. mstore(0x00, 0xb0e0f9b5) mstore(0x20, 0x60) mstore(0x40, 0xa0) mstore(0x60, p2) writeString(0x80, p0) writeString(0xc0, p1) } _sendLogPayload(0x1c, 0xe4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) } } function log(bytes32 p0, bytes32 p1, uint256 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) // Selector of `log(string,string,uint256)`. mstore(0x00, 0x5821efa1) mstore(0x20, 0x60) mstore(0x40, 0xa0) mstore(0x60, p2) writeString(0x80, p0) writeString(0xc0, p1) } _sendLogPayload(0x1c, 0xe4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) } } function log(bytes32 p0, bytes32 p1, bytes32 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; bytes32 m9; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) m9 := mload(0x120) // Selector of `log(string,string,string)`. mstore(0x00, 0x2ced7cef) mstore(0x20, 0x60) mstore(0x40, 0xa0) mstore(0x60, 0xe0) writeString(0x80, p0) writeString(0xc0, p1) writeString(0x100, p2) } _sendLogPayload(0x1c, 0x124); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) mstore(0x120, m9) } } function log(address p0, address p1, address p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,address,address,address)`. mstore(0x00, 0x665bf134) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, address p1, address p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,address,address,bool)`. mstore(0x00, 0x0e378994) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, address p1, address p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,address,address,uint256)`. mstore(0x00, 0x94250d77) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, address p1, address p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,address,address,string)`. mstore(0x00, 0xf808da20) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, address p1, bool p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,address,bool,address)`. mstore(0x00, 0x9f1bc36e) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, address p1, bool p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,address,bool,bool)`. mstore(0x00, 0x2cd4134a) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, address p1, bool p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,address,bool,uint256)`. mstore(0x00, 0x3971e78c) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, address p1, bool p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,address,bool,string)`. mstore(0x00, 0xaa6540c8) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, address p1, uint256 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,address,uint256,address)`. mstore(0x00, 0x8da6def5) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, address p1, uint256 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,address,uint256,bool)`. mstore(0x00, 0x9b4254e2) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, address p1, uint256 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,address,uint256,uint256)`. mstore(0x00, 0xbe553481) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, address p1, uint256 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,address,uint256,string)`. mstore(0x00, 0xfdb4f990) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, address p1, bytes32 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,address,string,address)`. mstore(0x00, 0x8f736d16) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, address p1, bytes32 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,address,string,bool)`. mstore(0x00, 0x6f1a594e) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, address p1, bytes32 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,address,string,uint256)`. mstore(0x00, 0xef1cefe7) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, address p1, bytes32 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(address,address,string,string)`. mstore(0x00, 0x21bdaf25) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, 0xc0) writeString(0xa0, p2) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(address p0, bool p1, address p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,bool,address,address)`. mstore(0x00, 0x660375dd) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, bool p1, address p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,bool,address,bool)`. mstore(0x00, 0xa6f50b0f) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, bool p1, address p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,bool,address,uint256)`. mstore(0x00, 0xa75c59de) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, bool p1, address p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,bool,address,string)`. mstore(0x00, 0x2dd778e6) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, bool p1, bool p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,bool,bool,address)`. mstore(0x00, 0xcf394485) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, bool p1, bool p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,bool,bool,bool)`. mstore(0x00, 0xcac43479) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, bool p1, bool p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,bool,bool,uint256)`. mstore(0x00, 0x8c4e5de6) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, bool p1, bool p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,bool,bool,string)`. mstore(0x00, 0xdfc4a2e8) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, bool p1, uint256 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,bool,uint256,address)`. mstore(0x00, 0xccf790a1) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, bool p1, uint256 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,bool,uint256,bool)`. mstore(0x00, 0xc4643e20) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,bool,uint256,uint256)`. mstore(0x00, 0x386ff5f4) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, bool p1, uint256 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,bool,uint256,string)`. mstore(0x00, 0x0aa6cfad) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, bool p1, bytes32 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,bool,string,address)`. mstore(0x00, 0x19fd4956) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, bool p1, bytes32 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,bool,string,bool)`. mstore(0x00, 0x50ad461d) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, bool p1, bytes32 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,bool,string,uint256)`. mstore(0x00, 0x80e6a20b) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, bool p1, bytes32 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(address,bool,string,string)`. mstore(0x00, 0x475c5c33) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, 0xc0) writeString(0xa0, p2) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(address p0, uint256 p1, address p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,uint256,address,address)`. mstore(0x00, 0x478d1c62) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, uint256 p1, address p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,uint256,address,bool)`. mstore(0x00, 0xa1bcc9b3) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, uint256 p1, address p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,uint256,address,uint256)`. mstore(0x00, 0x100f650e) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, uint256 p1, address p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,uint256,address,string)`. mstore(0x00, 0x1da986ea) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, uint256 p1, bool p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,uint256,bool,address)`. mstore(0x00, 0xa31bfdcc) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, uint256 p1, bool p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,uint256,bool,bool)`. mstore(0x00, 0x3bf5e537) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,uint256,bool,uint256)`. mstore(0x00, 0x22f6b999) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, uint256 p1, bool p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,uint256,bool,string)`. mstore(0x00, 0xc5ad85f9) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, uint256 p1, uint256 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,uint256,uint256,address)`. mstore(0x00, 0x20e3984d) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,uint256,uint256,bool)`. mstore(0x00, 0x66f1bc67) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,uint256,uint256,uint256)`. mstore(0x00, 0x34f0e636) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, uint256 p1, uint256 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,uint256,uint256,string)`. mstore(0x00, 0x4a28c017) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, uint256 p1, bytes32 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,uint256,string,address)`. mstore(0x00, 0x5c430d47) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, uint256 p1, bytes32 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,uint256,string,bool)`. mstore(0x00, 0xcf18105c) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, uint256 p1, bytes32 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,uint256,string,uint256)`. mstore(0x00, 0xbf01f891) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(address,uint256,string,string)`. mstore(0x00, 0x88a8c406) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, 0xc0) writeString(0xa0, p2) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(address p0, bytes32 p1, address p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,string,address,address)`. mstore(0x00, 0x0d36fa20) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, bytes32 p1, address p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,string,address,bool)`. mstore(0x00, 0x0df12b76) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, bytes32 p1, address p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,string,address,uint256)`. mstore(0x00, 0x457fe3cf) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, bytes32 p1, address p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(address,string,address,string)`. mstore(0x00, 0xf7e36245) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, 0xc0) writeString(0xa0, p1) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(address p0, bytes32 p1, bool p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,string,bool,address)`. mstore(0x00, 0x205871c2) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, bytes32 p1, bool p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,string,bool,bool)`. mstore(0x00, 0x5f1d5c9f) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, bytes32 p1, bool p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,string,bool,uint256)`. mstore(0x00, 0x515e38b6) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, bytes32 p1, bool p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(address,string,bool,string)`. mstore(0x00, 0xbc0b61fe) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, 0xc0) writeString(0xa0, p1) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(address p0, bytes32 p1, uint256 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,string,uint256,address)`. mstore(0x00, 0x63183678) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, bytes32 p1, uint256 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,string,uint256,bool)`. mstore(0x00, 0x0ef7e050) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, bytes32 p1, uint256 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,string,uint256,uint256)`. mstore(0x00, 0x1dc8e1b8) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(address,string,uint256,string)`. mstore(0x00, 0x448830a8) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, 0xc0) writeString(0xa0, p1) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(address p0, bytes32 p1, bytes32 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(address,string,string,address)`. mstore(0x00, 0xa04e2f87) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, 0xc0) mstore(0x80, p3) writeString(0xa0, p1) writeString(0xe0, p2) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(address p0, bytes32 p1, bytes32 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(address,string,string,bool)`. mstore(0x00, 0x35a5071f) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, 0xc0) mstore(0x80, p3) writeString(0xa0, p1) writeString(0xe0, p2) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(address p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(address,string,string,uint256)`. mstore(0x00, 0x159f8927) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, 0xc0) mstore(0x80, p3) writeString(0xa0, p1) writeString(0xe0, p2) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(address p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; bytes32 m9; bytes32 m10; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) m9 := mload(0x120) m10 := mload(0x140) // Selector of `log(address,string,string,string)`. mstore(0x00, 0x5d02c50b) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, 0xc0) mstore(0x80, 0x100) writeString(0xa0, p1) writeString(0xe0, p2) writeString(0x120, p3) } _sendLogPayload(0x1c, 0x144); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) mstore(0x120, m9) mstore(0x140, m10) } } function log(bool p0, address p1, address p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,address,address,address)`. mstore(0x00, 0x1d14d001) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, address p1, address p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,address,address,bool)`. mstore(0x00, 0x46600be0) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, address p1, address p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,address,address,uint256)`. mstore(0x00, 0x0c66d1be) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, address p1, address p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,address,address,string)`. mstore(0x00, 0xd812a167) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, address p1, bool p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,address,bool,address)`. mstore(0x00, 0x1c41a336) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, address p1, bool p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,address,bool,bool)`. mstore(0x00, 0x6a9c478b) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, address p1, bool p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,address,bool,uint256)`. mstore(0x00, 0x07831502) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, address p1, bool p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,address,bool,string)`. mstore(0x00, 0x4a66cb34) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, address p1, uint256 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,address,uint256,address)`. mstore(0x00, 0x136b05dd) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, address p1, uint256 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,address,uint256,bool)`. mstore(0x00, 0xd6019f1c) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,address,uint256,uint256)`. mstore(0x00, 0x7bf181a1) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, address p1, uint256 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,address,uint256,string)`. mstore(0x00, 0x51f09ff8) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, address p1, bytes32 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,address,string,address)`. mstore(0x00, 0x6f7c603e) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, address p1, bytes32 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,address,string,bool)`. mstore(0x00, 0xe2bfd60b) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, address p1, bytes32 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,address,string,uint256)`. mstore(0x00, 0xc21f64c7) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, address p1, bytes32 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(bool,address,string,string)`. mstore(0x00, 0xa73c1db6) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, 0xc0) writeString(0xa0, p2) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bool p0, bool p1, address p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,bool,address,address)`. mstore(0x00, 0xf4880ea4) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, bool p1, address p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,bool,address,bool)`. mstore(0x00, 0xc0a302d8) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, bool p1, address p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,bool,address,uint256)`. mstore(0x00, 0x4c123d57) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, bool p1, address p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,bool,address,string)`. mstore(0x00, 0xa0a47963) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, bool p1, bool p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,bool,bool,address)`. mstore(0x00, 0x8c329b1a) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, bool p1, bool p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,bool,bool,bool)`. mstore(0x00, 0x3b2a5ce0) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, bool p1, bool p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,bool,bool,uint256)`. mstore(0x00, 0x6d7045c1) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, bool p1, bool p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,bool,bool,string)`. mstore(0x00, 0x2ae408d4) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, bool p1, uint256 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,bool,uint256,address)`. mstore(0x00, 0x54a7a9a0) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, bool p1, uint256 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,bool,uint256,bool)`. mstore(0x00, 0x619e4d0e) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,bool,uint256,uint256)`. mstore(0x00, 0x0bb00eab) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, bool p1, uint256 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,bool,uint256,string)`. mstore(0x00, 0x7dd4d0e0) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, bool p1, bytes32 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,bool,string,address)`. mstore(0x00, 0xf9ad2b89) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, bool p1, bytes32 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,bool,string,bool)`. mstore(0x00, 0xb857163a) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, bool p1, bytes32 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,bool,string,uint256)`. mstore(0x00, 0xe3a9ca2f) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, bool p1, bytes32 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(bool,bool,string,string)`. mstore(0x00, 0x6d1e8751) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, 0xc0) writeString(0xa0, p2) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bool p0, uint256 p1, address p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,uint256,address,address)`. mstore(0x00, 0x26f560a8) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, uint256 p1, address p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,uint256,address,bool)`. mstore(0x00, 0xb4c314ff) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,uint256,address,uint256)`. mstore(0x00, 0x1537dc87) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, uint256 p1, address p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,uint256,address,string)`. mstore(0x00, 0x1bb3b09a) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, uint256 p1, bool p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,uint256,bool,address)`. mstore(0x00, 0x9acd3616) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, uint256 p1, bool p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,uint256,bool,bool)`. mstore(0x00, 0xceb5f4d7) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,uint256,bool,uint256)`. mstore(0x00, 0x7f9bbca2) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, uint256 p1, bool p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,uint256,bool,string)`. mstore(0x00, 0x9143dbb1) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,uint256,uint256,address)`. mstore(0x00, 0x00dd87b9) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,uint256,uint256,bool)`. mstore(0x00, 0xbe984353) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,uint256,uint256,uint256)`. mstore(0x00, 0x374bb4b2) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, uint256 p1, uint256 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,uint256,uint256,string)`. mstore(0x00, 0x8e69fb5d) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, uint256 p1, bytes32 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,uint256,string,address)`. mstore(0x00, 0xfedd1fff) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, uint256 p1, bytes32 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,uint256,string,bool)`. mstore(0x00, 0xe5e70b2b) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, uint256 p1, bytes32 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,uint256,string,uint256)`. mstore(0x00, 0x6a1199e2) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(bool,uint256,string,string)`. mstore(0x00, 0xf5bc2249) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, 0xc0) writeString(0xa0, p2) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bool p0, bytes32 p1, address p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,string,address,address)`. mstore(0x00, 0x2b2b18dc) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, bytes32 p1, address p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,string,address,bool)`. mstore(0x00, 0x6dd434ca) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, bytes32 p1, address p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,string,address,uint256)`. mstore(0x00, 0xa5cada94) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, bytes32 p1, address p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(bool,string,address,string)`. mstore(0x00, 0x12d6c788) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, 0xc0) writeString(0xa0, p1) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bool p0, bytes32 p1, bool p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,string,bool,address)`. mstore(0x00, 0x538e06ab) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, bytes32 p1, bool p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,string,bool,bool)`. mstore(0x00, 0xdc5e935b) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, bytes32 p1, bool p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,string,bool,uint256)`. mstore(0x00, 0x1606a393) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, bytes32 p1, bool p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(bool,string,bool,string)`. mstore(0x00, 0x483d0416) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, 0xc0) writeString(0xa0, p1) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bool p0, bytes32 p1, uint256 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,string,uint256,address)`. mstore(0x00, 0x1596a1ce) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, bytes32 p1, uint256 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,string,uint256,bool)`. mstore(0x00, 0x6b0e5d53) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, bytes32 p1, uint256 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,string,uint256,uint256)`. mstore(0x00, 0x28863fcb) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(bool,string,uint256,string)`. mstore(0x00, 0x1ad96de6) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, 0xc0) writeString(0xa0, p1) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bool p0, bytes32 p1, bytes32 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(bool,string,string,address)`. mstore(0x00, 0x97d394d8) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, 0xc0) mstore(0x80, p3) writeString(0xa0, p1) writeString(0xe0, p2) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bool p0, bytes32 p1, bytes32 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(bool,string,string,bool)`. mstore(0x00, 0x1e4b87e5) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, 0xc0) mstore(0x80, p3) writeString(0xa0, p1) writeString(0xe0, p2) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bool p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(bool,string,string,uint256)`. mstore(0x00, 0x7be0c3eb) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, 0xc0) mstore(0x80, p3) writeString(0xa0, p1) writeString(0xe0, p2) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bool p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; bytes32 m9; bytes32 m10; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) m9 := mload(0x120) m10 := mload(0x140) // Selector of `log(bool,string,string,string)`. mstore(0x00, 0x1762e32a) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, 0xc0) mstore(0x80, 0x100) writeString(0xa0, p1) writeString(0xe0, p2) writeString(0x120, p3) } _sendLogPayload(0x1c, 0x144); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) mstore(0x120, m9) mstore(0x140, m10) } } function log(uint256 p0, address p1, address p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,address,address,address)`. mstore(0x00, 0x2488b414) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, address p1, address p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,address,address,bool)`. mstore(0x00, 0x091ffaf5) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, address p1, address p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,address,address,uint256)`. mstore(0x00, 0x736efbb6) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, address p1, address p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,address,address,string)`. mstore(0x00, 0x031c6f73) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, address p1, bool p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,address,bool,address)`. mstore(0x00, 0xef72c513) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, address p1, bool p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,address,bool,bool)`. mstore(0x00, 0xe351140f) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,address,bool,uint256)`. mstore(0x00, 0x5abd992a) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, address p1, bool p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,address,bool,string)`. mstore(0x00, 0x90fb06aa) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, address p1, uint256 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,address,uint256,address)`. mstore(0x00, 0x15c127b5) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,address,uint256,bool)`. mstore(0x00, 0x5f743a7c) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,address,uint256,uint256)`. mstore(0x00, 0x0c9cd9c1) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, address p1, uint256 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,address,uint256,string)`. mstore(0x00, 0xddb06521) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, address p1, bytes32 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,address,string,address)`. mstore(0x00, 0x9cba8fff) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, address p1, bytes32 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,address,string,bool)`. mstore(0x00, 0xcc32ab07) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, address p1, bytes32 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,address,string,uint256)`. mstore(0x00, 0x46826b5d) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, address p1, bytes32 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(uint256,address,string,string)`. mstore(0x00, 0x3e128ca3) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, 0xc0) writeString(0xa0, p2) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(uint256 p0, bool p1, address p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,bool,address,address)`. mstore(0x00, 0xa1ef4cbb) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, bool p1, address p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,bool,address,bool)`. mstore(0x00, 0x454d54a5) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,bool,address,uint256)`. mstore(0x00, 0x078287f5) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, bool p1, address p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,bool,address,string)`. mstore(0x00, 0xade052c7) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, bool p1, bool p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,bool,bool,address)`. mstore(0x00, 0x69640b59) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, bool p1, bool p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,bool,bool,bool)`. mstore(0x00, 0xb6f577a1) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,bool,bool,uint256)`. mstore(0x00, 0x7464ce23) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, bool p1, bool p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,bool,bool,string)`. mstore(0x00, 0xdddb9561) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,bool,uint256,address)`. mstore(0x00, 0x88cb6041) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,bool,uint256,bool)`. mstore(0x00, 0x91a02e2a) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,bool,uint256,uint256)`. mstore(0x00, 0xc6acc7a8) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, bool p1, uint256 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,bool,uint256,string)`. mstore(0x00, 0xde03e774) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, bool p1, bytes32 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,bool,string,address)`. mstore(0x00, 0xef529018) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, bool p1, bytes32 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,bool,string,bool)`. mstore(0x00, 0xeb928d7f) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, bool p1, bytes32 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,bool,string,uint256)`. mstore(0x00, 0x2c1d0746) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, bool p1, bytes32 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(uint256,bool,string,string)`. mstore(0x00, 0x68c8b8bd) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, 0xc0) writeString(0xa0, p2) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(uint256 p0, uint256 p1, address p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,uint256,address,address)`. mstore(0x00, 0x56a5d1b1) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,uint256,address,bool)`. mstore(0x00, 0x15cac476) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,uint256,address,uint256)`. mstore(0x00, 0x88f6e4b2) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, uint256 p1, address p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,uint256,address,string)`. mstore(0x00, 0x6cde40b8) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,uint256,bool,address)`. mstore(0x00, 0x9a816a83) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,uint256,bool,bool)`. mstore(0x00, 0xab085ae6) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,uint256,bool,uint256)`. mstore(0x00, 0xeb7f6fd2) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, uint256 p1, bool p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,uint256,bool,string)`. mstore(0x00, 0xa5b4fc99) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,uint256,uint256,address)`. mstore(0x00, 0xfa8185af) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,uint256,uint256,bool)`. mstore(0x00, 0xc598d185) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,uint256,uint256,uint256)`. mstore(0x00, 0x193fb800) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, uint256 p1, uint256 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,uint256,uint256,string)`. mstore(0x00, 0x59cfcbe3) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, uint256 p1, bytes32 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,uint256,string,address)`. mstore(0x00, 0x42d21db7) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, uint256 p1, bytes32 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,uint256,string,bool)`. mstore(0x00, 0x7af6ab25) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, uint256 p1, bytes32 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,uint256,string,uint256)`. mstore(0x00, 0x5da297eb) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(uint256,uint256,string,string)`. mstore(0x00, 0x27d8afd2) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, 0xc0) writeString(0xa0, p2) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(uint256 p0, bytes32 p1, address p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,string,address,address)`. mstore(0x00, 0x6168ed61) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, bytes32 p1, address p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,string,address,bool)`. mstore(0x00, 0x90c30a56) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, bytes32 p1, address p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,string,address,uint256)`. mstore(0x00, 0xe8d3018d) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, bytes32 p1, address p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(uint256,string,address,string)`. mstore(0x00, 0x9c3adfa1) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, 0xc0) writeString(0xa0, p1) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(uint256 p0, bytes32 p1, bool p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,string,bool,address)`. mstore(0x00, 0xae2ec581) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, bytes32 p1, bool p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,string,bool,bool)`. mstore(0x00, 0xba535d9c) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, bytes32 p1, bool p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,string,bool,uint256)`. mstore(0x00, 0xcf009880) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, bytes32 p1, bool p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(uint256,string,bool,string)`. mstore(0x00, 0xd2d423cd) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, 0xc0) writeString(0xa0, p1) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(uint256 p0, bytes32 p1, uint256 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,string,uint256,address)`. mstore(0x00, 0x3b2279b4) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, bytes32 p1, uint256 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,string,uint256,bool)`. mstore(0x00, 0x691a8f74) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, bytes32 p1, uint256 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,string,uint256,uint256)`. mstore(0x00, 0x82c25b74) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(uint256,string,uint256,string)`. mstore(0x00, 0xb7b914ca) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, 0xc0) writeString(0xa0, p1) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(uint256 p0, bytes32 p1, bytes32 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(uint256,string,string,address)`. mstore(0x00, 0xd583c602) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, 0xc0) mstore(0x80, p3) writeString(0xa0, p1) writeString(0xe0, p2) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(uint256 p0, bytes32 p1, bytes32 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(uint256,string,string,bool)`. mstore(0x00, 0xb3a6b6bd) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, 0xc0) mstore(0x80, p3) writeString(0xa0, p1) writeString(0xe0, p2) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(uint256 p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(uint256,string,string,uint256)`. mstore(0x00, 0xb028c9bd) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, 0xc0) mstore(0x80, p3) writeString(0xa0, p1) writeString(0xe0, p2) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(uint256 p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; bytes32 m9; bytes32 m10; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) m9 := mload(0x120) m10 := mload(0x140) // Selector of `log(uint256,string,string,string)`. mstore(0x00, 0x21ad0683) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, 0xc0) mstore(0x80, 0x100) writeString(0xa0, p1) writeString(0xe0, p2) writeString(0x120, p3) } _sendLogPayload(0x1c, 0x144); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) mstore(0x120, m9) mstore(0x140, m10) } } function log(bytes32 p0, address p1, address p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,address,address,address)`. mstore(0x00, 0xed8f28f6) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, address p1, address p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,address,address,bool)`. mstore(0x00, 0xb59dbd60) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, address p1, address p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,address,address,uint256)`. mstore(0x00, 0x8ef3f399) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, address p1, address p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,address,address,string)`. mstore(0x00, 0x800a1c67) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0xc0) writeString(0xa0, p0) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, address p1, bool p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,address,bool,address)`. mstore(0x00, 0x223603bd) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, address p1, bool p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,address,bool,bool)`. mstore(0x00, 0x79884c2b) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, address p1, bool p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,address,bool,uint256)`. mstore(0x00, 0x3e9f866a) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, address p1, bool p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,address,bool,string)`. mstore(0x00, 0x0454c079) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0xc0) writeString(0xa0, p0) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, address p1, uint256 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,address,uint256,address)`. mstore(0x00, 0x63fb8bc5) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, address p1, uint256 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,address,uint256,bool)`. mstore(0x00, 0xfc4845f0) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, address p1, uint256 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,address,uint256,uint256)`. mstore(0x00, 0xf8f51b1e) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, address p1, uint256 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,address,uint256,string)`. mstore(0x00, 0x5a477632) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0xc0) writeString(0xa0, p0) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, address p1, bytes32 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,address,string,address)`. mstore(0x00, 0xaabc9a31) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, 0xc0) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p2) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, address p1, bytes32 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,address,string,bool)`. mstore(0x00, 0x5f15d28c) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, 0xc0) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p2) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, address p1, bytes32 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,address,string,uint256)`. mstore(0x00, 0x91d1112e) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, 0xc0) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p2) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, address p1, bytes32 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; bytes32 m9; bytes32 m10; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) m9 := mload(0x120) m10 := mload(0x140) // Selector of `log(string,address,string,string)`. mstore(0x00, 0x245986f2) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, 0xc0) mstore(0x80, 0x100) writeString(0xa0, p0) writeString(0xe0, p2) writeString(0x120, p3) } _sendLogPayload(0x1c, 0x144); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) mstore(0x120, m9) mstore(0x140, m10) } } function log(bytes32 p0, bool p1, address p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,bool,address,address)`. mstore(0x00, 0x33e9dd1d) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, bool p1, address p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,bool,address,bool)`. mstore(0x00, 0x958c28c6) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, bool p1, address p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,bool,address,uint256)`. mstore(0x00, 0x5d08bb05) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, bool p1, address p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,bool,address,string)`. mstore(0x00, 0x2d8e33a4) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0xc0) writeString(0xa0, p0) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, bool p1, bool p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,bool,bool,address)`. mstore(0x00, 0x7190a529) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, bool p1, bool p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,bool,bool,bool)`. mstore(0x00, 0x895af8c5) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, bool p1, bool p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,bool,bool,uint256)`. mstore(0x00, 0x8e3f78a9) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, bool p1, bool p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,bool,bool,string)`. mstore(0x00, 0x9d22d5dd) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0xc0) writeString(0xa0, p0) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, bool p1, uint256 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,bool,uint256,address)`. mstore(0x00, 0x935e09bf) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, bool p1, uint256 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,bool,uint256,bool)`. mstore(0x00, 0x8af7cf8a) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, bool p1, uint256 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,bool,uint256,uint256)`. mstore(0x00, 0x64b5bb67) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, bool p1, uint256 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,bool,uint256,string)`. mstore(0x00, 0x742d6ee7) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0xc0) writeString(0xa0, p0) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, bool p1, bytes32 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,bool,string,address)`. mstore(0x00, 0xe0625b29) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, 0xc0) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p2) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, bool p1, bytes32 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,bool,string,bool)`. mstore(0x00, 0x3f8a701d) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, 0xc0) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p2) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, bool p1, bytes32 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,bool,string,uint256)`. mstore(0x00, 0x24f91465) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, 0xc0) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p2) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, bool p1, bytes32 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; bytes32 m9; bytes32 m10; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) m9 := mload(0x120) m10 := mload(0x140) // Selector of `log(string,bool,string,string)`. mstore(0x00, 0xa826caeb) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, 0xc0) mstore(0x80, 0x100) writeString(0xa0, p0) writeString(0xe0, p2) writeString(0x120, p3) } _sendLogPayload(0x1c, 0x144); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) mstore(0x120, m9) mstore(0x140, m10) } } function log(bytes32 p0, uint256 p1, address p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,uint256,address,address)`. mstore(0x00, 0x5ea2b7ae) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, uint256 p1, address p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,uint256,address,bool)`. mstore(0x00, 0x82112a42) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, uint256 p1, address p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,uint256,address,uint256)`. mstore(0x00, 0x4f04fdc6) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, uint256 p1, address p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,uint256,address,string)`. mstore(0x00, 0x9ffb2f93) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0xc0) writeString(0xa0, p0) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, uint256 p1, bool p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,uint256,bool,address)`. mstore(0x00, 0xe0e95b98) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, uint256 p1, bool p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,uint256,bool,bool)`. mstore(0x00, 0x354c36d6) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, uint256 p1, bool p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,uint256,bool,uint256)`. mstore(0x00, 0xe41b6f6f) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, uint256 p1, bool p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,uint256,bool,string)`. mstore(0x00, 0xabf73a98) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0xc0) writeString(0xa0, p0) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, uint256 p1, uint256 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,uint256,uint256,address)`. mstore(0x00, 0xe21de278) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, uint256 p1, uint256 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,uint256,uint256,bool)`. mstore(0x00, 0x7626db92) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, uint256 p1, uint256 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,uint256,uint256,uint256)`. mstore(0x00, 0xa7a87853) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, uint256 p1, uint256 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,uint256,uint256,string)`. mstore(0x00, 0x854b3496) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0xc0) writeString(0xa0, p0) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, uint256 p1, bytes32 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,uint256,string,address)`. mstore(0x00, 0x7c4632a4) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, 0xc0) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p2) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, uint256 p1, bytes32 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,uint256,string,bool)`. mstore(0x00, 0x7d24491d) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, 0xc0) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p2) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, uint256 p1, bytes32 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,uint256,string,uint256)`. mstore(0x00, 0xc67ea9d1) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, 0xc0) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p2) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; bytes32 m9; bytes32 m10; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) m9 := mload(0x120) m10 := mload(0x140) // Selector of `log(string,uint256,string,string)`. mstore(0x00, 0x5ab84e1f) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, 0xc0) mstore(0x80, 0x100) writeString(0xa0, p0) writeString(0xe0, p2) writeString(0x120, p3) } _sendLogPayload(0x1c, 0x144); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) mstore(0x120, m9) mstore(0x140, m10) } } function log(bytes32 p0, bytes32 p1, address p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,string,address,address)`. mstore(0x00, 0x439c7bef) mstore(0x20, 0x80) mstore(0x40, 0xc0) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p1) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, bytes32 p1, address p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,string,address,bool)`. mstore(0x00, 0x5ccd4e37) mstore(0x20, 0x80) mstore(0x40, 0xc0) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p1) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, bytes32 p1, address p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,string,address,uint256)`. mstore(0x00, 0x7cc3c607) mstore(0x20, 0x80) mstore(0x40, 0xc0) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p1) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, bytes32 p1, address p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; bytes32 m9; bytes32 m10; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) m9 := mload(0x120) m10 := mload(0x140) // Selector of `log(string,string,address,string)`. mstore(0x00, 0xeb1bff80) mstore(0x20, 0x80) mstore(0x40, 0xc0) mstore(0x60, p2) mstore(0x80, 0x100) writeString(0xa0, p0) writeString(0xe0, p1) writeString(0x120, p3) } _sendLogPayload(0x1c, 0x144); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) mstore(0x120, m9) mstore(0x140, m10) } } function log(bytes32 p0, bytes32 p1, bool p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,string,bool,address)`. mstore(0x00, 0xc371c7db) mstore(0x20, 0x80) mstore(0x40, 0xc0) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p1) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, bytes32 p1, bool p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,string,bool,bool)`. mstore(0x00, 0x40785869) mstore(0x20, 0x80) mstore(0x40, 0xc0) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p1) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, bytes32 p1, bool p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,string,bool,uint256)`. mstore(0x00, 0xd6aefad2) mstore(0x20, 0x80) mstore(0x40, 0xc0) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p1) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, bytes32 p1, bool p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; bytes32 m9; bytes32 m10; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) m9 := mload(0x120) m10 := mload(0x140) // Selector of `log(string,string,bool,string)`. mstore(0x00, 0x5e84b0ea) mstore(0x20, 0x80) mstore(0x40, 0xc0) mstore(0x60, p2) mstore(0x80, 0x100) writeString(0xa0, p0) writeString(0xe0, p1) writeString(0x120, p3) } _sendLogPayload(0x1c, 0x144); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) mstore(0x120, m9) mstore(0x140, m10) } } function log(bytes32 p0, bytes32 p1, uint256 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,string,uint256,address)`. mstore(0x00, 0x1023f7b2) mstore(0x20, 0x80) mstore(0x40, 0xc0) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p1) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, bytes32 p1, uint256 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,string,uint256,bool)`. mstore(0x00, 0xc3a8a654) mstore(0x20, 0x80) mstore(0x40, 0xc0) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p1) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, bytes32 p1, uint256 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,string,uint256,uint256)`. mstore(0x00, 0xf45d7d2c) mstore(0x20, 0x80) mstore(0x40, 0xc0) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p1) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; bytes32 m9; bytes32 m10; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) m9 := mload(0x120) m10 := mload(0x140) // Selector of `log(string,string,uint256,string)`. mstore(0x00, 0x5d1a971a) mstore(0x20, 0x80) mstore(0x40, 0xc0) mstore(0x60, p2) mstore(0x80, 0x100) writeString(0xa0, p0) writeString(0xe0, p1) writeString(0x120, p3) } _sendLogPayload(0x1c, 0x144); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) mstore(0x120, m9) mstore(0x140, m10) } } function log(bytes32 p0, bytes32 p1, bytes32 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; bytes32 m9; bytes32 m10; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) m9 := mload(0x120) m10 := mload(0x140) // Selector of `log(string,string,string,address)`. mstore(0x00, 0x6d572f44) mstore(0x20, 0x80) mstore(0x40, 0xc0) mstore(0x60, 0x100) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p1) writeString(0x120, p2) } _sendLogPayload(0x1c, 0x144); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) mstore(0x120, m9) mstore(0x140, m10) } } function log(bytes32 p0, bytes32 p1, bytes32 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; bytes32 m9; bytes32 m10; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) m9 := mload(0x120) m10 := mload(0x140) // Selector of `log(string,string,string,bool)`. mstore(0x00, 0x2c1754ed) mstore(0x20, 0x80) mstore(0x40, 0xc0) mstore(0x60, 0x100) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p1) writeString(0x120, p2) } _sendLogPayload(0x1c, 0x144); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) mstore(0x120, m9) mstore(0x140, m10) } } function log(bytes32 p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; bytes32 m9; bytes32 m10; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) m9 := mload(0x120) m10 := mload(0x140) // Selector of `log(string,string,string,uint256)`. mstore(0x00, 0x8eafb02b) mstore(0x20, 0x80) mstore(0x40, 0xc0) mstore(0x60, 0x100) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p1) writeString(0x120, p2) } _sendLogPayload(0x1c, 0x144); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) mstore(0x120, m9) mstore(0x140, m10) } } function log(bytes32 p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; bytes32 m9; bytes32 m10; bytes32 m11; bytes32 m12; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) m9 := mload(0x120) m10 := mload(0x140) m11 := mload(0x160) m12 := mload(0x180) // Selector of `log(string,string,string,string)`. mstore(0x00, 0xde68f20a) mstore(0x20, 0x80) mstore(0x40, 0xc0) mstore(0x60, 0x100) mstore(0x80, 0x140) writeString(0xa0, p0) writeString(0xe0, p1) writeString(0x120, p2) writeString(0x160, p3) } _sendLogPayload(0x1c, 0x184); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) mstore(0x120, m9) mstore(0x140, m10) mstore(0x160, m11) mstore(0x180, m12) } } }
pragma solidity ^0.8.4; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC-165 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); * } * ``` */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
pragma solidity ^0.8.4; /** * @dev Interface of the ERC-165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[ERC]. * * 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[ERC 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); }
pragma solidity ^0.8.4; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ```solidity * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position is the index of the value in the `values` array plus 1. // Position 0 is used to mean a value is not in the set. mapping(bytes32 value => uint256) _positions; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._positions[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We cache the value's position to prevent multiple reads from the same storage slot uint256 position = set._positions[value]; if (position != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 valueIndex = position - 1; uint256 lastIndex = set._values.length - 1; if (valueIndex != lastIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the lastValue to the index where the value to delete is set._values[valueIndex] = lastValue; // Update the tracked position of the lastValue (that was just moved) set._positions[lastValue] = position; } // Delete the slot where the moved value was stored set._values.pop(); // Delete the tracked position for the deleted slot delete set._positions[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._positions[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } }
pragma solidity ^0.8.4; import "../introspection/IERC165.sol"; interface IEOARegistry is IERC165 { function isVerifiedEOA(address account) external view returns (bool); }
pragma solidity ^0.8.4; interface ITransferValidator { function applyCollectionTransferPolicy(address caller, address from, address to) external view; function validateTransfer(address caller, address from, address to) external view; function validateTransfer(address caller, address from, address to, uint256 tokenId) external view; function validateTransfer(address caller, address from, address to, uint256 tokenId, uint256 amount) external; function beforeAuthorizedTransfer(address operator, address token, uint256 tokenId) external; function afterAuthorizedTransfer(address token, uint256 tokenId) external; function beforeAuthorizedTransfer(address operator, address token) external; function afterAuthorizedTransfer(address token) external; function beforeAuthorizedTransfer(address token, uint256 tokenId) external; function beforeAuthorizedTransferWithAmount(address token, uint256 tokenId, uint256 amount) external; function afterAuthorizedTransferWithAmount(address token, uint256 tokenId) external; }
// SPDX-License-Identifier: BSL-1.1 pragma solidity 0.8.24; import "forge-std/Script.sol"; import "forge-std/console2.sol"; import "src/CreatorTokenTransferValidator.sol"; contract DeployCreatorTokenTransferValidator is Script { function run() public { uint256 deployerPrivateKey = vm.envUint("DEPLOYER_KEY"); address defaultOwner = address(0x1a38EB41b74622CBfA733210ec3c85Bea1658d9D); address eoaRegistry = address(0x1A589d072a1529c4d3d9E8262f84E57d6febC027); string memory name = "CreatorTokenTransferValidator"; string memory version = "4"; vm.startBroadcast(deployerPrivateKey); address validator = address(new CreatorTokenTransferValidator(defaultOwner, eoaRegistry, name, version)); vm.stopBroadcast(); console.log("Validator: ", validator); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.24; /** * @dev Constant definitions for receiver constraints used by the transfer validator. */ /// @dev No constraints on the receiver of a token. uint256 constant RECEIVER_CONSTRAINTS_NONE = 0; /// @dev Token receiver cannot have deployed code. uint256 constant RECEIVER_CONSTRAINTS_NO_CODE = 1; /// @dev Token receiver must be a verified EOA with the EOA Registry. uint256 constant RECEIVER_CONSTRAINTS_EOA = 2; /// @dev Token is a soulbound token and cannot be transferred. uint256 constant RECEIVER_CONSTRAINTS_SBT = 3; /** * @dev Constant definitions for caller constraints used by the transfer validator. */ /// @dev No constraints on the caller of a token transfer. uint256 constant CALLER_CONSTRAINTS_NONE = 0; /// @dev Caller of a token transfer must not be on the blacklist unless it is an OTC transfer. uint256 constant CALLER_CONSTRAINTS_OPERATOR_BLACKLIST_ENABLE_OTC = 1; /// @dev Caller of a token transfer must be on the whitelist unless it is an OTC transfer. uint256 constant CALLER_CONSTRAINTS_OPERATOR_WHITELIST_ENABLE_OTC = 2; /// @dev Caller of a token transfer must be on the whitelist. uint256 constant CALLER_CONSTRAINTS_OPERATOR_WHITELIST_DISABLE_OTC = 3; /// @dev Token is a soulbound token and cannot be transferred. uint256 constant CALLER_CONSTRAINTS_SBT = 4; /** * @dev Constant definitions for transfer security levels used by the transfer validator * to define what receiver and caller constraints are applied to a transfer. */ /// @dev Recommend Security Level - /// Caller Constraints: Operator Whitelist /// Receiver Constraints: None /// OTC: Allowed uint8 constant TRANSFER_SECURITY_LEVEL_RECOMMENDED = 0; /// @dev Security Level One - /// Caller Constraints: None /// Receiver Constraints: None /// OTC: Allowed uint8 constant TRANSFER_SECURITY_LEVEL_ONE = 1; /// @dev Security Level Two - /// Caller Constraints: Operator Blacklist /// Receiver Constraints: None /// OTC: Allowed uint8 constant TRANSFER_SECURITY_LEVEL_TWO = 2; /// @dev Security Level Three - /// Caller Constraints: Operator Whitelist /// Receiver Constraints: None /// OTC: Allowed uint8 constant TRANSFER_SECURITY_LEVEL_THREE = 3; /// @dev Security Level Four - /// Caller Constraints: Operator Whitelist /// Receiver Constraints: None /// OTC: Not Allowed uint8 constant TRANSFER_SECURITY_LEVEL_FOUR = 4; /// @dev Security Level Five - /// Caller Constraints: Operator Whitelist /// Receiver Constraints: No Code /// OTC: Allowed uint8 constant TRANSFER_SECURITY_LEVEL_FIVE = 5; /// @dev Security Level Six - /// Caller Constraints: Operator Whitelist /// Receiver Constraints: Verified EOA /// OTC: Allowed uint8 constant TRANSFER_SECURITY_LEVEL_SIX = 6; /// @dev Security Level Seven - /// Caller Constraints: Operator Whitelist /// Receiver Constraints: No Code /// OTC: Not Allowed uint8 constant TRANSFER_SECURITY_LEVEL_SEVEN = 7; /// @dev Security Level Eight - /// Caller Constraints: Operator Whitelist /// Receiver Constraints: Verified EOA /// OTC: Not Allowed uint8 constant TRANSFER_SECURITY_LEVEL_EIGHT = 8; /// @dev Security Level Nine - /// Soulbound Token, No Transfers Allowed uint8 constant TRANSFER_SECURITY_LEVEL_NINE = 9; /// @dev List type is a blacklist. uint8 constant LIST_TYPE_BLACKLIST = 0; /// @dev List type is a whitelist. uint8 constant LIST_TYPE_WHITELIST = 1; /// @dev List type is authorizers. uint8 constant LIST_TYPE_AUTHORIZERS = 2; /// @dev Constant value for the no error selector. bytes4 constant SELECTOR_NO_ERROR = bytes4(0x00000000); /// @dev Constant value for the default validator list ID. uint120 constant DEFAULT_LIST_ID = 0;
// SPDX-License-Identifier: MIT pragma solidity 0.8.24; struct CollectionSecurityPolicyV3 { bool disableAuthorizationMode; bool authorizersCannotSetWildcardOperators; uint8 transferSecurityLevel; uint120 listId; bool enableAccountFreezingMode; uint16 tokenType; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; /** * @title ZkTstorish */ abstract contract ZkTstorish { function _setTstorish(uint256 storageSlot, uint256 value) internal { assembly { sstore(storageSlot, value) } } function _getTstorish( uint256 storageSlot ) internal view returns (uint256 value) { assembly { value := sload(storageSlot) } } function _clearTstorish(uint256 storageSlot) internal { assembly { sstore(storageSlot, 0) } } }
{ "viaIR": false, "codegen": "yul", "remappings": [ "ds-test/=lib/forge-std/lib/ds-test/src/", "forge-std/=lib/forge-std/src/", "@limitbreak/tm-core-lib/=lib/tm-core-lib/", "@limitbreak/permit-c/=lib/PermitC/src/", "@openzeppelin/=lib/PermitC/lib/openzeppelin-contracts/", "@rari-capital/solmate/=lib/PermitC/lib/solmate/", "PermitC/=lib/PermitC/", "erc4626-tests/=lib/PermitC/lib/openzeppelin-contracts/lib/erc4626-tests/", "forge-gas-metering/=lib/PermitC/lib/forge-gas-metering/", "openzeppelin-contracts/=lib/PermitC/lib/openzeppelin-contracts/", "openzeppelin/=lib/PermitC/lib/openzeppelin-contracts/contracts/", "solady/=lib/PermitC/lib/forge-gas-metering/lib/solady/", "solmate/=lib/PermitC/lib/solmate/src/", "tm-core-lib/=lib/tm-core-lib/src/" ], "evmVersion": "cancun", "outputSelection": { "*": { "*": [ "abi", "metadata" ], "": [ "ast" ] } }, "optimizer": { "enabled": true, "mode": "3", "fallback_to_optimizing_for_size": false, "disable_system_request_memoization": true }, "metadata": {}, "libraries": {}, "enableEraVMExtensions": false, "forceEVMLA": false }
[{"inputs":[{"internalType":"address","name":"defaultOwner","type":"address"},{"internalType":"address","name":"eoaRegistry_","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"CollateralizedPausableFlags__NotPaused","type":"error"},{"inputs":[],"name":"CollateralizedPausableFlags__Paused","type":"error"},{"inputs":[],"name":"CollateralizedPausableFlags__WithdrawFailed","type":"error"},{"inputs":[],"name":"CreatorTokenTransferValidator__AuthorizationDisabledForCollection","type":"error"},{"inputs":[],"name":"CreatorTokenTransferValidator__CallerDoesNotOwnList","type":"error"},{"inputs":[],"name":"CreatorTokenTransferValidator__CallerMustBeAnAuthorizer","type":"error"},{"inputs":[],"name":"CreatorTokenTransferValidator__CallerMustBeWhitelisted","type":"error"},{"inputs":[],"name":"CreatorTokenTransferValidator__CallerMustHaveElevatedPermissionsForSpecifiedNFT","type":"error"},{"inputs":[],"name":"CreatorTokenTransferValidator__CannotReassignOwnershipOfDefaultList","type":"error"},{"inputs":[],"name":"CreatorTokenTransferValidator__InvalidConstructorArgs","type":"error"},{"inputs":[],"name":"CreatorTokenTransferValidator__InvalidTransferSecurityLevel","type":"error"},{"inputs":[],"name":"CreatorTokenTransferValidator__ListDoesNotExist","type":"error"},{"inputs":[],"name":"CreatorTokenTransferValidator__ListOwnershipCannotBeTransferredToZeroAddress","type":"error"},{"inputs":[],"name":"CreatorTokenTransferValidator__OperatorIsBlacklisted","type":"error"},{"inputs":[],"name":"CreatorTokenTransferValidator__ReceiverAccountIsFrozen","type":"error"},{"inputs":[],"name":"CreatorTokenTransferValidator__ReceiverMustNotHaveDeployedCode","type":"error"},{"inputs":[],"name":"CreatorTokenTransferValidator__ReceiverProofOfEOASignatureUnverified","type":"error"},{"inputs":[],"name":"CreatorTokenTransferValidator__SenderAccountIsFrozen","type":"error"},{"inputs":[],"name":"CreatorTokenTransferValidator__TokenIsSoulbound","type":"error"},{"inputs":[],"name":"CreatorTokenTransferValidator__TokenTypesDoNotMatch","type":"error"},{"inputs":[],"name":"CreatorTokenTransferValidator__WildcardOperatorsCannotBeAuthorizedForCollection","type":"error"},{"inputs":[],"name":"Ownable__CallerIsNotOwner","type":"error"},{"inputs":[],"name":"Ownable__NewOwnerIsZeroAddress","type":"error"},{"inputs":[],"name":"PermitC__AmountExceedsStorageMaximum","type":"error"},{"inputs":[],"name":"PermitC__ApprovalTransferExceededPermittedAmount","type":"error"},{"inputs":[],"name":"PermitC__ApprovalTransferPermitExpiredOrUnset","type":"error"},{"inputs":[],"name":"PermitC__CallerMustBeOwnerOrOperator","type":"error"},{"inputs":[],"name":"PermitC__InvalidTokenType","type":"error"},{"inputs":[],"name":"PermitC__NonceAlreadyUsedOrRevoked","type":"error"},{"inputs":[],"name":"PermitC__NonceNotUsedOrRevoked","type":"error"},{"inputs":[],"name":"PermitC__OrderIsEitherCancelledOrFilled","type":"error"},{"inputs":[],"name":"PermitC__SignatureTransferExceededPermitExpired","type":"error"},{"inputs":[],"name":"PermitC__SignatureTransferExceededPermittedAmount","type":"error"},{"inputs":[],"name":"PermitC__SignatureTransferInvalidSignature","type":"error"},{"inputs":[],"name":"PermitC__SignatureTransferPermitHashNotRegistered","type":"error"},{"inputs":[],"name":"PermitC__UnableToFillMinimumRequestedQuantity","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collection","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"AccountFrozenForCollection","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collection","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"AccountUnfrozenForCollection","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"kind","type":"uint8"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"AddedAccountToList","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"kind","type":"uint8"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"bytes32","name":"codehash","type":"bytes32"}],"name":"AddedCodeHashToList","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collection","type":"address"},{"indexed":true,"internalType":"uint120","name":"id","type":"uint120"}],"name":"AppliedListToCollection","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint200","name":"amount","type":"uint200"},{"indexed":false,"internalType":"uint48","name":"expiration","type":"uint48"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"CreatedList","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"Lockdown","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"orderId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"wasCancellation","type":"bool"}],"name":"OrderClosed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"orderId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"OrderFilled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"orderId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"uint256","name":"fillableQuantity","type":"uint256"}],"name":"OrderOpened","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"orderId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountRestoredToOrder","type":"uint256"}],"name":"OrderRestored","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":"uint256","name":"previousFlags","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newFlags","type":"uint256"}],"name":"PausableFlagsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"ReassignedListOwnership","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"kind","type":"uint8"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"RemovedAccountFromList","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"kind","type":"uint8"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"bytes32","name":"codehash","type":"bytes32"}],"name":"RemovedCodeHashFromList","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collection","type":"address"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SetAccountFreezingModeEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collection","type":"address"},{"indexed":false,"internalType":"bool","name":"disabled","type":"bool"},{"indexed":false,"internalType":"bool","name":"authorizersCannotSetWildcardOperators","type":"bool"}],"name":"SetAuthorizationModeEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collection","type":"address"},{"indexed":false,"internalType":"uint16","name":"tokenType","type":"uint16"}],"name":"SetTokenType","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collection","type":"address"},{"indexed":false,"internalType":"uint8","name":"level","type":"uint8"}],"name":"SetTransferSecurityLevel","type":"event"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"},{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"addAccountsToAuthorizers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"},{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"addAccountsToBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"},{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"addAccountsToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"},{"internalType":"bytes32[]","name":"codehashes","type":"bytes32[]"}],"name":"addCodeHashesToBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"},{"internalType":"bytes32[]","name":"codehashes","type":"bytes32[]"}],"name":"addCodeHashesToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"afterAuthorizedTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"afterAuthorizedTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"afterAuthorizedTransferWithAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenType","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"allowedAmount","type":"uint256"},{"internalType":"uint256","name":"expiration","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenType","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes32","name":"orderId","type":"bytes32"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"allowedAmount","type":"uint256"},{"internalType":"uint256","name":"expiration","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"applyCollectionTransferPolicy","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint120","name":"id","type":"uint120"}],"name":"applyListToCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenType","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint200","name":"amount","type":"uint200"},{"internalType":"uint48","name":"expiration","type":"uint48"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"beforeAuthorizedTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"token","type":"address"}],"name":"beforeAuthorizedTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"beforeAuthorizedTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"beforeAuthorizedTransferWithAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenType","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes32","name":"orderId","type":"bytes32"}],"name":"closePermittedOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"createList","outputs":[{"internalType":"uint120","name":"id","type":"uint120"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint120","name":"sourceListId","type":"uint120"}],"name":"createListCopy","outputs":[{"internalType":"uint120","name":"id","type":"uint120"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"domainSeparatorV4","outputs":[{"internalType":"bytes32","name":"domainSeparator","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signedPermit","type":"bytes"},{"components":[{"internalType":"uint256","name":"orderStartAmount","type":"uint256"},{"internalType":"uint256","name":"requestedFillAmount","type":"uint256"},{"internalType":"uint256","name":"minimumFillAmount","type":"uint256"}],"internalType":"struct OrderFillAmounts","name":"orderFillAmounts","type":"tuple"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"salt","type":"uint256"},{"internalType":"uint48","name":"expiration","type":"uint48"},{"internalType":"bytes32","name":"orderId","type":"bytes32"},{"internalType":"bytes32","name":"advancedPermitHash","type":"bytes32"}],"name":"fillPermittedOrderERC1155","outputs":[{"internalType":"uint256","name":"quantityFilled","type":"uint256"},{"internalType":"bool","name":"isError","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signedPermit","type":"bytes"},{"components":[{"internalType":"uint256","name":"orderStartAmount","type":"uint256"},{"internalType":"uint256","name":"requestedFillAmount","type":"uint256"},{"internalType":"uint256","name":"minimumFillAmount","type":"uint256"}],"internalType":"struct OrderFillAmounts","name":"orderFillAmounts","type":"tuple"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"salt","type":"uint256"},{"internalType":"uint48","name":"expiration","type":"uint48"},{"internalType":"bytes32","name":"orderId","type":"bytes32"},{"internalType":"bytes32","name":"advancedPermitHash","type":"bytes32"}],"name":"fillPermittedOrderERC20","outputs":[{"internalType":"uint256","name":"quantityFilled","type":"uint256"},{"internalType":"bool","name":"isError","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"address[]","name":"accountsToFreeze","type":"address[]"}],"name":"freezeAccountsForCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"}],"name":"getAuthorizerAccounts","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"}],"name":"getAuthorizerAccountsByCollection","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"}],"name":"getBlacklistedAccounts","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"}],"name":"getBlacklistedAccountsByCollection","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"}],"name":"getBlacklistedCodeHashes","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"}],"name":"getBlacklistedCodeHashesByCollection","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"}],"name":"getCollectionSecurityPolicy","outputs":[{"components":[{"internalType":"bool","name":"disableAuthorizationMode","type":"bool"},{"internalType":"bool","name":"authorizersCannotSetWildcardOperators","type":"bool"},{"internalType":"uint8","name":"transferSecurityLevel","type":"uint8"},{"internalType":"uint120","name":"listId","type":"uint120"},{"internalType":"bool","name":"enableAccountFreezingMode","type":"bool"},{"internalType":"uint16","name":"tokenType","type":"uint16"}],"internalType":"struct CollectionSecurityPolicyV3","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"}],"name":"getFrozenAccountsByCollection","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"}],"name":"getWhitelistedAccounts","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"}],"name":"getWhitelistedAccountsByCollection","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"}],"name":"getWhitelistedCodeHashes","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"}],"name":"getWhitelistedCodeHashesByCollection","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"invalidateUnorderedNonce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"},{"internalType":"address","name":"account","type":"address"}],"name":"isAccountAuthorizer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"isAccountAuthorizerOfCollection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"},{"internalType":"address","name":"account","type":"address"}],"name":"isAccountBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"isAccountBlacklistedByCollection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"isAccountFrozenForCollection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"},{"internalType":"address","name":"account","type":"address"}],"name":"isAccountWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"isAccountWhitelistedByCollection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"},{"internalType":"bytes32","name":"codehash","type":"bytes32"}],"name":"isCodeHashBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"bytes32","name":"codehash","type":"bytes32"}],"name":"isCodeHashBlacklistedByCollection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"},{"internalType":"bytes32","name":"codehash","type":"bytes32"}],"name":"isCodeHashWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"bytes32","name":"codehash","type":"bytes32"}],"name":"isCodeHashWhitelistedByCollection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"isRegisteredOrderAdditionalDataHash","outputs":[{"internalType":"bool","name":"isRegistered","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"isRegisteredTransferAdditionalDataHash","outputs":[{"internalType":"bool","name":"isRegistered","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"isValidUnorderedNonce","outputs":[{"internalType":"bool","name":"isValid","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isVerifiedEOA","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastListId","outputs":[{"internalType":"uint120","name":"","type":"uint120"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint120","name":"","type":"uint120"}],"name":"listOwners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockdown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"masterNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pausableConfigurationSettings","outputs":[{"internalType":"uint256","name":"_nativeValueToCheckPauseState","type":"uint256"},{"internalType":"uint256","name":"_pausableFlags","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pausableDepositCollateral","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pausableFlags","type":"uint256"}],"name":"pause","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"permitAmount","type":"uint256"},{"internalType":"uint256","name":"expiration","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"transferAmount","type":"uint256"},{"internalType":"bytes","name":"signedPermit","type":"bytes"}],"name":"permitTransferFromERC1155","outputs":[{"internalType":"bool","name":"isError","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"permitAmount","type":"uint256"},{"internalType":"uint256","name":"expiration","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"transferAmount","type":"uint256"},{"internalType":"bytes","name":"signedPermit","type":"bytes"}],"name":"permitTransferFromERC20","outputs":[{"internalType":"bool","name":"isError","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiration","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"signedPermit","type":"bytes"}],"name":"permitTransferFromERC721","outputs":[{"internalType":"bool","name":"isError","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"permitAmount","type":"uint256"},{"internalType":"uint256","name":"expiration","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"transferAmount","type":"uint256"},{"internalType":"bytes32","name":"additionalData","type":"bytes32"},{"internalType":"bytes32","name":"advancedPermitHash","type":"bytes32"},{"internalType":"bytes","name":"signedPermit","type":"bytes"}],"name":"permitTransferFromWithAdditionalDataERC1155","outputs":[{"internalType":"bool","name":"isError","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"permitAmount","type":"uint256"},{"internalType":"uint256","name":"expiration","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"transferAmount","type":"uint256"},{"internalType":"bytes32","name":"additionalData","type":"bytes32"},{"internalType":"bytes32","name":"advancedPermitHash","type":"bytes32"},{"internalType":"bytes","name":"signedPermit","type":"bytes"}],"name":"permitTransferFromWithAdditionalDataERC20","outputs":[{"internalType":"bool","name":"isError","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiration","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes32","name":"additionalData","type":"bytes32"},{"internalType":"bytes32","name":"advancedPermitHash","type":"bytes32"},{"internalType":"bytes","name":"signedPermit","type":"bytes"}],"name":"permitTransferFromWithAdditionalDataERC721","outputs":[{"internalType":"bool","name":"isError","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"reassignOwnershipOfList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"additionalDataTypeString","type":"string"}],"name":"registerAdditionalDataHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"},{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"removeAccountsFromAuthorizers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"},{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"removeAccountsFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"},{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"removeAccountsFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"},{"internalType":"bytes32[]","name":"codehashes","type":"bytes32[]"}],"name":"removeCodeHashesFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"},{"internalType":"bytes32[]","name":"codehashes","type":"bytes32[]"}],"name":"removeCodeHashesFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"}],"name":"renounceOwnershipOfList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint16","name":"tokenType","type":"uint16"}],"name":"setTokenTypeOfCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint8","name":"level","type":"uint8"},{"internalType":"bool","name":"disableAuthorizationMode","type":"bool"},{"internalType":"bool","name":"disableWildcardOperators","type":"bool"},{"internalType":"bool","name":"enableAccountFreezingMode","type":"bool"}],"name":"setTransferSecurityLevelOfCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFromERC1155","outputs":[{"internalType":"bool","name":"isError","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFromERC20","outputs":[{"internalType":"bool","name":"isError","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"transferFromERC721","outputs":[{"internalType":"bool","name":"isError","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"level","type":"uint256"}],"name":"transferSecurityPolicies","outputs":[{"internalType":"uint256","name":"callerConstraints","type":"uint256"},{"internalType":"uint256","name":"receiverConstraints","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"address[]","name":"accountsToUnfreeze","type":"address[]"}],"name":"unfreezeAccountsForCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"withdrawTo","type":"address"},{"internalType":"uint256","name":"withdrawAmount","type":"uint256"}],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenType","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint200","name":"amount","type":"uint200"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint48","name":"approvalExpiration","type":"uint48"},{"internalType":"uint48","name":"sigDeadline","type":"uint48"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"bytes","name":"signedPermit","type":"bytes"}],"name":"updateApprovalBySignature","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"validateTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"validateTransfer","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"validateTransfer","outputs":[],"stateMutability":"view","type":"function"}]
Deployed Bytecode
0x00040000000000020011000000000002000000000801034f0000006003100270000015d90130019700030000001803550002000000080355000015d90030019d0000000100200190000001020000c13d0000008002000039000000400020043f000000040010008c0000012a0000413d000000000208043b000000e002200270000015f20020009c0000012c0000a13d000015f30020009c0000018d0000a13d000015f40020009c000002cf0000a13d000015f50020009c000004050000213d000015fd0020009c000007850000213d000016010020009c000013ba0000613d000016020020009c00000f8a0000613d000016030020009c0000012a0000c13d000000440010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000800000002001d000016760020009c0000012a0000213d0000002402800370000000000202043b000015dd0020009c0000012a0000213d0000002303200039000000000013004b0000012a0000813d0000000403200039000000000338034f000000000303043b000a00000003001d000015dd0030009c0000012a0000213d000900240020003d0000000a0200002900000005022002100000000902200029000000000012004b0000012a0000213d0000000801000029000000000010043f0000000c01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000f00000001001d0000000801000029000000000010043f0000000a01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000015dc011001970000000002000411000000000012004b0000184c0000c13d0000000a0000006b000015900000613d0000000f02000029000b00020020003d000700050020003d000c00030020003d000f00000000001d0000006c0000013d0000000f020000290000000102200039000f00000002001d0000000a0020006c000015900000813d0000000f01000029000000050110021000000009011000290000000201100367000000000101043b000e00000001001d000000000010043f0000000c01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000000002004b000000670000613d0000000b01000029000000000301041a000000000003004b00001fcf0000613d000000000032004b000d00000002001d000000c20000613d000600000003001d000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000d020000290005000100200092000000000101043b0000000b03000029000000000203041a000000050020006c0000307b0000a13d0000000602000029000000010220008a0000000001120019000000000101041a000600000001001d000000000030043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b00000005011000290000000602000029000000000021041b000000000020043f0000000c01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000d02000029000000000021041b0000000b01000029000000000201041a000d00000002001d000000000002004b000024200000613d000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000d02000029000000010220008a000000000101043b0000000001210019000000000001041b0000000b01000029000000000021041b0000000e01000029000000000010043f0000000c01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000001041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d0200003900000004030000390000167a04000041000000000500001900000008060000290000000e0700002956ae56a40000040f00000001002001900000012a0000613d0000000e01000029000000000010043f0000000701000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000016e302200197000000000021041b000000670000013d000001e003000039000000400030043f0000000002000416000000000002004b0000012a0000c13d0000001f02100039000015da02200197000001e002200039000000400020043f0000001f0410018f000015db05100198000001e002500039000001140000613d000000000608034f000000006706043c0000000003730436000000000023004b000001100000c13d000000000004004b000001210000613d000000000358034f0000000304400210000000000502043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f0000000000320435000000800010008c0000012a0000413d000001e00600043d000015dc0060009c0000012a0000213d000002000200043d000f00000002001d000015dc0020009c0000029a0000a13d0000000001000019000056b0000104300000162f0020009c000001ac0000213d0000164d0020009c000003bc0000213d0000165c0020009c0000054c0000a13d0000165d0020009c000007c60000213d000016610020009c0000148e0000613d000016620020009c0000118f0000613d000016630020009c0000012a0000c13d000000a40010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000f00000001001d000015dc0010009c0000012a0000213d0000002401800370000000000101043b000e00000001001d000015dc0010009c0000012a0000213d0000004401800370000000000101043b000d00000001001d000015dc0010009c0000012a0000213d0000008401800370000000000101043b000b00000001001d0000006401800370000000000101043b000c00000001001d0000167201000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000010110008a000000030010008c000015cd0001a13e0000200e0000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000a00000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000a0010006b00001ccc0000a13d0000000101000039000000000101041a000000020010019000000f870000c13d00001ccc0000013d000016120020009c000002b40000213d000016210020009c000004210000a13d000016220020009c0000066f0000213d000016260020009c00000cda0000613d000016270020009c00000c340000613d000016280020009c0000012a0000c13d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000015dc0010009c0000012a0000213d000000000010043f0000000b01000039000000200010043f0000004002000039000000000100001956ae56710000040f000000000101041a000000180110027000001676011001970000151e0000013d000016300020009c000003f60000213d0000163f0020009c000005c50000a13d000016400020009c000007e00000213d000016440020009c000015150000613d000016450020009c0000119a0000613d000016460020009c0000012a0000c13d000000440010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000800000002001d000016760020009c0000012a0000213d0000002402800370000000000202043b000015dd0020009c0000012a0000213d0000002303200039000000000013004b0000012a0000813d0000000403200039000000000338034f000000000303043b000a00000003001d000015dd0030009c0000012a0000213d000900240020003d0000000a0200002900000005022002100000000902200029000000000012004b0000012a0000213d0000000801000029000000000010043f0000000d01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000f00000001001d0000000801000029000000000010043f0000000a01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000015dc011001970000000002000411000000000012004b0000184c0000c13d0000000a0000006b000015900000613d0000000f02000029000b00020020003d000700050020003d000c00030020003d000f00000000001d000002040000013d0000000f020000290000000102200039000f00000002001d0000000a0020006c000015900000813d0000000f01000029000000050110021000000009011000290000000201100367000000000101043b000e00000001001d000000000010043f0000000c01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000000002004b000001ff0000613d0000000b01000029000000000301041a000000000003004b00001fcf0000613d000000000032004b000d00000002001d0000025a0000613d000600000003001d000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000d020000290005000100200092000000000101043b0000000b03000029000000000203041a000000050020006c0000307b0000a13d0000000602000029000000010220008a0000000001120019000000000101041a000600000001001d000000000030043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b00000005011000290000000602000029000000000021041b000000000020043f0000000c01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000d02000029000000000021041b0000000b01000029000000000201041a000d00000002001d000000000002004b000024200000613d000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000d02000029000000010220008a000000000101043b0000000001210019000000000001041b0000000b01000029000000000021041b0000000e01000029000000000010043f0000000c01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000001041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d0200003900000004030000390000167a04000041000000010500003900000008060000290000000e0700002956ae56a40000040f00000001002001900000012a0000613d0000000e01000029000000000010043f0000000701000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000016e302200197000000000021041b000001ff0000013d000002200500043d000015dd0050009c0000012a0000213d0000001f02500039000000000012004b0000000003000019000015de03008041000015de02200197000000000002004b0000000004000019000015de04004041000015de0020009c000000000403c019000000000004004b0000012a0000c13d000e00000006001d000001e0025000390000000004020433000015dd0040009c000008bf0000a13d000016ce01000041000000000010043f0000004101000039000000040010043f000016cf01000041000056b000010430000016130020009c0000043a0000a13d000016140020009c000007200000213d000016180020009c00000ce20000613d000016190020009c00000be70000613d0000161a0020009c0000012a0000c13d000000440010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000016760010009c0000012a0000213d0000002402800370000000000202043b000f00000002001d000015dc0020009c0000012a0000213d000000000010043f0000000e010000390000133a0000013d000016040020009c000004c30000a13d000016050020009c000007750000213d000016090020009c000013580000613d0000160a0020009c00000eca0000613d0000160b0020009c0000012a0000c13d000000240010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000302043b000015dd0030009c0000012a0000213d0000002302300039000000000012004b0000012a0000813d0000000402300039000000000428034f000000000404043b000f00000004001d000015dd0040009c0000012a0000213d0000000f033000290000002403300039000000000013004b0000012a0000213d0000016001000039000000400010043f000000a501000039000000800010043f0000168a01000041000000a00010043f0000168b03000041000000c00030043f0000168c04000041000000e00040043f0000168d05000041000001000050043f0000168e06000041000001200060043f0000168f07000041000001400070043f000001800010043f000001a00030043f000001c00040043f000001e00050043f000002000060043f000002200070043f0000000f01000029000016e4071001980000001f0910018f000c00200020003d0000000c028003600000022501700039000002250000043f000003130000613d0000022503000039000000000402034f000000004504043c0000000003530436000000000013004b0000030f0000c13d000000000009004b000003200000613d000000000272034f0000000303900210000000000401043300000000043401cf000000000434022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000242019f0000000000210435000d00000009001d000e00000007001d0000000f0300002900000225013000390000000000010435000000e401300039000016e402100197000000a501300039000001600010043f000016900020009c000002ae0000213d0000016002200039000000400020043f000015d90010009c000015d90100804100000060011002100000000002000414000015d90020009c000015d902008041000000c002200210000000000121019f00001691011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000010043f0000000401000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000016e30220019700000001022001bf000000000021041b000000400100043d000015e70010009c000002ae0000213d000000c002100039000000400020043f000000a002100039000016920300004100000000003204350000008002100039000016930300004100000000003204350000006002100039000016940300004100000000003204350000004002100039000016950300004100000000003204350000009d02000039000000000321043600001696010000410000000000130435000000400100043d0000002002100039000000000400001900000000052400190000000006340019000000000606043300000000006504350000007d0040008c0000002004400039000003640000413d000000bd0310003900000000000304350000000e043000290000000c0500002900000002055003670000000e0000006b000003780000613d000000000605034f0000000007030019000000006806043c0000000007870436000000000047004b000003740000c13d0000000d0000006b000003860000613d0000000e055003600000000d060000290000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f00000000005404350000000f04000029000000000343001900000000000304350000009d034000390000000000310435000000dc03400039000016e4033001970000000003310019000000000013004b00000000040000390000000104004039000015dd0030009c000002ae0000213d0000000100400190000002ae0000c13d000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000010043f0000000501000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000016e30220019700000001022001bf000000000021041b0000000001000019000056af0001042e0000164e0020009c000006510000a13d0000164f0020009c000008510000213d000016530020009c000015240000613d000016540020009c000011f60000613d000016550020009c0000012a0000c13d000000a40010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000f00000001001d000015dc0010009c0000012a0000213d0000002401800370000000000101043b000e00000001001d000000ff0010008c0000012a0000213d0000004401800370000000000201043b000000000002004b0000000001000039000000010100c039000d00000002001d000000000012004b0000012a0000c13d0000006401800370000000000201043b000000000002004b0000000001000039000000010100c039000c00000002001d000000000012004b0000012a0000c13d0000008401800370000000000201043b000000000002004b0000000001000039000000010100c039000b00000002001d000000000012004b0000012a0000c13d0000000e01000029000000ff0110018f000a00000001001d0000000a0010008c00001b960000413d000016cd01000041000000800010043f0000167501000041000056b000010430000016310020009c0000065c0000a13d000016320020009c000008690000213d000016360020009c0000154d0000613d000016370020009c000012ff0000613d000016380020009c0000012a0000c13d0000000001000416000000000001004b0000012a0000c13d56ae52520000040f0000167c0000013d000015f60020009c000007b60000213d000015fa0020009c000015900000613d000015fb0020009c00000fb30000613d000015fc0020009c0000012a0000c13d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000601043b000015dc0060009c0000012a0000213d000000000100041a000015dc021001970000000005000411000000000052004b000017e00000c13d000000000006004b0000184f0000c13d0000167401000041000000800010043f0000167501000041000056b000010430000016290020009c00000a1e0000a13d0000162a0020009c00000c060000613d0000162b0020009c00000be90000613d0000162c0020009c0000012a0000c13d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000f00000001001d000016760010009c0000012a0000213d0000000f01000029000000000001004b000017e40000c13d000016ba01000041000000800010043f0000167501000041000056b0000104300000161b0020009c00000a4c0000a13d0000161c0020009c00000c110000613d0000161d0020009c00000bf50000613d0000161e0020009c0000012a0000c13d000001240010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000f00000002001d000015dc0020009c0000012a0000213d0000008402800370000000000202043b000e00000002001d000015dc0020009c0000012a0000213d000000a402800370000000000202043b000c00000002001d000015dc0020009c0000012a0000213d0000010402800370000000000202043b000d00000002001d000015dd0020009c0000012a0000213d0000000d020000290000002302200039000000000012004b0000012a0000813d0000000d02000029000a00040020003d0000000a02800360000000000202043b000b00000002001d000015dd0020009c0000012a0000213d0000000d030000290000000b023000290000002402200039000000000012004b0000012a0000213d0000002401800370000000000101043b000700000001001d0000004401800370000000000101043b000800000001001d0000006401800370000000000101043b000900000001001d000000c401800370000000000101043b000500000001001d000000e401800370000000000101043b000600000001001d000000000010043f0000000401000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000ff001001900000165d0000613d0000167201000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000010110008a000000030010008c000015b90001a13e0000200e0000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000400000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000040010006b0000244a0000a13d0000000101000039000000000101041a000000080010019000000f870000c13d0000244a0000013d0000160c0020009c00000a5e0000a13d0000160d0020009c00000ebf0000613d0000160e0020009c00000cd30000613d0000160f0020009c0000012a0000c13d000001640010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000f00000002001d000015dd0020009c0000012a0000213d0000000f020000290000002302200039000000000012004b0000012a0000813d0000000f020000290000000402200039000000000228034f000000000202043b000e00000002001d000015dd0020009c0000012a0000213d0000000f020000290000002403200039000d00000003001d0000000e02300029000000000012004b0000012a0000213d0000008401800370000000000101043b000c00000001001d000015dc0010009c0000012a0000213d000000a401800370000000000101043b000b00000001001d000015dc0010009c0000012a0000213d000000c401800370000000000101043b000a00000001001d000015dc0010009c0000012a0000213d0000010401800370000000000101043b000900000001001d000016a40010009c0000012a0000213d000000e401800370000000000101043b000600000001001d0000012401800370000000000101043b000800000001001d0000014401800370000000000101043b000700000001001d000000000010043f0000000501000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000ff001001900000165d0000613d0000167201000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000010110008a000000030010008c000015b50001a13e0000200e0000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000500000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000050010006b000028180000a13d0000000101000039000000000101041a000000800010019000000f870000c13d000028180000013d000016640020009c00000a7f0000a13d000016650020009c000010ed0000613d000016660020009c00000cf80000613d000016670020009c0000012a0000c13d000001240010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000f00000002001d000015dc0020009c0000012a0000213d000000a402800370000000000202043b000e00000002001d000015dc0020009c0000012a0000213d000000c402800370000000000202043b000c00000002001d000015dc0020009c0000012a0000213d0000010402800370000000000202043b000d00000002001d000015dd0020009c0000012a0000213d0000000d020000290000002302200039000000000012004b0000012a0000813d0000000d02000029000a00040020003d0000000a02800360000000000202043b000b00000002001d000015dd0020009c0000012a0000213d0000000d030000290000000b023000290000002402200039000000000012004b0000012a0000213d0000002401800370000000000101043b000600000001001d0000004401800370000000000101043b000700000001001d0000006401800370000000000101043b000800000001001d0000008401800370000000000101043b000900000001001d000000e401800370000000000101043b000500000001001d0000167201000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000010110008a000000030010008c000015d50001a13e0000200e0000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000400000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000040010006b000021040000a13d0000000101000039000000000101041a000000100010019000000f870000c13d000021040000013d000016470020009c00000a980000a13d000016480020009c000010fe0000613d000016490020009c00000d370000613d0000164a0020009c0000012a0000c13d000001440010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000f00000002001d000015dc0020009c0000012a0000213d0000008402800370000000000202043b000e00000002001d000015dc0020009c0000012a0000213d000000a402800370000000000202043b000c00000002001d000015dc0020009c0000012a0000213d0000012402800370000000000202043b000d00000002001d000015dd0020009c0000012a0000213d0000000d020000290000002302200039000000000012004b0000012a0000813d0000000d02000029000a00040020003d0000000a02800360000000000202043b000b00000002001d000015dd0020009c0000012a0000213d0000000d030000290000000b023000290000002402200039000000000012004b0000012a0000213d0000002401800370000000000101043b000700000001001d0000004401800370000000000101043b000800000001001d0000006401800370000000000101043b000900000001001d000000c401800370000000000101043b000400000001001d000000e401800370000000000101043b000500000001001d0000010401800370000000000101043b000600000001001d000000000010043f0000000401000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000ff001001900000165d0000613d0000167201000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000010110008a000000030010008c000015c50001a13e0000200e0000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000300000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000030010006b0000258b0000a13d0000000101000039000000000101041a000000200010019000000f870000c13d0000258b0000013d000016560020009c00000aba0000a13d000016570020009c000011710000613d000016580020009c00000be80000613d000016590020009c0000012a0000c13d000000640010008c0000134c0000813d0000012a0000013d000016390020009c00000ada0000a13d0000163a0020009c0000117a0000613d0000163b0020009c00000de10000613d0000163c0020009c0000012a0000c13d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000016760010009c0000012a0000213d56ae47f10000040f0000151f0000013d000016230020009c00000df50000613d000016240020009c00000c460000613d000016250020009c0000012a0000c13d000000440010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000800000002001d000016760020009c0000012a0000213d0000002402800370000000000202043b000015dd0020009c0000012a0000213d0000002303200039000000000013004b0000012a0000813d0000000403200039000000000338034f000000000303043b000c00000003001d000015dd0030009c0000012a0000213d000b00240020003d0000000c0200002900000005022002100000000b02200029000000000012004b0000012a0000213d0000000801000029000000000010043f0000000d01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000a00000001001d0000000801000029000000000010043f0000000a01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000015dc011001970000000002000411000000000012004b0000184c0000c13d0000000c0000006b000015900000613d0000000a01000029000700040010003d000d00010010003d000f00000000001d000006c00000013d0000000f020000290000000102200039000f00000002001d0000000c0020006c000015900000813d0000000f0100002900000005011002100000000b011000290000000201100367000000000301043b000015dc0030009c0000012a0000213d000000000030043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c70000801002000039000e00000003001d56ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000000001004b000006bb0000c13d0000000a02000029000000000102041a000015dd0010009c000002ae0000213d000900000001001d0000000101100039000000000012041b000000000020043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000000e020000290000012a0000613d000000000101043b0000000901100029000000000021041b0000000a01000029000000000101041a000900000001001d000000000020043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000902000029000000000021041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d0200003900000004030000390000167e04000041000000010500003900000008060000290000000e0700002956ae56a40000040f0000000e0100002900000001002001900000012a0000613d000000000010043f0000000701000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000016e30220019700000001022001bf000000000021041b000006bb0000013d000016150020009c00000be70000613d000016160020009c00000c570000613d000016170020009c0000012a0000c13d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000015dc0010009c0000012a0000213d0000014002000039000000400020043f000000800000043f000000a00000043f000000c00000043f000000e00000043f000001000000043f000001200000043f000000000010043f0000000b01000039000000200010043f0000004002000039000000000100001956ae56710000040f000f00000001001d000001400100003956ae47900000040f0000000f01000029000000000101041a000000ff001001900000000002000039000000010200c039000001400020043f0000ff00001001900000000003000039000000010300c039000001600030043f0000001003100270000000ff0330018f000001800030043f00000018031002700000167603300197000001a00030043f000016ae001001980000000003000039000000010300c039000001c00030043f00000098011002700000ffff0110018f000001e00010043f000000400100043d0000000002210436000001600300043d000000000003004b0000000003000039000000010300c0390000000000320435000001800200043d000000ff0220018f00000040031000390000000000230435000001a00200043d000016760220019700000060031000390000000000230435000001c00200043d000000000002004b0000000002000039000000010200c03900000080031000390000000000230435000001e00200043d0000ffff0220018f000000a0031000390000000000230435000015d90010009c000015d9010080410000004001100210000016af011001c7000056af0001042e000016060020009c000013680000613d000016070020009c00000f380000613d000016080020009c0000012a0000c13d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000016760010009c0000012a0000213d000017400000013d000015fe0020009c000014650000613d000015ff0020009c00000fc70000613d000016000020009c0000012a0000c13d000000440010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000800000002001d000015dc0020009c0000012a0000213d0000002402800370000000000202043b000015dd0020009c0000012a0000213d0000002303200039000000000013004b0000012a0000813d0000000403200039000000000338034f000000000303043b000a00000003001d000015dd0030009c0000012a0000213d000900240020003d0000000a0200002900000005022002100000000902200029000000000012004b0000012a0000213d0000000002000411000000080020006c00001df30000613d0000162601000041000000000010043f00000000010004140000000802000029000000040020008c00001ba40000c13d0000001c0100043d000000000010043f0000000102000039000000010300003100001bc70000013d000015f70020009c000014780000613d000015f80020009c000010d00000613d000015f90020009c0000012a0000c13d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000000000010043f000000050100003900000e110000013d0000165e0020009c000015780000613d0000165f0020009c0000132a0000613d000016600020009c0000012a0000c13d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000015dc0010009c0000012a0000213d000000000010043f0000000b01000039000000200010043f0000004002000039000000000100001956ae56710000040f000000000101041a0000001801100270000016760110019756ae47f10000040f0000151f0000013d000016410020009c000015920000613d000016420020009c0000133e0000613d000016430020009c0000012a0000c13d000000e40010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000f00000002001d000015dc0020009c0000012a0000213d0000006402800370000000000202043b000d00000002001d0000004402800370000000000202043b000c00000002001d0000002402800370000000000202043b000b00000002001d0000008402800370000000000202043b000e00000002001d000015dc0020009c0000012a0000213d000000a402800370000000000202043b000900000002001d000015dc0020009c0000012a0000213d000000c402800370000000000202043b000a00000002001d000015dd0020009c0000012a0000213d0000000a020000290000002302200039000000000012004b0000012a0000813d0000000a02000029000700040020003d0000000702800360000000000202043b000800000002001d000015dd0020009c0000012a0000213d0000000a0300002900000008023000290000002402200039000000000012004b0000012a0000213d0000167201000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000010110008a000000030010008c000015c10001a13e0000200e0000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000600000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000060010006b000022440000a13d0000000101000039000000000101041a000000080010019000000f870000c13d000022440000013d000016500020009c000016120000613d000016510020009c0000134a0000613d000016520020009c0000012a0000c13d0000000002000416000000000002004b0000012a0000c13d56ae46450000040f000f00000002001d000015dc01100197000000000010043f0000000b01000039000000200010043f0000004002000039000000000100001956ae56710000040f000000000101041a00000018011002700000167601100197000000000010043f0000000e01000039000016710000013d000016330020009c000016600000613d000016340020009c00000be80000613d000016350020009c0000012a0000c13d000000840010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000f00000001001d000015dc0010009c0000012a0000213d0000002401800370000000000101043b000e00000001001d000015dc0010009c0000012a0000213d0000004401800370000000000101043b000d00000001001d000015dc0010009c0000012a0000213d0000006401800370000000000101043b000c00000001001d0000167201000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000010110008a000000030010008c000015bd0001a13e0000200e0000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000b00000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000b0010006b00001d850000a13d0000000101000039000000000101041a000000010010019000000f870000c13d00001d850000013d0000001f02400039000016e4022001970000003f02200039000016e402200197000000400700043d0000000006270019000d00000007001d000000000076004b00000000020000390000000102004039000015dd0060009c000002ae0000213d0000000100200190000002ae0000c13d000001e002100039000000400060043f0000000d060000290000000006460436000c00000006001d00000200055000390000000006540019000000000026004b0000012a0000213d000000000004004b0000000c09000029000008e10000613d000000000600001900000000076900190000000008560019000000000808043300000000008704350000002006600039000000000046004b000008da0000413d0000000d0440002900000020044000390000000000040435000002400400043d000015dd0040009c0000012a0000213d0000001f05400039000000000015004b0000000001000019000015de01008041000015de05500197000000000005004b0000000006000019000015de06004041000015de0050009c000000000601c019000000000006004b0000012a0000c13d000001e0014000390000000001010433000015dd0010009c000002ae0000213d0000001f05100039000016e4055001970000003f05500039000016e403500197000000400500043d0000000003350019000b00000005001d000000000053004b00000000050000390000000105004039000015dd0030009c000002ae0000213d0000000100500190000002ae0000c13d000000400030043f0000000b030000290000000003130436000a00000003001d00000200034000390000000004310019000000000024004b0000012a0000213d000000000001004b0000000a06000029000009180000613d000000000200001900000000042600190000000005320019000000000505043300000000005404350000002002200039000000000012004b000009110000413d0000000b0110002900000020011000390000000000010435000015df0100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d0000000002000411000015dc06200197000000000200041a000015e103200197000000000363019f000000000101043b000900000001001d000000000030041b0000000001000414000015dc05200197000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d020000390000000303000039000015e30400004156ae56a40000040f00000001002001900000012a0000613d0000000101000039000000a00010043f0000000301000039000000c00010043f0000000501000039000000e00010043f0000000901000029000000010010008c000015e501000041000015e401006041000000800010043f0000000c01000029000015d90010009c000015d90100804100000040011002100000000d020000290000000002020433000015d90020009c000015d9020080410000006002200210000000000112019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000d00000001001d000001400010043f0000000a01000029000015d90010009c000015d90100804100000040011002100000000b020000290000000002020433000015d90020009c000015d9020080410000006002200210000000000112019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000201043b000001600020043f0000000905000029000001200050043f000000400100043d000000a00310003900000000040004100000000000430435000000800310003900000000005304350000006003100039000000000023043500000040021000390000000d030000290000000000320435000000a0020000390000000002210436000015e6030000410000000000320435000015e70010009c000002ae0000213d000000c003100039000d00000003001d000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000000e020000290000012a0000613d000000000101043b000001000010043f000015dc06200197000000000100041a000015e102100197000000000262019f000000000020041b0000000002000414000015dc05100197000015d90020009c000015d902008041000000c001200210000015e2011001c70000800d020000390000000303000039000015e304000041000e00000006001d56ae56a40000040f00000001002001900000012a0000613d0000000e0000006b000027ec0000613d0000000f01000029000015dc00100198000027ec0000613d000000000000043f0000000a01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000015e1022001970000000e022001af000000000021041b000015e901000041000000400200043d000000400320003900000000001304350000000c010000390000002003200039000000000013043500000020010000390000000000120435000015d90020009c000015d90200804100000040012002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015ea011001c70000800d020000390000000203000039000015eb04000041000000000500001956ae56a40000040f00000001002001900000012a0000613d0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d020000390000000303000039000015ec0400004100000000050000190000000e0600002956ae56a40000040f00000001002001900000012a0000613d0000000f05000029000001c00050043f000015ed02000041000001800020043f000015ee01000041000001a00010043f000000800300043d00000140000004430000016000300443000000a00300043d00000020060000390000018000600443000001a0003004430000004003000039000000c00400043d000001c000300443000001e0004004430000006003000039000000e00400043d000002000030044300000220004004430000008003000039000001000400043d00000240003004430000026000400443000001200300043d000000a0040000390000028000400443000002a000300443000000c003000039000001400400043d000002c000300443000002e000400443000000e003000039000001600400043d0000030000300443000003200040044300000100030000390000034000300443000003600020044300000120020000390000038000200443000003a0001004430000014001000039000003c000100443000003e00050044300000100006004430000000b010000390000012000100443000015ef01000041000056af0001042e0000162d0020009c00000e080000613d0000162e0020009c0000012a0000c13d000000440010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000f00000001001d000015dc0010009c0000012a0000213d0000002401800370000000000301043b000000000100041a000015dc011001970000000002000411000000000021004b000017e00000c13d000e00000003001d0000000103000039000000000103041a000000000003041b000000800010043f000000a00000043f0000000001000414000015d90010009c000015d901008041000000c001100210000016b6011001c70000800d02000039000d00000003001d000016b70400004156ae56a40000040f00000001002001900000012a0000613d0000000e0000006b000015900000613d00000000010004140000000f04000029000000040040008c0000193c0000c13d0000000101000031000019490000013d0000161f0020009c00000e150000613d000016200020009c0000012a0000c13d0000000002000416000000000002004b0000012a0000c13d56ae46450000040f000f00000002001d000015dc01100197000000000010043f0000000f01000039000000200010043f0000004002000039000000000100001956ae56710000040f0000000201100039000016760000013d000016100020009c000013900000613d000016110020009c0000012a0000c13d000000440010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000f00000001001d000015dc0010009c0000012a0000213d0000002401800370000000000101043b000e00000001001d000016760010009c0000012a0000213d00000000050004110000000f04000029000000000045004b00001b0a0000613d0000162601000041000000000010043f0000000001000414000000040040008c0000190f0000c13d0000001c0100043d000000000010043f00000001020000390000000103000031000019340000013d000016680020009c000016830000613d000016690020009c0000012a0000c13d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000201043b000016b0002001980000012a0000c13d0000000101000039000016dd0020009c000018140000a13d000016de0020009c0000154a0000613d000016df0020009c0000154a0000613d000016e00020009c0000154a0000613d000000800000043f0000166a01000041000056af0001042e0000164b0020009c0000172e0000613d0000164c0020009c0000012a0000c13d0000000001000416000000000001004b0000012a0000c13d0000000001000411000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a0000000102200039000000000021041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d020000390000000203000039000016bf0400004100000000050004110000158d0000013d0000165a0020009c0000174f0000613d0000165b0020009c0000012a0000c13d000000440010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000015dc0010009c0000012a0000213d0000002402800370000000000202043b000f00000002001d000000000010043f0000000601000039000000200010043f0000004002000039000000000100001956ae56710000040f0000000f02000029000000080220027056ae47170000040f000000000101041a000016e5011001670000000f02000029000000ff0220018f000000000121022f000000010110018f0000167c0000013d0000163d0020009c000017560000613d0000163e0020009c0000012a0000c13d000000440010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000800000002001d000016760020009c0000012a0000213d0000002402800370000000000202043b000015dd0020009c0000012a0000213d0000002303200039000000000013004b0000012a0000813d0000000403200039000000000338034f000000000303043b000f00000003001d000015dd0030009c0000012a0000213d00000024032000390000000f02000029000e0005002002180000000e04300029000000000014004b0000012a0000213d0000000801000029000000000010043f0000000c01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c70000801002000039000d00000003001d000c00000004001d56ae56a90000040f00000001002001900000012a0000613d000000000101043b000b00000001001d0000000e010000290000003f011000390000167801100197000000400200043d0000000001120019000a00000002001d000000000021004b00000000020000390000000102004039000015dd0010009c000002ae0000213d0000000100200190000002ae0000c13d000000400010043f0000000a010000290000000f030000290000000001310436000900000001001d0000000c05000029000000000050007c0000000d040000290000012a0000213d0000000f0000006b00000b2f0000613d00000002010003670000000a02000029000000000341034f000000000303043b000015dc0030009c0000012a0000213d000000200220003900000000003204350000002004400039000000000054004b00000b260000413d0000000801000029000000000010043f0000000a01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000015dc011001970000000002000411000000000012004b0000184c0000c13d0000000a010000290000000001010433000000000001004b000015900000613d0000000b01000029000700040010003d000c00010010003d000f00000000001d00000b550000013d000000000101043b000000000201041a000016e302200197000000000021041b0000000f02000029000f00010020003d0000000a0100002900000000010104330000000f0010006b000015900000813d0000000f01000029000000050110021000000009011000290000000001010433000015dc01100197000e00000001001d000000000010043f0000000c01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000000002004b00000b4f0000613d0000000b01000029000000000301041a000000000003004b00001fcf0000613d000000000032004b000d00000002001d00000bab0000613d000600000003001d000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000d020000290005000100200092000000000101043b0000000b03000029000000000203041a000000050020006c0000307b0000a13d0000000602000029000000010220008a0000000001120019000000000101041a000600000001001d000000000030043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b00000005011000290000000602000029000000000021041b000000000020043f0000000c01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000d02000029000000000021041b0000000b01000029000000000201041a000d00000002001d000000000002004b000024200000613d000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000d02000029000000010220008a000000000101043b0000000001210019000000000001041b0000000b01000029000000000021041b0000000e01000029000000000010043f0000000c01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000001041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d0200003900000004030000390000167904000041000000000500001900000008060000290000000e0700002956ae56a40000040f00000001002001900000012a0000613d0000000e01000029000000000010043f0000000701000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000000b4b0000c13d0000012a0000013d56ae466b0000040f56ae43400000040f000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000015dc0010009c0000012a0000213d56ae48780000040f000000000001004b0000167a0000013d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000016760010009c0000012a0000213d000000000010043f0000000a01000039000000200010043f0000004002000039000000000100001956ae56710000040f000000000101041a00000cde0000013d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000016760010009c0000012a0000213d56ae48350000040f000017410000013d000000c40010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000f00000001001d000015dc0010009c0000012a0000213d0000002401800370000000000101043b000e00000001001d000015dc0010009c0000012a0000213d0000006401800370000000000101043b000d00000001001d000015dc0010009c0000012a0000213d000000a401800370000000000301043b0000008401800370000000000501043b0000004401800370000000000401043b00000000010004110000000f0010006c0000185b0000613d0000000e0010006c0000185b0000613d000016b401000041000000800010043f0000167501000041000056b0000104300000000002000416000000000002004b0000012a0000c13d56ae46450000040f000f00000002001d000015dc01100197000000000010043f0000000b01000039000000200010043f0000004002000039000000000100001956ae56710000040f000000000101041a00000018011002700000167601100197000000000010043f0000000d01000039000016710000013d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b56ae49000000040f000000400300043d000000200430003900000000002404350000000000130435000015d90030009c000015d9030080410000004001300210000016aa011001c7000056af0001042e000000240010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000015dd0020009c0000012a0000213d0000002303200039000000000013004b0000012a0000813d000e00040020003d0000000e03800360000000000303043b000f00000003001d000015dd0030009c0000012a0000213d0000000f022000290000002402200039000000000012004b0000012a0000213d0000000801000039000000000201041a0000167b0320019700000001022000390000167604200197000000000234019f000000000021041b000d00000004001d000000000040043f0000000a01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000002000411000015dc02200197000000000101043b000000000301041a000015e103300197000000000223019f000000000021041b0000002002000039000000400100043d00000000022104360000000f030000290000000000320435000016e4053001980000001f0630018f000000400310003900000000045300190000000e070000290000002007700039000000020770036700000c9b0000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b00000c970000c13d000000000006004b00000ca80000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f00000000005404350000000f04000029000000000343001900000000000304350000001f03400039000016e4023001970000167c0020009c0000167c020080410000006002200210000015d90010009c000015d9010080410000004001100210000000000112019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000121019f0000167d0110009a0000800d020000390000000203000039000015eb040000410000000d0500002956ae56a40000040f00000001002001900000012a0000613d000000400100043d000f00000001001d0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d020000390000000303000039000015ec040000410000000d05000029000000000600041156ae56a40000040f00000001002001900000012a0000613d0000000d010000290000000f020000290000167d0000013d0000000002000416000000000002004b0000012a0000c13d56ae46550000040f56ae492f0000040f0000000001000019000056af0001042e0000000001000416000000000001004b0000012a0000c13d000000000100041a000015dc01100197000000800010043f0000166a01000041000056af0001042e000000440010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000015dc0010009c0000012a0000213d000000000010043f0000000b01000039000000200010043f00000040020000390000000001000019000f00000008035356ae56710000040f000000000101041a00000018011002700000167601100197000000000010043f0000000d01000039000015390000013d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000f00000001001d000015dc0010009c0000012a0000213d0000000f01000029000000000010043f0000000b01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000ff00100190000018110000c13d00000018011002700000167601100197000000000010043f0000000e01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000002000411000015dc02200197000000000020043f0000000401100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000ff0010019000001b760000c13d000000400100043d000016dc0200004100001d7f0000013d000000440010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000800000002001d000016760020009c0000012a0000213d0000002402800370000000000202043b000015dd0020009c0000012a0000213d0000002303200039000000000013004b0000012a0000813d0000000403200039000000000338034f000000000303043b000c00000003001d000015dd0030009c0000012a0000213d000b00240020003d0000000c0200002900000005022002100000000b02200029000000000012004b0000012a0000213d0000000801000029000000000010043f0000000d01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000f00000001001d0000000801000029000000000010043f0000000a01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000015dc011001970000000002000411000000000012004b0000184c0000c13d0000000c0000006b000015900000613d0000000f02000029000a00020020003d000700050020003d000d00030020003d000f00000000001d00000d880000013d000000000101043b000000000201041a000016e30220019700000001022001bf000000000021041b0000000f020000290000000102200039000f00000002001d0000000c0020006c000015900000813d0000000f0100002900000005011002100000000b011000290000000201100367000000000101043b000e00000001001d000000000010043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000000001004b00000d830000c13d0000000a02000029000000000102041a000015dd0010009c000002ae0000213d000900000001001d0000000101100039000000000012041b000000000020043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000000e030000290000012a0000613d000000000101043b0000000901100029000000000031041b0000000a01000029000000000101041a000900000001001d000000000030043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000902000029000000000021041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d0200003900000004030000390000167f04000041000000010500003900000008060000290000000e0700002956ae56a40000040f0000000e0100002900000001002001900000012a0000613d000000000010043f0000000701000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000000d7e0000c13d0000012a0000013d0000000001000416000000000001004b0000012a0000c13d000000000100041a000015dc021001970000000005000411000000000052004b000017e00000c13d000015e101100197000000000010041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d020000390000000303000039000015e30400004100000000060000190000158d0000013d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000015dc0010009c0000012a0000213d000000000010043f0000000b01000039000000200010043f0000004002000039000000000100001956ae56710000040f000000000101041a00000018011002700000167601100197000011980000013d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000000000010043f0000000401000039000000200010043f00000040020000390000000001000019000015450000013d000000440010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000800000002001d000016760020009c0000012a0000213d0000002402800370000000000202043b000015dd0020009c0000012a0000213d0000002303200039000000000013004b0000012a0000813d0000000403200039000000000338034f000000000303043b000c00000003001d000015dd0030009c0000012a0000213d000b00240020003d0000000c0200002900000005022002100000000b02200029000000000012004b0000012a0000213d0000000801000029000000000010043f0000000c01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000f00000001001d0000000801000029000000000010043f0000000a01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000015dc011001970000000002000411000000000012004b0000184c0000c13d0000000c0000006b000015900000613d0000000f02000029000a00020020003d000700050020003d000d00030020003d000f00000000001d00000e660000013d000000000101043b000000000201041a000016e30220019700000001022001bf000000000021041b0000000f020000290000000102200039000f00000002001d0000000c0020006c000015900000813d0000000f0100002900000005011002100000000b011000290000000201100367000000000101043b000e00000001001d000000000010043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000000001004b00000e610000c13d0000000a02000029000000000102041a000015dd0010009c000002ae0000213d000900000001001d0000000101100039000000000012041b000000000020043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000000e030000290000012a0000613d000000000101043b0000000901100029000000000031041b0000000a01000029000000000101041a000900000001001d000000000030043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000902000029000000000021041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d0200003900000004030000390000167f04000041000000000500001900000008060000290000000e0700002956ae56a40000040f0000000e0100002900000001002001900000012a0000613d000000000010043f0000000701000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000000e5c0000c13d0000012a0000013d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000201043b000000000100041156ae51350000040f0000000001000019000056af0001042e000001040010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000f00000002001d000015dc0020009c0000012a0000213d0000006402800370000000000202043b000d00000002001d0000004402800370000000000202043b000c00000002001d0000002402800370000000000202043b000b00000002001d0000008402800370000000000202043b000e00000002001d000015dc0020009c0000012a0000213d000000a402800370000000000202043b000900000002001d000015dc0020009c0000012a0000213d000000c402800370000000000202043b000800000002001d000000e402800370000000000202043b000a00000002001d000015dd0020009c0000012a0000213d0000000a020000290000002302200039000000000012004b0000012a0000813d0000000a02000029000600040020003d0000000602800360000000000202043b000700000002001d000015dd0020009c0000012a0000213d0000000a0300002900000007023000290000002402200039000000000012004b0000012a0000213d0000167201000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000010110008a000000030010008c000015b10001a13e0000200e0000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000500000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000050010006b000023820000a13d0000000101000039000000000101041a000000200010019000000f870000c13d000023820000013d000000840010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000f00000001001d000015dc0010009c0000012a0000213d0000002401800370000000000101043b000e00000001001d000015dc0010009c0000012a0000213d0000004401800370000000000101043b000d00000001001d000015dc0010009c0000012a0000213d0000006401800370000000000101043b000c00000001001d0000167201000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000010110008a000000030010008c000015ad0001a13e0000200e0000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000b00000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000b0010006b00001c1e0000a13d0000000101000039000000000101041a000000040010019000001c1e0000613d000000400100043d000016d50200004100001d7f0000013d000000440010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000015dd0020009c0000012a0000213d0000002303200039000000000013004b0000012a0000813d000e00040020003d0000000e03800360000000000303043b000f00000003001d000015dd0030009c0000012a0000213d0000000f022000290000002402200039000000000012004b0000012a0000213d0000002401800370000000000101043b000d00000001001d000016760010009c0000012a0000213d0000000801000039000000000201041a000000010320003900001676043001970000167b03200197000000000334019f000000000031041b00001676012001970000000d0010006b000019df0000a13d0000168101000041000000800010043f0000167501000041000056b000010430000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000015dc0010009c0000012a0000213d000000000010043f0000000b01000039000000200010043f0000004002000039000000000100001956ae56710000040f000000000101041a0000001801100270000016760110019756ae48350000040f000017410000013d000000440010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000800000002001d000016760020009c0000012a0000213d0000002402800370000000000202043b000015dd0020009c0000012a0000213d0000002303200039000000000013004b0000012a0000813d0000000403200039000000000338034f000000000303043b000f00000003001d000015dd0030009c0000012a0000213d00000024032000390000000f02000029000e0005002002180000000e04300029000000000014004b0000012a0000213d0000000801000029000000000010043f0000000e01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c70000801002000039000d00000003001d000c00000004001d56ae56a90000040f00000001002001900000012a0000613d000000000101043b000b00000001001d0000000e010000290000003f011000390000167801100197000000400200043d0000000001120019000a00000002001d000000000021004b00000000020000390000000102004039000015dd0010009c000002ae0000213d0000000100200190000002ae0000c13d000000400010043f0000000a010000290000000f030000290000000001310436000900000001001d0000000c05000029000000000050007c0000000d040000290000012a0000213d0000000f0000006b000010180000613d00000002010003670000000a02000029000000000341034f000000000303043b000015dc0030009c0000012a0000213d000000200220003900000000003204350000002004400039000000000054004b0000100f0000413d0000000801000029000000000010043f0000000a01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000015dc011001970000000002000411000000000012004b0000184c0000c13d0000000a010000290000000001010433000000000001004b000015900000613d0000000b01000029000700040010003d000c00010010003d000f00000000001d0000103e0000013d000000000101043b000000000201041a000016e302200197000000000021041b0000000f02000029000f00010020003d0000000a0100002900000000010104330000000f0010006b000015900000813d0000000f01000029000000050110021000000009011000290000000001010433000015dc01100197000e00000001001d000000000010043f0000000c01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000000002004b000010380000613d0000000b01000029000000000301041a000000000003004b00001fcf0000613d000000000032004b000d00000002001d000010940000613d000600000003001d000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000d020000290005000100200092000000000101043b0000000b03000029000000000203041a000000050020006c0000307b0000a13d0000000602000029000000010220008a0000000001120019000000000101041a000600000001001d000000000030043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b00000005011000290000000602000029000000000021041b000000000020043f0000000c01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000d02000029000000000021041b0000000b01000029000000000201041a000d00000002001d000000000002004b000024200000613d000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000d02000029000000010220008a000000000101043b0000000001210019000000000001041b0000000b01000029000000000021041b0000000e01000029000000000010043f0000000c01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000001041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d0200003900000004030000390000167904000041000000020500003900000008060000290000000e0700002956ae56a40000040f00000001002001900000012a0000613d0000000e01000029000000000010043f0000000701000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000010340000c13d0000012a0000013d000000440010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000f00000001001d000015dc0010009c0000012a0000213d0000002401800370000000000101043b000e00000001001d0000ffff0010008c0000012a0000213d00000000050004110000000f04000029000000000045004b000019530000613d0000162601000041000000000010043f0000000001000414000000040040008c000018d00000c13d0000001c0100043d000000000010043f00000001020000390000000103000031000018f50000013d000000440010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000016760010009c0000012a0000213d0000002402800370000000000202043b000f00000002001d000015dc0020009c0000012a0000213d000000000010043f0000000d010000390000133a0000013d000000a40010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000f00000001001d000015dc0010009c0000012a0000213d0000002401800370000000000101043b000e00000001001d000015dc0010009c0000012a0000213d0000006401800370000000000101043b000d00000001001d000015dc0010009c0000012a0000213d0000004401800370000000000101043b000c00000001001d0000008401800370000000000101043b000b00000001001d0000000f01000029000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000400100043d000000c003100039000000000023043500000080021000390000000b03000029000000000032043500000060021000390000000d03000029000000000032043500000040021000390000000c03000029000000000032043500000020021000390000000f030000290000000000320435000000c0030000390000000000310435000000a0031000390000000000030435000016850010009c000002ae0000213d000000e003100039000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000010043f0000000201000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000f00000001001d000016860100004100000000001004430000000001000414000017cc0000013d0000000001000416000000000001004b0000012a0000c13d0000000801000039000000000101041a0000167601100197000000800010043f0000166a01000041000056af0001042e000000440010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000f00000001001d000016760010009c0000012a0000213d0000002401800370000000000101043b000e00000001001d000015dc0010009c0000012a0000213d0000000e0000006b0000181b0000c13d000016bb01000041000000800010043f0000167501000041000056b000010430000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000016760010009c0000012a0000213d56ae46d40000040f000017410000013d000000440010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000f00000001001d000015dc0010009c0000012a0000213d0000002401800370000000000101043b000e00000001001d000015dc0010009c0000012a0000213d0000000e01000029000000000010043f0000000b01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000ff00100190000018110000c13d0000000f02000029000000010020008c000011bf0000c13d0000ff00001001900000138d0000c13d00000018011002700000167601100197000000000010043f0000000e01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000002000411000015dc02200197000000000020043f0000000401100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000ff0010019000000d340000613d0000000e01000029000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000f02000029000015de022001c7000000000021041b0000000e01000029000000000010043f000000200000043f000000000100041400001af90000013d000000440010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000800000002001d000016760020009c0000012a0000213d0000002402800370000000000202043b000015dd0020009c0000012a0000213d0000002303200039000000000013004b0000012a0000813d0000000403200039000000000338034f000000000303043b000f00000003001d000015dd0030009c0000012a0000213d00000024032000390000000f02000029000e0005002002180000000e04300029000000000014004b0000012a0000213d0000000801000029000000000010043f0000000d01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c70000801002000039000d00000003001d000c00000004001d56ae56a90000040f00000001002001900000012a0000613d000000000101043b000b00000001001d0000000e010000290000003f011000390000167801100197000000400200043d0000000001120019000a00000002001d000000000021004b00000000020000390000000102004039000015dd0010009c000002ae0000213d0000000100200190000002ae0000c13d000000400010043f0000000a010000290000000f030000290000000001310436000900000001001d0000000c05000029000000000050007c0000000d040000290000012a0000213d0000000f0000006b000012470000613d00000002010003670000000a02000029000000000341034f000000000303043b000015dc0030009c0000012a0000213d000000200220003900000000003204350000002004400039000000000054004b0000123e0000413d0000000801000029000000000010043f0000000a01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000015dc011001970000000002000411000000000012004b0000184c0000c13d0000000a010000290000000001010433000000000001004b000015900000613d0000000b01000029000700040010003d000c00010010003d000f00000000001d000012690000013d0000000f02000029000f00010020003d0000000a0100002900000000010104330000000f0010006b000015900000813d0000000f01000029000000050110021000000009011000290000000001010433000015dc01100197000e00000001001d000000000010043f0000000c01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000000002004b000012630000613d0000000b01000029000000000301041a000000000003004b00001fcf0000613d000000000032004b000d00000002001d000012bf0000613d000600000003001d000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000d020000290005000100200092000000000101043b0000000b03000029000000000203041a000000050020006c0000307b0000a13d0000000602000029000000010220008a0000000001120019000000000101041a000600000001001d000000000030043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b00000005011000290000000602000029000000000021041b000000000020043f0000000c01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000d02000029000000000021041b0000000b01000029000000000201041a000d00000002001d000000000002004b000024200000613d000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000d02000029000000010220008a000000000101043b0000000001210019000000000001041b0000000b01000029000000000021041b0000000e01000029000000000010043f0000000c01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000001041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d0200003900000004030000390000167904000041000000010500003900000008060000290000000e0700002956ae56a40000040f00000001002001900000012a0000613d0000000e01000029000000000010043f0000000701000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000016e302200197000000000021041b000012630000013d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000015dc0010009c0000012a0000213d000000000010043f0000000f01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000301041a000000400200043d000f00000002001d000d00000003001d0000000002320436000e00000002001d000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000d05000029000000000005004b000018fd0000c13d0000000e04000029000019060000013d000000440010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000016760010009c0000012a0000213d0000002402800370000000000202043b000f00000002001d000015dc0020009c0000012a0000213d000000000010043f0000000c01000039000000200010043f00000040020000390000000001000019000016740000013d000000440010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000016760010009c0000012a0000213d000000000010043f0000000d01000039000013630000013d000000440010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000015dc0010009c0000012a0000213d0000002402800370000000000202043b56ae47270000040f0000000001000019000056af0001042e000000440010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000016760010009c0000012a0000213d000000000010043f0000000c01000039000000200010043f00000040020000390000000001000019000f0000000803530000153c0000013d000000640010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000f00000001001d000015dc0010009c0000012a0000213d0000002401800370000000000101043b000e00000001001d000015dc0010009c0000012a0000213d0000000e01000029000000000010043f0000000b01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000ff00100190000018110000c13d0000000f02000029000000010020008c00001abf0000c13d0000ff000010019000001abf0000613d000000400100043d000016be0200004100001d7f0000013d000000c40010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000201043b0000002401800370000000000101043b000f00000001001d000015dc0010009c0000012a0000213d0000006401800370000000000101043b000e00000001001d000015dc0010009c0000012a0000213d0000008401800370000000000101043b000d00000001001d000016870010009c0000012a0000213d000000a401800370000000000101043b000c00000001001d000016a40010009c0000012a0000213d0000000001020019000b00000002001d56ae51260000040f00000044010000390000000201100367000000000301043b00000000060004110000000b010000290000000f020000290000000d040000290000000c050000290000000e0700002956ae51660000040f0000000001000019000056af0001042e000000440010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000800000002001d000016760020009c0000012a0000213d0000002402800370000000000202043b000015dd0020009c0000012a0000213d0000002303200039000000000013004b0000012a0000813d0000000403200039000000000338034f000000000303043b000c00000003001d000015dd0030009c0000012a0000213d000b00240020003d0000000c0200002900000005022002100000000b02200029000000000012004b0000012a0000213d0000000801000029000000000010043f0000000e01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000a00000001001d0000000801000029000000000010043f0000000a01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000015dc011001970000000002000411000000000012004b0000184c0000c13d0000000c0000006b000015900000613d0000000a01000029000700040010003d000d00010010003d000f00000000001d0000140a0000013d000000000101043b000000000201041a000016e30220019700000001022001bf000000000021041b0000000f020000290000000102200039000f00000002001d0000000c0020006c000015900000813d0000000f0100002900000005011002100000000b011000290000000201100367000000000301043b000015dc0030009c0000012a0000213d000000000030043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c70000801002000039000e00000003001d56ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000000001004b000014050000c13d0000000a02000029000000000102041a000015dd0010009c000002ae0000213d000900000001001d0000000101100039000000000012041b000000000020043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000000e020000290000012a0000613d000000000101043b0000000901100029000000000021041b0000000a01000029000000000101041a000900000001001d000000000020043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000902000029000000000021041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d0200003900000004030000390000167e04000041000000020500003900000008060000290000000e0700002956ae56a40000040f0000000e0100002900000001002001900000012a0000613d000000000010043f0000000701000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000014000000c13d0000012a0000013d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000015dc0010009c0000012a0000213d000000000010043f0000000701000039000000200010043f0000004002000039000000000100001956ae56710000040f000000000101041a000000800010043f0000166a01000041000056af0001042e0000000001000416000000000001004b0000012a0000c13d0000000101000039000000000101041a000f00000001001d0000000001000412001100000001001d001000000000003d000080050100003900000044030000390000000004000415000000110440008a0000000504400210000016720200004156ae56860000040f0000000101100039000000800010043f0000000f01000029000000a00010043f0000167301000041000056af0001042e000001640010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000f00000002001d000015dc0020009c0000012a0000213d000000a402800370000000000202043b000e00000002001d000015dc0020009c0000012a0000213d000000c402800370000000000202043b000c00000002001d000015dc0020009c0000012a0000213d0000014402800370000000000202043b000d00000002001d000015dd0020009c0000012a0000213d0000000d020000290000002302200039000000000012004b0000012a0000813d0000000d02000029000a00040020003d0000000a02800360000000000202043b000b00000002001d000015dd0020009c0000012a0000213d0000000d030000290000000b023000290000002402200039000000000012004b0000012a0000213d0000002401800370000000000101043b000600000001001d0000004401800370000000000101043b000700000001001d0000006401800370000000000101043b000800000001001d0000008401800370000000000101043b000900000001001d000000e401800370000000000101043b000300000001001d0000010401800370000000000101043b000400000001001d0000012401800370000000000101043b000500000001001d000000000010043f0000000401000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000ff001001900000165d0000613d0000167201000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000010110008a000000030010008c000015d10001a13e0000200e0000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000200000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000020010006b000026cd0000a13d0000000101000039000000000101041a000000100010019000000f870000c13d000026cd0000013d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000016760010009c0000012a0000213d56ae47ad0000040f0000000002010019000000400100043d000f00000001001d56ae43310000040f000017450000013d000000440010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000015dc0010009c0000012a0000213d000000000010043f0000000b01000039000000200010043f00000040020000390000000001000019000f00000008035356ae56710000040f000000000101041a00000018011002700000167601100197000000000010043f0000000c01000039000000200010043f0000000001000019000000400200003956ae56710000040f0000000f0200035f0000002402200370000000000202043b000000000020043f0000000501100039000000200010043f0000000001000019000000400200003956ae56710000040f000000000101041a000000ff001001900000000001000039000000010100c039000000800010043f0000166a01000041000056af0001042e000000440010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000800000002001d000015dc0020009c0000012a0000213d0000002402800370000000000202043b000015dd0020009c0000012a0000213d0000002303200039000000000013004b0000012a0000813d0000000403200039000000000338034f000000000303043b000c00000003001d000015dd0030009c0000012a0000213d000b00240020003d0000000c0200002900000005022002100000000b02200029000000000012004b0000012a0000213d0000000002000411000000080020006c00001ebb0000613d0000162601000041000000000010043f00000000010004140000000802000029000000040020008c00001bcf0000c13d0000001c0100043d000000000010043f0000000102000039000000010300003100001bf20000013d000000240010008c0000012a0000413d000000000100041a000015dc011001970000000002000411000000000021004b000017e00000c13d0000000401800370000000000101043b0000000103000039000000000203041a000000000013041b000000800020043f000000a00010043f0000000001000414000015d90010009c000015d901008041000000c001100210000016b6011001c70000800d02000039000016b70400004156ae56a40000040f00000001002001900000012a0000613d0000000001000019000056af0001042e000001440010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000002402800370000000000202043b000f00000002001d000015dc0020009c0000012a0000213d0000008402800370000000000202043b000e00000002001d000016870020009c0000012a0000213d000000a402800370000000000202043b000d00000002001d000015dc0020009c0000012a0000213d000000c402800370000000000202043b000c00000002001d000016a40020009c0000012a0000213d000000e402800370000000000202043b000b00000002001d000016a40020009c0000012a0000213d0000010402800370000000000202043b000900000002001d000015dc0020009c0000012a0000213d0000012402800370000000000202043b000a00000002001d000015dd0020009c0000012a0000213d0000000a020000290000002302200039000000000012004b0000012a0000813d0000000a02000029000700040020003d0000000702800360000000000202043b000800000002001d000015dd0020009c0000012a0000213d0000000a0300002900000008023000290000002402200039000000000012004b0000012a0000213d0000000401800370000000000101043b000600000001001d0000004401800370000000000101043b000400000001001d0000006401800370000000000101043b000500000001001d000016860100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000300000001001d0000000b0010006c00001dec0000213d0000000601000029000000140010008c000015eb0000613d0000000601000029000002d10010008c000015eb0000613d0000000601000029000004830010008c0000298f0000c13d0000000901000029000000000010043f0000000601000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b00000005020000290000000802200270000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000502000029000000ff0220018f000000010220020f000000000101043b000000000301041a000000000323013f000000000031041b000000000023017000002af80000c13d000000400100043d000016d80200004100001d7f0000013d000001840010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000f00000002001d000015dd0020009c0000012a0000213d0000000f020000290000002302200039000000000012004b0000012a0000813d0000000f020000290000000402200039000000000228034f000000000202043b000e00000002001d000015dd0020009c0000012a0000213d0000000f020000290000002403200039000d00000003001d0000000e02300029000000000012004b0000012a0000213d0000008401800370000000000101043b000c00000001001d000015dc0010009c0000012a0000213d000000c401800370000000000101043b000b00000001001d000015dc0010009c0000012a0000213d000000e401800370000000000101043b000a00000001001d000015dc0010009c0000012a0000213d0000012401800370000000000101043b000900000001001d000016a40010009c0000012a0000213d000000a401800370000000000101043b000700000001001d0000010401800370000000000101043b000500000001001d0000014401800370000000000101043b000800000001001d0000016401800370000000000101043b000600000001001d000000000010043f0000000501000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000ff0010019000001fd50000c13d000000400100043d000016d30200004100001d7f0000013d0000000002000416000000000002004b0000012a0000c13d56ae46450000040f000f00000002001d000015dc01100197000000000010043f0000000b01000039000000200010043f0000004002000039000000000100001956ae56710000040f000000000101041a00000018011002700000167601100197000000000010043f0000000c01000039000000200010043f0000000001000019000000400200003956ae56710000040f00000004011000390000000f0200002956ae46c40000040f000000000101041a000000ff001001900000000001000039000000010100c039000000400200043d0000000000120435000015d90020009c000015d902008041000000400120021000001680011001c7000056af0001042e000000440010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000800000002001d000016760020009c0000012a0000213d0000002402800370000000000202043b000015dd0020009c0000012a0000213d0000002303200039000000000013004b0000012a0000813d0000000403200039000000000338034f000000000303043b000c00000003001d000015dd0030009c0000012a0000213d000b00240020003d0000000c0200002900000005022002100000000b02200029000000000012004b0000012a0000213d0000000801000029000000000010043f0000000c01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000a00000001001d0000000801000029000000000010043f0000000a01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000015dc011001970000000002000411000000000012004b0000184c0000c13d0000000c0000006b000015900000613d0000000a01000029000700040010003d000d00010010003d000f00000000001d000016d30000013d000000000101043b000000000201041a000016e30220019700000001022001bf000000000021041b0000000f020000290000000102200039000f00000002001d0000000c0020006c000015900000813d0000000f0100002900000005011002100000000b011000290000000201100367000000000301043b000015dc0030009c0000012a0000213d000000000030043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c70000801002000039000e00000003001d56ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000000001004b000016ce0000c13d0000000a02000029000000000102041a000015dd0010009c000002ae0000213d000900000001001d0000000101100039000000000012041b000000000020043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000000e020000290000012a0000613d000000000101043b0000000901100029000000000021041b0000000a01000029000000000101041a000900000001001d000000000020043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000902000029000000000021041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d0200003900000004030000390000167e04000041000000000500001900000008060000290000000e0700002956ae56a40000040f0000000e0100002900000001002001900000012a0000613d000000000010043f0000000701000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000016c90000c13d0000012a0000013d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000015dc0010009c0000012a0000213d000000000010043f0000000b01000039000000200010043f0000004002000039000000000100001956ae56710000040f000000000101041a0000001801100270000016760110019756ae4c950000040f0000000002010019000000400100043d000f00000001001d56ae430b0000040f0000000f020000290000000001210049000015d90010009c000015d9010080410000006001100210000015d90020009c000015d9020080410000004002200210000000000121019f000056af0001042e0000000002000416000000000002004b0000012a0000c13d56ae431b0000040f56ae492f0000040f0000000001000019000056af0001042e000000c40010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000f00000001001d000015dc0010009c0000012a0000213d0000002401800370000000000101043b000e00000001001d000015dc0010009c0000012a0000213d0000006401800370000000000101043b000d00000001001d000015dc0010009c0000012a0000213d000000a401800370000000000101043b000a00000001001d0000008401800370000000000101043b000b00000001001d0000004401800370000000000101043b000c00000001001d0000000f01000029000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000400100043d000000c0031000390000000000230435000000a0021000390000000a03000029000000000032043500000080021000390000000b03000029000000000032043500000060021000390000000d03000029000000000032043500000040021000390000000c03000029000000000032043500000020021000390000000f030000290000000000320435000000c0030000390000000000310435000016850010009c000002ae0000213d000000e003100039000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000010043f0000000301000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000f00000001001d000016860100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000f05000029000000d002500270000000400300043d0000002004300039000000000024043500000008045002700000168704400197000000000012004b0000000004004019000000000043043500000c520000013d000016d001000041000000800010043f0000167501000041000056b000010430000000000010043f0000000a01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000015dc011001970000000002000411000000000012004b0000184c0000c13d0000000f01000029000000000010043f0000000a01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000015e102200197000000000021041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d020000390000000303000039000015ec040000410000000f0500002900000df30000013d000000400100043d000016db0200004100001d7f0000013d000000000002004b0000154a0000613d000016e10020009c000000000100c019000000800010043f0000166a01000041000056af0001042e0000000f01000029000000000001004b000004360000613d000000000010043f0000000a01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000015dc011001970000000002000411000000000012004b0000184c0000c13d0000000f01000029000000000010043f0000000a01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000015e1022001970000000e06000029000000000262019f000000000021041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d020000390000000303000039000015ec0400004100001b2e0000013d000000400100043d000016e20200004100001d7f0000013d000015e101100197000000000161019f000000000010041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d020000390000000303000039000015e3040000410000158d0000013d000b00000005001d000c00000003001d000000140040008c000018630000613d000002d10040008c000018630000613d000004830040008c00001b720000c13d000a00000004001d0000000f01000029000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000400100043d000000c0031000390000000000230435000000a0021000390000000c03000029000000000032043500000080021000390000000b03000029000000000032043500000060021000390000000d03000029000000000032043500000040021000390000000a03000029000000000032043500000020021000390000000f030000290000000000320435000000c0030000390000000000310435000016850010009c000002ae0000213d000000e003100039000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000010043f0000000301000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000ff0020019000002ade0000c13d0000000202000039000000000021041b0000000101000039000000400200043d0000000000120435000015d90020009c000015d90200804100000040012002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f00001670011001c70000800d020000390000000403000039000016a7040000410000000c050000290000000f060000290000000e070000290000158d0000013d000015d90010009c000015d901008041000000c0011002100000166b011001c7000000000204001956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000018e40000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000018e00000c13d000000000005004b000018f10000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000f0400002900000000050004110000000100200190000019500000613d000000200030008c0000000001000019000019510000413d000000000100043d000015dc01100197000019510000013d000000000101043b00000000020000190000000e04000029000000000301041a000000000434043600000001011000390000000102200039000000000052004b000019000000413d0000000f01000029000000000214004956ae479b0000040f000000400100043d000e00000001001d0000000f0200002956ae430b0000040f0000000e02000029000017460000013d000015d90010009c000015d901008041000000c0011002100000166b011001c7000000000204001956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000019230000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000191f0000c13d000000000005004b000019300000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000f040000290000000005000411000000010020019000001b070000613d000000200030008c000000000100001900001b080000413d000000000100043d000015dc0110019700001b080000013d000015d90010009c000015d901008041000000c001100210000015e2011001c700008009020000390000000e03000029000000000500001956ae56a40000040f000d00010020019300030000000103550000006001100270000115d90010019d000015d901100197000000000001004b000019880000c13d0000000d0000006b000015900000c13d000000400100043d000016b80200004100001d7f0000013d0000000001000019000000000015004b000019780000c13d000000000040043f0000000b01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000e030000290000ffff0230018f00000098033002100000166e03300197000000000101043b000000000401041a0000166f04400197000000000334019f000000000031041b000000400100043d0000000000210435000015d90010009c000015d90100804100000040011002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f00001670011001c70000800d02000039000000020300003900001671040000410000000f050000290000158d0000013d000000400100043d0000006002100039000000400020043f000000400210003900000000005204350000166c02000041000000000221043600000000000204350000001c021000390000000001000414000000040040008c000019af0000c13d0000000001020433000000000010043f0000000102000039000019d70000013d0000001f03100039000016e4033001970000003f03300039000016e404300197000000400300043d0000000004430019000000000034004b00000000050000390000000105004039000015dd0040009c000002ae0000213d0000000100500190000002ae0000c13d000000400040043f0000000005130436000016e4021001980000001f0310018f00000000012500190000000304000367000019a10000613d000000000604034f000000006706043c0000000005750436000000000015004b0000199d0000c13d000000000003004b0000194b0000613d000000000224034f0000000303300210000000000401043300000000043401cf000000000434022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000242019f00000000002104350000194b0000013d000015d90020009c000015d9020080410000004002200210000015d90010009c000015d901008041000000c001100210000000000121019f0000166d011001c7000000000204001956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000019c70000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000019c30000c13d000000000005004b000019d40000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000f04000029000000010020019000001b6f0000613d000000200030008c00001b6f0000413d000000000100043d000000000001004b000019530000c13d00001b6f0000013d000800000004001d000000000040043f0000000a01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000002000411000015dc02200197000000000101043b000000000301041a000015e103300197000000000223019f000000000021041b0000002002000039000000400100043d00000000022104360000000f030000290000000000320435000016e4053001980000001f0630018f000000400310003900000000045300190000000e070000290000002007700039000000020770036700001a060000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b00001a020000c13d000000000006004b00001a130000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f00000000005404350000000f04000029000000000343001900000000000304350000001f03400039000016e4023001970000167c0020009c0000167c020080410000006002200210000015d90010009c000015d9010080410000004001100210000000000112019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000121019f0000167d0110009a0000800d020000390000000203000039000015eb04000041000000080500002956ae56a40000040f00000001002001900000012a0000613d0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d020000390000000303000039000015ec040000410000000805000029000000000600041156ae56a40000040f00000001002001900000012a0000613d0000000d01000029000000000010043f0000000c01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000a00000001001d0000000d01000029000000000010043f0000000d01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000700000001001d0000000d01000029000000000010043f0000000e01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000400000001001d0000000801000029000000000010043f0000000c01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000c00000001001d0000000801000029000000000010043f0000000d01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000600000001001d0000000801000029000000000010043f0000000e01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000300000001001d0000000a01000029000000000101041a000900000001001d000000000001004b00002be10000c13d0000000a010000290000000201100039000a00000001001d000000000101041a000900000001001d000000000001004b00002d3f0000c13d0000000701000029000000000101041a000b00000001001d000000000001004b00002db60000c13d00000007010000290000000201100039000a00000001001d000000000101041a000900000001001d000000000001004b00002f150000c13d0000000401000029000000000101041a000b00000001001d000000000001004b00002f8c0000c13d00000004010000290000000201100039000a00000001001d000000000101041a000900000001001d000000000001004b000030040000c13d000000400100043d00000008020000290000000000210435000015d90010009c000015d901008041000000400110021000001680011001c7000056af0001042e00000018011002700000167601100197000000000010043f0000000e01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000002000411000015dc02200197000000000020043f0000000401100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000ff0010019000000d340000613d00000044010000390000000201100367000000000101043b000d00000001001d0000000e01000029000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000f02000029000000000021041b0000000e01000029000000000010043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b00000004011002700000000f02000029000000000021041b0000000001000019000056af0001042e0000000001000019000000000015004b00001b300000c13d0000000801000039000000000101041a00001676011001970000000e0010006b00001b120000a13d000000400100043d000016810200004100001d7f0000013d000000000040043f0000000b01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000e060000290000001802600210000016ab02200197000000000101043b000000000301041a000016ac03300197000000000223019f000000000021041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d020000390000000303000039000016ad040000410000000f050000290000158d0000013d000000400100043d0000006002100039000000400020043f000000400210003900000000005204350000166c02000041000000000221043600000000000204350000001c021000390000000001000414000000040040008c00001b400000c13d0000000001020433000000000010043f000000010200003900001b680000013d000015d90020009c000015d9020080410000004002200210000015d90010009c000015d901008041000000c001100210000000000121019f0000166d011001c7000000000204001956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000001b580000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00001b540000c13d000000000005004b00001b650000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000f04000029000000010020019000001b6f0000613d000000200030008c00001b6f0000413d000000000100043d000000000001004b00001b0a0000c13d000000400100043d000016c50200004100001d7f0000013d000016b501000041000000800010043f0000167501000041000056b0000104300000000f01000029000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000001041b0000000f01000029000000000010043f000000200000043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000401100270000000000001041b0000000001000019000056af0001042e00000000020004110000000f0020006c000020580000613d0000162601000041000000000010043f00000000010004140000000f02000029000000040020008c00001fa40000c13d0000001c0100043d000000000010043f0000000102000039000000010300003100001fc70000013d000015d90010009c000015d901008041000000c0011002100000166b011001c7000000080200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000001bb80000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00001bb40000c13d000000000005004b00001bc50000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f0003000000010355000000010020019000001def0000613d000000200030008c000000000100001900001df00000413d000000000100043d000015dc0110019700001df00000013d000015d90010009c000015d901008041000000c0011002100000166b011001c7000000080200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000001be30000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00001bdf0000c13d000000000005004b00001bf00000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f0003000000010355000000010020019000001eb70000613d000000200030008c000000000100001900001eb80000413d000000000100043d000015dc0110019700001eb80000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000b00000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000b0010006b00001d7d0000a13d0000000101000039000000000101041a000000040010019000001d7d0000613d0000000f01000029000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000400100043d000000c003100039000000000023043500000060021000390000000d03000029000000000032043500000040021000390000001403000039000000000032043500000020021000390000000f030000290000000000320435000000c0030000390000000000310435000000a003100039000000000003043500000080031000390000000000030435000016850010009c000002ae0000213d000000e003100039000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000010043f0000000201000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000002000411000000000101043b000015dc02200197000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000a00000001001d000000000101041a000b00000001001d000016860100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000b02000029000000d002200270000000000012004b00001dec0000413d0000000b01000029000000080110027000001687021001970000000c0020006c000029950000413d000016870020009c00001c930000613d0000000c0110006a000000080110021000001688011001970000000a03000029000000000203041a0000168902200197000000000112019f000000000013041b0000000d010000290000000f020000290000000e030000290000000c0400002956ae4d3f0000040f000000000001004b00000bf30000613d0000000c0000006b00000bf30000613d0000000a02000029000000000202041a0000168803200197000016880030009c00000bf30000613d0000000c030000290000000803300210000000000332001900001688033001970000168902200197000000000223019f00002af50000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000a00000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000a0010006b00001d7d0000a13d0000000101000039000000000101041a000000020010019000001d7d0000613d0000000f01000029000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000400100043d000000c003100039000000000023043500000080021000390000000c03000029000000000032043500000060021000390000000d03000029000000000032043500000040021000390000048303000039000000000032043500000020021000390000000f030000290000000000320435000000c0030000390000000000310435000000a0031000390000000000030435000016850010009c000002ae0000213d000000e003100039000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000010043f0000000201000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000002000411000000000101043b000015dc02200197000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000900000001001d000000000101041a000a00000001001d000016860100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000a02000029000000d002200270000000000012004b00001dec0000413d0000000a01000029000000080110027000001687021001970000000b0020006c000029950000413d000016870020009c00001d420000613d0000000b0110006a000000080110021000001688011001970000000903000029000000000203041a0000168902200197000000000112019f000000000013041b0000000d010000290000000f020000290000000e030000290000000c040000290000000b0500002956ae4cd80000040f000000000001004b00000bf30000613d0000000b0000006b00000bf30000613d0000000902000029000000000202041a0000168803200197000016880030009c00000bf30000613d0000000b030000290000000803300210000000000332001900001688033001970000168902200197000000000223019f000000090300002900002af60000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000b00000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000b0010006b00001d7d0000a13d0000000101000039000000000101041a000000010010019000001d850000c13d000000400100043d000016d4020000410000000000210435000015d90010009c000015d9010080410000004001100210000015f1011001c7000056b0000104300000000f01000029000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000400100043d000000c003100039000000000023043500000080021000390000000c03000029000000000032043500000060021000390000000d0300002900000000003204350000004002100039000002d103000039000000000032043500000020021000390000000f030000290000000000320435000000c0030000390000000000310435000000a0031000390000000000030435000016850010009c000002ae0000213d000000e003100039000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000010043f0000000201000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000002000411000000000101043b000015dc02200197000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000a00000001001d000000000101041a000b00000001001d000016860100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000b02000029000000d002200270000000000012004b000029920000813d000000400100043d000016d20200004100001d7f0000013d00000000010000190000000004000411000000000014004b00001ea60000c13d0000000801000029000000000010043f0000000f01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000b00000001001d0000000a0000006b000015900000613d0000000b01000029000700020010003d000c00010010003d000e00000000001d00001e120000013d000000000101043b000000000201041a000016e302200197000000000021041b0000000e020000290000000102200039000e00000002001d0000000a0020006c000015900000813d0000000e01000029000000050110021000000009011000290000000201100367000000000101043b000f00000001001d000015dc0010009c0000012a0000213d0000000f01000029000000000010043f0000000c01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000000002004b00001e0d0000613d0000000b01000029000000000301041a000000000003004b00001fcf0000613d000000000032004b000d00000002001d00001e6b0000613d000600000003001d000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000d020000290005000100200092000000000101043b0000000b03000029000000000203041a000000050020006c0000307b0000a13d0000000602000029000000010220008a0000000001120019000000000101041a000600000001001d000000000030043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b00000005011000290000000602000029000000000021041b000000000020043f0000000c01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000d02000029000000000021041b0000000b01000029000000000201041a000d00000002001d000000000002004b000024200000613d000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000d02000029000000010220008a000000000101043b0000000001210019000000000001041b0000000b01000029000000000021041b0000000f01000029000000000010043f0000000c01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000001041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d020000390000000303000039000016770400004100000008050000290000000f0600002956ae56a40000040f00000001002001900000012a0000613d0000000f01000029000000000010043f0000000701000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000001e090000c13d0000012a0000013d000000400100043d0000006002100039000000400020043f000000400210003900000000004204350000166c02000041000000000221043600000000000204350000001c0210003900000000010004140000000804000029000000040040008c00001f460000c13d0000000001020433000000000010043f000000010200003900001f6d0000013d00000000010000190000000004000411000000000014004b00001f350000c13d0000000801000029000000000010043f0000000f01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000a00000001001d0000000c0000006b000015900000613d0000000a01000029000700020010003d000d00010010003d000f00000000001d00001edb0000013d000000000101043b000000000201041a000016e30220019700000001022001bf000000000021041b0000000f020000290000000102200039000f00000002001d0000000c0020006c000015900000813d0000000f0100002900000005011002100000000b011000290000000201100367000000000301043b000015dc0030009c0000012a0000213d000000000030043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c70000801002000039000e00000003001d56ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000000001004b00001ed60000c13d0000000a02000029000000000102041a000015dd0010009c000002ae0000213d000900000001001d0000000101100039000000000012041b000000000020043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000000e020000290000012a0000613d000000000101043b0000000901100029000000000021041b0000000a01000029000000000101041a000900000001001d000000000020043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000902000029000000000021041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d020000390000000303000039000016b90400004100000008050000290000000e0600002956ae56a40000040f0000000e0100002900000001002001900000012a0000613d000000000010043f0000000701000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000001ed10000c13d0000012a0000013d000000400100043d0000006002100039000000400020043f000000400210003900000000004204350000166c02000041000000000221043600000000000204350000001c0210003900000000010004140000000804000029000000040040008c00001f750000c13d0000000001020433000000000010043f000000010200003900001f9c0000013d000015d90020009c000015d9020080410000004002200210000015d90010009c000015d901008041000000c001100210000000000121019f0000166d011001c7000000080200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000001f5e0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00001f5a0000c13d000000000005004b00001f6b0000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f0003000000010355000000010020019000001b6f0000613d000000200030008c00001b6f0000413d000000000100043d000000000001004b00001b6f0000613d00001df30000013d000015d90020009c000015d9020080410000004002200210000015d90010009c000015d901008041000000c001100210000000000121019f0000166d011001c7000000080200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000001f8d0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00001f890000c13d000000000005004b00001f9a0000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f0003000000010355000000010020019000001b6f0000613d000000200030008c00001b6f0000413d000000000100043d000000000001004b00001b6f0000613d00001ebb0000013d000015d90010009c000015d901008041000000c0011002100000166b011001c70000000f0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000001fb80000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00001fb40000c13d000000000005004b00001fc50000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000020140000613d000000200030008c0000000001000019000020150000413d000000000100043d000015dc01100197000020150000013d000016ce01000041000000000010043f0000001101000039000000040010043f000016cf01000041000056b0000104300000167201000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000010110008a000000030010008c000015c90001a13e0000200e0000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000400000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000040010006b000029860000a13d0000000101000039000000000101041a000000400010019000000f870000c13d000029860000013d000016ce01000041000000000010043f0000005101000039000000040010043f000016cf01000041000056b00001043000000000010000190000000002000411000000000012004b000020580000613d000000400100043d0000006002100039000000400020043f0000004002100039000000000400041100000000004204350000166c02000041000000000221043600000000000204350000001c0210003900000000010004140000000f04000029000000040040008c0000202a0000c13d0000000001020433000000000010043f0000000102000039000020510000013d000015d90020009c000015d9020080410000004002200210000015d90010009c000015d901008041000000c001100210000000000121019f0000166d011001c70000000f0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000020420000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000203e0000c13d000000000005004b0000204f0000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f0003000000010355000000010020019000001b6f0000613d000000200030008c00001b6f0000413d000000000100043d000000000001004b00001b6f0000613d0000000f01000029000000000010043f0000000b01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000e020000290000001002200210000016c602200197000000000101043b000000000301041a000016c703300197000000000223019f000000000021041b0000000f01000029000000000010043f0000000b01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000016e3022001970000000d022001af000000000021041b0000000f01000029000000000010043f0000000b01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000016e6022001970000000c0000006b000001000220c1bf000000000021041b0000000f01000029000000000010043f0000000b01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000b0000006b000016c8020000410000000002006019000000000101043b000000000301041a000016c903300197000000000223019f000000000021041b000000400100043d0000000a020000290000000000210435000015d90010009c000015d90100804100000040011002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f00001670011001c70000800d020000390000000203000039000016ca040000410000000f0500002956ae56a40000040f00000001002001900000012a0000613d000000400100043d00000020021000390000000c0300002900000000003204350000000d020000290000000000210435000015d90010009c000015d90100804100000040011002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e8011001c70000800d020000390000000203000039000016cb040000410000000f0500002956ae56a40000040f00000001002001900000012a0000613d000000400100043d0000000b020000290000000000210435000015d90010009c000015d90100804100000040011002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f00001670011001c70000800d020000390000000203000039000016cc0400004100001b2e0000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000400000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000040010006b00001d7d0000a13d0000000101000039000000000101041a000000100010019000001d7d0000613d0000000e01000029000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000400100043d00000120031000390000000000230435000001000210003900000009030000290000000000320435000000c00210003900000007030000290000000000320435000000a0021000390000000803000029000000000032043500000080021000390000000603000029000000000032043500000060021000390000000f030000290000000000320435000000400210003900000483030000390000000000320435000000e0021000390000000003000411000000000032043500000020021000390000169703000041000000000032043500000120030000390000000000310435000016980010009c000002ae0000213d0000014003100039000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000400000001001d0000167201000041000000000010044300000000010004120000000400100443000000a00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000300000001001d000015df0100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000200000001001d000000030010006c00002c580000c13d0000167201000041000000000010044300000000010004120000000400100443000000800100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000400200043d0000002203200039000000040400002900000000004304350000169903000041000000000032043500000002032000390000000000130435000015d90020009c000015d90200804100000040012002100000000002000414000015d90020009c000015d902008041000000c002200210000000000121019f0000169a011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000400000001001d000016860100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000090010006c0000423d0000213d0000000802000029000000050020006b0000241d0000213d0000000e01000029000000000010043f0000000601000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b00000007020000290000000802200270000900000002001d000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000702000029000000ff0220018f0008000100200217000000000101043b000000000201041a000000080220014f000000000021041b00000008002001800000160f0000613d0000000b01000029000000400010008c000032430000613d0000000b01000029000000410010008c000032790000c13d0000000d01000029000d00440010003d00000002020003670000000d01200360000000000101043b0000169c0010009c000034410000a13d0000169e0100004100000000001004430000000e0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d0000004402100039000000410300003900000000003204350000002402100039000000400300003900000000003204350000169f020000410000000000210435000000040210003900000004030000290000000000320435000000a40410003900000064031000390000000d02000029000000200220008a0000000202200367000000000502034f0000000006030019000000005705043c0000000006760436000000000046004b000021f50000c13d00000040033000390000000004030433000016a1044001970000004002200370000000000202043b000016a202200197000000000242019f0000000000230435000000c402100039000000400020043f00000000020004140000000e03000029000000040030008c000032740000613d000015d90020009c000015d902008041000000c002200210000015d90010009c000015d9010080410000004001100210000000000121019f000016a3011001c70000000e0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000003b6d0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000221b0000c13d00003b6d0000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000600000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000060010006b00001d7d0000a13d0000000101000039000000000101041a000000080010019000001d7d0000613d0000000e01000029000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000400100043d0000012003100039000000000023043500000100021000390000000d030000290000000000320435000000c0021000390000000c030000290000000000320435000000a0021000390000000103000039000600000003001d000000000032043500000080021000390000000b03000029000000000032043500000060021000390000000f0300002900000000003204350000004002100039000002d1030000390000000000320435000000e0021000390000000003000411000000000032043500000020021000390000169703000041000000000032043500000120030000390000000000310435000016980010009c000002ae0000213d0000014003100039000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000500000001001d0000167201000041000000000010044300000000010004120000000400100443000000a00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000400000001001d000015df0100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000300000001001d000000040010006c00002ca50000c13d0000167201000041000000000010044300000000010004120000000400100443000000800100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000400200043d0000002203200039000000050400002900000000004304350000169903000041000000000032043500000002032000390000000000130435000015d90020009c000015d90200804100000040012002100000000002000414000015d90020009c000015d902008041000000c002200210000000000121019f0000169a011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000500000001001d000016860100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000d0010006c0000423d0000213d0000000e01000029000000000010043f0000000601000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000c020000290000000802200270000d00000002001d000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000c02000029000000ff0220018f000c000100200217000000000101043b000000000201041a0000000c0220014f000000000021041b0000000c002001800000160f0000613d0000000801000029000000400010008c0000314e0000613d0000000801000029000000410010008c000031840000c13d0000000a01000029000a00440010003d00000002020003670000000a01200360000000000101043b0000169c0010009c000032be0000a13d0000169e0100004100000000001004430000000e0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d0000004402100039000000410300003900000000003204350000002402100039000000400300003900000000003204350000169f020000410000000000210435000000040210003900000005030000290000000000320435000000a40410003900000064031000390000000a02000029000000200220008a0000000202200367000000000502034f0000000006030019000000005705043c0000000006760436000000000046004b000023330000c13d00000040033000390000000004030433000016a1044001970000004002200370000000000202043b000016a202200197000000000242019f0000000000230435000000c402100039000000400020043f00000000020004140000000e03000029000000040030008c0000317f0000613d000015d90020009c000015d902008041000000c002200210000015d90010009c000015d9010080410000004001100210000000000121019f000016a3011001c70000000e0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000038af0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000023590000c13d000038af0000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000500000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000050010006b00001d7d0000a13d0000000101000039000000000101041a000000200010019000001d7d0000613d0000000e01000029000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000400100043d0000012003100039000000000023043500000100021000390000000d030000290000000000320435000000e00210003900000000030004110000000000320435000000c0021000390000000b030000290000000000320435000000a0021000390000000c03000029000000000032043500000060021000390000000f0300002900000000003204350000004002100039000000140300003900000000003204350000002002100039000016970300004100000000003204350000012003000039000000000031043500000080031000390000000000030435000016980010009c000002ae0000213d0000014003100039000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000500000001001d0000167201000041000000000010044300000000010004120000000400100443000000a00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000400000001001d000015df0100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000300000001001d000000040010006c00002cf20000c13d0000167201000041000000000010044300000000010004120000000400100443000000800100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000400200043d0000002203200039000000050400002900000000004304350000169903000041000000000032043500000002032000390000000000130435000015d90020009c000015d90200804100000040012002100000000002000414000015d90020009c000015d902008041000000c002200210000000000121019f0000169a011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000500000001001d000016860100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000d0010006c0000423d0000213d0000000c02000029000000080020006b000030810000a13d000000400100043d000016d90200004100001d7f0000013d000016ce01000041000000000010043f0000003101000039000000040010043f000016cf01000041000056b00001043000001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000400000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000040010006b00001d7d0000a13d0000000101000039000000000101041a000000080010019000001d7d0000613d0000000e01000029000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000400100043d00000140031000390000000504000029000000000043043500000120031000390000000000230435000001000210003900000009030000290000000000320435000000c00210003900000008030000290000000000320435000000a0021000390000000103000039000500000003001d000000000032043500000080021000390000000703000029000000000032043500000060021000390000000f0300002900000000003204350000004002100039000002d1030000390000000000320435000000e0021000390000000003000411000000000032043500000020021000390000000603000029000000000032043500000140030000390000000000310435000016900010009c000002ae0000213d0000016003100039000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000600000001001d0000167201000041000000000010044300000000010004120000000400100443000000a00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000400000001001d000015df0100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000300000001001d000000040010006c00002e2e0000c13d0000167201000041000000000010044300000000010004120000000400100443000000800100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000400200043d0000002203200039000000060400002900000000004304350000169903000041000000000032043500000002032000390000000000130435000015d90020009c000015d90200804100000040012002100000000002000414000015d90020009c000015d902008041000000c002200210000000000121019f0000169a011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000600000001001d000016860100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000090010006c0000423d0000213d0000000e01000029000000000010043f0000000601000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b00000008020000290000000802200270000900000002001d000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000802000029000000ff0220018f0008000100200217000000000101043b000000000201041a000000080220014f000000000021041b00000008002001800000160f0000613d0000000b01000029000000400010008c000034840000613d0000000b01000029000000410010008c000034ba0000c13d0000000d01000029000d00440010003d00000002020003670000000d01200360000000000101043b0000169c0010009c0000368d0000a13d0000169e0100004100000000001004430000000e0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d0000004402100039000000410300003900000000003204350000002402100039000000400300003900000000003204350000169f020000410000000000210435000000040210003900000006030000290000000000320435000000a40410003900000064031000390000000d02000029000000200220008a0000000202200367000000000502034f0000000006030019000000005705043c0000000006760436000000000046004b0000253c0000c13d00000040033000390000000004030433000016a1044001970000004002200370000000000202043b000016a202200197000000000242019f0000000000230435000000c402100039000000400020043f00000000020004140000000e03000029000000040030008c000034b50000613d000015d90020009c000015d902008041000000c002200210000015d90010009c000015d9010080410000004001100210000000000121019f000016a3011001c70000000e0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000003cc20000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000025620000c13d00003cc20000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000300000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000030010006b00001d7d0000a13d0000000101000039000000000101041a000000200010019000001d7d0000613d0000000e01000029000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000400100043d00000140031000390000000504000029000000000043043500000120031000390000000000230435000001000210003900000009030000290000000000320435000000e00210003900000000030004110000000000320435000000c00210003900000007030000290000000000320435000000a0021000390000000803000029000000000032043500000060021000390000000f0300002900000000003204350000004002100039000000140300003900000000003204350000002002100039000000060300002900000000003204350000014003000039000000000031043500000080031000390000000000030435000016900010009c000002ae0000213d0000016003100039000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000600000001001d0000167201000041000000000010044300000000010004120000000400100443000000a00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000500000001001d000015df0100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000300000001001d000000050010006c00002e7b0000c13d0000167201000041000000000010044300000000010004120000000400100443000000800100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000400200043d0000002203200039000000060400002900000000004304350000169903000041000000000032043500000002032000390000000000130435000015d90020009c000015d90200804100000040012002100000000002000414000015d90020009c000015d902008041000000c002200210000000000121019f0000169a011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000600000001001d000016860100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000090010006c0000423d0000213d0000000802000029000000040020006b0000241d0000213d0000000e01000029000000000010043f0000000601000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b00000007020000290000000802200270000900000002001d000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000702000029000000ff0220018f0008000100200217000000000101043b000000000201041a000000080220014f000000000021041b00000008002001800000160f0000613d0000000b01000029000000400010008c000036d00000613d0000000b01000029000000410010008c000037060000c13d0000000d01000029000d00440010003d00000002020003670000000d01200360000000000101043b0000169c0010009c000039300000a13d0000169e0100004100000000001004430000000e0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d0000004402100039000000410300003900000000003204350000002402100039000000400300003900000000003204350000169f020000410000000000210435000000040210003900000006030000290000000000320435000000a40410003900000064031000390000000d02000029000000200220008a0000000202200367000000000502034f0000000006030019000000005705043c0000000006760436000000000046004b0000267e0000c13d00000040033000390000000004030433000016a1044001970000004002200370000000000202043b000016a202200197000000000242019f0000000000230435000000c402100039000000400020043f00000000020004140000000e03000029000000040030008c000037010000613d000015d90020009c000015d902008041000000c002200210000015d90010009c000015d9010080410000004001100210000000000121019f000016a3011001c70000000e0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000003e960000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000026a40000c13d00003e960000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000200000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000020010006b00001d7d0000a13d0000000101000039000000000101041a000000100010019000001d7d0000613d0000000e01000029000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000400100043d00000140031000390000000404000029000000000043043500000120031000390000000000230435000001000210003900000009030000290000000000320435000000c00210003900000007030000290000000000320435000000a0021000390000000803000029000000000032043500000080021000390000000603000029000000000032043500000060021000390000000f030000290000000000320435000000400210003900000483030000390000000000320435000000e0021000390000000003000411000000000032043500000020021000390000000503000029000000000032043500000140030000390000000000310435000016900010009c000002ae0000213d0000016003100039000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000500000001001d0000167201000041000000000010044300000000010004120000000400100443000000a00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000400000001001d000015df0100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000200000001001d000000040010006c00002ec80000c13d0000167201000041000000000010044300000000010004120000000400100443000000800100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000400200043d0000002203200039000000050400002900000000004304350000169903000041000000000032043500000002032000390000000000130435000015d90020009c000015d90200804100000040012002100000000002000414000015d90020009c000015d902008041000000c002200210000000000121019f0000169a011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000500000001001d000016860100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000090010006c0000423d0000213d0000000802000029000000030020006b0000241d0000213d0000000e01000029000000000010043f0000000601000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b00000007020000290000000802200270000900000002001d000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000702000029000000ff0220018f0008000100200217000000000101043b000000000201041a000000080220014f000000000021041b00000008002001800000160f0000613d0000000b01000029000000400010008c0000374b0000613d0000000b01000029000000410010008c000037810000c13d0000000d01000029000d00440010003d00000002020003670000000d01200360000000000101043b0000169c0010009c000039730000a13d0000169e0100004100000000001004430000000e0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d0000004402100039000000410300003900000000003204350000002402100039000000400300003900000000003204350000169f020000410000000000210435000000040210003900000005030000290000000000320435000000a40410003900000064031000390000000d02000029000000200220008a0000000202200367000000000502034f0000000006030019000000005705043c0000000006760436000000000046004b000027c10000c13d00000040033000390000000004030433000016a1044001970000004002200370000000000202043b000016a202200197000000000242019f0000000000230435000000c402100039000000400020043f00000000020004140000000e03000029000000040030008c0000377c0000613d000015d90020009c000015d902008041000000c002200210000015d90010009c000015d9010080410000004001100210000000000121019f000016a3011001c70000000e0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000003eea0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000027e70000c13d00003eea0000013d000015f0010000410000000d020000290000000000120435000015d90020009c000015d9020080410000004001200210000015f1011001c7000056b00001043000001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000500000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000050010006b00001d7d0000a13d0000000101000039000000000101041a000000800010019000001d7d0000613d00000024010000390000000201100367000000000101043b000500000001001d000016870010009c0000298c0000213d0000000b01000029000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000400100043d000000c0031000390000000000230435000000a0021000390000000803000029000000000032043500000060021000390000000c03000029000000000032043500000040021000390000001403000039000000000032043500000020021000390000000b030000290000000000320435000000c003000039000000000031043500000080031000390000000000030435000016850010009c000002ae0000213d000000e003100039000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000010043f0000000301000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000002000411000000000101043b000015dc02200197000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000300000001001d000000000101041a000400000001001d000000ff0010019000002ade0000c13d000000040100002900001688001001980000415a0000c13d0000000b01000029000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000400100043d00000140031000390000000804000029000000000043043500000120031000390000000000230435000001000210003900000009030000290000000000320435000000e00210003900000000030004110000000000320435000000c00210003900000006030000290000000000320435000000a0021000390000000503000029000000000032043500000060021000390000000c0300002900000000003204350000004002100039000000140300003900000000003204350000002002100039000000070300002900000000003204350000014003000039000000000031043500000080031000390000000000030435000016900010009c000002ae0000213d0000016003100039000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000700000001001d0000167201000041000000000010044300000000010004120000000400100443000000a00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000600000001001d000015df0100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000400000001001d000000060010006c000035f30000c13d0000167201000041000000000010044300000000010004120000000400100443000000800100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000400200043d0000002203200039000000070400002900000000004304350000169903000041000000000032043500000002032000390000000000130435000015d90020009c000015d90200804100000040012002100000000002000414000015d90020009c000015d902008041000000c002200210000000000121019f0000169a011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000700000001001d0000000e01000029000000400010008c00003d2c0000613d0000000e01000029000000410010008c00003d620000c13d0000000f01000029000f00440010003d00000002020003670000000f01200360000000000101043b0000169c0010009c00003f740000a13d0000169e0100004100000000001004430000000b0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d0000004402100039000000410300003900000000003204350000002402100039000000400300003900000000003204350000169f020000410000000000210435000000040210003900000007030000290000000000320435000000a40410003900000064031000390000000f02000029000000200220008a0000000202200367000000000502034f0000000006030019000000005705043c0000000006760436000000000046004b000029370000c13d00000040033000390000000004030433000016a1044001970000004002200370000000000202043b000016a202200197000000000242019f0000000000230435000000c402100039000000400020043f00000000020004140000000b03000029000000040030008c00003d5d0000613d000015d90020009c000015d902008041000000c002200210000015d90010009c000015d9010080410000004001100210000000000121019f000016a3011001c70000000b0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000041220000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000295d0000c13d000041220000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000400000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000040010006b00001d7d0000a13d0000000101000039000000000101041a000000400010019000001d7d0000613d00000024010000390000000201100367000000000101043b000400000001001d000016c00010009c000029980000413d000000400100043d000016c40200004100001d7f0000013d000000400100043d000016b50200004100001d7f0000013d0000000b01000029000016880010019800002ae10000c13d000000400100043d000016d10200004100001d7f0000013d0000000b01000029000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000400100043d000000c0031000390000000000230435000000a0021000390000000803000029000000000032043500000080021000390000000703000029000000000032043500000060021000390000000c03000029000000000032043500000040021000390000048303000039000000000032043500000020021000390000000b030000290000000000320435000000c0030000390000000000310435000016850010009c000002ae0000213d000000e003100039000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000010043f0000000301000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000002000411000000000101043b000015dc02200197000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000200000001001d000000000101041a000300000001001d000000ff0010019000002ade0000c13d000000030100002900001688001001980000422d0000c13d0000000b01000029000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000400100043d00000140031000390000000804000029000000000043043500000120031000390000000000230435000001000210003900000009030000290000000000320435000000e00210003900000000030004110000000000320435000000c00210003900000005030000290000000000320435000000a0021000390000000403000029000000000032043500000080021000390000000703000029000000000032043500000060021000390000000c03000029000000000032043500000040021000390000048303000039000000000032043500000020021000390000000603000029000000000032043500000140030000390000000000310435000016900010009c000002ae0000213d0000016003100039000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000600000001001d0000167201000041000000000010044300000000010004120000000400100443000000a00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000500000001001d000015df0100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000300000001001d000000050010006c000036400000c13d0000167201000041000000000010044300000000010004120000000400100443000000800100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000400200043d0000002203200039000000060400002900000000004304350000169903000041000000000032043500000002032000390000000000130435000015d90020009c000015d90200804100000040012002100000000002000414000015d90020009c000015d902008041000000c002200210000000000121019f0000169a011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000600000001001d0000000e01000029000000400010008c00003da60000613d0000000e01000029000000410010008c00003ddc0000c13d0000000f01000029000f00440010003d00000002020003670000000f01200360000000000101043b0000169c0010009c00003fb70000a13d0000169e0100004100000000001004430000000b0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d0000004402100039000000410300003900000000003204350000002402100039000000400300003900000000003204350000169f020000410000000000210435000000040210003900000006030000290000000000320435000000a40410003900000064031000390000000f02000029000000200220008a0000000202200367000000000502034f0000000006030019000000005705043c0000000006760436000000000046004b00002ab30000c13d00000040033000390000000004030433000016a1044001970000004002200370000000000202043b000016a202200197000000000242019f0000000000230435000000c402100039000000400020043f00000000020004140000000b03000029000000040030008c00003dd70000613d000015d90020009c000015d902008041000000c002200210000015d90010009c000015d9010080410000004001100210000000000121019f000016a3011001c70000000b0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000041f50000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00002ad90000c13d000041f50000013d000000400100043d000016c10200004100001d7f0000013d0000000b0100002900001689011001970000000a02000029000000000012041b0000000f010000290000000e020000290000000d030000290000000c0400002956ae51f30000040f000000000001004b00000bf30000613d0000000a02000029000000000202041a0000168803200197000016880030009c00000bf30000613d000016890320019700000100022000390000168802200197000000000232019f0000000a03000029000000000023041b00000bf30000013d0000000901000029000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000400100043d0000014003100039000000000023043500000120021000390000000b03000029000000000032043500000100021000390000000c030000290000000000320435000000e0021000390000000d030000290000000000320435000000c00210003900000005030000290000000000320435000000a0021000390000000e03000029000000000032043500000080021000390000000403000029000000000032043500000060021000390000000f0300002900000000003204350000004002100039000000060300002900000000003204350000002002100039000016bc03000041000000000032043500000140030000390000000000310435000016900010009c000002ae0000213d0000016003100039000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000b00000001001d0000167201000041000000000010044300000000010004120000000400100443000000a00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000500000001001d000015df0100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000200000001001d000000050010006c000031010000c13d0000167201000041000000000010044300000000010004120000000400100443000000800100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000400200043d00000022032000390000000b0400002900000000004304350000169903000041000000000032043500000002032000390000000000130435000015d90020009c000015d90200804100000040012002100000000002000414000015d90020009c000015d902008041000000c002200210000000000121019f0000169a011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000b00000001001d0000000801000029000000400010008c000031c80000613d0000000801000029000000410010008c000031fe0000c13d0000000a01000029000a00440010003d00000002020003670000000a01200360000000000101043b0000169c0010009c000033bd0000a13d0000169e010000410000000000100443000000090100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d0000004402100039000000410300003900000000003204350000002402100039000000400300003900000000003204350000169f02000041000000000021043500000004021000390000000b030000290000000000320435000000a40410003900000064031000390000000a02000029000000200220008a0000000202200367000000000502034f0000000006030019000000005705043c0000000006760436000000000046004b00002bb60000c13d00000040033000390000000004030433000016a1044001970000004002200370000000000202043b000016a202200197000000000242019f0000000000230435000000c402100039000000400020043f00000000020004140000000903000029000000040030008c000031f90000613d000015d90020009c000015d902008041000000c002200210000015d90010009c000015d9010080410000004001100210000000000121019f000016a3011001c7000000090200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000003ac60000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00002bdc0000c13d00003ac60000013d0000000c01000029000500040010003d000d00010010003d000000000300001900002bef0000013d000000000101043b000000000201041a000016e30220019700000001022001bf000000000021041b0000000f030000290000000103300039000000090030006c00001a980000813d0000000a02000029000000000102041a000f00000003001d000000000031004b0000307b0000a13d000000000020043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000f01100029000000000101041a000015dc01100197000e00000001001d000000000010043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000000001004b00002beb0000c13d0000000c01000029000000000101041a000b00000001001d000015dd0010009c000002ae0000213d0000000b0100002900000001011000390000000c02000029000000000012041b000000000020043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000b011000290000000e02000029000000000021041b0000000c01000029000000000101041a000b00000001001d000000000020043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000b02000029000000000021041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d0200003900000004030000390000167e04000041000000000500001900000008060000290000000e0700002956ae56a40000040f00000001002001900000012a0000613d0000000e01000029000000000010043f0000000501000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000002be60000c13d0000012a0000013d000000400100043d000300000001001d0000002002100039000015e601000041000100000002001d00000000001204350000167201000041000000000010044300000000010004120000000400100443000000c00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000302000029000000400220003900000000001204350000167201000041000000000010044300000000010004120000000400100443000000e00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000304000029000000a0024000390000000003000410000000000032043500000080024000390000000203000029000000000032043500000060024000390000000000120435000000a0010000390000000000140435000015e70040009c000002ae0000213d0000000302000029000000c001200039000000400010043f0000000101000029000015d90010009c000015d90100804100000040011002100000000002020433000015d90020009c000015d9020080410000006002200210000000000112019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000021770000013d000000400100043d000400000001001d0000002002100039000015e601000041000200000002001d00000000001204350000167201000041000000000010044300000000010004120000000400100443000000c00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000402000029000000400220003900000000001204350000167201000041000000000010044300000000010004120000000400100443000000e00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000404000029000000a0024000390000000003000410000000000032043500000080024000390000000303000029000000000032043500000060024000390000000000120435000000a0010000390000000000140435000015e70040009c000002ae0000213d0000000402000029000000c001200039000000400010043f0000000201000029000015d90010009c000015d90100804100000040011002100000000002020433000015d90020009c000015d9020080410000006002200210000000000112019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000022b80000013d000000400100043d000400000001001d0000002002100039000015e601000041000200000002001d00000000001204350000167201000041000000000010044300000000010004120000000400100443000000c00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000402000029000000400220003900000000001204350000167201000041000000000010044300000000010004120000000400100443000000e00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000404000029000000a0024000390000000003000410000000000032043500000080024000390000000303000029000000000032043500000060024000390000000000120435000000a0010000390000000000140435000015e70040009c000002ae0000213d0000000402000029000000c001200039000000400010043f0000000201000029000015d90010009c000015d90100804100000040011002100000000002020433000015d90020009c000015d9020080410000006002200210000000000112019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f0000000100200190000023f40000c13d0000012a0000013d0000000c01000029000500050010003d000b00020010003d000d00030010003d000000000300001900002d490000013d0000000f030000290000000103300039000000090030006c00001a9f0000813d0000000a02000029000000000102041a000f00000003001d000000000031004b0000307b0000a13d000000000020043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000f01100029000000000101041a000e00000001001d000000000010043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000000001004b00002d450000c13d0000000b01000029000000000101041a000c00000001001d000015dd0010009c000002ae0000213d0000000c0100002900000001011000390000000b02000029000000000012041b000000000020043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000c011000290000000e02000029000000000021041b0000000b01000029000000000101041a000c00000001001d000000000020043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000c02000029000000000021041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d0200003900000004030000390000167f04000041000000000500001900000008060000290000000e0700002956ae56a40000040f00000001002001900000012a0000613d0000000e01000029000000000010043f0000000501000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000016e30220019700000001022001bf000000000021041b00002d450000013d0000000601000029000a00040010003d000d00010010003d000000000200001900002dc40000013d000000000101043b000000000201041a000016e30220019700000001022001bf000000000021041b0000000f0200002900000001022000390000000b0020006c00001aa40000813d0000000701000029000000000101041a000f00000002001d000000000021004b0000307b0000a13d0000000701000029000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000f01100029000000000101041a000015dc01100197000e00000001001d000000000010043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000000001004b00002dc00000c13d0000000601000029000000000101041a000c00000001001d000015dd0010009c000002ae0000213d0000000c0100002900000001011000390000000602000029000000000012041b000000000020043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000c011000290000000e02000029000000000021041b0000000601000029000000000101041a000c00000001001d000000000020043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000c02000029000000000021041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d0200003900000004030000390000167e04000041000000010500003900000008060000290000000e0700002956ae56a40000040f00000001002001900000012a0000613d0000000e01000029000000000010043f0000000a01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000002dbb0000c13d0000012a0000013d000000400100043d000400000001001d0000002002100039000015e601000041000200000002001d00000000001204350000167201000041000000000010044300000000010004120000000400100443000000c00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000402000029000000400220003900000000001204350000167201000041000000000010044300000000010004120000000400100443000000e00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000404000029000000a0024000390000000003000410000000000032043500000080024000390000000303000029000000000032043500000060024000390000000000120435000000a0010000390000000000140435000015e70040009c000002ae0000213d0000000402000029000000c001200039000000400010043f0000000201000029000015d90010009c000015d90100804100000040011002100000000002020433000015d90020009c000015d9020080410000006002200210000000000112019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f0000000100200190000024c10000c13d0000012a0000013d000000400100043d000500000001001d0000002002100039000015e601000041000200000002001d00000000001204350000167201000041000000000010044300000000010004120000000400100443000000c00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000502000029000000400220003900000000001204350000167201000041000000000010044300000000010004120000000400100443000000e00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000504000029000000a0024000390000000003000410000000000032043500000080024000390000000303000029000000000032043500000060024000390000000000120435000000a0010000390000000000140435000015e70040009c000002ae0000213d0000000502000029000000c001200039000000400010043f0000000201000029000015d90010009c000015d90100804100000040011002100000000002020433000015d90020009c000015d9020080410000006002200210000000000112019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000026000000013d000000400100043d000400000001001d0000002002100039000015e601000041000100000002001d00000000001204350000167201000041000000000010044300000000010004120000000400100443000000c00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000402000029000000400220003900000000001204350000167201000041000000000010044300000000010004120000000400100443000000e00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000404000029000000a0024000390000000003000410000000000032043500000080024000390000000203000029000000000032043500000060024000390000000000120435000000a0010000390000000000140435000015e70040009c000002ae0000213d0000000402000029000000c001200039000000400010043f0000000101000029000015d90010009c000015d90100804100000040011002100000000002020433000015d90020009c000015d9020080410000006002200210000000000112019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000027430000013d0000000601000029000700050010003d000c00020010003d000d00030010003d000000000300001900002f240000013d000000000101043b000000000201041a000016e30220019700000001022001bf000000000021041b0000000f030000290000000103300039000000090030006c00001aab0000813d0000000a02000029000000000102041a000f00000003001d000000000031004b0000307b0000a13d000000000020043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000f01100029000000000101041a000e00000001001d000000000010043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000000001004b00002f200000c13d0000000c01000029000000000101041a000b00000001001d000015dd0010009c000002ae0000213d0000000b0100002900000001011000390000000c02000029000000000012041b000000000020043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000b011000290000000e02000029000000000021041b0000000c01000029000000000101041a000b00000001001d000000000020043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000b02000029000000000021041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d0200003900000004030000390000167f04000041000000010500003900000008060000290000000e0700002956ae56a40000040f00000001002001900000012a0000613d0000000e01000029000000000010043f0000000701000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000002f1b0000c13d0000012a0000013d0000000301000029000a00040010003d000d00010010003d000000000200001900002f9a0000013d000000000101043b000000000201041a000016e30220019700000001022001bf000000000021041b0000000f0200002900000001022000390000000b0020006c00001ab00000813d0000000401000029000000000101041a000f00000002001d000000000021004b0000307b0000a13d0000000401000029000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000f01100029000000000101041a000015dc01100197000e00000001001d000000000010043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000000001004b00002f960000c13d0000000301000029000000000101041a000c00000001001d000015dd0010009c000002ae0000213d0000000c0100002900000001011000390000000302000029000000000012041b000000000020043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000c011000290000000e02000029000000000021041b0000000301000029000000000101041a000c00000001001d000000000020043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000c02000029000000000021041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d0200003900000004030000390000167e04000041000000020500003900000008060000290000000e0700002956ae56a40000040f00000001002001900000012a0000613d0000000e01000029000000000010043f0000000a01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000002f910000c13d0000012a0000013d0000000301000029000700050010003d000c00020010003d000d00030010003d0000000003000019000030130000013d000000000101043b000000000201041a000016e30220019700000001022001bf000000000021041b0000000f030000290000000103300039000000090030006c00001ab70000813d0000000a02000029000000000102041a000f00000003001d000000000031004b0000307b0000a13d000000000020043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000f01100029000000000101041a000e00000001001d000000000010043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000000001004b0000300f0000c13d0000000c01000029000000000101041a000b00000001001d000015dd0010009c000002ae0000213d0000000b0100002900000001011000390000000c02000029000000000012041b000000000020043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000b011000290000000e02000029000000000021041b0000000c01000029000000000101041a000b00000001001d000000000020043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000b02000029000000000021041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d0200003900000004030000390000167f04000041000000020500003900000008060000290000000e0700002956ae56a40000040f00000001002001900000012a0000613d0000000e01000029000000000010043f0000000701000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000300a0000c13d0000012a0000013d000016ce01000041000000000010043f0000003201000039000000040010043f000016cf01000041000056b0000104300000000e01000029000000000010043f0000000601000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000b020000290000000802200270000d00000002001d000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000b02000029000000ff0220018f000c000100200217000000000101043b000000000201041a0000000c0220014f000000000021041b0000000c002001800000160f0000613d0000000701000029000000400010008c000033010000613d0000000701000029000000410010008c000033370000c13d0000000a01000029000b00440010003d00000002020003670000000b01200360000000000101043b0000169c0010009c000034fe0000a13d0000169e0100004100000000001004430000000e0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d0000004402100039000000410300003900000000003204350000002402100039000000400300003900000000003204350000169f020000410000000000210435000000040210003900000005030000290000000000320435000000a40410003900000064031000390000000b02000029000000200220008a0000000202200367000000000502034f0000000006030019000000005705043c0000000006760436000000000046004b000030d60000c13d00000040033000390000000004030433000016a1044001970000004002200370000000000202043b000016a202200197000000000242019f0000000000230435000000c402100039000000400020043f00000000020004140000000e03000029000000040030008c000033320000613d000015d90020009c000015d902008041000000c002200210000015d90010009c000015d9010080410000004001100210000000000121019f000016a3011001c70000000e0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000003bf30000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000030fc0000c13d00003bf30000013d000000400100043d000500000001001d0000002002100039000015e601000041000100000002001d00000000001204350000167201000041000000000010044300000000010004120000000400100443000000c00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000502000029000000400220003900000000001204350000167201000041000000000010044300000000010004120000000400100443000000e00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000504000029000000a0024000390000000003000410000000000032043500000080024000390000000203000029000000000032043500000060024000390000000000120435000000a0010000390000000000140435000015e70040009c000002ae0000213d0000000502000029000000c001200039000000400010043f0000000101000029000015d90010009c000015d90100804100000040011002100000000002020433000015d90020009c000015d9020080410000006002200210000000000112019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d00002b6e0000013d0000000a01000029000a00440010003d00000002030003670000000a01300360000000000101043b0000169b021001970000169c0020009c0000337c0000a13d0000169e0100004100000000001004430000000e0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d000000440210003900000040030000390000000000320435000000240210003900000000003204350000169f020000410000000000210435000000040210003900000005030000290000000000320435000000a40210003900000064031000390000000a04000029000000200440008a0000000204400367000000004504043c0000000003530436000000000023004b000031760000c13d000000400020043f00000000020004140000000e03000029000000040030008c000038970000c13d0000000001010433000000000010043f00000001020000390000000103000031000038be0000013d0000169e0100004100000000001004430000000e0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d0000002402100039000000400300003900000000003204350000169f020000410000000000210435000000040210003900000005030000290000000000320435000000440210003900000008030000290000000000320435000016e4043001980000001f0530018f00000064071000390000000003470019000000070600002900000020066000390000000206600367000031ad0000613d000000000806034f000000008908043c0000000007970436000000000037004b000031a90000c13d000000000005004b000031ba0000613d000000000446034f0000000305500210000000000603043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f000000000043043500000008030000290000001f03300039000016e40230019700000064032000390000000002310019000000400020043f00000000020004140000000e04000029000000040040008c000037c60000c13d0000000001010433000000000010043f0000000102000031000037f10000013d0000000a01000029000a00440010003d00000002030003670000000a01300360000000000101043b0000169b021001970000169c0020009c000034000000a13d0000169e010000410000000000100443000000090100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d000000440210003900000040030000390000000000320435000000240210003900000000003204350000169f02000041000000000021043500000004021000390000000b030000290000000000320435000000a40210003900000064031000390000000a04000029000000200440008a0000000204400367000000004504043c0000000003530436000000000023004b000031f00000c13d000000400020043f00000000020004140000000903000029000000040030008c00003aae0000c13d0000000001010433000000000010043f0000000102000039000000010300003100003ad50000013d0000169e010000410000000000100443000000090100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d0000002402100039000000400300003900000000003204350000169f02000041000000000021043500000004021000390000000b030000290000000000320435000000440210003900000008030000290000000000320435000016e4043001980000001f0530018f00000064071000390000000003470019000000070600002900000020066000390000000206600367000032270000613d000000000806034f000000008908043c0000000007970436000000000037004b000032230000c13d000000000005004b000032340000613d000000000446034f0000000305500210000000000603043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f000000000043043500000008030000290000001f03300039000016e40230019700000064032000390000000002310019000000400020043f00000000020004140000000904000029000000040040008c000038680000c13d0000000001010433000000000010043f00000001020000390000000103000031000038920000013d0000000d01000029000d00440010003d00000002030003670000000d01300360000000000101043b0000169b021001970000169c0020009c000035410000a13d0000169e0100004100000000001004430000000e0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d000000440210003900000040030000390000000000320435000000240210003900000000003204350000169f020000410000000000210435000000040210003900000004030000290000000000320435000000a40210003900000064031000390000000d04000029000000200440008a0000000204400367000000004504043c0000000003530436000000000023004b0000326b0000c13d000000400020043f00000000020004140000000e03000029000000040030008c00003b550000c13d0000000001010433000000000010043f0000000102000039000000010300003100003b7c0000013d0000169e0100004100000000001004430000000e0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d0000002402100039000000400300003900000000003204350000169f02000041000000000021043500000004021000390000000403000029000000000032043500000044021000390000000b030000290000000000320435000016e4043001980000001f0530018f000000640710003900000000034700190000000a0600002900000020066000390000000206600367000032a20000613d000000000806034f000000008908043c0000000007970436000000000037004b0000329e0000c13d000000000005004b000032af0000613d000000000446034f0000000305500210000000000603043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f00000000004304350000000b030000290000001f03300039000016e40230019700000064032000390000000002310019000000400020043f00000000020004140000000e04000029000000040040008c000039b60000c13d0000000001010433000000000010043f00000001020000390000000103000031000039e00000013d0000000a04000029000000200340008a000000000332034f0000002004400039000000000242034f000000000202043b000000000303043b000000400400043d0000006005400039000000000015043500000040014000390000000000310435000000f8012002700000002002400039000000000012043500000005010000290000000000140435000000000000043f000015d90040009c000015d90400804100000040014002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f0000169d011001c7000000010200003956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000032e90000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000032e50000c13d000000000005004b000032f60000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000035820000613d000000000100043d000015dc00100198000023100000613d0000000e0110014f000015dc00100198000038c50000613d000023100000013d0000000a01000029000b00440010003d00000002030003670000000b01300360000000000101043b0000169b021001970000169c0020009c0000358e0000a13d0000169e0100004100000000001004430000000e0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d000000440210003900000040030000390000000000320435000000240210003900000000003204350000169f020000410000000000210435000000040210003900000005030000290000000000320435000000a40210003900000064031000390000000b04000029000000200440008a0000000204400367000000004504043c0000000003530436000000000023004b000033290000c13d000000400020043f00000000020004140000000e03000029000000040030008c00003bdb0000c13d0000000001010433000000000010043f0000000102000039000000010300003100003c020000013d0000169e0100004100000000001004430000000e0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d0000002402100039000000400300003900000000003204350000169f020000410000000000210435000000040210003900000005030000290000000000320435000000440210003900000007030000290000000000320435000016e4043001980000001f0530018f00000064071000390000000003470019000000060600002900000020066000390000000206600367000033600000613d000000000806034f000000008908043c0000000007970436000000000037004b0000335c0000c13d000000000005004b0000336d0000613d000000000446034f0000000305500210000000000603043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f000000000043043500000007030000290000001f03300039000016e40230019700000064032000390000000002310019000000400020043f00000000020004140000000e04000029000000040040008c000039e50000c13d0000000001010433000000000010043f0000000102000039000000010300003100003a0f0000013d0000000a04000029000000200440008a000000000343034f000000000303043b000000400400043d0000006005400039000000000025043500000040024000390000000000320435000000ff011002700000001b011000390000002002400039000000000012043500000005010000290000000000140435000000000000043f000015d90040009c000015d90400804100000040014002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f0000169d011001c7000000010200003956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000033a50000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000033a10000c13d000000000005004b000033b20000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000035cf0000613d000000000100043d000015dc00100198000031560000613d0000000e0110014f000015dc00100198000038c50000613d000031560000013d0000000a04000029000000200340008a000000000332034f0000002004400039000000000242034f000000000202043b000000000303043b000000400400043d0000006005400039000000000015043500000040014000390000000000310435000000f801200270000000200240003900000000001204350000000b010000290000000000140435000000000000043f000015d90040009c000015d90400804100000040014002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f0000169d011001c7000000010200003956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000033e80000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000033e40000c13d000000000005004b000033f50000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000035db0000613d000000000100043d000015dc0010019800002b930000613d000000090110014f000015dc0010019800003adc0000613d00002b930000013d0000000a04000029000000200440008a000000000343034f000000000303043b000000400400043d0000006005400039000000000025043500000040024000390000000000320435000000ff011002700000001b01100039000000200240003900000000001204350000000b010000290000000000140435000000000000043f000015d90040009c000015d90400804100000040014002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f0000169d011001c7000000010200003956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000034290000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000034250000c13d000000000005004b000034360000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000035e70000613d000000000100043d000015dc00100198000031d00000613d000000090110014f000015dc0010019800003adc0000613d000031d00000013d0000000d04000029000000200340008a000000000332034f0000002004400039000000000242034f000000000202043b000000000303043b000000400400043d0000006005400039000000000015043500000040014000390000000000310435000000f8012002700000002002400039000000000012043500000004010000290000000000140435000000000000043f000015d90040009c000015d90400804100000040014002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f0000169d011001c7000000010200003956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f00000020044001900000346c0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000034680000c13d000000000005004b000034790000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000037f70000613d000000000100043d000015dc00100198000021d20000613d0000000e0110014f000015dc0010019800003b830000613d000021d20000013d0000000d01000029000d00440010003d00000002030003670000000d01300360000000000101043b0000169b021001970000169c0020009c000038030000a13d0000169e0100004100000000001004430000000e0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d000000440210003900000040030000390000000000320435000000240210003900000000003204350000169f020000410000000000210435000000040210003900000006030000290000000000320435000000a40210003900000064031000390000000d04000029000000200440008a0000000204400367000000004504043c0000000003530436000000000023004b000034ac0000c13d000000400020043f00000000020004140000000e03000029000000040030008c00003caa0000c13d0000000001010433000000000010043f0000000102000039000000010300003100003cd10000013d0000169e0100004100000000001004430000000e0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d0000002402100039000000400300003900000000003204350000169f02000041000000000021043500000004021000390000000603000029000000000032043500000044021000390000000b030000290000000000320435000016e4043001980000001f0530018f000000640710003900000000034700190000000a0600002900000020066000390000000206600367000034e30000613d000000000806034f000000008908043c0000000007970436000000000037004b000034df0000c13d000000000005004b000034f00000613d000000000446034f0000000305500210000000000603043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f00000000004304350000000b030000290000001f03300039000016e40230019700000064032000390000000002310019000000400020043f00000000020004140000000e04000029000000040040008c00003c370000c13d0000000001010433000000000010043f000000010200003100003c620000013d0000000b04000029000000200340008a000000000332034f0000002004400039000000000242034f000000000202043b000000000303043b000000400400043d0000006005400039000000000015043500000040014000390000000000310435000000f8012002700000002002400039000000000012043500000005010000290000000000140435000000000000043f000015d90040009c000015d90400804100000040014002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f0000169d011001c7000000010200003956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000035290000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000035250000c13d000000000005004b000035360000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000038440000613d000000000100043d000015dc00100198000030b30000613d0000000e0110014f000015dc0010019800003c090000613d000030b30000013d0000000d04000029000000200440008a000000000343034f000000000303043b000000400400043d0000006005400039000000000025043500000040024000390000000000320435000000ff011002700000001b011000390000002002400039000000000012043500000004010000290000000000140435000000000000043f000015d90040009c000015d90400804100000040014002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f0000169d011001c7000000010200003956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f00000020044001900000356a0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000035660000c13d000000000005004b000035770000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000038500000613d000000000100043d000015dc001001980000324b0000613d0000000e0110014f000015dc0010019800003b830000613d0000324b0000013d0000001f0530018f000015db06300198000000400200043d000000000462001900003c970000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000035890000c13d00003c970000013d0000000b04000029000000200440008a000000000343034f000000000303043b000000400400043d0000006005400039000000000025043500000040024000390000000000320435000000ff011002700000001b011000390000002002400039000000000012043500000005010000290000000000140435000000000000043f000015d90040009c000015d90400804100000040014002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f0000169d011001c7000000010200003956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000035b70000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000035b30000c13d000000000005004b000035c40000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f000300000001035500000001002001900000385c0000613d000000000100043d000015dc00100198000033090000613d0000000e0110014f000015dc0010019800003c090000613d000033090000013d0000001f0530018f000015db06300198000000400200043d000000000462001900003c970000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000035d60000c13d00003c970000013d0000001f0530018f000015db06300198000000400200043d000000000462001900003c970000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000035e20000c13d00003c970000013d0000001f0530018f000015db06300198000000400200043d000000000462001900003c970000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000035ee0000c13d00003c970000013d000000400100043d000600000001001d0000002002100039000015e601000041000200000002001d00000000001204350000167201000041000000000010044300000000010004120000000400100443000000c00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000602000029000000400220003900000000001204350000167201000041000000000010044300000000010004120000000400100443000000e00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000604000029000000a0024000390000000003000410000000000032043500000080024000390000000403000029000000000032043500000060024000390000000000120435000000a0010000390000000000140435000015e70040009c000002ae0000213d0000000602000029000000c001200039000000400010043f0000000201000029000015d90010009c000015d90100804100000040011002100000000002020433000015d90020009c000015d9020080410000006002200210000000000112019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f0000000100200190000028ef0000c13d0000012a0000013d000000400100043d000500000001001d0000002002100039000015e601000041000100000002001d00000000001204350000167201000041000000000010044300000000010004120000000400100443000000c00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000502000029000000400220003900000000001204350000167201000041000000000010044300000000010004120000000400100443000000e00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000504000029000000a0024000390000000003000410000000000032043500000080024000390000000303000029000000000032043500000060024000390000000000120435000000a0010000390000000000140435000015e70040009c000002ae0000213d0000000502000029000000c001200039000000400010043f0000000101000029000015d90010009c000015d90100804100000040011002100000000002020433000015d90020009c000015d9020080410000006002200210000000000112019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d00002a6b0000013d0000000d04000029000000200340008a000000000332034f0000002004400039000000000242034f000000000202043b000000000303043b000000400400043d0000006005400039000000000015043500000040014000390000000000310435000000f8012002700000002002400039000000000012043500000006010000290000000000140435000000000000043f000015d90040009c000015d90400804100000040014002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f0000169d011001c7000000010200003956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000036b80000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000036b40000c13d000000000005004b000036c50000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f0003000000010355000000010020019000003a140000613d000000000100043d000015dc00100198000025190000613d0000000e0110014f000015dc0010019800003cd80000613d000025190000013d0000000d01000029000d00440010003d00000002030003670000000d01300360000000000101043b0000169b021001970000169c0020009c00003a200000a13d0000169e0100004100000000001004430000000e0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d000000440210003900000040030000390000000000320435000000240210003900000000003204350000169f020000410000000000210435000000040210003900000006030000290000000000320435000000a40210003900000064031000390000000d04000029000000200440008a0000000204400367000000004504043c0000000003530436000000000023004b000036f80000c13d000000400020043f00000000020004140000000e03000029000000040030008c00003e7e0000c13d0000000001010433000000000010043f0000000102000039000000010300003100003ea50000013d0000169e0100004100000000001004430000000e0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d0000002402100039000000400300003900000000003204350000169f02000041000000000021043500000004021000390000000603000029000000000032043500000044021000390000000b030000290000000000320435000016e4043001980000001f0530018f000000640710003900000000034700190000000a06000029000000200660003900000002066003670000372f0000613d000000000806034f000000008908043c0000000007970436000000000037004b0000372b0000c13d000000000005004b0000373c0000613d000000000446034f0000000305500210000000000603043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f00000000004304350000000b030000290000001f03300039000016e40230019700000064032000390000000002310019000000400020043f00000000020004140000000e04000029000000040040008c00003e200000c13d0000000001010433000000000010043f0000000102000039000000010300003100003e4a0000013d0000000d01000029000d00440010003d00000002030003670000000d01300360000000000101043b0000169b021001970000169c0020009c00003a610000a13d0000169e0100004100000000001004430000000e0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d000000440210003900000040030000390000000000320435000000240210003900000000003204350000169f020000410000000000210435000000040210003900000005030000290000000000320435000000a40210003900000064031000390000000d04000029000000200440008a0000000204400367000000004504043c0000000003530436000000000023004b000037730000c13d000000400020043f00000000020004140000000e03000029000000040030008c00003ed20000c13d0000000001010433000000000010043f0000000102000039000000010300003100003ef90000013d0000169e0100004100000000001004430000000e0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d0000002402100039000000400300003900000000003204350000169f02000041000000000021043500000004021000390000000503000029000000000032043500000044021000390000000b030000290000000000320435000016e4043001980000001f0530018f000000640710003900000000034700190000000a0600002900000020066000390000000206600367000037aa0000613d000000000806034f000000008908043c0000000007970436000000000037004b000037a60000c13d000000000005004b000037b70000613d000000000446034f0000000305500210000000000603043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f00000000004304350000000b030000290000001f03300039000016e40230019700000064032000390000000002310019000000400020043f00000000020004140000000e04000029000000040040008c00003e4f0000c13d0000000001010433000000000010043f0000000102000039000000010300003100003e790000013d000015d90030009c000015d9030080410000006003300210000015d90010009c000015d9010080410000004001100210000000000131019f000015d90020009c000015d902008041000000c002200210000000000112019f0000000e0200002956ae56a90000040f000600000002001d0000006002100270000015d902200197000000200020008c000000200300003900000000030240190000001f0430018f0000002003300190000037e20000613d000000000501034f0000000006000019000000005705043c0000000006760436000000000036004b000037de0000c13d000000000004004b000037ef0000613d000000000531034f0000000304400210000000000603043300000000064601cf000000000646022f000000000505043b0000010004400089000000000545022f00000000044501cf000000000464019f0000000000430435000100000002001f000300000001035500000006010000290000000100100190000042400000613d000000200020008c000038c20000813d000042400000013d0000001f0530018f000015db06300198000000400200043d000000000462001900003c970000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000037fe0000c13d00003c970000013d0000000d04000029000000200440008a000000000343034f000000000303043b000000400400043d0000006005400039000000000025043500000040024000390000000000320435000000ff011002700000001b011000390000002002400039000000000012043500000006010000290000000000140435000000000000043f000015d90040009c000015d90400804100000040014002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f0000169d011001c7000000010200003956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f00000020044001900000382c0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000038280000c13d000000000005004b000038390000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f0003000000010355000000010020019000003aa20000613d000000000100043d000015dc001001980000348c0000613d0000000e0110014f000015dc0010019800003cd80000613d0000348c0000013d0000001f0530018f000015db06300198000000400200043d000000000462001900003c970000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000384b0000c13d00003c970000013d0000001f0530018f000015db06300198000000400200043d000000000462001900003c970000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000038570000c13d00003c970000013d0000001f0530018f000015db06300198000000400200043d000000000462001900003c970000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000038630000c13d00003c970000013d000015d90030009c000015d9030080410000006003300210000015d90010009c000015d9010080410000004001100210000000000131019f000015d90020009c000015d902008041000000c002200210000000000112019f000000090200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000038830000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000387f0000c13d000000000005004b000038900000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000042400000613d000000200030008c00003ad90000813d000042400000013d000015d90020009c000015d902008041000000c002200210000015d90010009c000015d9010080410000004001100210000000000121019f000016a0011001c70000000e0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000038af0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000038ab0000c13d000000000005004b000038bc0000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000042400000613d0000001f0030008c000042400000a13d000000000100043d0000169f0010009c000042400000c13d0000000f0100002900000000020004110000000e0300002900000009040000290000000b0500002956ae52da0000040f0000ffff0220018f000002d10020008c000038d00000613d000000000002004b000042da0000c13d000016b00010009c0000390b0000213d0000169e0100004100000000001004430000000f0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b0000012a0000613d000000400300043d00000044013000390000000b020000290000000000210435000000240130003900000009020000290000000000210435000016b1010000410000000000130435000b00000003001d00000004013000390000000e02000029000000000021043500000000010004140000000f02000029000000040020008c000039030000613d0000000b02000029000015d90020009c000015d9020080410000004002200210000015d90010009c000015d901008041000000c001100210000000000121019f000016b2011001c70000000f0200002956ae56a40000040f0000006003100270000115d90030019d000300000001035500000001002001900000390b0000613d0000000b01000029000015dd0010009c000002ae0000213d0000000b01000029000000400010043f00000000010000190000000b020000290000167d0000013d0000000e01000029000000000010043f0000000601000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a0000000c0220014f000000000021041b0000000c00200180000000400100043d000b00000001001d00003d290000c13d00000001010000390000000b020000290000167d0000013d0000000d04000029000000200340008a000000000332034f0000002004400039000000000242034f000000000202043b000000000303043b000000400400043d0000006005400039000000000015043500000040014000390000000000310435000000f8012002700000002002400039000000000012043500000006010000290000000000140435000000000000043f000015d90040009c000015d90400804100000040014002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f0000169d011001c7000000010200003956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f00000020044001900000395b0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000039570000c13d000000000005004b000039680000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f0003000000010355000000010020019000003c680000613d000000000100043d000015dc001001980000265b0000613d0000000e0110014f000015dc0010019800003eac0000613d0000265b0000013d0000000d04000029000000200340008a000000000332034f0000002004400039000000000242034f000000000202043b000000000303043b000000400400043d0000006005400039000000000015043500000040014000390000000000310435000000f8012002700000002002400039000000000012043500000005010000290000000000140435000000000000043f000015d90040009c000015d90400804100000040014002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f0000169d011001c7000000010200003956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f00000020044001900000399e0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000399a0000c13d000000000005004b000039ab0000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f0003000000010355000000010020019000003c740000613d000000000100043d000015dc001001980000279e0000613d0000000e0110014f000015dc0010019800003f000000613d0000279e0000013d000015d90030009c000015d9030080410000006003300210000015d90010009c000015d9010080410000004001100210000000000131019f000015d90020009c000015d902008041000000c002200210000000000112019f0000000e0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000039d10000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000039cd0000c13d000000000005004b000039de0000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000042400000613d000000200030008c00003b800000813d000042400000013d000015d90030009c000015d9030080410000006003300210000015d90010009c000015d9010080410000004001100210000000000131019f000015d90020009c000015d902008041000000c002200210000000000112019f0000000e0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000003a000000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000039fc0000c13d000000000005004b00003a0d0000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000042400000613d000000200030008c00003c060000813d000042400000013d0000001f0530018f000015db06300198000000400200043d000000000462001900003c970000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003a1b0000c13d00003c970000013d0000000d04000029000000200440008a000000000343034f000000000303043b000000400400043d0000006005400039000000000025043500000040024000390000000000320435000000ff011002700000001b011000390000002002400039000000000012043500000006010000290000000000140435000000000000043f000015d90040009c000015d90400804100000040014002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f0000169d011001c7000000010200003956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000003a490000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00003a450000c13d000000000005004b00003a560000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f0003000000010355000000010020019000003c800000613d000000000100043d000015dc00100198000036d80000613d0000000e0110014f000015dc0010019800003eac0000613d000036d80000013d0000000d04000029000000200440008a000000000343034f000000000303043b000000400400043d0000006005400039000000000025043500000040024000390000000000320435000000ff011002700000001b011000390000002002400039000000000012043500000005010000290000000000140435000000000000043f000015d90040009c000015d90400804100000040014002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f0000169d011001c7000000010200003956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000003a8a0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00003a860000c13d000000000005004b00003a970000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f0003000000010355000000010020019000003c8c0000613d000000000100043d000015dc00100198000037530000613d0000000e0110014f000015dc0010019800003f000000613d000037530000013d0000001f0530018f000015db06300198000000400200043d000000000462001900003c970000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003aa90000c13d00003c970000013d000015d90020009c000015d902008041000000c002200210000015d90010009c000015d9010080410000004001100210000000000121019f000016a0011001c7000000090200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000003ac60000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00003ac20000c13d000000000005004b00003ad30000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000042400000613d0000001f0030008c000042400000a13d000000000100043d0000169f0010009c000042400000c13d0000000901000029000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000303000029000016a4043001970000000c0000006b0000000c0400c029000c00000004001d00000001002001900000012a0000613d000000000101043b000000000201041a000000400100043d000000c003100039000000000023043500000080021000390000000403000029000000000032043500000060021000390000000f030000290000000000320435000000400210003900000006030000290000000000320435000000200210003900000009030000290000000000320435000000c0030000390000000000310435000000a0031000390000000000030435000016850010009c000002ae0000213d000000e003100039000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000010043f0000000201000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000ff0220018f0000000c05000029000000d003500210000000000232019f0000000e0400002900000008034002100000168803300197000000000232019f000000000021041b000000400100043d000000400210003900000000005204350000002002100039000000000042043500000004020000290000000000210435000015d90010009c000015d90100804100000040011002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015ea011001c70000800d020000390000000403000039000016bd0400004100000009050000290000000f060000290000000d070000290000158d0000013d000015d90020009c000015d902008041000000c002200210000015d90010009c000015d9010080410000004001100210000000000121019f000016a0011001c70000000e0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000003b6d0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00003b690000c13d000000000005004b00003b7a0000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000042400000613d0000001f0030008c000042400000a13d000000000100043d0000169f0010009c000042400000c13d0000000f0100002900000000020004110000000e030000290000000c04000029000000060500002956ae52da0000040f0000ffff0220019000003b8d0000613d000004830020008c000042da0000c13d000016b00010009c00003bc80000213d0000169e0100004100000000001004430000000f0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b0000012a0000613d000000400300043d0000008401300039000000a002000039000000000021043500000064013000390000000502000029000000000021043500000044013000390000000602000029000000000021043500000024013000390000000c020000290000000000210435000016c201000041000000000013043500000004013000390000000e020000290000000000210435000d00000003001d000000a401300039000000000001043500000000010004140000000f02000029000000040020008c00003f460000613d0000000d02000029000015d90020009c000015d9020080410000004002200210000015d90010009c000015d901008041000000c001100210000000000121019f000016a3011001c70000000f0200002956ae56a40000040f0000006003100270000115d90030019d0003000000010355000000010020019000003f460000c13d0000000e01000029000000000010043f0000000601000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000902000029000000000020043f000000200010043f000000000100041400003f5f0000013d000015d90020009c000015d902008041000000c002200210000015d90010009c000015d9010080410000004001100210000000000121019f000016a0011001c70000000e0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000003bf30000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00003bef0000c13d000000000005004b00003c000000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000042400000613d0000001f0030008c000042400000a13d000000000100043d0000169f0010009c000042400000c13d0000000f010000290000000e020000290000000903000029000000080400002956ae4d3f0000040f000f00000001001d000000000001004b00003c130000c13d0000000f0100002900000bf30000013d0000000e01000029000000000010043f0000000601000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a0000000c03000029000000000232013f000000000021041b000000000032017000003c110000613d000000400100043d000016b30200004100001d7f0000013d000015d90030009c000015d9030080410000006003300210000015d90010009c000015d9010080410000004001100210000000000131019f000015d90020009c000015d902008041000000c002200210000000000112019f0000000e0200002956ae56a90000040f000500000002001d0000006002100270000015d902200197000000200020008c000000200300003900000000030240190000001f0430018f000000200330019000003c530000613d000000000501034f0000000006000019000000005705043c0000000006760436000000000036004b00003c4f0000c13d000000000004004b00003c600000613d000000000531034f0000000304400210000000000603043300000000064601cf000000000646022f000000000505043b0000010004400089000000000545022f00000000044501cf000000000464019f0000000000430435000100000002001f000300000001035500000005010000290000000100100190000042400000613d000000200020008c00003cd50000813d000042400000013d0000001f0530018f000015db06300198000000400200043d000000000462001900003c970000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003c6f0000c13d00003c970000013d0000001f0530018f000015db06300198000000400200043d000000000462001900003c970000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003c7b0000c13d00003c970000013d0000001f0530018f000015db06300198000000400200043d000000000462001900003c970000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003c870000c13d00003c970000013d0000001f0530018f000015db06300198000000400200043d000000000462001900003c970000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003c930000c13d000000000005004b00003ca40000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000015d90020009c000015d9020080410000004002200210000000000112019f000056b000010430000015d90020009c000015d902008041000000c002200210000015d90010009c000015d9010080410000004001100210000000000121019f000016a0011001c70000000e0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000003cc20000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00003cbe0000c13d000000000005004b00003ccf0000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000042400000613d0000001f0030008c000042400000a13d000000000100043d0000169f0010009c000042400000c13d0000000f0100002900000000020004110000000e030000290000000c04000029000000070500002956ae52da0000040f0000ffff0220018f000002d10020008c00003ce30000613d000000000002004b000042da0000c13d000016b00010009c00003d160000213d0000169e0100004100000000001004430000000f0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b0000012a0000613d000000400300043d00000044013000390000000702000029000000000021043500000024013000390000000c020000290000000000210435000016b1010000410000000000130435000d00000003001d00000004013000390000000e02000029000000000021043500000000010004140000000f02000029000000040020008c00003f460000613d0000000d02000029000015d90020009c000015d9020080410000004002200210000015d90010009c000015d901008041000000c001100210000000000121019f000016b2011001c70000000f0200002956ae56a40000040f0000006003100270000115d90030019d0003000000010355000000010020019000003f460000c13d0000000e01000029000000000010043f0000000601000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000902000029000000000020043f000000200010043f000000000100041400003f5f0000013d000016b3010000410000000b02000029000027ee0000013d0000000f01000029000f00440010003d00000002030003670000000f01300360000000000101043b0000169b021001970000169c0020009c00003ffa0000a13d0000169e0100004100000000001004430000000b0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d000000440210003900000040030000390000000000320435000000240210003900000000003204350000169f020000410000000000210435000000040210003900000007030000290000000000320435000000a40210003900000064031000390000000f04000029000000200440008a0000000204400367000000004504043c0000000003530436000000000023004b00003d540000c13d000000400020043f00000000020004140000000b03000029000000040030008c0000410a0000c13d0000000001010433000000000010043f00000001020000390000000103000031000041310000013d0000169e0100004100000000001004430000000b0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d0000002402100039000000400300003900000000003204350000169f02000041000000000021043500000004021000390000000703000029000000000032043500000044021000390000000e030000290000000000320435000016e4043001980000001f0530018f000000640710003900000000034700190000000d06000029000000020660036700003d8a0000613d000000000806034f000000008908043c0000000007970436000000000037004b00003d860000c13d000000000005004b00003d970000613d000000000446034f0000000305500210000000000603043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f00000000004304350000000e030000290000001f03300039000016e40230019700000064032000390000000002310019000000400020043f00000000020004140000000b04000029000000040040008c000040ac0000c13d0000000001010433000000000010043f00000001020000390000000103000031000040d60000013d0000000f01000029000f00440010003d00000002030003670000000f01300360000000000101043b0000169b021001970000169c0020009c0000403b0000a13d0000169e0100004100000000001004430000000b0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d000000440210003900000040030000390000000000320435000000240210003900000000003204350000169f020000410000000000210435000000040210003900000006030000290000000000320435000000a40210003900000064031000390000000f04000029000000200440008a0000000204400367000000004504043c0000000003530436000000000023004b00003dce0000c13d000000400020043f00000000020004140000000b03000029000000040030008c000041dd0000c13d0000000001010433000000000010043f00000001020000390000000103000031000042040000013d0000169e0100004100000000001004430000000b0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d0000002402100039000000400300003900000000003204350000169f02000041000000000021043500000004021000390000000603000029000000000032043500000044021000390000000e030000290000000000320435000016e4043001980000001f0530018f000000640710003900000000034700190000000d06000029000000020660036700003e040000613d000000000806034f000000008908043c0000000007970436000000000037004b00003e000000c13d000000000005004b00003e110000613d000000000446034f0000000305500210000000000603043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f00000000004304350000000e030000290000001f03300039000016e40230019700000064032000390000000002310019000000400020043f00000000020004140000000b04000029000000040040008c000040db0000c13d0000000001010433000000000010043f00000001020000390000000103000031000041050000013d000015d90030009c000015d9030080410000006003300210000015d90010009c000015d9010080410000004001100210000000000131019f000015d90020009c000015d902008041000000c002200210000000000112019f0000000e0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000003e3b0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00003e370000c13d000000000005004b00003e480000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000042400000613d000000200030008c00003ea90000813d000042400000013d000015d90030009c000015d9030080410000006003300210000015d90010009c000015d9010080410000004001100210000000000131019f000015d90020009c000015d902008041000000c002200210000000000112019f0000000e0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000003e6a0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00003e660000c13d000000000005004b00003e770000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000042400000613d000000200030008c00003efd0000813d000042400000013d000015d90020009c000015d902008041000000c002200210000015d90010009c000015d9010080410000004001100210000000000121019f000016a0011001c70000000e0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000003e960000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00003e920000c13d000000000005004b00003ea30000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000042400000613d0000001f0030008c000042400000a13d000000000100043d0000169f0010009c000042400000c13d0000000f010000290000000e020000290000000c03000029000000040400002956ae4d3f0000040f000f00000001001d000000000001004b00003c110000613d0000000e01000029000000000010043f0000000601000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000902000029000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000080300002900003c300000013d000015d90020009c000015d902008041000000c002200210000015d90010009c000015d9010080410000004001100210000000000121019f000016a0011001c70000000e0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000003eea0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00003ee60000c13d000000000005004b00003ef70000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000042400000613d0000001f0030008c000042400000a13d000000000100043d0000169f0010009c000042400000c13d0000000f0100002900000000020004110000000e030000290000000c04000029000000060500002956ae52da0000040f0000ffff0220018f000004830020008c00003f0b0000613d000000000002004b000042da0000c13d000016b00010009c00003f4d0000213d0000169e0100004100000000001004430000000f0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b0000012a0000613d000000400300043d0000008401300039000000a002000039000000000021043500000064013000390000000302000029000000000021043500000044013000390000000602000029000000000021043500000024013000390000000c020000290000000000210435000016c201000041000000000013043500000004013000390000000e020000290000000000210435000d00000003001d000000a401300039000000000001043500000000010004140000000f02000029000000040020008c00003f460000613d0000000d02000029000015d90020009c000015d9020080410000004002200210000015d90010009c000015d901008041000000c001100210000000000121019f000016a3011001c70000000f0200002956ae56a40000040f0000006003100270000115d90030019d0003000000010355000000010020019000003f4d0000613d0000000d01000029000015dd0010009c000002ae0000213d0000000d01000029000000400010043f000000000100001900003f700000013d0000000e01000029000000000010043f0000000601000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000902000029000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000080220014f000000000021041b0000000800200180000000400100043d000d00000001001d00003f720000c13d00000001010000390000000d020000290000167d0000013d000016b301000041000027ed0000013d0000000f04000029000000200340008a000000000332034f0000002004400039000000000242034f000000000202043b000000000303043b000000400400043d0000006005400039000000000015043500000040014000390000000000310435000000f8012002700000002002400039000000000012043500000007010000290000000000140435000000000000043f000015d90040009c000015d90400804100000040014002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f0000169d011001c7000000010200003956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000003f9f0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00003f9b0000c13d000000000005004b00003fac0000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f000300000001035500000001002001900000407c0000613d000000000100043d000015dc00100198000029140000613d0000000b0110014f000015dc00100198000041380000613d000029140000013d0000000f04000029000000200340008a000000000332034f0000002004400039000000000242034f000000000202043b000000000303043b000000400400043d0000006005400039000000000015043500000040014000390000000000310435000000f8012002700000002002400039000000000012043500000006010000290000000000140435000000000000043f000015d90040009c000015d90400804100000040014002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f0000169d011001c7000000010200003956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000003fe20000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00003fde0000c13d000000000005004b00003fef0000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000040880000613d000000000100043d000015dc0010019800002a900000613d0000000b0110014f000015dc001001980000420b0000613d00002a900000013d0000000f04000029000000200440008a000000000343034f000000000303043b000000400400043d0000006005400039000000000025043500000040024000390000000000320435000000ff011002700000001b011000390000002002400039000000000012043500000007010000290000000000140435000000000000043f000015d90040009c000015d90400804100000040014002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f0000169d011001c7000000010200003956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000040230000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000401f0000c13d000000000005004b000040300000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000040940000613d000000000100043d000015dc0010019800003d340000613d0000000b0110014f000015dc00100198000041380000613d00003d340000013d0000000f04000029000000200440008a000000000343034f000000000303043b000000400400043d0000006005400039000000000025043500000040024000390000000000320435000000ff011002700000001b011000390000002002400039000000000012043500000006010000290000000000140435000000000000043f000015d90040009c000015d90400804100000040014002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f0000169d011001c7000000010200003956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000040640000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000040600000c13d000000000005004b000040710000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000040a00000613d000000000100043d000015dc0010019800003dae0000613d0000000b0110014f000015dc001001980000420b0000613d00003dae0000013d0000001f0530018f000015db06300198000000400200043d000000000462001900003c970000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000040830000c13d00003c970000013d0000001f0530018f000015db06300198000000400200043d000000000462001900003c970000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000408f0000c13d00003c970000013d0000001f0530018f000015db06300198000000400200043d000000000462001900003c970000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000409b0000c13d00003c970000013d0000001f0530018f000015db06300198000000400200043d000000000462001900003c970000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000040a70000c13d00003c970000013d000015d90030009c000015d9030080410000006003300210000015d90010009c000015d9010080410000004001100210000000000131019f000015d90020009c000015d902008041000000c002200210000000000112019f0000000b0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000040c70000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000040c30000c13d000000000005004b000040d40000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000042400000613d000000200030008c000041350000813d000042400000013d000015d90030009c000015d9030080410000006003300210000015d90010009c000015d9010080410000004001100210000000000131019f000015d90020009c000015d902008041000000c002200210000000000112019f0000000b0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000040f60000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000040f20000c13d000000000005004b000041030000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000042400000613d000000200030008c000042080000813d000042400000013d000015d90020009c000015d902008041000000c002200210000015d90010009c000015d9010080410000004001100210000000000121019f000016a0011001c70000000b0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000041220000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000411e0000c13d000000000005004b0000412f0000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000042400000613d0000001f0030008c000042400000a13d000000000100043d0000169f0010009c000042400000c13d0000000303000029000000000103041a000000ff0110018f000000050400002900000008024002100000168802200197000000000112019f0000000902000029000000d002200210000000000121019f000000000013041b000000400100043d0000000000410435000015d90010009c000015d90100804100000040011002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f00001670011001c70000800d020000390000000403000039000016a50400004100000008050000290000000b06000029000000000700041156ae56a40000040f00000001002001900000012a0000613d0000000301000029000000000101041a000400000001001d000016860100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d0000000402000029000000d002200270000000000101043b000000000021004b0000423d0000213d00000002030003670000004401300370000000000501043b0000000301000029000000000101041a00000008021002700000168704200197000000000045004b00000000050480190000006403300370000000000303043b000f00000005001d000000000035004b000042510000413d0000000f030000290000000002320049000000080220021000001688022001970000168901100197000000000112019f0000000302000029000000000012041b000000400100043d0000000000310435000015d90010009c000015d90100804100000040011002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f00001670011001c70000800d020000390000000403000039000016a60400004100000008050000290000000b06000029000000000700041156ae56a40000040f00000001002001900000012a0000613d0000000301000029000000000101041a0000168800100198000041b00000c13d000016e30110019700000001011001bf0000000302000029000000000012041b000000400100043d0000000000010435000015d90010009c000015d90100804100000040011002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f00001670011001c70000800d020000390000000403000039000016a70400004100000008050000290000000b06000029000000000700041156ae56a40000040f00000001002001900000012a0000613d0000000c010000290000000b020000290000000a030000290000000f0400002956ae4d3f0000040f000e00000001001d0000000f0000006b000041d60000613d0000000e0000006b000041d60000613d0000000f0400002900000008014002100000000303000029000000000203041a00000000011200190000168801100197000016a802200197000000000121019f000000000013041b000000400100043d0000000000410435000015d90010009c000015d90100804100000040011002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f00001670011001c70000800d020000390000000303000039000016a90400004100000008050000290000000b0600002956ae56a40000040f00000001002001900000012a0000613d0000000e0000006b0000000001000039000000010100c039000000400200043d00000020032000390000000000130435000043040000013d000015d90020009c000015d902008041000000c002200210000015d90010009c000015d9010080410000004001100210000000000121019f000016a0011001c70000000b0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000041f50000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000041f10000c13d000000000005004b000042020000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000042400000613d0000001f0030008c000042400000a13d000000000100043d0000169f0010009c000042400000c13d0000000203000029000000000103041a000000ff0110018f000000040400002900000008024002100000168802200197000000000112019f0000000902000029000000d002200210000000000121019f000000000013041b000000400100043d0000000000410435000015d90010009c000015d90100804100000040011002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f00001670011001c70000800d020000390000000403000039000016a50400004100000008050000290000000b06000029000000000700041156ae56a40000040f00000001002001900000012a0000613d0000000201000029000000000101041a000300000001001d000016860100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d0000000302000029000000d002200270000000000101043b000000000021004b000042430000a13d000000400100043d000016da0200004100001d7f0000013d000000400100043d000016d70200004100001d7f0000013d00000002030003670000004401300370000000000501043b0000000201000029000000000101041a00000008021002700000168704200197000000000045004b00000000050480190000006403300370000000000303043b000f00000005001d000000000035004b000042540000813d000000400100043d000016c30200004100001d7f0000013d0000000f030000290000000002320049000000080220021000001688022001970000168901100197000000000112019f0000000202000029000000000012041b000000400100043d0000000000310435000015d90010009c000015d90100804100000040011002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f00001670011001c70000800d020000390000000403000039000016a60400004100000008050000290000000b06000029000000000700041156ae56a40000040f00000001002001900000012a0000613d0000000201000029000000000101041a00001688001001980000428c0000c13d000016e30110019700000001011001bf0000000202000029000000000012041b000000400100043d0000000000010435000015d90010009c000015d90100804100000040011002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f00001670011001c70000800d020000390000000403000039000016a70400004100000008050000290000000b06000029000000000700041156ae56a40000040f00000001002001900000012a0000613d0000000c0100002900000000020004110000000b030000290000000a04000029000000070500002956ae52da0000040f0000ffff0220018f000004830020008c000042970000613d000000000002004b000042da0000c13d000016b00010009c000042dd0000213d0000169e0100004100000000001004430000000c0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b0000012a0000613d000000400300043d0000008401300039000000a002000039000000000021043500000064013000390000000f02000029000000000021043500000044013000390000000702000029000000000021043500000024013000390000000a020000290000000000210435000016c201000041000000000013043500000004013000390000000b020000290000000000210435000e00000003001d000000a401300039000000000001043500000000010004140000000c02000029000000040020008c000042d20000613d0000000e02000029000015d90020009c000015d9020080410000004002200210000015d90010009c000015d901008041000000c001100210000000000121019f000016a3011001c70000000c0200002956ae56a40000040f0000006003100270000115d90030019d00030000000103550000000100200190000042dd0000613d0000000e01000029000015dd0010009c000002ae0000213d0000000e01000029000000400010043f000d00000000001d000043000000013d000000000001042f000000400100043d000016d60200004100001d7f0000013d000d00010000003d000000400100043d000e00000001001d0000000f0000006b000043000000613d0000000f0400002900000008014002100000000203000029000000000203041a00000000011200190000168801100197000016a802200197000000000121019f000000000013041b0000000e010000290000000000410435000015d90010009c000015d90100804100000040011002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f00001670011001c70000800d020000390000000303000039000016a90400004100000008050000290000000b0600002956ae56a40000040f00000001002001900000012a0000613d000000400100043d000e00000001001d0000000e0200002900000020012000390000000d0300002900000000003104350000000f010000290000000000120435000015d90020009c000015d9020080410000004001200210000016aa011001c7000056af0001042e00000020030000390000000004310436000000000302043300000000003404350000004001100039000000000003004b0000431a0000613d000000000400001900000020022000390000000005020433000015dc0550019700000000015104360000000104400039000000000034004b000043130000413d000000000001042d0000169b0010009c0000432f0000213d000000a30010008c0000432f0000a13d00000002040003670000000401400370000000000101043b000015dc0010009c0000432f0000213d0000002402400370000000000202043b000015dc0020009c0000432f0000213d0000004403400370000000000303043b000015dc0030009c0000432f0000213d0000006404400370000000000404043b000000000001042d0000000001000019000056b00001043000000020030000390000000004310436000000000302043300000000003404350000004001100039000000000003004b0000433f0000613d00000000040000190000002002200039000000000502043300000000015104360000000104400039000000000034004b000043390000413d000000000001042d00080000000000020000000001000416000000000001004b000043560000c13d00000000010000310000169b0010009c000043560000213d000000630010008c000043560000a13d00000002010003670000000402100370000000000302043b000015dc0030009c000043560000213d0000002402100370000000000402043b000015dc0040009c000043560000213d0000004401100370000000000501043b000015dc0050009c000043580000a13d0000000001000019000056b0000104300000000001000410000000000013004b0000435d0000c13d0000000001000019000056af0001042e0000000001000411000015dc01100197000600000001001d000000000010043f0000000b01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c70000801002000039000500000003001d000800000004001d000700000005001d56ae56a90000040f0000000100200190000043560000613d000000000101043b000000000101041a000400000001001d0000167201000041000000000010044300000000010004120000000400100443000001000100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000046220000613d000000000101043b000300000001001d0000167201000041000000000010044300000000010004120000000400100443000001200100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000046220000613d000000000101043b000200000001001d00000004020000290000000d01200270000007f80310018f000000030130024f000000ff0110018f000300000003001d000000ff0030008c0000000001002019000016ae00200198000043a40000c13d000016e905000041000000040010008c000043da0000c13d000000000050043f000015f101000041000056b000010430000100000001001d0000000601000029000000000010043f0000000f01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000008030000290000000100200190000043560000613d000000000101043b000000000030043f0000000201100039000600000001001d000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000007030000290000000100200190000043560000613d000016e705000041000000000101043b000000000101041a000000ff00100190000043a10000c13d000000000030043f0000000601000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000043560000613d000016e805000041000000000101043b000000000101041a000000ff0010019000000001010000290000439e0000613d000043a10000013d000100000001001d000000040100002900000018011002700000167601100197000600000001001d000000000010043f0000000d01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000705000029000000080400002900000005030000290000000100200190000043560000613d0000000306000029000000020260024f000000ff0060008c0000000002002019000000000101043b000400000001001d000000ff0120018f000000010010008c000044190000613d000000020010008c0000000102000029000045090000c13d000000400200043d000016df010000410000000000120435000300000002001d000000040120003900000000005104350000167201000041000000000010044300000000010004120000000400100443000001400100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000046220000613d000000000201043b0000000001000414000015dc02200197000000040020008c0000447b0000c13d0000000103000031000000200030008c00000020040000390000000004034019000044a50000013d0000169e01000041000000000010044300000004005004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000046220000613d000000000101043b000000000001004b0000000503000029000000080400002900000001020000290000000701000029000045090000613d000000000010043f00000004010000290000000401100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000080400002900000005030000290000000100200190000043560000613d000000000101043b000000000101041a000000ff001001900000000102000029000045090000c13d0000000001000411000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000705000029000000080400002900000005030000290000000100200190000043560000613d000000000101043b000000000101041a000015dc01100197000000010010008c0000000102000029000045090000613d000000000031004b000045090000613d000016ea01000041000000000010044300000004005004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000046220000613d000000000101043b000000000010043f00000004010000290000000501100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000000005030000290000000804000029000043560000613d000016ec05000041000000000101043b000000000101041a000000ff001001900000000102000029000043a10000613d000045090000013d0000000303000029000015d90030009c000015d9030080410000004003300210000015d90010009c000015d901008041000000c001100210000000000131019f000016cf011001c756ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000305700029000044940000613d000000000801034f0000000309000029000000008a08043c0000000009a90436000000000059004b000044900000c13d000000000006004b000044a10000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000046230000613d0000001f01400039000000600210018f0000000301200029000000000021004b00000000020000390000000102004039000015dd0010009c0000457f0000213d00000001002001900000457f0000c13d000000400010043f000000200030008c000000050300002900000008040000290000000705000029000043560000413d00000003010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b000043560000c13d000000000001004b0000000102000029000045090000c13d000000000050043f00000004010000290000000401100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000080400002900000005030000290000000100200190000043560000613d000000000101043b000000000101041a000000ff001001900000000102000029000045090000c13d0000000001000411000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000705000029000000080400002900000005030000290000000100200190000043560000613d000000000101043b000000000101041a000015dc01100197000000010010008c0000000102000029000045090000613d000000000031004b000045090000613d000016ea01000041000000000010044300000004005004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000046220000613d000000000101043b000000000010043f00000004010000290000000501100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000000005030000290000000804000029000043560000613d000016eb05000041000044750000013d000000000043004b0000450d0000c13d000000030020008c0000435b0000c13d000000ff0120018f000000010010008c000045850000613d000000020010008c000045db0000613d000000030010008c00000005010000290000435b0000c13d000000000010043f00000004010000290000000401100039000700000001001d000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000008030000290000000100200190000043560000613d000000000101043b000000000101041a000000ff001001900000435b0000c13d000000000030043f0000000701000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000043560000613d000000000101043b000000000101041a000000ff001001900000435b0000c13d0000000001000411000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000005030000290000000100200190000043560000613d000000000101043b000000000101041a000015dc01100197000000010010008c0000435b0000613d000000000031004b0000435b0000613d000016ea01000041000000000010044300000004003004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000046220000613d00000004020000290000000502200039000000000101043b000000000010043f000700000002001d000000200020043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000000802000029000043560000613d000000000101043b000000000101041a000000ff001001900000435b0000c13d000016ea01000041000000000010044300000004002004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000046220000613d000000000101043b000000000010043f0000000701000029000000200010043f0000000001000414000046140000013d000016ce01000041000000000010043f0000004101000039000000040010043f000016cf01000041000056b0000104300000000001000411000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000000502000029000043560000613d000000000101043b000000000101041a000015dc01100197000000010010008c0000435b0000613d000000000021004b0000435b0000613d0000000601000029000000000010043f0000000c01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000005030000290000000100200190000043560000613d000000000101043b000000000030043f000800000001001d0000000401100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000043560000613d000000000101043b000000000101041a000000ff00100190000046410000c13d000016ea010000410000000000100443000000050100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000046220000613d000000000101043b000000000010043f00000008010000290000000501100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000043560000613d000000000101043b000000000101041a000000ff00100190000016ee050000410000435b0000613d000043a10000013d0000000501000029000000000010043f00000004010000290000000401100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000043560000613d000000000101043b000000000101041a000000ff001001900000435b0000c13d0000000001000411000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000005030000290000000100200190000043560000613d000000000101043b000000000101041a000015dc01100197000000010010008c0000435b0000613d000000000031004b0000435b0000613d000016ea01000041000000000010044300000004003004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000046220000613d000000000101043b000000000010043f00000004010000290000000501100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000043560000613d000016ed05000041000000000101043b000000000101041a000000ff001001900000435b0000c13d000043a10000013d000000000001042f0000001f0530018f000015db06300198000000400200043d00000000046200190000462e0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000462a0000c13d000000000005004b0000463b0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000015d90020009c000015d9020080410000004002200210000000000112019f000056b000010430000016ee05000041000000000050043f000015f101000041000056b0000104300000169b0010009c000046530000213d000000430010008c000046530000a13d00000002020003670000000401200370000000000101043b000015dc0010009c000046530000213d0000002402200370000000000202043b000015dc0020009c000046530000213d000000000001042d0000000001000019000056b0000104300000169b0010009c000046690000213d000000830010008c000046690000a13d00000002040003670000000401400370000000000101043b000015dc0010009c000046690000213d0000002402400370000000000202043b000015dc0020009c000046690000213d0000004403400370000000000303043b000015dc0030009c000046690000213d0000006404400370000000000404043b000000000001042d0000000001000019000056b00001043000010000000000020000000001000416000000000001004b000046af0000c13d00000000010000310000169b0010009c000046af0000213d000000430010008c000046af0000a13d00000004010000390000000201100367000000000201043b000015dc0020009c000046af0000213d000000000020043f0000000b01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000100000002001d000080100200003956ae56a90000040f0000000100200190000046af0000613d000000000101043b000000000101041a000000ff00100190000046b10000c13d00000018011002700000167601100197000000000010043f0000000e01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000046af0000613d000000000101043b0000000002000411000015dc02200197000000000020043f0000000401100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000000102000029000046af0000613d000000000101043b000000000101041a000000ff00100190000046b90000c13d000000400100043d000016dc02000041000046b30000013d0000000001000019000056b000010430000000400100043d000016db020000410000000000210435000015d90010009c000015d9010080410000004001100210000015f1011001c7000056b000010430000000000102001956ae56500000040f000000000001041b00000024010000390000000201100367000000000201043b000000010100002956ae56600000040f000000000001041b0000000001000019000056af0001042e000015dc02200197000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000046d20000613d000000000101043b000000000001042d0000000001000019000056b00001043000030000000000020000167601100197000000000010043f0000000c01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000470f0000613d000000000101043b000000000301041a000000400200043d000300000002001d000200000003001d0000000002320436000100000002001d000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000470f0000613d0000000205000029000000000005004b000047000000613d000000000101043b00000000020000190000000104000029000000000301041a000000000434043600000001011000390000000102200039000000000052004b000046f90000413d000047010000013d0000000104000029000000030100002900000000021400490000001f03200039000016e4023001970000000003120019000000000023004b00000000020000390000000102004039000015dd0030009c000047110000213d0000000100200190000047110000c13d000000400030043f000000000001042d0000000001000019000056b000010430000016ce01000041000000000010043f0000004101000039000000040010043f000016cf01000041000056b000010430000016a102200197000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000047250000613d000000000101043b000000000001042d0000000001000019000056b0000104300002000000000002000100000002001d000200000001001d000015dc01100197000000000010043f0000000b01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000047800000613d000000000101043b000000000101041a000000ff00100190000047820000c13d0000ff0000100190000047850000c13d00000018011002700000167601100197000000000010043f0000000e01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000047800000613d000000000101043b0000000002000411000015dc02200197000000000020043f0000000401100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000047800000613d000000000101043b000000000101041a000000ff00100190000047880000613d0000000201000029000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000047800000613d000000000101043b0000000102000039000000000021041b0000000201000029000000000010043f0000000101000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000047800000613d000000000101043b00000004011002700000000102000039000000000021041b000000000001042d0000000001000019000056b000010430000000400100043d000016db020000410000478a0000013d000000400100043d000016be020000410000478a0000013d000000400100043d000016dc020000410000000000210435000015d90010009c000015d9010080410000004001100210000015f1011001c7000056b000010430000016ef0010009c000047950000813d000000c001100039000000400010043f000000000001042d000016ce01000041000000000010043f0000004101000039000000040010043f000016cf01000041000056b0000104300000001f02200039000016e4022001970000000001120019000000000021004b00000000020000390000000102004039000015dd0010009c000047a70000213d0000000100200190000047a70000c13d000000400010043f000000000001042d000016ce01000041000000000010043f0000004101000039000000040010043f000016cf01000041000056b00001043000030000000000020000167601100197000000000010043f0000000d01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000047e90000613d000000000101043b0000000201100039000000000301041a000000400200043d000300000002001d000200000003001d0000000002320436000100000002001d000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f0000000100200190000047e90000613d0000000205000029000000000005004b000047da0000613d000000000101043b00000000020000190000000104000029000000000301041a000000000434043600000001011000390000000102200039000000000052004b000047d30000413d000047db0000013d0000000104000029000000030100002900000000021400490000001f03200039000016e4023001970000000003120019000000000023004b00000000020000390000000102004039000015dd0030009c000047eb0000213d0000000100200190000047eb0000c13d000000400030043f000000000001042d0000000001000019000056b000010430000016ce01000041000000000010043f0000004101000039000000040010043f000016cf01000041000056b00001043000030000000000020000167601100197000000000010043f0000000c01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000482d0000613d000000000101043b0000000201100039000000000301041a000000400200043d000300000002001d000200000003001d0000000002320436000100000002001d000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000482d0000613d0000000205000029000000000005004b0000481e0000613d000000000101043b00000000020000190000000104000029000000000301041a000000000434043600000001011000390000000102200039000000000052004b000048170000413d0000481f0000013d0000000104000029000000030100002900000000021400490000001f03200039000016e4023001970000000003120019000000000023004b00000000020000390000000102004039000015dd0030009c0000482f0000213d00000001002001900000482f0000c13d000000400030043f000000000001042d0000000001000019000056b000010430000016ce01000041000000000010043f0000004101000039000000040010043f000016cf01000041000056b00001043000030000000000020000167601100197000000000010043f0000000d01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000048700000613d000000000101043b000000000301041a000000400200043d000300000002001d000200000003001d0000000002320436000100000002001d000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f0000000100200190000048700000613d0000000205000029000000000005004b000048610000613d000000000101043b00000000020000190000000104000029000000000301041a000000000434043600000001011000390000000102200039000000000052004b0000485a0000413d000048620000013d0000000104000029000000030100002900000000021400490000001f03200039000016e4023001970000000003120019000000000023004b00000000020000390000000102004039000015dd0030009c000048720000213d0000000100200190000048720000c13d000000400030043f000000000001042d0000000001000019000056b000010430000016ce01000041000000000010043f0000004101000039000000040010043f000016cf01000041000056b0000104300001000000000002000000400300043d000016df020000410000000000230435000015dc01100197000100000003001d000000040230003900000000001204350000167201000041000000000010044300000000010004120000000400100443000001400100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000048db0000613d000000000201043b0000000001000414000015dc02200197000000040020008c0000489a0000c13d0000000103000031000000200030008c00000020040000390000000004034019000000010b000029000048c50000013d0000000103000029000015d90030009c000015d9030080410000004003300210000015d90010009c000015d901008041000000c001100210000000000131019f000016cf011001c756ae56a90000040f000000010b0000290000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000048b40000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000048b00000c13d000000000006004b000048c10000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000048e20000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000015dd0010009c000048dc0000213d0000000100200190000048dc0000c13d000000400010043f0000001f0030008c000048d90000a13d00000000010b0433000000000001004b0000000002000039000000010200c039000000000021004b000048d90000c13d000000000001042d0000000001000019000056b000010430000000000001042f000016ce01000041000000000010043f0000004101000039000000040010043f000016cf01000041000056b0000104300000001f0530018f000015db06300198000000400200043d0000000004620019000048ed0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000048e90000c13d000000000005004b000048fa0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000015d90020009c000015d9020080410000004002200210000000000112019f000056b0000104300002000000000002000200000001001d0000167201000041000000000010044300000000010004120000000400100443000001000100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f00000001002001900000492e0000613d000000000101043b000100000001001d0000167201000041000000000010044300000000010004120000000400100443000001200100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f00000001002001900000492e0000613d00000002020000290000000302200210000000010320024f000000ff0330018f000000ff0020008c0000000003002019000000000101043b000000000121022f000000ff0210018f00000000020020190000000001030019000000000001042d000000000001042f000a000000000002000500000004001d000900000003001d000a00000002001d000400000001001d000015dc021001970000000001000410000000000012004b00004c100000613d000600000002001d0000000001000411000015dc01100197000100000001001d000000000010043f0000000b01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b000000000101041a000800000001001d0000167201000041000000000010044300000000010004120000000400100443000001000100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f000000010020019000004c640000613d000000000101043b000700000001001d0000167201000041000000000010044300000000010004120000000400100443000001200100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f000000010020019000004c640000613d000000000101043b000200000001001d00000008020000290000000d01200270000007f80310018f000000070130024f000000ff0110018f000300000003001d000000ff0030008c0000000001002019000016ae00200198000700000001001d000049ac0000613d0000000101000029000000000010043f0000000f01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b0000000a02000029000015dc02200197000000000020043f0000000201100039000100000001001d000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b000000000101041a000000ff0010019000004c670000c13d0000000901000029000015dc01100197000000000010043f0000000101000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b000000000101041a000000ff00100190000000070100002900004c690000c13d000000040010008c00004c650000613d000000080100002900000018011002700000167601100197000100000001001d000000000010043f0000000d01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d0000000303000029000000020230024f000000ff0030008c0000000002002019000000000101043b000800000001001d000000ff0120018f000000010010008c000049ec0000613d000000020010008c00004ab20000c13d000000400300043d000016df0100004100000000001304350000000901000029000015dc02100197000300000003001d0000000401300039000200000002001d00000000002104350000167201000041000000000010044300000000010004120000000400100443000001400100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f000000010020019000004c640000613d000000000201043b0000000001000414000015dc02200197000000040020008c00004a600000c13d0000000103000031000000200030008c00000020040000390000000004034019000000030b00002900004a8b0000013d0000169e010000410000000000100443000000090100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f000000010020019000004c640000613d000000000101043b000000000001004b00004ab20000613d0000000901000029000015dc01100197000000000010043f00000008010000290000000401100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b000000000101041a000000ff0010019000004ab20000c13d0000000001000411000000000010043f0000000501000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b0000000401100270000000000101041a000015dc01100197000000010010008c00004ab20000613d000000060010006c00004ab20000613d0000000001000411000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b000000000301041a000015dc02300197000000060020006c0000000001000039000000010100c039000000010020008c0000000002000039000000010200c039000015de0030009c00004a3f0000413d000000000112016f000000010010019000004ab20000613d000016ea010000410000000000100443000000090100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f000000010020019000004c640000613d000000000101043b000000000010043f00000008010000290000000501100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b000000000101041a000000ff0010019000004ab20000c13d000016ec0100004100004c6a0000013d0000000303000029000015d90030009c000015d9030080410000004003300210000015d90010009c000015d901008041000000c001100210000000000131019f000016cf011001c756ae56a90000040f000000030b0000290000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b001900004a7a0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b00004a760000c13d000000000006004b00004a870000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000004c750000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000015dd0010009c00004c6f0000213d000000010020019000004c6f0000c13d000000400010043f000000200030008c00004c620000413d00000000010b0433000000000001004b0000000002000039000000010200c039000000000021004b00004c620000c13d000000000001004b00004ab20000c13d0000000201000029000000000010043f00000008010000290000000401100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b000000000101041a000000ff0010019000004c110000613d0000000a01000029000015dc031001970000000602000029000000000032004b000000070100002900004aba0000c13d000000030010008c00004c100000c13d000000ff0110018f000000010010008c00004b450000613d000000020010008c00004bb30000613d000000030010008c00004c100000c13d000900000003001d000000000020043f00000008010000290000000401100039000700000001001d000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b000000000101041a000000ff00100190000000090100002900004c100000c13d000000000010043f0000000701000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b000000000101041a000000ff0010019000004c100000c13d0000000001000411000000000010043f0000000501000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b0000000401100270000000000101041a000015dc01100197000000010010008c000000060200002900004c100000613d000000000021004b00004c100000613d0000000001000411000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b000000000101041a000015dc02100197000000010020008c000000060300002900004b100000613d000000000032004b00004b120000c13d0000169b0010009c00004c100000213d000016ea010000410000000000100443000000040100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f000000010020019000004c640000613d00000008020000290000000502200039000000000101043b000000000010043f000900000002001d000000200020043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b000000000101041a000000ff0010019000004c100000c13d000016ea0100004100000000001004430000000a0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f000000010020019000004c640000613d000000000101043b000000000010043f0000000901000029000000200010043f000000000100041400004c040000013d0000000001000411000000000010043f0000000501000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b0000000401100270000000000101041a000015dc01100197000000010010008c000000060200002900004c100000613d000000000021004b00004c100000613d0000000001000411000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b000000000101041a000015dc02100197000000010020008c000000060300002900004b700000613d000000000032004b00004b720000c13d0000169b0010009c00004c100000213d0000000101000029000000000010043f0000000c01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000201043b0000000601000029000000000010043f000a00000002001d0000000401200039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000916ee00000045000000000101043b000000000101041a000000ff0010019000004c6b0000c13d000016ea010000410000000000100443000000040100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f000000010020019000004c640000613d000000000101043b000000000010043f0000000a010000290000000501100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b000000000101041a000000ff0010019000004c100000613d00004c6b0000013d000000000020043f00000008010000290000000401100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b000000000101041a000000ff0010019000004c100000c13d0000000001000411000000000010043f0000000501000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b0000000401100270000000000101041a000015dc01100197000000010010008c000000060200002900004c100000613d000000000021004b00004c100000613d0000000001000411000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b000000000101041a000015dc02100197000000010020008c000000060300002900004bef0000613d000000000032004b00004bf10000c13d0000169b0010009c00004c100000213d000016ea010000410000000000100443000000040100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f000000010020019000004c640000613d000000000101043b000000000010043f00000008010000290000000501100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b000000000101041a000000ff0010019000004c930000613d000000000001042d0000000001000411000000000010043f0000000501000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b0000000401100270000000000101041a000015dc01100197000000010010008c00004ab20000613d000000060010006c00004ab20000613d0000000001000411000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b000000000301041a000015dc02300197000000060020006c0000000001000039000000010100c039000000010020008c0000000002000039000000010200c039000015de0030009c00004c410000413d000000000112016f000000010010019000004ab20000613d000016ea010000410000000000100443000000090100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f000000010020019000004c640000613d000000000101043b000000000010043f00000008010000290000000501100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b000000000101041a000000ff0010019000004ab20000c13d000016eb0100004100004c6a0000013d0000000001000019000056b000010430000000000001042f000016e90100004100004c6a0000013d000016e70100004100004c6a0000013d000016e801000041000900000001001d0000000901000029000000000010043f000015f101000041000056b000010430000016ce01000041000000000010043f0000004101000039000000040010043f000016cf01000041000056b0000104300000001f0530018f000015db06300198000000400200043d000000000462001900004c800000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00004c7c0000c13d000000000005004b00004c8d0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000015d90020009c000015d9020080410000004002200210000000000112019f000056b000010430000016ed0100004100004c6a0000013d00030000000000020000167601100197000000000010043f0000000e01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004cd00000613d000000000101043b000000000301041a000000400200043d000300000002001d000200000003001d0000000002320436000100000002001d000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f000000010020019000004cd00000613d0000000205000029000000000005004b00004cc10000613d000000000101043b00000000020000190000000104000029000000000301041a000000000434043600000001011000390000000102200039000000000052004b00004cba0000413d00004cc20000013d0000000104000029000000030100002900000000021400490000001f03200039000016e4023001970000000003120019000000000023004b00000000020000390000000102004039000015dd0030009c00004cd20000213d000000010020019000004cd20000c13d000000400030043f000000000001042d0000000001000019000056b000010430000016ce01000041000000000010043f0000004101000039000000040010043f000016cf01000041000056b0000104300005000000000002000100000005001d0000000005040019000000000403001900000000030200190000000002000411000500000001001d000400000003001d000300000004001d000200000005001d56ae52da0000040f0000ffff0220019000004ce70000613d000004830020008c00004d2e0000c13d0000000102000039000016b00010009c00004d2c0000213d0000169e0100004100000000001004430000000501000029000015dc01100197000500000001001d00000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f000000010020019000004d360000613d000000000101043b000000000001004b00004d370000613d000000400300043d0000008401300039000000a00200003900000000002104350000006401300039000000010200002900000000002104350000004401300039000000020200002900000000002104350000000301000029000015dc0110019700000024023000390000000000120435000016c20100004100000000001304350000000401000029000015dc0110019700000004023000390000000000120435000000a401300039000000000001043500000000010004140000000502000029000000040020008c00004d280000613d000015d90030009c000400000003001d000015d90300004100000004030040290000004003300210000015d90010009c000015d901008041000000c001100210000000000131019f000016a3011001c756ae56a40000040f0000006003100270000115d90030019d000000040300002900030000000103550000000100200190000000010200003900004d2c0000613d000016f00030009c00004d390000813d000000400030043f00000000020000190000000001020019000000000001042d000000400100043d000016d6020000410000000000210435000015d90010009c000015d9010080410000004001100210000015f1011001c7000056b000010430000000000001042f0000000001000019000056b000010430000016ce01000041000000000010043f0000004101000039000000040010043f000016cf01000041000056b000010430000b00000000000200000000050100190000000001000411000015dc061001970000000001000410000000000016004b00004d8a0000c13d000000400600043d00000064016000390000000000410435000015dc01300197000000440360003900000000001304350000002001600039000016b1030000410000000000310435000015dc032001970000002404600039000000000034043500000064030000390000000000360435000016f10060009c000051020000213d000000a003600039000000400030043f00000000030604330000000002000414000000040050008c00004df10000c13d00000001020000390000000104000031000000000004004b00004e040000613d0000001f01400039000016e4011001970000003f01100039000016e403100197000000400100043d0000000003310019000000000013004b00000000060000390000000106004039000015dd0030009c000051020000213d0000000100600190000051020000c13d000000400030043f0000000003410436000016e4054001980000001f0640018f0000000004530019000000030700036700004d7a0000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b00004d760000c13d000000000006004b00004d870000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f00000000005404350000000100200190000050fd0000613d00004e080000013d000600000006001d000200000004001d000800000003001d000a00000002001d000500000005001d000015dc01500197000700000001001d000000000010043f0000000b01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b000000000101041a000b00000001001d0000167201000041000000000010044300000000010004120000000400100443000001000100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000051010000613d000000000101043b000900000001001d0000167201000041000000000010044300000000010004120000000400100443000001200100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000051010000613d000000000101043b000300000001001d0000000b020000290000000d01200270000007f80310018f000000090130024f000000ff0110018f000400000003001d000000ff0030008c0000000001002019000016ae00200198000900000001001d00004e190000613d0000000701000029000000000010043f0000000f01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b0000000a02000029000015dc02200197000000000020043f0000000201100039000700000001001d000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d0000000102000039000000000101043b000000000101041a000000ff0010019000004e1f0000613d0000000001020019000000000001042d000015d90010009c000015d9010080410000004001100210000015d90030009c000015d9030080410000006003300210000000000113019f000015d90020009c000015d902008041000000c002200210000000000121019f000000000205001956ae56a40000040f00030000000103550000006001100270000115d90010019d000015d904100197000000000004004b00004d600000c13d000000600100003900000080030000390000000100200190000050fd0000613d0000000001010433000000000001004b00004e1d0000613d0000169b0010009c000050ff0000213d000000200010008c000050ff0000413d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000050ff0000c13d000000000001004b00000000010000390000000101006039000000000001042d000000040010008c00004e350000c13d0000000101000039000000000001042d0000000001000019000000000001042d0000000801000029000015dc01100197000000000010043f0000000701000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b000000000101041a000000ff00100190000050fd0000c13d0000000901000029000000040010008c000000010200003900004def0000613d0000000b0100002900000018011002700000167601100197000100000001001d000000000010043f0000000d01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d0000000403000029000000030230024f000000ff0030008c0000000002002019000000000101043b000700000001001d000000ff0120018f000000010010008c00004e730000613d000000020010008c00004f370000c13d000000400300043d000016df0100004100000000001304350000000801000029000015dc02100197000400000003001d0000000401300039000300000002001d00000000002104350000167201000041000000000010044300000000010004120000000400100443000001400100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000051010000613d000000000201043b0000000001000414000015dc02200197000000040020008c00004ee50000c13d0000000103000031000000200030008c00000020040000390000000004034019000000040b00002900004f100000013d0000169e010000410000000000100443000000080100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000051010000613d000000000101043b000000000001004b00004f370000613d0000000801000029000015dc01100197000000000010043f00000007010000290000000401100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b000000000101041a000000ff0010019000004f370000c13d0000000501000029000000000010043f000000200000043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b0000000401100270000000000101041a000015dc01100197000000010010008c00004f370000613d000000060010006c00004f370000613d0000000501000029000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b000000000301041a000015dc02300197000000060020006c0000000001000039000000010100c039000000010020008c0000000002000039000000010200c039000015de0030009c00004ec50000413d000000000112016f000000010010019000004f370000613d000016ea010000410000000000100443000000080100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000051010000613d000000000101043b000000000010043f00000007010000290000000501100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b000000000101041a000000ff0010019000004f370000c13d000050fd0000013d0000000403000029000015d90030009c000015d9030080410000004003300210000015d90010009c000015d901008041000000c001100210000000000131019f000016cf011001c756ae56a90000040f000000040b0000290000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b001900004eff0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b00004efb0000c13d000000000006004b00004f0c0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000051080000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000015dd0010009c000051020000213d0000000100200190000051020000c13d000000400010043f000000200030008c000050ff0000413d00000000010b0433000000000001004b0000000002000039000000010200c039000000000021004b000050ff0000c13d000000000001004b00004f370000c13d0000000301000029000000000010043f00000007010000290000000401100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b000000000101041a000000ff00100190000050640000613d0000000a01000029000015dc02100197000000060020006b000000090100002900004f3e0000c13d000000030010008c000050520000c13d000000ff0110018f000000010010008c00004fd40000613d000000020010008c000050400000613d000000030010008c000050520000c13d000900000002001d0000000601000029000000000010043f00000007010000290000000401100039000400000001001d000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b000000000101041a000000ff001001900000000901000029000050520000c13d000000000010043f0000000401000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b000000000101041a000000ff00100190000050520000c13d0000000501000029000000000010043f000000200000043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b0000000401100270000000000101041a000015dc01100197000000010010008c000050520000613d000000060010006c000050520000613d0000000501000029000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b000000000101041a000015dc02100197000000010020008c00004f920000613d000000060020006c00004f940000c13d0000169b0010009c000050520000213d000016ea010000410000000000100443000000000100041100000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000051010000613d00000007020000290000000502200039000000000101043b000000000010043f000900000002001d000000200020043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b000000000101041a000000ff00100190000050520000c13d000016ea0100004100000000001004430000000a0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000051010000613d000000000101043b000000000010043f0000000901000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b000000000101041a000000ff00100190000050520000c13d0000000101000039000000000001042d0000000501000029000000000010043f000000200000043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b0000000401100270000000000101041a000015dc01100197000000010010008c000050520000613d000000060010006c000050520000613d0000000501000029000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b000000000101041a000015dc02100197000000010020008c00004ffc0000613d000000060020006c00004ffe0000c13d0000169b0010009c000050520000213d0000000101000029000000000010043f0000000c01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000201043b0000000601000029000000000010043f000900000002001d0000000401200039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d0000000102000039000000000101043b000000000101041a000000ff0010019000004def0000c13d000016ea010000410000000000100443000000000100041100000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000051010000613d000000000101043b000000000010043f00000009010000290000000501100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b000000000101041a000000ff00100190000000010200003900004def0000c13d000050520000013d0000000601000029000000000010043f00000007010000290000000401100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b000000000101041a000000ff00100190000050b40000613d0000000b0100002900000098011002700000ffff0110019000000005050000290000000a020000290000000803000029000000020400002900004d460000613d000000140010008c00004d460000613d000000400100043d000016d6020000410000000000210435000015d90010009c000015d9010080410000004001100210000015f1011001c7000056b0000104300000000501000029000000000010043f000000200000043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b0000000401100270000000000101041a000015dc01100197000000010010008c00004f370000613d000000060010006c00004f370000613d0000000501000029000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b000000000301041a000015dc02300197000000060020006c0000000001000039000000010100c039000000010020008c0000000002000039000000010200c039000015de0030009c000050930000413d000000000112016f000000010010019000004f370000613d000016ea010000410000000000100443000000080100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000051010000613d000000000101043b000000000010043f00000007010000290000000501100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b000000000101041a000000ff0010019000004f370000c13d0000000101000039000000000001042d0000000501000029000000000010043f000000200000043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b0000000401100270000000000101041a000015dc01100197000000010010008c000050520000613d000000060010006c000050520000613d0000000501000029000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b000000000101041a000015dc02100197000000010020008c000050dc0000613d000000060020006c000050de0000c13d0000169b0010009c000050520000213d000016ea010000410000000000100443000000000100041100000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000051010000613d000000000101043b000000000010043f00000007010000290000000501100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b000000000101041a000000ff00100190000050520000c13d0000000101000039000000000001042d0000000001000019000056b000010430000000000001042f000016ce01000041000000000010043f0000004101000039000000040010043f000016cf01000041000056b0000104300000001f0530018f000015db06300198000000400200043d0000000004620019000051130000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000510f0000c13d000000000005004b000051200000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000015d90020009c000015d9020080410000004002200210000000000112019f000056b000010430000000140010008c0000512c0000613d000002d10010008c0000512c0000613d000004830010008c0000512d0000c13d000000000001042d000000400100043d000016b5020000410000000000210435000015d90010009c000015d9010080410000004001100210000015f1011001c7000056b0000104300001000000000002000100000002001d000015dc01100197000000000010043f0000000601000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000515c0000613d000000000101043b00000001020000290000000802200270000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000515c0000613d0000000102000029000000ff0220018f000000010220020f000000000101043b000000000301041a000000000323013f000000000031041b00000000002301700000515e0000613d000000000001042d0000000001000019000056b000010430000000400100043d000016d8020000410000000000210435000015d90010009c000015d9010080410000004001100210000015f1011001c7000056b0000104300007000000000002000300000007001d000100000005001d000200000004001d000600000003001d000500000002001d000400000001001d000015dc01600197000700000001001d000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000051eb0000613d000000000101043b000000000201041a000000400100043d000000c00310003900000000002304350000008002100039000000060300002900000000003204350000004002100039000000040300002900000000003204350000000502000029000015dc032001970000006002100039000500000003001d0000000000320435000000200210003900000007030000290000000000320435000000c0030000390000000000310435000000a0031000390000000000030435000016f20010009c000051ed0000813d000000e003100039000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f0000000100200190000051eb0000613d000000000101043b000000000010043f0000000201000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000051eb0000613d000000000101043b0000000302000029000015dc02200197000400000002001d000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000051eb0000613d000000000101043b000000000201041a000000ff0220018f0000000105000029000000d003500210000000000232019f000000020400002900000008034002100000168803300197000000000232019f000000000021041b000016a401500197000000400200043d0000004003200039000000000013043500001687014001970000002003200039000000000013043500000006010000290000000000120435000015d90020009c000015d90200804100000040012002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015ea011001c70000800d020000390000000403000039000016bd0400004100000007050000290000000506000029000000040700002956ae56a40000040f0000000100200190000051eb0000613d000000000001042d0000000001000019000056b000010430000016ce01000041000000000010043f0000004101000039000000040010043f000016cf01000041000056b00001043000040000000000020000000005040019000400000003001d0000000004020019000000000301001900000000020004110000000401000029000300000003001d000100000004001d000200000005001d56ae52da0000040f0000ffff02200190000052020000613d000002d10020008c000052410000c13d0000000102000039000016b00010009c0000523f0000213d0000169e0100004100000000001004430000000401000029000015dc01100197000400000001001d00000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000052490000613d000000000101043b000000000001004b0000524a0000613d000000400300043d0000004401300039000000020200002900000000002104350000000101000029000015dc0110019700000024023000390000000000120435000016b10100004100000000001304350000000301000029000015dc011001970000000402300039000000000012043500000000010004140000000402000029000000040020008c0000523b0000613d000015d90030009c000300000003001d000015d90300004100000003030040290000004003300210000015d90010009c000015d901008041000000c001100210000000000131019f000016b2011001c756ae56a40000040f0000006003100270000115d90030019d00000003030000290003000000010355000000010020019000000001020000390000523f0000613d000016f00030009c0000524c0000813d000000400030043f00000000020000190000000001020019000000000001042d000000400100043d000016d6020000410000000000210435000015d90010009c000015d9010080410000004001100210000015f1011001c7000056b000010430000000000001042f0000000001000019000056b000010430000016ce01000041000000000010043f0000004101000039000000040010043f000016cf01000041000056b00001043000030000000000020000167201000041000000000010044300000000010004120000000400100443000000a00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000052d10000613d000000000101043b000300000001001d000015df0100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000052d10000613d000000000101043b000000030010006c000052820000c13d0000167201000041000000000010044300000000010004120000000400100443000000800100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000052cf0000c13d000052d10000013d000200000001001d000000400100043d000300000001001d0000002002100039000015e601000041000100000002001d00000000001204350000167201000041000000000010044300000000010004120000000400100443000000c00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000052d10000613d000000000101043b0000000302000029000000400220003900000000001204350000167201000041000000000010044300000000010004120000000400100443000000e00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000052d10000613d000000000101043b0000000304000029000000a0024000390000000003000410000000000032043500000080024000390000000203000029000000000032043500000060024000390000000000120435000000a0010000390000000000140435000016ef0040009c000052d20000813d0000000302000029000000c001200039000000400010043f0000000101000029000015d90010009c000015d90100804100000040011002100000000002020433000015d90020009c000015d9020080410000006002200210000000000112019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f0000000100200190000052d80000613d000000000101043b000000000001042d000000000001042f000016ce01000041000000000010043f0000004101000039000000040010043f000016cf01000041000056b0000104300000000001000019000056b000010430000c0000000000020000000006020019000015dc072001970000000002000410000000000027004b00000000080000190000000002000019000052e40000c13d0000000001080019000000000001042d000800000004001d000500000005001d000a00000003001d000600000007001d000200000006001d000700000001001d000015dc01100197000900000001001d000000000010043f0000000b01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b000000000101041a000c00000001001d0000167201000041000000000010044300000000010004120000000400100443000001000100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f00000001002001900000562b0000613d000000000101043b000b00000001001d0000167201000041000000000010044300000000010004120000000400100443000001200100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f00000001002001900000562b0000613d000000000101043b000300000001001d0000000c020000290000000d01200270000007f80310018f0000000b0130024f000000ff0110018f000400000003001d000000ff0030008c0000000001002019000016ae00200198000053620000613d000b00000001001d0000000901000029000000000010043f0000000f01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b0000000a02000029000015dc02200197000000000020043f0000000201100039000900000001001d000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b000000000101041a000000ff001001900000534c0000613d000016e7010000410000000002000019000000000001042d0000000801000029000015dc01100197000000000010043f0000000901000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b000000000101041a000000ff001001900000000b01000029000053620000613d000016e8010000410000000002000019000000000001042d000000040010008c000053670000c13d000016e9010000410000000002000019000000000001042d000b00000001001d0000000c0100002900000018011002700000167601100197000100000001001d000000000010043f0000000d01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d0000000403000029000000030230024f000000ff0030008c0000000002002019000000000101043b000900000001001d000000ff0120018f000000010010008c000053a60000613d000000020010008c0000546d0000c13d000000400300043d000016df0100004100000000001304350000000801000029000015dc02100197000400000003001d0000000401300039000300000002001d00000000002104350000167201000041000000000010044300000000010004120000000400100443000001400100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f00000001002001900000562b0000613d000000000201043b0000000001000414000015dc02200197000000040020008c0000541b0000c13d0000000103000031000000200030008c00000020040000390000000004034019000000040b000029000054460000013d0000169e010000410000000000100443000000080100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f00000001002001900000562b0000613d000000000101043b000000000001004b0000546d0000613d0000000801000029000015dc01100197000000000010043f00000009010000290000000401100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b000000000101041a000000ff001001900000546d0000c13d0000000701000029000000000010043f0000000501000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b0000000401100270000000000101041a000015dc01100197000000010010008c0000546d0000613d000000060010006c0000546d0000613d0000000701000029000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b000000000301041a000015dc02300197000000060020006c0000000001000039000000010100c039000000010020008c0000000002000039000000010200c039000015de0030009c000053f90000413d000000000112016f00000001001001900000546d0000613d000016ea010000410000000000100443000000080100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f00000001002001900000562b0000613d000000000101043b000000000010043f00000009010000290000000501100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b000000000101041a000000ff001001900000546d0000c13d000016ec010000410000000002000019000000000001042d0000000403000029000015d90030009c000015d9030080410000004003300210000015d90010009c000015d901008041000000c001100210000000000131019f000016cf011001c756ae56a90000040f000000040b0000290000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000054350000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000054310000c13d000000000006004b000054420000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000056320000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000015dd0010009c0000562c0000213d00000001002001900000562c0000c13d000000400010043f000000200030008c000056290000413d00000000010b0433000000000001004b0000000002000039000000010200c039000000000021004b000056290000c13d000000000001004b0000546d0000c13d0000000301000029000000000010043f00000009010000290000000401100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b000000000101041a000000ff00100190000055680000613d0000000a01000029000015dc051001970000000602000029000000000052004b000000070300002900000005040000290000000b01000029000054770000c13d000000030010008c000055630000c13d000000ff0110018f000000010010008c000055020000613d000000020010008c000055500000613d000000030010008c000055630000c13d000b00000005001d000000000020043f00000009010000290000000401100039000800000001001d000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b000000000101041a000000ff001001900000000b01000029000055630000c13d000000000010043f0000000801000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b000000000101041a000000ff0010019000000007010000290000000502000029000055630000c13d000000000010043f000000200020043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b0000000401100270000000000101041a000015dc01100197000000010010008c00000006020000290000000703000029000055630000613d000000000021004b000055630000613d000000000030043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b000000000101041a000015dc02100197000000010020008c00000002030000290000000604000029000054ce0000613d000000000042004b000054d00000c13d0000169b0010009c000055630000213d000016ea01000041000000000010044300000004003004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f00000001002001900000562b0000613d00000009020000290000000502200039000000000101043b000000000010043f000b00000002001d000000200020043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b000000000101041a000000ff001001900000000a02000029000055630000c13d000016ea01000041000000000010044300000004002004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f00000001002001900000562b0000613d000000000101043b000000000010043f0000000b01000029000000200010043f0000000001000414000055f80000013d000000000030043f000000200040043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b0000000401100270000000000101041a000015dc01100197000000010010008c00000006020000290000000703000029000055630000613d000000000021004b000055630000613d000000000030043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b000000000101041a000015dc02100197000000010020008c00000006030000290000552b0000613d000000000032004b0000552d0000c13d0000169b0010009c000055630000213d0000000101000029000000000010043f0000000c01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000201043b0000000601000029000000000010043f000b00000002001d0000000401200039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b000000000101041a000000ff00100190000056070000613d0000000002000019000016ee01000041000000000001042d000000000020043f00000009010000290000000401100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b000000000101041a000000ff0010019000000007010000290000000502000029000055ba0000613d0000000c0100002900000098011002700000ffff0210018f0000000001000019000000000001042d0000000701000029000000000010043f0000000501000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b0000000401100270000000000101041a000015dc01100197000000010010008c0000546d0000613d000000060010006c0000546d0000613d0000000701000029000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b000000000301041a000015dc02300197000000060020006c0000000001000039000000010100c039000000010020008c0000000002000039000000010200c039000015de0030009c000055980000413d000000000112016f00000001001001900000546d0000613d000016ea010000410000000000100443000000080100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f00000001002001900000562b0000613d000000000101043b000000000010043f00000009010000290000000501100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b000000000101041a000000ff001001900000546d0000c13d000016eb010000410000000002000019000000000001042d000000000010043f000000200020043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b0000000401100270000000000101041a000015dc01100197000000010010008c00000006020000290000000703000029000055630000613d000000000021004b000055630000613d000000000030043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b000000000101041a000015dc02100197000000010020008c00000002030000290000000604000029000055e40000613d000000000042004b000055e60000c13d0000169b0010009c000055630000213d000016ea01000041000000000010044300000004003004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f00000001002001900000562b0000613d000000000101043b000000000010043f00000009010000290000000501100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b000000000101041a000000ff00100190000055630000c13d000016ed010000410000000002000019000000000001042d000016ea010000410000000000100443000000020100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f00000001002001900000562b0000613d000000000101043b000000000010043f0000000b010000290000000501100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b000000000101041a000000ff001001900000000002000019000016ee08000041000052e20000c13d000055630000013d0000000001000019000056b000010430000000000001042f000016ce01000041000000000010043f0000004101000039000000040010043f000016cf01000041000056b0000104300000001f0530018f000015db06300198000000400200043d00000000046200190000563d0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000056390000c13d000000000005004b0000564a0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000015d90020009c000015d9020080410000004002200210000000000112019f000056b000010430000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000565e0000613d000000000101043b000000000001042d0000000001000019000056b000010430000000000010043f000000200020043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000566e0000613d000000000101043b0000000401100270000000000001042d0000000001000019000056b000010430000000000001042f000015d90010009c000015d9010080410000004001100210000015d90020009c000015d9020080410000006002200210000000000112019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f0000000100200190000056840000613d000000000101043b000000000001042d0000000001000019000056b00001043000000000050100190000000000200443000000050030008c000056940000413d000000040100003900000000020000190000000506200210000000000664001900000005066002700000000006060031000000000161043a0000000102200039000000000031004b0000568c0000413d000015d90030009c000015d90300804100000060013002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000016f3011001c7000000000205001956ae56a90000040f0000000100200190000056a30000613d000000000101043b000000000001042d000000000001042f000056a7002104210000000102000039000000000001042d0000000002000019000000000001042d000056ac002104230000000102000039000000000001042d0000000002000019000000000001042d000056ae00000432000056af0001042e000056b0000104300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f630000000000000000000000000000000000000000000000000000000000000f830000000000000000000000000000000000000000000000000000000000001bfa0000000000000000000000000000000000000000000000000000000000001c1a0000000000000000000000000000000000000000000000000000000000000f130000000000000000000000000000000000000000000000000000000000000f33000000000000000000000000000000000000000000000000000000000000235e000000000000000000000000000000000000000000000000000000000000237e0000000000000000000000000000000000000000000000000000000000000527000000000000000000000000000000000000000000000000000000000000054700000000000000000000000000000000000000000000000000000000000027f40000000000000000000000000000000000000000000000000000000000002814000000000000000000000000000000000000000000000000000000000000049e00000000000000000000000000000000000000000000000000000000000004be00000000000000000000000000000000000000000000000000000000000024260000000000000000000000000000000000000000000000000000000000002446000000000000000000000000000000000000000000000000000000000000089a00000000000000000000000000000000000000000000000000000000000008ba0000000000000000000000000000000000000000000000000000000000001d590000000000000000000000000000000000000000000000000000000000001d79000000000000000000000000000000000000000000000000000000000000082c000000000000000000000000000000000000000000000000000000000000084c00000000000000000000000000000000000000000000000000000000000022200000000000000000000000000000000000000000000000000000000000002240000000000000000000000000000000000000000000000000000000000000062c000000000000000000000000000000000000000000000000000000000000064c000000000000000000000000000000000000000000000000000000000000256700000000000000000000000000000000000000000000000000000000000025870000000000000000000000000000000000000000000000000000000000001fe9000000000000000000000000000000000000000000000000000000000000200900000000000000000000000000000000000000000000000000000000000029620000000000000000000000000000000000000000000000000000000000002982000000000000000000000000000000000000000000000000000000000000016800000000000000000000000000000000000000000000000000000000000001880000000000000000000000000000000000000000000000000000000000001ca80000000000000000000000000000000000000000000000000000000000001cc800000000000000000000000000000000000000000000000000000000000014f0000000000000000000000000000000000000000000000000000000000000151000000000000000000000000000000000000000000000000000000000000026a900000000000000000000000000000000000000000000000000000000000026c900000000000000000000000000000000000000000000000000000000000005a000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000020e0000000000000000000000000000000000000000000000000000000000000210000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000ffffffffffffffff80000000000000000000000000000000000000000000000000000000000000009a8a0592ac89c5ad3bc6df8224c17b485976f597df104ee20d0df415241f670b0200000200000000000000000000000000000004000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000008be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e00000000000000000000000000000000000000000000000000494654067e0ffff000000000000000000000000000000000000000000000000002386f26fc0ffff8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f000000000000000000000000000000000000000000000000ffffffffffffff3f020000000000000000000000000000000000004000000000000000000000000044454641554c54204c495354000000000000000000000000000000000000000002000000000000000000000000000000000000600000000000000000000000005cc365f89543268cb9f25c255f7f610e9147e733c589bc2732279575f125be149b0894203394c3cbb23140db7a23b224d3e18e0366e9f65bd9c8402650e27367000000000000000000000000000000000000000000000403030202030201000200000000000000000000000000000000000000000000030201020100000000000000000200000000000000000000000000000300000001000000000000000000c56e5d73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000008254fcb600000000000000000000000000000000000000000000000000000000b97f6f8a00000000000000000000000000000000000000000000000000000000ddae38f100000000000000000000000000000000000000000000000000000000e34fda8400000000000000000000000000000000000000000000000000000000f7a2000900000000000000000000000000000000000000000000000000000000f7a2000a00000000000000000000000000000000000000000000000000000000fb2de5d700000000000000000000000000000000000000000000000000000000ffbcb4aa00000000000000000000000000000000000000000000000000000000e34fda8500000000000000000000000000000000000000000000000000000000e991dc3000000000000000000000000000000000000000000000000000000000f2fde38b00000000000000000000000000000000000000000000000000000000df21dc1c00000000000000000000000000000000000000000000000000000000df21dc1d00000000000000000000000000000000000000000000000000000000df5fd29a00000000000000000000000000000000000000000000000000000000e07cb24000000000000000000000000000000000000000000000000000000000ddae38f200000000000000000000000000000000000000000000000000000000de02cbb100000000000000000000000000000000000000000000000000000000def0125b00000000000000000000000000000000000000000000000000000000d415f62e00000000000000000000000000000000000000000000000000000000db5f30a700000000000000000000000000000000000000000000000000000000db5f30a800000000000000000000000000000000000000000000000000000000dd71105d00000000000000000000000000000000000000000000000000000000dda964e300000000000000000000000000000000000000000000000000000000d415f62f00000000000000000000000000000000000000000000000000000000d5dc239a00000000000000000000000000000000000000000000000000000000db188e6300000000000000000000000000000000000000000000000000000000c435f43400000000000000000000000000000000000000000000000000000000c435f43500000000000000000000000000000000000000000000000000000000caee23ea00000000000000000000000000000000000000000000000000000000cfea7ecf00000000000000000000000000000000000000000000000000000000b97f6f8b00000000000000000000000000000000000000000000000000000000bf7bfd7e00000000000000000000000000000000000000000000000000000000a5d56b4500000000000000000000000000000000000000000000000000000000b67d8f9800000000000000000000000000000000000000000000000000000000b89c4b0c00000000000000000000000000000000000000000000000000000000b89c4b0d00000000000000000000000000000000000000000000000000000000b8dcc68f00000000000000000000000000000000000000000000000000000000b955455200000000000000000000000000000000000000000000000000000000b67d8f9900000000000000000000000000000000000000000000000000000000b6e39ba100000000000000000000000000000000000000000000000000000000b70510f500000000000000000000000000000000000000000000000000000000ad1ff68400000000000000000000000000000000000000000000000000000000ad1ff68500000000000000000000000000000000000000000000000000000000ae602f4400000000000000000000000000000000000000000000000000000000b3992ab100000000000000000000000000000000000000000000000000000000a5d56b4600000000000000000000000000000000000000000000000000000000a87b03b6000000000000000000000000000000000000000000000000000000008da5cb5a00000000000000000000000000000000000000000000000000000000982d03bf00000000000000000000000000000000000000000000000000000000982d03c0000000000000000000000000000000000000000000000000000000009c2a9c6f00000000000000000000000000000000000000000000000000000000a1cc5cc1000000000000000000000000000000000000000000000000000000008da5cb5b000000000000000000000000000000000000000000000000000000008e28800f000000000000000000000000000000000000000000000000000000009340a7cc000000000000000000000000000000000000000000000000000000008963162500000000000000000000000000000000000000000000000000000000896316260000000000000000000000000000000000000000000000000000000089a9c855000000000000000000000000000000000000000000000000000000008b6ee865000000000000000000000000000000000000000000000000000000008254fcb70000000000000000000000000000000000000000000000000000000086e11774000000000000000000000000000000000000000000000000000000003e5c139c000000000000000000000000000000000000000000000000000000006498c0440000000000000000000000000000000000000000000000000000000071be859c000000000000000000000000000000000000000000000000000000007bac97dd000000000000000000000000000000000000000000000000000000007bac97de000000000000000000000000000000000000000000000000000000007c1e14b4000000000000000000000000000000000000000000000000000000007df81b900000000000000000000000000000000000000000000000000000000071be859d00000000000000000000000000000000000000000000000000000000725d07c50000000000000000000000000000000000000000000000000000000078e890ba000000000000000000000000000000000000000000000000000000006bfab91c000000000000000000000000000000000000000000000000000000006bfab91d00000000000000000000000000000000000000000000000000000000715018a6000000000000000000000000000000000000000000000000000000007161ac8d000000000000000000000000000000000000000000000000000000006498c0450000000000000000000000000000000000000000000000000000000069710828000000000000000000000000000000000000000000000000000000004c9d0b4400000000000000000000000000000000000000000000000000000000539d260100000000000000000000000000000000000000000000000000000000539d2602000000000000000000000000000000000000000000000000000000005e17263d000000000000000000000000000000000000000000000000000000005ed5917f000000000000000000000000000000000000000000000000000000004c9d0b45000000000000000000000000000000000000000000000000000000005079331500000000000000000000000000000000000000000000000000000000515f7b28000000000000000000000000000000000000000000000000000000003f6560ed000000000000000000000000000000000000000000000000000000003f6560ee00000000000000000000000000000000000000000000000000000000409dc573000000000000000000000000000000000000000000000000000000004be52a89000000000000000000000000000000000000000000000000000000003e5c139d000000000000000000000000000000000000000000000000000000003e8a0bc9000000000000000000000000000000000000000000000000000000001854b240000000000000000000000000000000000000000000000000000000002c7fe709000000000000000000000000000000000000000000000000000000003779e6fc000000000000000000000000000000000000000000000000000000003779e6fd000000000000000000000000000000000000000000000000000000003a0e3160000000000000000000000000000000000000000000000000000000003cda743a000000000000000000000000000000000000000000000000000000002c7fe70a000000000000000000000000000000000000000000000000000000002eb0b98a00000000000000000000000000000000000000000000000000000000317e3e8d0000000000000000000000000000000000000000000000000000000023c992610000000000000000000000000000000000000000000000000000000023c9926200000000000000000000000000000000000000000000000000000000285fb8c80000000000000000000000000000000000000000000000000000000028cc1131000000000000000000000000000000000000000000000000000000001854b241000000000000000000000000000000000000000000000000000000001f2fdc79000000000000000000000000000000000000000000000000000000000f59197c00000000000000000000000000000000000000000000000000000000136439dc00000000000000000000000000000000000000000000000000000000136439dd0000000000000000000000000000000000000000000000000000000016a17ce00000000000000000000000000000000000000000000000000000000016f18d74000000000000000000000000000000000000000000000000000000000f59197d0000000000000000000000000000000000000000000000000000000010b5c6a00000000000000000000000000000000000000000000000000000000012d3848a00000000000000000000000000000000000000000000000000000000057497ca00000000000000000000000000000000000000000000000000000000057497cb000000000000000000000000000000000000000000000000000000000ad38899000000000000000000000000000000000000000000000000000000000e14021a00000000000000000000000000000000000000000000000000000000015499300000000000000000000000000000000000000000000000000000000001ffc9a7000000000000000000000000000000000000002000000080000000000000000000000000000000000000000000000000000000040000001c00000000000000000000000000000000000000000000000000000000000000000000000091d1485400000000000000000000000000000000000000440000000000000000000000000000000000000000000000ffff00000000000000000000000000000000000000ffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffff0200000000000000000000000000000000000020000000000000000000000000a5c37ab91519073edd58e608f19f7ce383fd171f4f22c3612a1d0a7c1047794a310ab089e4439a4c15d089f94afb7896ff553aecb10793d0ab882de59d99a32e00000000000000000000000000000000000000400000008000000000000000003e58254b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000008000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffff208795fcac393398e42038456348398d8cac9067232f671ab240444cb51b1d207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0503012490a650739416858609e898957b874d17415a062945179c57357978840061d78094976b1d9ae7bb858f141c915b46152756409caadb07482983c2ca301ffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffbffdffffffffffffffffffffffffffffffffffffc0000000000000000000000000da8f3bd170446760f0f965a9b52bf271cb9679b5e0a70059eff2d49425229d17c8615322788d404dfe307db9eef031bc148d1cec5e270a1fd6528a02b445d4450000000000000000000000000000000000000020000000000000000000000000f71687260000000000000000000000000000000000000000000000000000000002000002000000000000000000000000000000440000000000000000000000009cc7f708afc65944829bd487b90b72536b1951864fbfc14e125fc972a6507f390200000200000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff1f796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d9553913200000000000000ffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff00000000000000000000000000000000000000000000000000ff5065726d69745472616e7366657246726f6d576974684164646974696f6e616c446174612875696e7432353620746f6b656e547970652c6164647265737320746f6b656e2c75696e743235362069642c75696e7432353620616d6f756e742c75696e74323536206e6f6e63652c61646472657373206f70657261746f722c75696e743235362065787069726174696f6e2c75696e74323536206d61737465724e6f6e63652c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fffffffffffffe9f02000000000000000000000000000000000000000000018000000000000000007069726174696f6e2c75696e74323536206d61737465724e6f6e63652c00000073616c742c61646472657373206f70657261746f722c75696e743235362065786e743235362069642c75696e7432353620616d6f756e742c75696e74323536206e7432353620746f6b656e547970652c6164647265737320746f6b656e2c75695065726d69744f72646572576974684164646974696f6e616c44617461287569932b8553b8e35bbee682d275cbe1cf115e14a777e2ca3266b4797369fb6317d3000000000000000000000000000000000000000000000000fffffffffffffebf190100000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000420000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a000000000000000000000000000000000000000800000000000000000000000001806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b831626ba7e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a400000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c40000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffff257001e1f7fbfc5bbde5da225c876ab67293f37bda3afb8b35d9a55dfad6f65d2203cb053e6b01ec07e87d67d288d360ae164171185684936663b7d8fa9c534c705db7ac401a8091bb37a7838ad73d1fa8e1c663cb345f347fefe71280e3f03bffffffffffff000000000000000000000000000000000000000000000000000083e0ca2c1392f14286fa1e41c797789d48c5827572e8bcc352d8943c1961eaf000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffff000000000000000000000000000000ffffffa66ff5557b7dc1562bb5e83306e15b513a25aa7537369bce38fc29c20847a79100000000000000000000000000ff00000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff23b872dd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064000000000000000000000000e4adc0bf00000000000000000000000000000000000000000000000000000000eda71103000000000000000000000000000000000000000000000000000000009d36a979000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000040000000800000000000000000e0d8d9ad73c586e8cf60ffd390b6f3654200a2d8857eb6abba4f6842a1210aae3f1df144000000000000000000000000000000000000000000000000000000001138edbff75f319641eb242dbcacee294ebc2a473eb6aa1454a7706da5bf96b0519973e7000000000000000000000000000000000000000000000000000000001f4ee59800000000000000000000000000000000000000000000000000000000f9c04f8b028fcfa3315ea5accaee4589194a685f07cda0392e6ba955070611190ec867d4f1b037422566cd0248bae620e6c142dcf5631948271916e8ca8dd263bf729bb1000000000000000000000000000000000000000000000000000000008e8cebe67607ce50a14a2e3261437f641a7b33ecc053e3d9c90b25ae5e66c65600000000000001000000000000000000000000000000000000000000000000008cbf875200000000000000000000000000000000000000000000000000000000f242432a00000000000000000000000000000000000000000000000000000000b9ff9815000000000000000000000000000000000000000000000000000000003b0a3343000000000000000000000000000000000000000000000000000000007f954ba1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff0000000000000000000000000001000000000000000000000000000000000000ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffb39d8f1e6f05413a407e46fc950eb92e9f5b3d65a47c3f0bdc7a2741a6ec0f7d9c615afab54584e53810beb24cced6ca36919dfc62bff2d4a0d244906c41c2ac9c6e8620d0004b9dd8b49560e2de8ced6f409f529cc23d0bb9e5a106d5c4324217c57023000000000000000000000000000000000000000000000000000000004e487b71000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000021943c000000000000000000000000000000000000000000000000000000000fee142c500000000000000000000000000000000000000000000000000000000827aed80000000000000000000000000000000000000000000000000000000004722506e00000000000000000000000000000000000000000000000000000000fd2c901300000000000000000000000000000000000000000000000000000000cc47725a000000000000000000000000000000000000000000000000000000007a535da60000000000000000000000000000000000000000000000000000000073c919b500000000000000000000000000000000000000000000000000000000d979627300000000000000000000000000000000000000000000000000000000de7fafeb00000000000000000000000000000000000000000000000000000000e3fd7ac300000000000000000000000000000000000000000000000000000000b1ae736700000000000000000000000000000000000000000000000000000000bc8ea062000000000000000000000000000000000000000000000000000000001bb3460dffffffffffffffffffffffffffffffffffffffffffffffffffffffff1bb3460e0000000000000000000000000000000000000000000000000000000089a9c85500000000000000000000000000000000000000000000000000000000c05808340000000000000000000000000000000000000000000000000000000001ffc9a7000000000000000000000000000000000000000000000000000000004e680cb000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff2b635c88000000000000000000000000000000000000000000000000000000002a5cb1c300000000000000000000000000000000000000000000000000000000d73e63af00000000000000000000000000000000000000000000000000000000e03fe177bb050a40ea1b3ecd64121a3fa063a94b6d404b2f45c64697555efe0ece32f2aa00000000000000000000000000000000000000000000000000000000aca58aa000000000000000000000000000000000000000000000000000000000ef28f90100000000000000000000000000000000000000000000000000000000409e6e1e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff400000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000ffffffffffffff5f000000000000000000000000000000000000000000000000ffffffffffffff200200000200000000000000000000000000000000000000000000000000000000722592740483e82f2e8f4f7cfca95947a020448bf86aa1bd63adc1d7b3d44cd6
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.