Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- WrappedGM
- Optimization enabled
- true
- Compiler version
- v0.8.18+commit.87f61d96
- Optimization runs
- 200
- EVM Version
- default
- Verified at
- 2023-07-12T06:35:02.421582Z
contracts/bridge/WrappedGM.sol
// SPDX-License-Identifier: MITpragma solidity ^0.8.0;import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";import {ERC20BurnableUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20BurnableUpgradeable.sol";import {ERC20VotesUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20VotesUpgradeable.sol";import {ERC20PermitUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/draft-ERC20PermitUpgradeable.sol";import {ERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";abstract contract WrappedGMStorage {// --------- IMMUTABLE ---------}contract WrappedGM isOwnableUpgradeable,ERC20BurnableUpgradeable,ERC20PermitUpgradeable,ERC20VotesUpgradeable,WrappedGMStorage{function initialize(address bridgeContract,string calldata name,string calldata symbol) external initializer {_transferOwnership(bridgeContract);__ERC20_init(name, symbol);}function mint(address account, uint amount) external onlyOwner {_mint(account, amount);}//FOR PROPOSALfunction _mint(address account,uint256 amount) internal virtual override(ERC20Upgradeable, ERC20VotesUpgradeable) {return ERC20VotesUpgradeable._mint(account, amount);}
@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)pragma solidity ^0.8.0;import "../utils/ContextUpgradeable.sol";import "../proxy/utils/Initializable.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 OwnableUpgradeable is Initializable, ContextUpgradeable {address private _owner;event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);/*** @dev Initializes the contract setting the deployer as the initial owner.*/function __Ownable_init() internal onlyInitializing {__Ownable_init_unchained();}function __Ownable_init_unchained() internal onlyInitializing {_transferOwnership(_msgSender());}/*** @dev Throws if called by any account other than the owner.*/modifier onlyOwner() {_checkOwner();
@openzeppelin/contracts-upgradeable/governance/utils/IVotesUpgradeable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (governance/utils/IVotes.sol)pragma solidity ^0.8.0;/*** @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.** _Available since v4.5._*/interface IVotesUpgradeable {/*** @dev Emitted when an account changes their delegate.*/event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);/*** @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.*/event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);/*** @dev Returns the current amount of votes that `account` has.*/function getVotes(address account) external view returns (uint256);/*** @dev Returns the amount of votes that `account` had at a specific moment in the past. If the `clock()` is* configured to use block numbers, this will return the value at the end of the corresponding block.*/function getPastVotes(address account, uint256 timepoint) external view returns (uint256);/*** @dev Returns the total supply of votes available at a specific moment in the past. If the `clock()` is* configured to use block numbers, this will return the value at the end of the corresponding block.** NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.* Votes that have not been delegated are still part of total supply, even though they would not participate in a* vote.*/function getPastTotalSupply(uint256 timepoint) external view returns (uint256);
@openzeppelin/contracts-upgradeable/interfaces/IERC5267Upgradeable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC5267.sol)pragma solidity ^0.8.0;interface IERC5267Upgradeable {/*** @dev MAY be emitted to signal that the domain could have changed.*/event EIP712DomainChanged();/*** @dev returns the fields and values that describe the domain separator used by this contract for EIP-712* signature.*/function eip712Domain()externalviewreturns (bytes1 fields,string memory name,string memory version,uint256 chainId,address verifyingContract,bytes32 salt,uint256[] memory extensions);}
@openzeppelin/contracts-upgradeable/interfaces/IERC5805Upgradeable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC5805.sol)pragma solidity ^0.8.0;import "../governance/utils/IVotesUpgradeable.sol";import "./IERC6372Upgradeable.sol";interface IERC5805Upgradeable is IERC6372Upgradeable, IVotesUpgradeable {}
@openzeppelin/contracts-upgradeable/interfaces/IERC6372Upgradeable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC6372.sol)pragma solidity ^0.8.0;interface IERC6372Upgradeable {/*** @dev Clock used for flagging checkpoints. Can be overridden to implement timestamp based checkpoints (and voting).*/function clock() external view returns (uint48);/*** @dev Description of the clock*/// solhint-disable-next-line func-name-mixedcasefunction CLOCK_MODE() external view returns (string memory);}
@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol)pragma solidity ^0.8.2;import "../../utils/AddressUpgradeable.sol";/*** @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed* behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.** The initialization functions use a version number. Once a version number is used, it is consumed and cannot be* reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in* case an upgrade adds a module that needs to be initialized.** For example:** [.hljs-theme-light.nopadding]* ```solidity* contract MyToken is ERC20Upgradeable {* function initialize() initializer public {* __ERC20_init("MyToken", "MTK");* }* }** contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {* function initializeV2() reinitializer(2) public {* __ERC20Permit_init("MyToken");* }* }* ```** TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as* possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.** CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.** [CAUTION]
@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)pragma solidity ^0.8.0;import "./IERC20Upgradeable.sol";import "./extensions/IERC20MetadataUpgradeable.sol";import "../../utils/ContextUpgradeable.sol";import "../../proxy/utils/Initializable.sol";/*** @dev Implementation of the {IERC20} interface.** This implementation is agnostic to the way tokens are created. This means* that a supply mechanism has to be added in a derived contract using {_mint}.* For a generic mechanism see {ERC20PresetMinterPauser}.** TIP: For a detailed writeup see our guide* https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How* to implement supply mechanisms].** The default value of {decimals} is 18. To change this, you should override* this function so it returns a different value.** We have followed general OpenZeppelin Contracts guidelines: functions revert* instead returning `false` on failure. This behavior is nonetheless* conventional and does not conflict with the expectations of ERC20* applications.** Additionally, an {Approval} event is emitted on calls to {transferFrom}.* This allows applications to reconstruct the allowance for all accounts just* by listening to said events. Other implementations of the EIP may not emit* these events, as it isn't required by the specification.** Finally, the non-standard {decreaseAllowance} and {increaseAllowance}* functions have been added to mitigate the well-known issues around setting* allowances. See {IERC20-approve}.*/contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable {mapping(address => uint256) private _balances;
@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol
// 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 IERC20Upgradeable {/*** @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);
@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20BurnableUpgradeable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol)pragma solidity ^0.8.0;import "../ERC20Upgradeable.sol";import "../../../utils/ContextUpgradeable.sol";import "../../../proxy/utils/Initializable.sol";/*** @dev Extension of {ERC20} that allows token holders to destroy both their own* tokens and those that they have an allowance for, in a way that can be* recognized off-chain (via event analysis).*/abstract contract ERC20BurnableUpgradeable is Initializable, ContextUpgradeable, ERC20Upgradeable {function __ERC20Burnable_init() internal onlyInitializing {}function __ERC20Burnable_init_unchained() internal onlyInitializing {}/*** @dev Destroys `amount` tokens from the caller.** See {ERC20-_burn}.*/function burn(uint256 amount) public virtual {_burn(_msgSender(), amount);}/*** @dev Destroys `amount` tokens from `account`, deducting from the caller's* allowance.** See {ERC20-_burn} and {ERC20-allowance}.** Requirements:** - the caller must have allowance for ``accounts``'s tokens of at least* `amount`.*/function burnFrom(address account, uint256 amount) public virtual {
@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PermitUpgradeable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/ERC20Permit.sol)pragma solidity ^0.8.0;import "./IERC20PermitUpgradeable.sol";import "../ERC20Upgradeable.sol";import "../../../utils/cryptography/ECDSAUpgradeable.sol";import "../../../utils/cryptography/EIP712Upgradeable.sol";import "../../../utils/CountersUpgradeable.sol";import "../../../proxy/utils/Initializable.sol";/*** @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].** Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by* presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't* need to send a transaction, and thus is not required to hold Ether at all.** _Available since v3.4._** @custom:storage-size 51*/abstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IERC20PermitUpgradeable, EIP712Upgradeable {using CountersUpgradeable for CountersUpgradeable.Counter;mapping(address => CountersUpgradeable.Counter) private _nonces;// solhint-disable-next-line var-name-mixedcasebytes32 private constant _PERMIT_TYPEHASH =keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");/*** @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`.* However, to ensure consistency with the upgradeable transpiler, we will continue* to reserve a slot.* @custom:oz-renamed-from _PERMIT_TYPEHASH*/// solhint-disable-next-line var-name-mixedcasebytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT;
@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20VotesUpgradeable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/ERC20Votes.sol)pragma solidity ^0.8.0;import "./ERC20PermitUpgradeable.sol";import "../../../interfaces/IERC5805Upgradeable.sol";import "../../../utils/math/MathUpgradeable.sol";import "../../../utils/math/SafeCastUpgradeable.sol";import "../../../utils/cryptography/ECDSAUpgradeable.sol";import "../../../proxy/utils/Initializable.sol";/*** @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,* and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.** NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.** This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either* by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting* power can be queried through the public accessors {getVotes} and {getPastVotes}.** By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it* requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.** _Available since v4.2._*/abstract contract ERC20VotesUpgradeable is Initializable, ERC20PermitUpgradeable, IERC5805Upgradeable {function __ERC20Votes_init() internal onlyInitializing {}function __ERC20Votes_init_unchained() internal onlyInitializing {}struct Checkpoint {uint32 fromBlock;uint224 votes;}bytes32 private constant _DELEGATION_TYPEHASH =keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");
@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)pragma solidity ^0.8.0;import "../IERC20Upgradeable.sol";/*** @dev Interface for the optional metadata functions from the ERC20 standard.** _Available since v4.1._*/interface IERC20MetadataUpgradeable is IERC20Upgradeable {/*** @dev Returns the name of the token.*/function name() external view returns (string memory);/*** @dev Returns the symbol of the token.*/function symbol() external view returns (string memory);/*** @dev Returns the decimals places of the token.*/function decimals() external view returns (uint8);}
@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20PermitUpgradeable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol)pragma solidity ^0.8.0;/*** @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].** Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by* presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't* need to send a transaction, and thus is not required to hold Ether at all.*/interface IERC20PermitUpgradeable {/*** @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,* given ``owner``'s signed approval.** IMPORTANT: The same issues {IERC20-approve} has related to transaction* ordering also apply here.** Emits an {Approval} event.** Requirements:** - `spender` cannot be the zero address.* - `deadline` must be a timestamp in the future.* - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`* over the EIP712-formatted function arguments.* - the signature must use ``owner``'s current nonce (see {nonces}).** For more information on the signature format, see the* https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP* section].*/function permit(address owner,address spender,uint256 value,uint256 deadline,uint8 v,
@openzeppelin/contracts-upgradeable/token/ERC20/extensions/draft-ERC20PermitUpgradeable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/draft-ERC20Permit.sol)pragma solidity ^0.8.0;// EIP-2612 is Final as of 2022-11-01. This file is deprecated.import "./ERC20PermitUpgradeable.sol";
@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)pragma solidity ^0.8.1;/*** @dev Collection of functions related to the address type*/library AddressUpgradeable {/*** @dev Returns true if `account` is a contract.** [IMPORTANT]* ====* It is unsafe to assume that an address for which this function returns* false is an externally-owned account (EOA) and not a contract.** Among others, `isContract` will return false for the following* types of addresses:** - an externally-owned account* - a contract in construction* - an address where a contract will be created* - an address where a contract lived, but was destroyed** Furthermore, `isContract` will also return true if the target contract within* the same transaction is already scheduled for destruction by `SELFDESTRUCT`,* which only has an effect at the end of a transaction.* ====** [IMPORTANT]* ====* You shouldn't rely on `isContract` to protect against flash loan attacks!** Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract* constructor.* ====*/function isContract(address account) internal view returns (bool) {// This method relies on extcodesize/address.code.length, which returns 0
@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)pragma solidity ^0.8.0;import "../proxy/utils/Initializable.sol";/*** @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 ContextUpgradeable is Initializable {function __Context_init() internal onlyInitializing {}function __Context_init_unchained() internal onlyInitializing {}function _msgSender() internal view virtual returns (address) {return msg.sender;}function _msgData() internal view virtual returns (bytes calldata) {return msg.data;}/*** @dev This empty reserved space is put in place to allow future versions to add new* variables without shifting down storage in the inheritance chain.* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps*/uint256[50] private __gap;}
@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)pragma solidity ^0.8.0;/*** @title Counters* @author Matt Condon (@shrugs)* @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number* of elements in a mapping, issuing ERC721 ids, or counting request ids.** Include with `using Counters for Counters.Counter;`*/library CountersUpgradeable {struct Counter {// This variable should never be directly accessed by users of the library: interactions must be restricted to// the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add// this feature: see https://github.com/ethereum/solidity/issues/4637uint256 _value; // default: 0}function current(Counter storage counter) internal view returns (uint256) {return counter._value;}function increment(Counter storage counter) internal {unchecked {counter._value += 1;}}function decrement(Counter storage counter) internal {uint256 value = counter._value;require(value > 0, "Counter: decrement overflow");unchecked {counter._value = value - 1;}}function reset(Counter storage counter) internal {counter._value = 0;
@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)pragma solidity ^0.8.0;import "./math/MathUpgradeable.sol";import "./math/SignedMathUpgradeable.sol";/*** @dev String operations.*/library StringsUpgradeable {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 = MathUpgradeable.log10(value) + 1;string memory buffer = new string(length);uint256 ptr;/// @solidity memory-safe-assemblyassembly {ptr := add(buffer, add(32, length))}while (true) {ptr--;/// @solidity memory-safe-assemblyassembly {mstore8(ptr, byte(mod(value, 10), _SYMBOLS))}value /= 10;if (value == 0) break;}return buffer;}}/**
@openzeppelin/contracts-upgradeable/utils/cryptography/ECDSAUpgradeable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/ECDSA.sol)pragma solidity ^0.8.0;import "../StringsUpgradeable.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 ECDSAUpgradeable {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.
@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/EIP712.sol)pragma solidity ^0.8.8;import "./ECDSAUpgradeable.sol";import "../../interfaces/IERC5267Upgradeable.sol";import "../../proxy/utils/Initializable.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:storage-size 52*/abstract contract EIP712Upgradeable is Initializable, IERC5267Upgradeable {bytes32 private constant _TYPE_HASH =keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");/// @custom:oz-renamed-from _HASHED_NAMEbytes32 private _hashedName;/// @custom:oz-renamed-from _HASHED_VERSION
@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol
// 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 MathUpgradeable {enum Rounding {Down, // Toward negative infinityUp, // Toward infinityZero // 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.*
@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SafeCast.sol)// This file was procedurally generated from scripts/generate/templates/SafeCast.js.pragma solidity ^0.8.0;/*** @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow* checks.** Downcasting from uint256/int256 in Solidity does not revert on overflow. This can* easily result in undesired exploitation or bugs, since developers usually* assume that overflows raise errors. `SafeCast` restores this intuition by* reverting the transaction when such an operation overflows.** Using this library instead of the unchecked operations eliminates an entire* class of bugs, so it's recommended to use it always.** Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing* all math on `uint256` and `int256` and then downcasting.*/library SafeCastUpgradeable {/*** @dev Returns the downcasted uint248 from uint256, reverting on* overflow (when the input is greater than largest uint248).** Counterpart to Solidity's `uint248` operator.** Requirements:** - input must fit into 248 bits** _Available since v4.7._*/function toUint248(uint256 value) internal pure returns (uint248) {require(value <= type(uint248).max, "SafeCast: value doesn't fit in 248 bits");return uint248(value);}/*** @dev Returns the downcasted uint240 from uint256, reverting on
@openzeppelin/contracts-upgradeable/utils/math/SignedMathUpgradeable.sol
// 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 SignedMathUpgradeable {/*** @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);}
Compiler Settings
{"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers"]}},"optimizer":{"runs":200,"enabled":true},"metadata":{"useLiteralContent":true},"libraries":{}}
Contract ABI
[{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"DelegateChanged","inputs":[{"type":"address","name":"delegator","internalType":"address","indexed":true},{"type":"address","name":"fromDelegate","internalType":"address","indexed":true},{"type":"address","name":"toDelegate","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"DelegateVotesChanged","inputs":[{"type":"address","name":"delegate","internalType":"address","indexed":true},{"type":"uint256","name":"previousBalance","internalType":"uint256","indexed":false},{"type":"uint256","name":"newBalance","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"EIP712DomainChanged","inputs":[],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"type":"uint8","name":"version","internalType":"uint8","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"CLOCK_MODE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"DOMAIN_SEPARATOR","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burn","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burnFrom","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct ERC20VotesUpgradeable.Checkpoint","components":[{"type":"uint32","name":"fromBlock","internalType":"uint32"},{"type":"uint224","name":"votes","internalType":"uint224"}]}],"name":"checkpoints","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"uint32","name":"pos","internalType":"uint32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint48","name":"","internalType":"uint48"}],"name":"clock","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"subtractedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"delegate","inputs":[{"type":"address","name":"delegatee","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"delegateBySig","inputs":[{"type":"address","name":"delegatee","internalType":"address"},{"type":"uint256","name":"nonce","internalType":"uint256"},{"type":"uint256","name":"expiry","internalType":"uint256"},{"type":"uint8","name":"v","internalType":"uint8"},{"type":"bytes32","name":"r","internalType":"bytes32"},{"type":"bytes32","name":"s","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"delegates","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes1","name":"fields","internalType":"bytes1"},{"type":"string","name":"name","internalType":"string"},{"type":"string","name":"version","internalType":"string"},{"type":"uint256","name":"chainId","internalType":"uint256"},{"type":"address","name":"verifyingContract","internalType":"address"},{"type":"bytes32","name":"salt","internalType":"bytes32"},{"type":"uint256[]","name":"extensions","internalType":"uint256[]"}],"name":"eip712Domain","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getPastTotalSupply","inputs":[{"type":"uint256","name":"timepoint","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getPastVotes","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"uint256","name":"timepoint","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getVotes","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"increaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"addedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initialize","inputs":[{"type":"address","name":"bridgeContract","internalType":"address"},{"type":"string","name":"name","internalType":"string"},{"type":"string","name":"symbol","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"mint","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"nonces","inputs":[{"type":"address","name":"owner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint32","name":"","internalType":"uint32"}],"name":"numCheckpoints","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"permit","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"},{"type":"uint256","name":"deadline","internalType":"uint256"},{"type":"uint8","name":"v","internalType":"uint8"},{"type":"bytes32","name":"r","internalType":"bytes32"},{"type":"bytes32","name":"s","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]}]
Contract Creation Code
0x608060405234801561001057600080fd5b50612764806100206000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c806379cc67901161010f5780639ab24eb0116100a2578063d505accf11610071578063d505accf14610464578063dd62ed3e14610477578063f1127ed81461048a578063f2fde38b146104c757600080fd5b80639ab24eb014610418578063a457c2d71461042b578063a9059cbb1461043e578063c3cda5201461045157600080fd5b80638e539e8c116100de5780638e539e8c146103cb57806390657147146103de57806391ddadf4146103f157806395d89b411461041057600080fd5b806379cc6790146103795780637ecebe001461038c57806384b0196e1461039f5780638da5cb5b146103ba57600080fd5b806340c10f19116101875780635c19a95c116101565780635c19a95c1461030d5780636fcfff451461032057806370a0823114610348578063715018a61461037157600080fd5b806340c10f191461029857806342966c68146102ad5780634bf5d7e9146102c0578063587cde1e146102c857600080fd5b8063313ce567116101c3578063313ce5671461025b5780633644e5151461026a57806339509351146102725780633a46b1a81461028557600080fd5b806306fdde03146101f5578063095ea7b31461021357806318160ddd1461023657806323b872dd14610248575b600080fd5b6101fd6104da565b60405161020a9190612184565b60405180910390f35b6102266102213660046121b3565b61056c565b604051901515815260200161020a565b6067545b60405190815260200161020a565b6102266102563660046121dd565b610586565b6040516012815260200161020a565b61023a6105aa565b6102266102803660046121b3565b6105b9565b61023a6102933660046121b3565b6105db565b6102ab6102a63660046121b3565b610666565b005b6102ab6102bb366004612219565b61067c565b6101fd610689565b6102f56102d6366004612232565b6001600160a01b03908116600090815261013060205260409020541690565b6040516001600160a01b03909116815260200161020a565b6102ab61031b366004612232565b610721565b61033361032e366004612232565b61072b565b60405163ffffffff909116815260200161020a565b61023a610356366004612232565b6001600160a01b031660009081526065602052604090205490565b6102ab61074e565b6102ab6103873660046121b3565b610762565b61023a61039a366004612232565b610777565b6103a7610795565b60405161020a979695949392919061224d565b6033546001600160a01b03166102f5565b61023a6103d9366004612219565b610833565b6102ab6103ec36600461232c565b61089b565b6103f9610a25565b60405165ffffffffffff909116815260200161020a565b6101fd610a30565b61023a610426366004612232565b610a3f565b6102266104393660046121b3565b610ac3565b61022661044c3660046121b3565b610b3e565b6102ab61045f3660046123be565b610b4c565b6102ab610472366004612416565b610c82565b61023a610485366004612480565b610de6565b61049d6104983660046124b3565b610e11565b60408051825163ffffffff1681526020928301516001600160e01b0316928101929092520161020a565b6102ab6104d5366004612232565b610e96565b6060606880546104e9906124f3565b80601f0160208091040260200160405190810160405280929190818152602001828054610515906124f3565b80156105625780601f1061053757610100808354040283529160200191610562565b820191906000526020600020905b81548152906001019060200180831161054557829003601f168201915b5050505050905090565b60003361057a818585610f0c565b60019150505b92915050565b600033610594858285611030565b61059f8585856110aa565b506001949350505050565b60006105b461125b565b905090565b60003361057a8185856105cc8383610de6565b6105d6919061253d565b610f0c565b60006105e5610a25565b65ffffffffffff16821061063c5760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b60448201526064015b60405180910390fd5b6001600160a01b03831660009081526101316020526040902061065f9083611265565b9392505050565b61066e61134e565b61067882826113a8565b5050565b61068633826113b2565b50565b606043610694610a25565b65ffffffffffff16146106e95760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a2062726f6b656e20636c6f636b206d6f64650000006044820152606401610633565b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b61068633826113bc565b6001600160a01b0381166000908152610131602052604081205461058090611437565b61075661134e565b61076060006114a0565b565b61076d823383611030565b61067882826113b2565b6001600160a01b038116600090815260fd6020526040812054610580565b60006060806000806000606060c9546000801b1480156107b5575060ca54155b6107f95760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610633565b6108016114f2565b610809611501565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b600061083d610a25565b65ffffffffffff16821061088f5760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610633565b61058061013283611265565b600054610100900460ff16158080156108bb5750600054600160ff909116105b806108d55750303b1580156108d5575060005460ff166001145b6109385760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610633565b6000805460ff19166001179055801561095b576000805461ff0019166101001790555b610964866114a0565b6109d785858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8901819004810282018101909252878152925087915086908190840183828082843760009201919091525061151092505050565b8015610a1d576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b60006105b443611541565b6060606980546104e9906124f3565b6001600160a01b038116600090815261013160205260408120548015610ab0576001600160a01b03831660009081526101316020526040902080546000198301908110610a8e57610a8e612566565b60009182526020909120015464010000000090046001600160e01b0316610ab3565b60005b6001600160e01b03169392505050565b60003381610ad18286610de6565b905083811015610b315760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610633565b61059f8286868403610f0c565b60003361057a8185856110aa565b83421115610b9c5760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610633565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090610c1690610c0e9060a001604051602081830303815290604052805190602001206115a8565b8585856115d5565b9050610c21816115fd565b8614610c6f5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610633565b610c7981886113bc565b50505050505050565b83421115610cd25760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610633565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610d018c6115fd565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610d5c826115a8565b90506000610d6c828787876115d5565b9050896001600160a01b0316816001600160a01b031614610dcf5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610633565b610dda8a8a8a610f0c565b50505050505050505050565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205490565b60408051808201909152600080825260208201526001600160a01b038316600090815261013160205260409020805463ffffffff8416908110610e5657610e56612566565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b610e9e61134e565b6001600160a01b038116610f035760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610633565b610686816114a0565b6001600160a01b038316610f6e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610633565b6001600160a01b038216610fcf5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610633565b6001600160a01b0383811660008181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600061103c8484610de6565b905060001981146110a457818110156110975760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610633565b6110a48484848403610f0c565b50505050565b6001600160a01b03831661110e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610633565b6001600160a01b0382166111705760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610633565b6001600160a01b038316600090815260656020526040902054818110156111e85760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610633565b6001600160a01b0380851660008181526065602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906112489086815260200190565b60405180910390a36110a484848461162a565b60006105b4611635565b8154600090818160058111156112bf576000611280846116a9565b61128a908561257c565b600088815260209020909150869082015463ffffffff1611156112af578091506112bd565b6112ba81600161253d565b92505b505b8082101561130c5760006112d38383611791565b600088815260209020909150869082015463ffffffff1611156112f857809150611306565b61130381600161253d565b92505b506112bf565b8015611338576000868152602090208101600019015464010000000090046001600160e01b031661133b565b60005b6001600160e01b03169695505050505050565b6033546001600160a01b031633146107605760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610633565b61067882826117ac565b6106788282611837565b6001600160a01b0382811660008181526101306020818152604080842080546065845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46110a4828483611850565b600063ffffffff82111561149c5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610633565b5090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b606060cb80546104e9906124f3565b606060cc80546104e9906124f3565b600054610100900460ff166115375760405162461bcd60e51b81526004016106339061258f565b610678828261198f565b600065ffffffffffff82111561149c5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b6064820152608401610633565b60006105806115b561125b565b8360405161190160f01b8152600281019290925260228201526042902090565b60008060006115e6878787876119cf565b915091506115f381611a93565b5095945050505050565b6001600160a01b038116600090815260fd602052604090208054600181018255905b50919050565b505050565b611625838383611bdd565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611660611c10565b611668611c69565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b6000816000036116bb57506000919050565b600060016116c884611c9a565b901c6001901b905060018184816116e1576116e16125da565b048201901c905060018184816116f9576116f96125da565b048201901c90506001818481611711576117116125da565b048201901c90506001818481611729576117296125da565b048201901c90506001818481611741576117416125da565b048201901c90506001818481611759576117596125da565b048201901c90506001818481611771576117716125da565b048201901c905061065f8182858161178b5761178b6125da565b04611d2e565b60006117a060028484186125f0565b61065f9084841661253d565b6117b68282611d44565b6067546001600160e01b0310156118285760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401610633565b6110a4610132611e0d83611e19565b6118418282611f8e565b6110a46101326120c983611e19565b816001600160a01b0316836001600160a01b0316141580156118725750600081115b15611625576001600160a01b03831615611901576001600160a01b03831660009081526101316020526040812081906118ae906120c985611e19565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516118f6929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615611625576001600160a01b038216600090815261013160205260408120819061193890611e0d85611e19565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611980929190918252602082015260400190565b60405180910390a25050505050565b600054610100900460ff166119b65760405162461bcd60e51b81526004016106339061258f565b60686119c28382612658565b5060696116258282612658565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611a065750600090506003611a8a565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611a5a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611a8357600060019250925050611a8a565b9150600090505b94509492505050565b6000816004811115611aa757611aa7612718565b03611aaf5750565b6001816004811115611ac357611ac3612718565b03611b105760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610633565b6002816004811115611b2457611b24612718565b03611b715760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610633565b6003816004811115611b8557611b85612718565b036106865760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610633565b6001600160a01b038381166000908152610130602052604080822054858416835291205461162592918216911683611850565b600080611c1b6114f2565b805190915015611c32578051602090910120919050565b60c9548015611c415792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b600080611c74611501565b805190915015611c8b578051602090910120919050565b60ca548015611c415792915050565b600080608083901c15611caf57608092831c92015b604083901c15611cc157604092831c92015b602083901c15611cd357602092831c92015b601083901c15611ce557601092831c92015b600883901c15611cf757600892831c92015b600483901c15611d0957600492831c92015b600283901c15611d1b57600292831c92015b600183901c156105805760010192915050565b6000818310611d3d578161065f565b5090919050565b6001600160a01b038216611d9a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610633565b8060676000828254611dac919061253d565b90915550506001600160a01b0382166000818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36106786000838361162a565b600061065f828461253d565b82546000908190818115611e665760008781526020902082016000190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b03166020820152611e7b565b60408051808201909152600080825260208201525b905080602001516001600160e01b03169350611e9b84868863ffffffff16565b9250600082118015611ec55750611eb0610a25565b65ffffffffffff16816000015163ffffffff16145b15611f0a57611ed3836120d5565b60008881526020902083016000190180546001600160e01b03929092166401000000000263ffffffff909216919091179055611f84565b866040518060400160405280611f2e611f21610a25565b65ffffffffffff16611437565b63ffffffff168152602001611f42866120d5565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b6001600160a01b038216611fee5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610633565b6001600160a01b038216600090815260656020526040902054818110156120625760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610633565b6001600160a01b03831660008181526065602090815260408083208686039055606780548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36116258360008461162a565b600061065f828461257c565b60006001600160e01b0382111561149c5760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610633565b6000815180845260005b8181101561216457602081850181015186830182015201612148565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061065f602083018461213e565b80356001600160a01b03811681146121ae57600080fd5b919050565b600080604083850312156121c657600080fd5b6121cf83612197565b946020939093013593505050565b6000806000606084860312156121f257600080fd5b6121fb84612197565b925061220960208501612197565b9150604084013590509250925092565b60006020828403121561222b57600080fd5b5035919050565b60006020828403121561224457600080fd5b61065f82612197565b60ff60f81b881681526000602060e08184015261226d60e084018a61213e565b838103604085015261227f818a61213e565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825283870192509083019060005b818110156122d1578351835292840192918401916001016122b5565b50909c9b505050505050505050505050565b60008083601f8401126122f557600080fd5b50813567ffffffffffffffff81111561230d57600080fd5b60208301915083602082850101111561232557600080fd5b9250929050565b60008060008060006060868803121561234457600080fd5b61234d86612197565b9450602086013567ffffffffffffffff8082111561236a57600080fd5b61237689838a016122e3565b9096509450604088013591508082111561238f57600080fd5b5061239c888289016122e3565b969995985093965092949392505050565b803560ff811681146121ae57600080fd5b60008060008060008060c087890312156123d757600080fd5b6123e087612197565b955060208701359450604087013593506123fc606088016123ad565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a03121561243157600080fd5b61243a88612197565b965061244860208901612197565b95506040880135945060608801359350612464608089016123ad565b925060a0880135915060c0880135905092959891949750929550565b6000806040838503121561249357600080fd5b61249c83612197565b91506124aa60208401612197565b90509250929050565b600080604083850312156124c657600080fd5b6124cf83612197565b9150602083013563ffffffff811681146124e857600080fd5b809150509250929050565b600181811c9082168061250757607f821691505b60208210810361161f57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561058057610580612527565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b8181038181111561058057610580612527565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261260d57634e487b7160e01b600052601260045260246000fd5b500490565b601f82111561162557600081815260208120601f850160051c810160208610156126395750805b601f850160051c820191505b81811015610a1d57828155600101612645565b815167ffffffffffffffff81111561267257612672612550565b6126868161268084546124f3565b84612612565b602080601f8311600181146126bb57600084156126a35750858301515b600019600386901b1c1916600185901b178555610a1d565b600085815260208120601f198616915b828110156126ea578886015182559484019460019091019084016126cb565b50858210156127085787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052602160045260246000fdfea2646970667358221220964726d227561cc3826299578ca5faec4ac2436b7fef43367f664e61fb24404664736f6c63430008120033
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106101f05760003560e01c806379cc67901161010f5780639ab24eb0116100a2578063d505accf11610071578063d505accf14610464578063dd62ed3e14610477578063f1127ed81461048a578063f2fde38b146104c757600080fd5b80639ab24eb014610418578063a457c2d71461042b578063a9059cbb1461043e578063c3cda5201461045157600080fd5b80638e539e8c116100de5780638e539e8c146103cb57806390657147146103de57806391ddadf4146103f157806395d89b411461041057600080fd5b806379cc6790146103795780637ecebe001461038c57806384b0196e1461039f5780638da5cb5b146103ba57600080fd5b806340c10f19116101875780635c19a95c116101565780635c19a95c1461030d5780636fcfff451461032057806370a0823114610348578063715018a61461037157600080fd5b806340c10f191461029857806342966c68146102ad5780634bf5d7e9146102c0578063587cde1e146102c857600080fd5b8063313ce567116101c3578063313ce5671461025b5780633644e5151461026a57806339509351146102725780633a46b1a81461028557600080fd5b806306fdde03146101f5578063095ea7b31461021357806318160ddd1461023657806323b872dd14610248575b600080fd5b6101fd6104da565b60405161020a9190612184565b60405180910390f35b6102266102213660046121b3565b61056c565b604051901515815260200161020a565b6067545b60405190815260200161020a565b6102266102563660046121dd565b610586565b6040516012815260200161020a565b61023a6105aa565b6102266102803660046121b3565b6105b9565b61023a6102933660046121b3565b6105db565b6102ab6102a63660046121b3565b610666565b005b6102ab6102bb366004612219565b61067c565b6101fd610689565b6102f56102d6366004612232565b6001600160a01b03908116600090815261013060205260409020541690565b6040516001600160a01b03909116815260200161020a565b6102ab61031b366004612232565b610721565b61033361032e366004612232565b61072b565b60405163ffffffff909116815260200161020a565b61023a610356366004612232565b6001600160a01b031660009081526065602052604090205490565b6102ab61074e565b6102ab6103873660046121b3565b610762565b61023a61039a366004612232565b610777565b6103a7610795565b60405161020a979695949392919061224d565b6033546001600160a01b03166102f5565b61023a6103d9366004612219565b610833565b6102ab6103ec36600461232c565b61089b565b6103f9610a25565b60405165ffffffffffff909116815260200161020a565b6101fd610a30565b61023a610426366004612232565b610a3f565b6102266104393660046121b3565b610ac3565b61022661044c3660046121b3565b610b3e565b6102ab61045f3660046123be565b610b4c565b6102ab610472366004612416565b610c82565b61023a610485366004612480565b610de6565b61049d6104983660046124b3565b610e11565b60408051825163ffffffff1681526020928301516001600160e01b0316928101929092520161020a565b6102ab6104d5366004612232565b610e96565b6060606880546104e9906124f3565b80601f0160208091040260200160405190810160405280929190818152602001828054610515906124f3565b80156105625780601f1061053757610100808354040283529160200191610562565b820191906000526020600020905b81548152906001019060200180831161054557829003601f168201915b5050505050905090565b60003361057a818585610f0c565b60019150505b92915050565b600033610594858285611030565b61059f8585856110aa565b506001949350505050565b60006105b461125b565b905090565b60003361057a8185856105cc8383610de6565b6105d6919061253d565b610f0c565b60006105e5610a25565b65ffffffffffff16821061063c5760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b60448201526064015b60405180910390fd5b6001600160a01b03831660009081526101316020526040902061065f9083611265565b9392505050565b61066e61134e565b61067882826113a8565b5050565b61068633826113b2565b50565b606043610694610a25565b65ffffffffffff16146106e95760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a2062726f6b656e20636c6f636b206d6f64650000006044820152606401610633565b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b61068633826113bc565b6001600160a01b0381166000908152610131602052604081205461058090611437565b61075661134e565b61076060006114a0565b565b61076d823383611030565b61067882826113b2565b6001600160a01b038116600090815260fd6020526040812054610580565b60006060806000806000606060c9546000801b1480156107b5575060ca54155b6107f95760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610633565b6108016114f2565b610809611501565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b600061083d610a25565b65ffffffffffff16821061088f5760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610633565b61058061013283611265565b600054610100900460ff16158080156108bb5750600054600160ff909116105b806108d55750303b1580156108d5575060005460ff166001145b6109385760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610633565b6000805460ff19166001179055801561095b576000805461ff0019166101001790555b610964866114a0565b6109d785858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8901819004810282018101909252878152925087915086908190840183828082843760009201919091525061151092505050565b8015610a1d576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b60006105b443611541565b6060606980546104e9906124f3565b6001600160a01b038116600090815261013160205260408120548015610ab0576001600160a01b03831660009081526101316020526040902080546000198301908110610a8e57610a8e612566565b60009182526020909120015464010000000090046001600160e01b0316610ab3565b60005b6001600160e01b03169392505050565b60003381610ad18286610de6565b905083811015610b315760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610633565b61059f8286868403610f0c565b60003361057a8185856110aa565b83421115610b9c5760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610633565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090610c1690610c0e9060a001604051602081830303815290604052805190602001206115a8565b8585856115d5565b9050610c21816115fd565b8614610c6f5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610633565b610c7981886113bc565b50505050505050565b83421115610cd25760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610633565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610d018c6115fd565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610d5c826115a8565b90506000610d6c828787876115d5565b9050896001600160a01b0316816001600160a01b031614610dcf5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610633565b610dda8a8a8a610f0c565b50505050505050505050565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205490565b60408051808201909152600080825260208201526001600160a01b038316600090815261013160205260409020805463ffffffff8416908110610e5657610e56612566565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b610e9e61134e565b6001600160a01b038116610f035760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610633565b610686816114a0565b6001600160a01b038316610f6e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610633565b6001600160a01b038216610fcf5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610633565b6001600160a01b0383811660008181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600061103c8484610de6565b905060001981146110a457818110156110975760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610633565b6110a48484848403610f0c565b50505050565b6001600160a01b03831661110e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610633565b6001600160a01b0382166111705760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610633565b6001600160a01b038316600090815260656020526040902054818110156111e85760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610633565b6001600160a01b0380851660008181526065602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906112489086815260200190565b60405180910390a36110a484848461162a565b60006105b4611635565b8154600090818160058111156112bf576000611280846116a9565b61128a908561257c565b600088815260209020909150869082015463ffffffff1611156112af578091506112bd565b6112ba81600161253d565b92505b505b8082101561130c5760006112d38383611791565b600088815260209020909150869082015463ffffffff1611156112f857809150611306565b61130381600161253d565b92505b506112bf565b8015611338576000868152602090208101600019015464010000000090046001600160e01b031661133b565b60005b6001600160e01b03169695505050505050565b6033546001600160a01b031633146107605760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610633565b61067882826117ac565b6106788282611837565b6001600160a01b0382811660008181526101306020818152604080842080546065845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46110a4828483611850565b600063ffffffff82111561149c5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610633565b5090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b606060cb80546104e9906124f3565b606060cc80546104e9906124f3565b600054610100900460ff166115375760405162461bcd60e51b81526004016106339061258f565b610678828261198f565b600065ffffffffffff82111561149c5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b6064820152608401610633565b60006105806115b561125b565b8360405161190160f01b8152600281019290925260228201526042902090565b60008060006115e6878787876119cf565b915091506115f381611a93565b5095945050505050565b6001600160a01b038116600090815260fd602052604090208054600181018255905b50919050565b505050565b611625838383611bdd565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611660611c10565b611668611c69565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b6000816000036116bb57506000919050565b600060016116c884611c9a565b901c6001901b905060018184816116e1576116e16125da565b048201901c905060018184816116f9576116f96125da565b048201901c90506001818481611711576117116125da565b048201901c90506001818481611729576117296125da565b048201901c90506001818481611741576117416125da565b048201901c90506001818481611759576117596125da565b048201901c90506001818481611771576117716125da565b048201901c905061065f8182858161178b5761178b6125da565b04611d2e565b60006117a060028484186125f0565b61065f9084841661253d565b6117b68282611d44565b6067546001600160e01b0310156118285760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401610633565b6110a4610132611e0d83611e19565b6118418282611f8e565b6110a46101326120c983611e19565b816001600160a01b0316836001600160a01b0316141580156118725750600081115b15611625576001600160a01b03831615611901576001600160a01b03831660009081526101316020526040812081906118ae906120c985611e19565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516118f6929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615611625576001600160a01b038216600090815261013160205260408120819061193890611e0d85611e19565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611980929190918252602082015260400190565b60405180910390a25050505050565b600054610100900460ff166119b65760405162461bcd60e51b81526004016106339061258f565b60686119c28382612658565b5060696116258282612658565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611a065750600090506003611a8a565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611a5a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611a8357600060019250925050611a8a565b9150600090505b94509492505050565b6000816004811115611aa757611aa7612718565b03611aaf5750565b6001816004811115611ac357611ac3612718565b03611b105760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610633565b6002816004811115611b2457611b24612718565b03611b715760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610633565b6003816004811115611b8557611b85612718565b036106865760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610633565b6001600160a01b038381166000908152610130602052604080822054858416835291205461162592918216911683611850565b600080611c1b6114f2565b805190915015611c32578051602090910120919050565b60c9548015611c415792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b600080611c74611501565b805190915015611c8b578051602090910120919050565b60ca548015611c415792915050565b600080608083901c15611caf57608092831c92015b604083901c15611cc157604092831c92015b602083901c15611cd357602092831c92015b601083901c15611ce557601092831c92015b600883901c15611cf757600892831c92015b600483901c15611d0957600492831c92015b600283901c15611d1b57600292831c92015b600183901c156105805760010192915050565b6000818310611d3d578161065f565b5090919050565b6001600160a01b038216611d9a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610633565b8060676000828254611dac919061253d565b90915550506001600160a01b0382166000818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36106786000838361162a565b600061065f828461253d565b82546000908190818115611e665760008781526020902082016000190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b03166020820152611e7b565b60408051808201909152600080825260208201525b905080602001516001600160e01b03169350611e9b84868863ffffffff16565b9250600082118015611ec55750611eb0610a25565b65ffffffffffff16816000015163ffffffff16145b15611f0a57611ed3836120d5565b60008881526020902083016000190180546001600160e01b03929092166401000000000263ffffffff909216919091179055611f84565b866040518060400160405280611f2e611f21610a25565b65ffffffffffff16611437565b63ffffffff168152602001611f42866120d5565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b6001600160a01b038216611fee5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610633565b6001600160a01b038216600090815260656020526040902054818110156120625760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610633565b6001600160a01b03831660008181526065602090815260408083208686039055606780548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36116258360008461162a565b600061065f828461257c565b60006001600160e01b0382111561149c5760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610633565b6000815180845260005b8181101561216457602081850181015186830182015201612148565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061065f602083018461213e565b80356001600160a01b03811681146121ae57600080fd5b919050565b600080604083850312156121c657600080fd5b6121cf83612197565b946020939093013593505050565b6000806000606084860312156121f257600080fd5b6121fb84612197565b925061220960208501612197565b9150604084013590509250925092565b60006020828403121561222b57600080fd5b5035919050565b60006020828403121561224457600080fd5b61065f82612197565b60ff60f81b881681526000602060e08184015261226d60e084018a61213e565b838103604085015261227f818a61213e565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825283870192509083019060005b818110156122d1578351835292840192918401916001016122b5565b50909c9b505050505050505050505050565b60008083601f8401126122f557600080fd5b50813567ffffffffffffffff81111561230d57600080fd5b60208301915083602082850101111561232557600080fd5b9250929050565b60008060008060006060868803121561234457600080fd5b61234d86612197565b9450602086013567ffffffffffffffff8082111561236a57600080fd5b61237689838a016122e3565b9096509450604088013591508082111561238f57600080fd5b5061239c888289016122e3565b969995985093965092949392505050565b803560ff811681146121ae57600080fd5b60008060008060008060c087890312156123d757600080fd5b6123e087612197565b955060208701359450604087013593506123fc606088016123ad565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a03121561243157600080fd5b61243a88612197565b965061244860208901612197565b95506040880135945060608801359350612464608089016123ad565b925060a0880135915060c0880135905092959891949750929550565b6000806040838503121561249357600080fd5b61249c83612197565b91506124aa60208401612197565b90509250929050565b600080604083850312156124c657600080fd5b6124cf83612197565b9150602083013563ffffffff811681146124e857600080fd5b809150509250929050565b600181811c9082168061250757607f821691505b60208210810361161f57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561058057610580612527565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b8181038181111561058057610580612527565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261260d57634e487b7160e01b600052601260045260246000fd5b500490565b601f82111561162557600081815260208120601f850160051c810160208610156126395750805b601f850160051c820191505b81811015610a1d57828155600101612645565b815167ffffffffffffffff81111561267257612672612550565b6126868161268084546124f3565b84612612565b602080601f8311600181146126bb57600084156126a35750858301515b600019600386901b1c1916600185901b178555610a1d565b600085815260208120601f198616915b828110156126ea578886015182559484019460019091019084016126cb565b50858210156127085787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052602160045260246000fdfea2646970667358221220964726d227561cc3826299578ca5faec4ac2436b7fef43367f664e61fb24404664736f6c63430008120033