ERC-721
Overview
Max Total Supply
318 MGP
Holders
78
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 MGPLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
GenesisPass
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-05-30 */ // File: @openzeppelin/contracts/utils/Counters.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 Counters { 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/4637 uint256 _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; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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 `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount ) external returns (bool); /** * @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); } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/finance/PaymentSplitter.sol // OpenZeppelin Contracts v4.4.1 (finance/PaymentSplitter.sol) pragma solidity ^0.8.0; /** * @title PaymentSplitter * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware * that the Ether will be split in this way, since it is handled transparently by the contract. * * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim * an amount proportional to the percentage of total shares they were assigned. * * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release} * function. * * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you * to run tests before sending real value to this contract. */ contract PaymentSplitter is Context { event PayeeAdded(address account, uint256 shares); event PaymentReleased(address to, uint256 amount); event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount); event PaymentReceived(address from, uint256 amount); uint256 private _totalShares; uint256 private _totalReleased; mapping(address => uint256) private _shares; mapping(address => uint256) private _released; address[] private _payees; mapping(IERC20 => uint256) private _erc20TotalReleased; mapping(IERC20 => mapping(address => uint256)) private _erc20Released; /** * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at * the matching position in the `shares` array. * * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no * duplicates in `payees`. */ constructor(address[] memory payees, uint256[] memory shares_) payable { require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch"); require(payees.length > 0, "PaymentSplitter: no payees"); for (uint256 i = 0; i < payees.length; i++) { _addPayee(payees[i], shares_[i]); } } /** * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the * reliability of the events, and not the actual splitting of Ether. * * To learn more about this see the Solidity documentation for * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback * functions]. */ receive() external payable virtual { emit PaymentReceived(_msgSender(), msg.value); } /** * @dev Getter for the total shares held by payees. */ function totalShares() public view returns (uint256) { return _totalShares; } /** * @dev Getter for the total amount of Ether already released. */ function totalReleased() public view returns (uint256) { return _totalReleased; } /** * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20 * contract. */ function totalReleased(IERC20 token) public view returns (uint256) { return _erc20TotalReleased[token]; } /** * @dev Getter for the amount of shares held by an account. */ function shares(address account) public view returns (uint256) { return _shares[account]; } /** * @dev Getter for the amount of Ether already released to a payee. */ function released(address account) public view returns (uint256) { return _released[account]; } /** * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an * IERC20 contract. */ function released(IERC20 token, address account) public view returns (uint256) { return _erc20Released[token][account]; } /** * @dev Getter for the address of the payee number `index`. */ function payee(uint256 index) public view returns (address) { return _payees[index]; } /** * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the * total shares and their previous withdrawals. */ function release(address payable account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 totalReceived = address(this).balance + totalReleased(); uint256 payment = _pendingPayment(account, totalReceived, released(account)); require(payment != 0, "PaymentSplitter: account is not due payment"); _released[account] += payment; _totalReleased += payment; Address.sendValue(account, payment); emit PaymentReleased(account, payment); } /** * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20 * contract. */ function release(IERC20 token, address account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token); uint256 payment = _pendingPayment(account, totalReceived, released(token, account)); require(payment != 0, "PaymentSplitter: account is not due payment"); _erc20Released[token][account] += payment; _erc20TotalReleased[token] += payment; SafeERC20.safeTransfer(token, account, payment); emit ERC20PaymentReleased(token, account, payment); } /** * @dev internal logic for computing the pending payment of an `account` given the token historical balances and * already released amounts. */ function _pendingPayment( address account, uint256 totalReceived, uint256 alreadyReleased ) private view returns (uint256) { return (totalReceived * _shares[account]) / _totalShares - alreadyReleased; } /** * @dev Add a new payee to the contract. * @param account The address of the payee to add. * @param shares_ The number of shares owned by the payee. */ function _addPayee(address account, uint256 shares_) private { require(account != address(0), "PaymentSplitter: account is the zero address"); require(shares_ > 0, "PaymentSplitter: shares are 0"); require(_shares[account] == 0, "PaymentSplitter: account already has shares"); _payees.push(account); _shares[account] = shares_; _totalShares = _totalShares + shares_; emit PayeeAdded(account, shares_); } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // 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); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: contracts/files/common/meta-transactions/ContentMixin.sol pragma solidity ^0.8.0; abstract contract ContextMixin { function msgSender() internal view returns (address payable sender) { if (msg.sender == address(this)) { bytes memory array = msg.data; uint256 index = msg.data.length; assembly { // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those. sender := and( mload(add(array, index)), 0xffffffffffffffffffffffffffffffffffffffff ) } } else { sender = payable(msg.sender); } return sender; } } // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: contracts/files/common/meta-transactions/Initializable.sol pragma solidity ^0.8.0; contract Initializable { bool inited = false; modifier initializer() { require(!inited, "already inited"); _; inited = true; } } // File: contracts/files/common/meta-transactions/EIP712Base.sol pragma solidity ^0.8.0; contract EIP712Base is Initializable { struct EIP712Domain { string name; string version; address verifyingContract; bytes32 salt; } string constant public ERC712_VERSION = "1"; bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256( bytes( "EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)" ) ); bytes32 internal domainSeperator; // supposed to be called once while initializing. // one of the contracts that inherits this contract follows proxy pattern // so it is not possible to do this in a constructor function _initializeEIP712( string memory name ) internal initializer { _setDomainSeperator(name); } function _setDomainSeperator(string memory name) internal { domainSeperator = keccak256( abi.encode( EIP712_DOMAIN_TYPEHASH, keccak256(bytes(name)), keccak256(bytes(ERC712_VERSION)), address(this), bytes32(getChainId()) ) ); } function getDomainSeperator() public view returns (bytes32) { return domainSeperator; } function getChainId() public view returns (uint256) { uint256 id; assembly { id := chainid() } return id; } /** * Accept message hash and returns hash message in EIP712 compatible form * So that it can be used to recover signer from signature signed using EIP712 formatted data * https://eips.ethereum.org/EIPS/eip-712 * "\\x19" makes the encoding deterministic * "\\x01" is the version byte to make it compatible to EIP-191 */ function toTypedMessageHash(bytes32 messageHash) internal view returns (bytes32) { return keccak256( abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash) ); } } // File: contracts/files/common/meta-transactions/NativeMetaTransaction.sol pragma solidity ^0.8.0; contract NativeMetaTransaction is EIP712Base { using SafeMath for uint256; bytes32 private constant META_TRANSACTION_TYPEHASH = keccak256( bytes( "MetaTransaction(uint256 nonce,address from,bytes functionSignature)" ) ); event MetaTransactionExecuted( address userAddress, address payable relayerAddress, bytes functionSignature ); mapping(address => uint256) nonces; /* * Meta transaction structure. * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas * He should call the desired function directly in that case. */ struct MetaTransaction { uint256 nonce; address from; bytes functionSignature; } function executeMetaTransaction( address userAddress, bytes memory functionSignature, bytes32 sigR, bytes32 sigS, uint8 sigV ) public payable returns (bytes memory) { MetaTransaction memory metaTx = MetaTransaction({ nonce: nonces[userAddress], from: userAddress, functionSignature: functionSignature }); require( verify(userAddress, metaTx, sigR, sigS, sigV), "Signer and signature do not match" ); // increase nonce for user (to avoid re-use) nonces[userAddress] = nonces[userAddress].add(1); emit MetaTransactionExecuted( userAddress, payable(msg.sender), functionSignature ); // Append userAddress and relayer address at the end to extract it from calling context (bool success, bytes memory returnData) = address(this).call( abi.encodePacked(functionSignature, userAddress) ); require(success, "Function call not successful"); return returnData; } function hashMetaTransaction(MetaTransaction memory metaTx) internal pure returns (bytes32) { return keccak256( abi.encode( META_TRANSACTION_TYPEHASH, metaTx.nonce, metaTx.from, keccak256(metaTx.functionSignature) ) ); } function getNonce(address user) public view returns (uint256 nonce) { nonce = nonces[user]; } function verify( address signer, MetaTransaction memory metaTx, bytes32 sigR, bytes32 sigS, uint8 sigV ) internal view returns (bool) { require(signer != address(0), "NativeMetaTransaction: INVALID_SIGNER"); return signer == ecrecover( toTypedMessageHash(hashMetaTransaction(metaTx)), sigV, sigR, sigS ); } } // File: contracts/files/ERC721Base.sol pragma solidity ^0.8.0; contract OwnableDelegateProxy {} /** * Used to delegate ownership of a contract to another address, to save on unneeded transactions to approve contract use for users */ contract ProxyRegistry { mapping(address => OwnableDelegateProxy) public proxies; } /** * @title ERC721Base * ERC721Base - ERC721 contract that whitelists a trading address */ abstract contract ERC721Base is ERC721, ContextMixin, NativeMetaTransaction, Ownable { /** * Proxy registry address (OpenSea) */ address private proxyRegistryAddress; mapping(address => bool) proxyToApproved; constructor( string memory _name, string memory _symbol ) ERC721(_name, _symbol) { _initializeEIP712(_name); } function setProxyRegistryAddress(address _address) public onlyOwner { proxyRegistryAddress = _address; } function removeProxyRegistryAddress() public onlyOwner { proxyRegistryAddress = address(0x0); } function flipProxyState(address _proxyAddress) public onlyOwner { proxyToApproved[_proxyAddress] = !proxyToApproved[_proxyAddress]; } /** * Override isApprovedForAll to whitelist proxy (registry) for gas-less listings. */ function isApprovedForAll(address _owner, address _operator) override public view returns (bool) { if (proxyRegistryAddress != address(0x0)) { ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress); if (address(proxyRegistry.proxies(_owner)) == _operator) { return true; } } if (proxyToApproved[_operator]) { return true; } return super.isApprovedForAll(_owner, _operator); } /** * This is used instead of msg.sender as transactions won't be sent by the original token owner, but by OpenSea. */ function _msgSender() internal override view returns (address sender) { return ContextMixin.msgSender(); } } // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } return computedHash; } } // File: contracts/files/MintPass.sol pragma solidity ^0.8.0; /** * Momentibles * Genesis Pass */ contract GenesisPass is ERC721Base, ReentrancyGuard { using Strings for uint256; using Counters for Counters.Counter; uint256 public PUBLIC_PRICE; uint256 public WHITELIST_PRICE; uint256 public MAX_SUPPLY; uint256 public MAX_PER_ADDRESS; uint256 public MAX_MULTIMINT; Counters.Counter private _supplyCounter; PaymentSplitter private _paymentSplitter; constructor( string memory _name, string memory _symbol, string memory _preRevealURI, uint256[] memory params, address[] memory payees, uint256[] memory shares ) ERC721Base(_name, _symbol) { PUBLIC_PRICE = params[0]; WHITELIST_PRICE = params[1]; MAX_SUPPLY = params[2]; MAX_PER_ADDRESS = params[3]; MAX_MULTIMINT = params[4]; _paymentSplitter = new PaymentSplitter(payees, shares); _supplyCounter.increment(); setPreRevealURI(_preRevealURI); } /** * Public Sale */ bool public publicSaleIsActive = false; function flipPublicSaleState() external onlyOwner { publicSaleIsActive = !publicSaleIsActive; } function mint(uint256 count) public payable nonReentrant { require(publicSaleIsActive, "Sale is not active"); require(totalSupply() + count - 1 < MAX_SUPPLY, "Exceeds max supply"); require(count - 1 < MAX_MULTIMINT, "Trying to mint too many at a time"); require(count - 1 < allowedMintCount(msg.sender), "Minting limit exceeded"); require(msg.value >= PUBLIC_PRICE * count, "Insufficient payment"); updateMintCount(msg.sender, count); _mint(count); payable(_paymentSplitter).transfer(msg.value); } function ownerMint(uint256 count, address recipient) external onlyOwner() { require(totalSupply() + count - 1 < MAX_SUPPLY, "Exceeds max supply"); for (uint256 i = 0; i < count; i++) { uint256 currentTokenId = _supplyCounter.current(); _supplyCounter.increment(); _safeMint(recipient, currentTokenId); } } function _mint(uint256 count) internal { for (uint256 i = 0; i < count; i++) { uint256 currentTokenId = _supplyCounter.current(); _supplyCounter.increment(); _safeMint(msg.sender, currentTokenId); } } function totalSupply() public view returns (uint256) { return _supplyCounter.current() - 1; } /** * Allowed mint count */ mapping(address => uint256) private mintCountMap; function allowedMintCount(address minter) public view returns (uint256) { return MAX_PER_ADDRESS - mintCountMap[minter]; } function updateMintCount(address minter, uint256 count) private { mintCountMap[minter] += count; } /** * Whitelist */ bool public whitelistSaleIsActive = false; function flipWhitelistSaleState() external onlyOwner { whitelistSaleIsActive = !whitelistSaleIsActive; } bytes32 private _whitelistMerkleRoot = 0xae16b27f1fd4a81a49ebad089e57fce5f821a6714556c8312e66f308cc0a9b69; function setWhitelistMerkleRoot(bytes32 _merkleRoot) public onlyOwner { _whitelistMerkleRoot = _merkleRoot; } function whitelistMint(uint256 count, bytes32[] calldata merkleProof) public payable nonReentrant { require(whitelistSaleIsActive, "Whitelist sale is not active"); require(totalSupply() + count - 1 < MAX_SUPPLY, "Exceeds max supply"); require(count - 1 < MAX_MULTIMINT, "Trying to mint too many at a time"); require(count - 1 < allowedMintCount(msg.sender), "Minting limit exceeded"); require(msg.value >= WHITELIST_PRICE * count, "Insufficient payment"); require( MerkleProof.verify(merkleProof, _whitelistMerkleRoot, keccak256(abi.encodePacked(msg.sender))), "invalid merkle proof"); updateMintCount(msg.sender, count); _mint(count); payable(_paymentSplitter).transfer(msg.value); } /** * Metadata Reveal */ bool public revealed = false; string public preRevealURI; string public baseURI; function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721MetaData: URI Query for nonexistent token" ); if (!revealed) { return preRevealURI; } return string(abi.encodePacked(baseURI, Strings.toString(tokenId))); } function toggleReveal() public onlyOwner { revealed = true; } function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function setPreRevealURI(string memory _preRevealURI) public onlyOwner { preRevealURI = _preRevealURI; } function release(address payable account) public onlyOwner { _paymentSplitter.release(account); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_preRevealURI","type":"string"},{"internalType":"uint256[]","name":"params","type":"uint256[]"},{"internalType":"address[]","name":"payees","type":"address[]"},{"internalType":"uint256[]","name":"shares","type":"uint256[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ERC712_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MULTIMINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_ADDRESS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"allowedMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_proxyAddress","type":"address"}],"name":"flipProxyState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPublicSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipWhitelistSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preRevealURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeProxyRegistryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_preRevealURI","type":"string"}],"name":"setPreRevealURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setProxyRegistryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setWhitelistMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526000600660006101000a81548160ff0219169083151502179055506000601360146101000a81548160ff0219169083151502179055506000601560006101000a81548160ff0219169083151502179055507fae16b27f1fd4a81a49ebad089e57fce5f821a6714556c8312e66f308cc0a9b6960001b6016556000601760006101000a81548160ff021916908315150217905550348015620000a457600080fd5b5060405162008c3738038062008c378339818101604052810190620000ca919062000b0f565b858581818160009080519060200190620000e692919062000663565b508060019080519060200190620000ff92919062000663565b5050506200012262000116620002a560201b60201c565b620002c160201b60201c565b62000133826200038760201b60201c565b50506001600c819055508260008151811062000154576200015362000c65565b5b6020026020010151600d819055508260018151811062000179576200017862000c65565b5b6020026020010151600e81905550826002815181106200019e576200019d62000c65565b5b6020026020010151600f8190555082600381518110620001c357620001c262000c65565b5b602002602001015160108190555082600481518110620001e857620001e762000c65565b5b602002602001015160118190555081816040516200020690620006f4565b6200021392919062000e30565b604051809103906000f08015801562000230573d6000803e3d6000fd5b50601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200028860126200040960201b620027b81760201c565b62000299846200041f60201b60201c565b5050505050506200104e565b6000620002bc620004ca60201b620027ce1760201c565b905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600660009054906101000a900460ff1615620003da576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003d19062000ecc565b60405180910390fd5b620003eb816200057d60201b60201c565b6001600660006101000a81548160ff02191690831515021790555050565b6001816000016000828254019250508190555050565b6200042f620002a560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620004556200062c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620004ae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004a59062000f3e565b60405180910390fd5b8060189080519060200190620004c692919062000663565b5050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156200057657600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff8183015116925050506200057a565b3390505b90565b6040518060800160405280604f815260200162008be8604f91398051906020012081805190602001206040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152508051906020012030620005f46200065660201b60201c565b60001b6040516020016200060d95949392919062000f8c565b6040516020818303038152906040528051906020012060078190555050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000804690508091505090565b828054620006719062001018565b90600052602060002090601f016020900481019282620006955760008555620006e1565b82601f10620006b057805160ff1916838001178555620006e1565b82800160010185558215620006e1579182015b82811115620006e0578251825591602001919060010190620006c3565b5b509050620006f0919062000702565b5090565b6122d2806200691683390190565b5b808211156200071d57600081600090555060010162000703565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200078a826200073f565b810181811067ffffffffffffffff82111715620007ac57620007ab62000750565b5b80604052505050565b6000620007c162000721565b9050620007cf82826200077f565b919050565b600067ffffffffffffffff821115620007f257620007f162000750565b5b620007fd826200073f565b9050602081019050919050565b60005b838110156200082a5780820151818401526020810190506200080d565b838111156200083a576000848401525b50505050565b6000620008576200085184620007d4565b620007b5565b9050828152602081018484840111156200087657620008756200073a565b5b620008838482856200080a565b509392505050565b600082601f830112620008a357620008a262000735565b5b8151620008b584826020860162000840565b91505092915050565b600067ffffffffffffffff821115620008dc57620008db62000750565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b6200090781620008f2565b81146200091357600080fd5b50565b6000815190506200092781620008fc565b92915050565b6000620009446200093e84620008be565b620007b5565b905080838252602082019050602084028301858111156200096a5762000969620008ed565b5b835b8181101562000997578062000982888262000916565b8452602084019350506020810190506200096c565b5050509392505050565b600082601f830112620009b957620009b862000735565b5b8151620009cb8482602086016200092d565b91505092915050565b600067ffffffffffffffff821115620009f257620009f162000750565b5b602082029050602081019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000a308262000a03565b9050919050565b62000a428162000a23565b811462000a4e57600080fd5b50565b60008151905062000a628162000a37565b92915050565b600062000a7f62000a7984620009d4565b620007b5565b9050808382526020820190506020840283018581111562000aa55762000aa4620008ed565b5b835b8181101562000ad2578062000abd888262000a51565b84526020840193505060208101905062000aa7565b5050509392505050565b600082601f83011262000af45762000af362000735565b5b815162000b0684826020860162000a68565b91505092915050565b60008060008060008060c0878903121562000b2f5762000b2e6200072b565b5b600087015167ffffffffffffffff81111562000b505762000b4f62000730565b5b62000b5e89828a016200088b565b965050602087015167ffffffffffffffff81111562000b825762000b8162000730565b5b62000b9089828a016200088b565b955050604087015167ffffffffffffffff81111562000bb45762000bb362000730565b5b62000bc289828a016200088b565b945050606087015167ffffffffffffffff81111562000be65762000be562000730565b5b62000bf489828a01620009a1565b935050608087015167ffffffffffffffff81111562000c185762000c1762000730565b5b62000c2689828a0162000adc565b92505060a087015167ffffffffffffffff81111562000c4a5762000c4962000730565b5b62000c5889828a01620009a1565b9150509295509295509295565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b62000ccb8162000a23565b82525050565b600062000cdf838362000cc0565b60208301905092915050565b6000602082019050919050565b600062000d058262000c94565b62000d11818562000c9f565b935062000d1e8362000cb0565b8060005b8381101562000d5557815162000d39888262000cd1565b975062000d468362000ceb565b92505060018101905062000d22565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b62000d9981620008f2565b82525050565b600062000dad838362000d8e565b60208301905092915050565b6000602082019050919050565b600062000dd38262000d62565b62000ddf818562000d6d565b935062000dec8362000d7e565b8060005b8381101562000e2357815162000e07888262000d9f565b975062000e148362000db9565b92505060018101905062000df0565b5085935050505092915050565b6000604082019050818103600083015262000e4c818562000cf8565b9050818103602083015262000e62818462000dc6565b90509392505050565b600082825260208201905092915050565b7f616c726561647920696e69746564000000000000000000000000000000000000600082015250565b600062000eb4600e8362000e6b565b915062000ec18262000e7c565b602082019050919050565b6000602082019050818103600083015262000ee78162000ea5565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000f2660208362000e6b565b915062000f338262000eee565b602082019050919050565b6000602082019050818103600083015262000f598162000f17565b9050919050565b6000819050919050565b62000f758162000f60565b82525050565b62000f868162000a23565b82525050565b600060a08201905062000fa3600083018862000f6a565b62000fb2602083018762000f6a565b62000fc1604083018662000f6a565b62000fd0606083018562000f7b565b62000fdf608083018462000f6a565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200103157607f821691505b6020821081141562001048576200104762000fe9565b5b50919050565b6158b8806200105e6000396000f3fe60806040526004361061027d5760003560e01c8063611f3f101161014f578063b88d4fde116100c1578063d26ea6c01161007a578063d26ea6c014610938578063d2cab05614610961578063d52c57e01461097d578063e985e9c5146109a6578063f2fde38b146109e3578063f73c814b14610a0c5761027d565b8063b88d4fde1461082a578063b8fc105114610853578063bb660c0a1461087e578063bd32fb66146108bb578063c87b56dd146108e4578063d1beca64146109215761027d565b806379b6ed361161011357806379b6ed361461074d5780638da5cb5b1461077857806395d89b41146107a3578063a0712d68146107ce578063a10866ef146107ea578063a22cb465146108015761027d565b8063611f3f10146106665780636352211e146106915780636c0360eb146106ce57806370a08231146106f9578063715018a6146107365761027d565b806319165587116101f357806332e367c7116101ac57806332e367c7146105905780633408e470146105a757806342842e0e146105d257806351830227146105fb57806355f804b3146106265780635b8ad4291461064f5761027d565b8063191655871461048257806320379ee5146104ab57806323b872dd146104d65780632a85db55146104ff5780632d0335ab1461052857806332cb6b0c146105655761027d565b80630c53c51c116102455780630c53c51c1461037b5780630f7e5970146103ab5780630fcf2e75146103d657806310b5454d1461040157806317e7f2951461042c57806318160ddd146104575761027d565b806301ffc9a71461028257806306fdde03146102bf578063081812fc146102ea578063095ea7b3146103275780630aaef28514610350575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190613a08565b610a35565b6040516102b69190613a50565b60405180910390f35b3480156102cb57600080fd5b506102d4610b17565b6040516102e19190613b04565b60405180910390f35b3480156102f657600080fd5b50610311600480360381019061030c9190613b5c565b610ba9565b60405161031e9190613bca565b60405180910390f35b34801561033357600080fd5b5061034e60048036038101906103499190613c11565b610c2e565b005b34801561035c57600080fd5b50610365610d46565b6040516103729190613c60565b60405180910390f35b61039560048036038101906103909190613e1f565b610d4c565b6040516103a29190613f0b565b60405180910390f35b3480156103b757600080fd5b506103c0610fbe565b6040516103cd9190613b04565b60405180910390f35b3480156103e257600080fd5b506103eb610ff7565b6040516103f89190613a50565b60405180910390f35b34801561040d57600080fd5b5061041661100a565b6040516104239190613a50565b60405180910390f35b34801561043857600080fd5b5061044161101d565b60405161044e9190613c60565b60405180910390f35b34801561046357600080fd5b5061046c611023565b6040516104799190613c60565b60405180910390f35b34801561048e57600080fd5b506104a960048036038101906104a49190613f6b565b611040565b005b3480156104b757600080fd5b506104c061114c565b6040516104cd9190613fa7565b60405180910390f35b3480156104e257600080fd5b506104fd60048036038101906104f89190613fc2565b611156565b005b34801561050b57600080fd5b50610526600480360381019061052191906140b6565b6111b6565b005b34801561053457600080fd5b5061054f600480360381019061054a91906140ff565b61124c565b60405161055c9190613c60565b60405180910390f35b34801561057157600080fd5b5061057a611295565b6040516105879190613c60565b60405180910390f35b34801561059c57600080fd5b506105a561129b565b005b3480156105b357600080fd5b506105bc61135b565b6040516105c99190613c60565b60405180910390f35b3480156105de57600080fd5b506105f960048036038101906105f49190613fc2565b611368565b005b34801561060757600080fd5b50610610611388565b60405161061d9190613a50565b60405180910390f35b34801561063257600080fd5b5061064d600480360381019061064891906140b6565b61139b565b005b34801561065b57600080fd5b50610664611431565b005b34801561067257600080fd5b5061067b6114ca565b6040516106889190613c60565b60405180910390f35b34801561069d57600080fd5b506106b860048036038101906106b39190613b5c565b6114d0565b6040516106c59190613bca565b60405180910390f35b3480156106da57600080fd5b506106e3611582565b6040516106f09190613b04565b60405180910390f35b34801561070557600080fd5b50610720600480360381019061071b91906140ff565b611610565b60405161072d9190613c60565b60405180910390f35b34801561074257600080fd5b5061074b6116c8565b005b34801561075957600080fd5b50610762611750565b60405161076f9190613b04565b60405180910390f35b34801561078457600080fd5b5061078d6117de565b60405161079a9190613bca565b60405180910390f35b3480156107af57600080fd5b506107b8611808565b6040516107c59190613b04565b60405180910390f35b6107e860048036038101906107e39190613b5c565b61189a565b005b3480156107f657600080fd5b506107ff611b16565b005b34801561080d57600080fd5b5061082860048036038101906108239190614158565b611bbe565b005b34801561083657600080fd5b50610851600480360381019061084c9190614198565b611bd4565b005b34801561085f57600080fd5b50610868611c36565b6040516108759190613c60565b60405180910390f35b34801561088a57600080fd5b506108a560048036038101906108a091906140ff565b611c3c565b6040516108b29190613c60565b60405180910390f35b3480156108c757600080fd5b506108e260048036038101906108dd919061421b565b611c92565b005b3480156108f057600080fd5b5061090b60048036038101906109069190613b5c565b611d18565b6040516109189190613b04565b60405180910390f35b34801561092d57600080fd5b50610936611e3b565b005b34801561094457600080fd5b5061095f600480360381019061095a91906140ff565b611ee3565b005b61097b600480360381019061097691906142a8565b611fa3565b005b34801561098957600080fd5b506109a4600480360381019061099f9190614308565b6122d4565b005b3480156109b257600080fd5b506109cd60048036038101906109c89190614348565b6123f8565b6040516109da9190613a50565b60405180910390f35b3480156109ef57600080fd5b50610a0a6004803603810190610a0591906140ff565b61259d565b005b348015610a1857600080fd5b50610a336004803603810190610a2e91906140ff565b612695565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b0057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b105750610b0f8261287f565b5b9050919050565b606060008054610b26906143b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610b52906143b7565b8015610b9f5780601f10610b7457610100808354040283529160200191610b9f565b820191906000526020600020905b815481529060010190602001808311610b8257829003601f168201915b5050505050905090565b6000610bb4826128e9565b610bf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bea9061445b565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c39826114d0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca1906144ed565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cc9612955565b73ffffffffffffffffffffffffffffffffffffffff161480610cf85750610cf781610cf2612955565b6123f8565b5b610d37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2e9061457f565b60405180910390fd5b610d418383612964565b505050565b60105481565b606060006040518060600160405280600860008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481526020018873ffffffffffffffffffffffffffffffffffffffff168152602001878152509050610dcf8782878787612a1d565b610e0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0590614611565b60405180910390fd5b610e616001600860008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612b2690919063ffffffff16565b600860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b873388604051610ed793929190614640565b60405180910390a16000803073ffffffffffffffffffffffffffffffffffffffff16888a604051602001610f0c929190614702565b604051602081830303815290604052604051610f28919061472a565b6000604051808303816000865af19150503d8060008114610f65576040519150601f19603f3d011682016040523d82523d6000602084013e610f6a565b606091505b509150915081610faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa69061478d565b60405180910390fd5b80935050505095945050505050565b6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b601360149054906101000a900460ff1681565b601560009054906101000a900460ff1681565b600e5481565b600060016110316012612b3c565b61103b91906147dc565b905090565b611048612955565b73ffffffffffffffffffffffffffffffffffffffff166110666117de565b73ffffffffffffffffffffffffffffffffffffffff16146110bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b39061485c565b60405180910390fd5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166319165587826040518263ffffffff1660e01b8152600401611117919061487c565b600060405180830381600087803b15801561113157600080fd5b505af1158015611145573d6000803e3d6000fd5b5050505050565b6000600754905090565b611167611161612955565b82612b4a565b6111a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119d90614909565b60405180910390fd5b6111b1838383612c28565b505050565b6111be612955565b73ffffffffffffffffffffffffffffffffffffffff166111dc6117de565b73ffffffffffffffffffffffffffffffffffffffff1614611232576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112299061485c565b60405180910390fd5b80601890805190602001906112489291906138f9565b5050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600f5481565b6112a3612955565b73ffffffffffffffffffffffffffffffffffffffff166112c16117de565b73ffffffffffffffffffffffffffffffffffffffff1614611317576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130e9061485c565b60405180910390fd5b6000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000804690508091505090565b61138383838360405180602001604052806000815250611bd4565b505050565b601760009054906101000a900460ff1681565b6113a3612955565b73ffffffffffffffffffffffffffffffffffffffff166113c16117de565b73ffffffffffffffffffffffffffffffffffffffff1614611417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140e9061485c565b60405180910390fd5b806019908051906020019061142d9291906138f9565b5050565b611439612955565b73ffffffffffffffffffffffffffffffffffffffff166114576117de565b73ffffffffffffffffffffffffffffffffffffffff16146114ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a49061485c565b60405180910390fd5b6001601760006101000a81548160ff021916908315150217905550565b600d5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611579576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115709061499b565b60405180910390fd5b80915050919050565b6019805461158f906143b7565b80601f01602080910402602001604051908101604052809291908181526020018280546115bb906143b7565b80156116085780601f106115dd57610100808354040283529160200191611608565b820191906000526020600020905b8154815290600101906020018083116115eb57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611681576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167890614a2d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116d0612955565b73ffffffffffffffffffffffffffffffffffffffff166116ee6117de565b73ffffffffffffffffffffffffffffffffffffffff1614611744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173b9061485c565b60405180910390fd5b61174e6000612e84565b565b6018805461175d906143b7565b80601f0160208091040260200160405190810160405280929190818152602001828054611789906143b7565b80156117d65780601f106117ab576101008083540402835291602001916117d6565b820191906000526020600020905b8154815290600101906020018083116117b957829003601f168201915b505050505081565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611817906143b7565b80601f0160208091040260200160405190810160405280929190818152602001828054611843906143b7565b80156118905780601f1061186557610100808354040283529160200191611890565b820191906000526020600020905b81548152906001019060200180831161187357829003601f168201915b5050505050905090565b6002600c5414156118e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d790614a99565b60405180910390fd5b6002600c81905550601360149054906101000a900460ff16611937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192e90614b05565b60405180910390fd5b600f54600182611945611023565b61194f9190614b25565b61195991906147dc565b10611999576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199090614bc7565b60405180910390fd5b6011546001826119a991906147dc565b106119e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e090614c59565b60405180910390fd5b6119f233611c3c565b6001826119ff91906147dc565b10611a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3690614cc5565b60405180910390fd5b80600d54611a4d9190614ce5565b341015611a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8690614d8b565b60405180910390fd5b611a993382612f4a565b611aa281612fa4565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611b0a573d6000803e3d6000fd5b506001600c8190555050565b611b1e612955565b73ffffffffffffffffffffffffffffffffffffffff16611b3c6117de565b73ffffffffffffffffffffffffffffffffffffffff1614611b92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b899061485c565b60405180910390fd5b601360149054906101000a900460ff1615601360146101000a81548160ff021916908315150217905550565b611bd0611bc9612955565b8383612fe9565b5050565b611be5611bdf612955565b83612b4a565b611c24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1b90614909565b60405180910390fd5b611c3084848484613156565b50505050565b60115481565b6000601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601054611c8b91906147dc565b9050919050565b611c9a612955565b73ffffffffffffffffffffffffffffffffffffffff16611cb86117de565b73ffffffffffffffffffffffffffffffffffffffff1614611d0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d059061485c565b60405180910390fd5b8060168190555050565b6060611d23826128e9565b611d62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5990614e1d565b60405180910390fd5b601760009054906101000a900460ff16611e085760188054611d83906143b7565b80601f0160208091040260200160405190810160405280929190818152602001828054611daf906143b7565b8015611dfc5780601f10611dd157610100808354040283529160200191611dfc565b820191906000526020600020905b815481529060010190602001808311611ddf57829003601f168201915b50505050509050611e36565b6019611e13836131b2565b604051602001611e24929190614f0d565b60405160208183030381529060405290505b919050565b611e43612955565b73ffffffffffffffffffffffffffffffffffffffff16611e616117de565b73ffffffffffffffffffffffffffffffffffffffff1614611eb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eae9061485c565b60405180910390fd5b601560009054906101000a900460ff1615601560006101000a81548160ff021916908315150217905550565b611eeb612955565b73ffffffffffffffffffffffffffffffffffffffff16611f096117de565b73ffffffffffffffffffffffffffffffffffffffff1614611f5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f569061485c565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6002600c541415611fe9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe090614a99565b60405180910390fd5b6002600c81905550601560009054906101000a900460ff16612040576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203790614f7d565b60405180910390fd5b600f5460018461204e611023565b6120589190614b25565b61206291906147dc565b106120a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209990614bc7565b60405180910390fd5b6011546001846120b291906147dc565b106120f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e990614c59565b60405180910390fd5b6120fb33611c3c565b60018461210891906147dc565b10612148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213f90614cc5565b60405180910390fd5b82600e546121569190614ce5565b341015612198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218f90614d8b565b60405180910390fd5b61220c828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601654336040516020016121f19190614f9d565b60405160208183030381529060405280519060200120613313565b61224b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224290615004565b60405180910390fd5b6122553384612f4a565b61225e83612fa4565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156122c6573d6000803e3d6000fd5b506001600c81905550505050565b6122dc612955565b73ffffffffffffffffffffffffffffffffffffffff166122fa6117de565b73ffffffffffffffffffffffffffffffffffffffff1614612350576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123479061485c565b60405180910390fd5b600f5460018361235e611023565b6123689190614b25565b61237291906147dc565b106123b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a990614bc7565b60405180910390fd5b60005b828110156123f35760006123c96012612b3c565b90506123d560126127b8565b6123df838261332a565b5080806123eb90615024565b9150506123b5565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461252f576000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b81526004016124c69190613bca565b602060405180830381865afa1580156124e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250791906150ab565b73ffffffffffffffffffffffffffffffffffffffff16141561252d576001915050612597565b505b600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561258a5760019050612597565b6125948383613348565b90505b92915050565b6125a5612955565b73ffffffffffffffffffffffffffffffffffffffff166125c36117de565b73ffffffffffffffffffffffffffffffffffffffff1614612619576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126109061485c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612689576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126809061514a565b60405180910390fd5b61269281612e84565b50565b61269d612955565b73ffffffffffffffffffffffffffffffffffffffff166126bb6117de565b73ffffffffffffffffffffffffffffffffffffffff1614612711576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127089061485c565b60405180910390fd5b600b60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6001816000016000828254019250508190555050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561287857600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff81830151169250505061287c565b3390505b90565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600061295f6127ce565b905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166129d7836114d0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415612a8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a85906151dc565b60405180910390fd5b6001612aa1612a9c876133dc565b613444565b83868660405160008152602001604052604051612ac1949392919061520b565b6020604051602081039080840390855afa158015612ae3573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b60008183612b349190614b25565b905092915050565b600081600001549050919050565b6000612b55826128e9565b612b94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8b906152c2565b60405180910390fd5b6000612b9f836114d0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612c0e57508373ffffffffffffffffffffffffffffffffffffffff16612bf684610ba9565b73ffffffffffffffffffffffffffffffffffffffff16145b80612c1f5750612c1e81856123f8565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612c48826114d0565b73ffffffffffffffffffffffffffffffffffffffff1614612c9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9590615354565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d05906153e6565b60405180910390fd5b612d1983838361347d565b612d24600082612964565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d7491906147dc565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612dcb9190614b25565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80601460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f999190614b25565b925050819055505050565b60005b81811015612fe5576000612fbb6012612b3c565b9050612fc760126127b8565b612fd1338261332a565b508080612fdd90615024565b915050612fa7565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304f90615452565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516131499190613a50565b60405180910390a3505050565b613161848484612c28565b61316d84848484613482565b6131ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131a3906154e4565b60405180910390fd5b50505050565b606060008214156131fa576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061330e565b600082905060005b6000821461322c57808061321590615024565b915050600a826132259190615533565b9150613202565b60008167ffffffffffffffff81111561324857613247613c85565b5b6040519080825280601f01601f19166020018201604052801561327a5781602001600182028036833780820191505090505b5090505b600085146133075760018261329391906147dc565b9150600a856132a29190615564565b60306132ae9190614b25565b60f81b8183815181106132c4576132c3615595565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133009190615533565b945061327e565b8093505050505b919050565b600082613320858461360a565b1490509392505050565b6133448282604051806020016040528060008152506136bd565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600060405180608001604052806043815260200161584060439139805190602001208260000151836020015184604001518051906020012060405160200161342794939291906155c4565b604051602081830303815290604052805190602001209050919050565b600061344e61114c565b82604051602001613460929190615676565b604051602081830303815290604052805190602001209050919050565b505050565b60006134a38473ffffffffffffffffffffffffffffffffffffffff16613718565b156135fd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026134cc612955565b8786866040518563ffffffff1660e01b81526004016134ee94939291906156ad565b6020604051808303816000875af192505050801561352a57506040513d601f19601f82011682018060405250810190613527919061570e565b60015b6135ad573d806000811461355a576040519150601f19603f3d011682016040523d82523d6000602084013e61355f565b606091505b506000815114156135a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161359c906154e4565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613602565b600190505b949350505050565b60008082905060005b84518110156136b257600085828151811061363157613630615595565b5b6020026020010151905080831161367257828160405160200161365592919061573b565b60405160208183030381529060405280519060200120925061369e565b808360405160200161368592919061573b565b6040516020818303038152906040528051906020012092505b5080806136aa90615024565b915050613613565b508091505092915050565b6136c7838361372b565b6136d46000848484613482565b613713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161370a906154e4565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561379b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613792906157b3565b60405180910390fd5b6137a4816128e9565b156137e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137db9061581f565b60405180910390fd5b6137f06000838361347d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546138409190614b25565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054613905906143b7565b90600052602060002090601f016020900481019282613927576000855561396e565b82601f1061394057805160ff191683800117855561396e565b8280016001018555821561396e579182015b8281111561396d578251825591602001919060010190613952565b5b50905061397b919061397f565b5090565b5b80821115613998576000816000905550600101613980565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6139e5816139b0565b81146139f057600080fd5b50565b600081359050613a02816139dc565b92915050565b600060208284031215613a1e57613a1d6139a6565b5b6000613a2c848285016139f3565b91505092915050565b60008115159050919050565b613a4a81613a35565b82525050565b6000602082019050613a656000830184613a41565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613aa5578082015181840152602081019050613a8a565b83811115613ab4576000848401525b50505050565b6000601f19601f8301169050919050565b6000613ad682613a6b565b613ae08185613a76565b9350613af0818560208601613a87565b613af981613aba565b840191505092915050565b60006020820190508181036000830152613b1e8184613acb565b905092915050565b6000819050919050565b613b3981613b26565b8114613b4457600080fd5b50565b600081359050613b5681613b30565b92915050565b600060208284031215613b7257613b716139a6565b5b6000613b8084828501613b47565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613bb482613b89565b9050919050565b613bc481613ba9565b82525050565b6000602082019050613bdf6000830184613bbb565b92915050565b613bee81613ba9565b8114613bf957600080fd5b50565b600081359050613c0b81613be5565b92915050565b60008060408385031215613c2857613c276139a6565b5b6000613c3685828601613bfc565b9250506020613c4785828601613b47565b9150509250929050565b613c5a81613b26565b82525050565b6000602082019050613c756000830184613c51565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613cbd82613aba565b810181811067ffffffffffffffff82111715613cdc57613cdb613c85565b5b80604052505050565b6000613cef61399c565b9050613cfb8282613cb4565b919050565b600067ffffffffffffffff821115613d1b57613d1a613c85565b5b613d2482613aba565b9050602081019050919050565b82818337600083830152505050565b6000613d53613d4e84613d00565b613ce5565b905082815260208101848484011115613d6f57613d6e613c80565b5b613d7a848285613d31565b509392505050565b600082601f830112613d9757613d96613c7b565b5b8135613da7848260208601613d40565b91505092915050565b6000819050919050565b613dc381613db0565b8114613dce57600080fd5b50565b600081359050613de081613dba565b92915050565b600060ff82169050919050565b613dfc81613de6565b8114613e0757600080fd5b50565b600081359050613e1981613df3565b92915050565b600080600080600060a08688031215613e3b57613e3a6139a6565b5b6000613e4988828901613bfc565b955050602086013567ffffffffffffffff811115613e6a57613e696139ab565b5b613e7688828901613d82565b9450506040613e8788828901613dd1565b9350506060613e9888828901613dd1565b9250506080613ea988828901613e0a565b9150509295509295909350565b600081519050919050565b600082825260208201905092915050565b6000613edd82613eb6565b613ee78185613ec1565b9350613ef7818560208601613a87565b613f0081613aba565b840191505092915050565b60006020820190508181036000830152613f258184613ed2565b905092915050565b6000613f3882613b89565b9050919050565b613f4881613f2d565b8114613f5357600080fd5b50565b600081359050613f6581613f3f565b92915050565b600060208284031215613f8157613f806139a6565b5b6000613f8f84828501613f56565b91505092915050565b613fa181613db0565b82525050565b6000602082019050613fbc6000830184613f98565b92915050565b600080600060608486031215613fdb57613fda6139a6565b5b6000613fe986828701613bfc565b9350506020613ffa86828701613bfc565b925050604061400b86828701613b47565b9150509250925092565b600067ffffffffffffffff8211156140305761402f613c85565b5b61403982613aba565b9050602081019050919050565b600061405961405484614015565b613ce5565b90508281526020810184848401111561407557614074613c80565b5b614080848285613d31565b509392505050565b600082601f83011261409d5761409c613c7b565b5b81356140ad848260208601614046565b91505092915050565b6000602082840312156140cc576140cb6139a6565b5b600082013567ffffffffffffffff8111156140ea576140e96139ab565b5b6140f684828501614088565b91505092915050565b600060208284031215614115576141146139a6565b5b600061412384828501613bfc565b91505092915050565b61413581613a35565b811461414057600080fd5b50565b6000813590506141528161412c565b92915050565b6000806040838503121561416f5761416e6139a6565b5b600061417d85828601613bfc565b925050602061418e85828601614143565b9150509250929050565b600080600080608085870312156141b2576141b16139a6565b5b60006141c087828801613bfc565b94505060206141d187828801613bfc565b93505060406141e287828801613b47565b925050606085013567ffffffffffffffff811115614203576142026139ab565b5b61420f87828801613d82565b91505092959194509250565b600060208284031215614231576142306139a6565b5b600061423f84828501613dd1565b91505092915050565b600080fd5b600080fd5b60008083601f84011261426857614267613c7b565b5b8235905067ffffffffffffffff81111561428557614284614248565b5b6020830191508360208202830111156142a1576142a061424d565b5b9250929050565b6000806000604084860312156142c1576142c06139a6565b5b60006142cf86828701613b47565b935050602084013567ffffffffffffffff8111156142f0576142ef6139ab565b5b6142fc86828701614252565b92509250509250925092565b6000806040838503121561431f5761431e6139a6565b5b600061432d85828601613b47565b925050602061433e85828601613bfc565b9150509250929050565b6000806040838503121561435f5761435e6139a6565b5b600061436d85828601613bfc565b925050602061437e85828601613bfc565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806143cf57607f821691505b602082108114156143e3576143e2614388565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614445602c83613a76565b9150614450826143e9565b604082019050919050565b6000602082019050818103600083015261447481614438565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006144d7602183613a76565b91506144e28261447b565b604082019050919050565b60006020820190508181036000830152614506816144ca565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000614569603883613a76565b91506145748261450d565b604082019050919050565b600060208201905081810360008301526145988161455c565b9050919050565b7f5369676e657220616e64207369676e617475726520646f206e6f74206d61746360008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b60006145fb602183613a76565b91506146068261459f565b604082019050919050565b6000602082019050818103600083015261462a816145ee565b9050919050565b61463a81613f2d565b82525050565b60006060820190506146556000830186613bbb565b6146626020830185614631565b81810360408301526146748184613ed2565b9050949350505050565b600081905092915050565b600061469482613eb6565b61469e818561467e565b93506146ae818560208601613a87565b80840191505092915050565b60008160601b9050919050565b60006146d2826146ba565b9050919050565b60006146e4826146c7565b9050919050565b6146fc6146f782613ba9565b6146d9565b82525050565b600061470e8285614689565b915061471a82846146eb565b6014820191508190509392505050565b60006147368284614689565b915081905092915050565b7f46756e6374696f6e2063616c6c206e6f74207375636365737366756c00000000600082015250565b6000614777601c83613a76565b915061478282614741565b602082019050919050565b600060208201905081810360008301526147a68161476a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006147e782613b26565b91506147f283613b26565b925082821015614805576148046147ad565b5b828203905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614846602083613a76565b915061485182614810565b602082019050919050565b6000602082019050818103600083015261487581614839565b9050919050565b60006020820190506148916000830184614631565b92915050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006148f3603183613a76565b91506148fe82614897565b604082019050919050565b60006020820190508181036000830152614922816148e6565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000614985602983613a76565b915061499082614929565b604082019050919050565b600060208201905081810360008301526149b481614978565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614a17602a83613a76565b9150614a22826149bb565b604082019050919050565b60006020820190508181036000830152614a4681614a0a565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614a83601f83613a76565b9150614a8e82614a4d565b602082019050919050565b60006020820190508181036000830152614ab281614a76565b9050919050565b7f53616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b6000614aef601283613a76565b9150614afa82614ab9565b602082019050919050565b60006020820190508181036000830152614b1e81614ae2565b9050919050565b6000614b3082613b26565b9150614b3b83613b26565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b7057614b6f6147ad565b5b828201905092915050565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b6000614bb1601283613a76565b9150614bbc82614b7b565b602082019050919050565b60006020820190508181036000830152614be081614ba4565b9050919050565b7f547279696e6720746f206d696e7420746f6f206d616e7920617420612074696d60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000614c43602183613a76565b9150614c4e82614be7565b604082019050919050565b60006020820190508181036000830152614c7281614c36565b9050919050565b7f4d696e74696e67206c696d697420657863656564656400000000000000000000600082015250565b6000614caf601683613a76565b9150614cba82614c79565b602082019050919050565b60006020820190508181036000830152614cde81614ca2565b9050919050565b6000614cf082613b26565b9150614cfb83613b26565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d3457614d336147ad565b5b828202905092915050565b7f496e73756666696369656e74207061796d656e74000000000000000000000000600082015250565b6000614d75601483613a76565b9150614d8082614d3f565b602082019050919050565b60006020820190508181036000830152614da481614d68565b9050919050565b7f4552433732314d657461446174613a2055524920517565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614e07602f83613a76565b9150614e1282614dab565b604082019050919050565b60006020820190508181036000830152614e3681614dfa565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154614e6a816143b7565b614e748186614e3d565b94506001821660008114614e8f5760018114614ea057614ed3565b60ff19831686528186019350614ed3565b614ea985614e48565b60005b83811015614ecb57815481890152600182019150602081019050614eac565b838801955050505b50505092915050565b6000614ee782613a6b565b614ef18185614e3d565b9350614f01818560208601613a87565b80840191505092915050565b6000614f198285614e5d565b9150614f258284614edc565b91508190509392505050565b7f57686974656c6973742073616c65206973206e6f742061637469766500000000600082015250565b6000614f67601c83613a76565b9150614f7282614f31565b602082019050919050565b60006020820190508181036000830152614f9681614f5a565b9050919050565b6000614fa982846146eb565b60148201915081905092915050565b7f696e76616c6964206d65726b6c652070726f6f66000000000000000000000000600082015250565b6000614fee601483613a76565b9150614ff982614fb8565b602082019050919050565b6000602082019050818103600083015261501d81614fe1565b9050919050565b600061502f82613b26565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615062576150616147ad565b5b600182019050919050565b600061507882613ba9565b9050919050565b6150888161506d565b811461509357600080fd5b50565b6000815190506150a58161507f565b92915050565b6000602082840312156150c1576150c06139a6565b5b60006150cf84828501615096565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615134602683613a76565b915061513f826150d8565b604082019050919050565b6000602082019050818103600083015261516381615127565b9050919050565b7f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360008201527f49474e4552000000000000000000000000000000000000000000000000000000602082015250565b60006151c6602583613a76565b91506151d18261516a565b604082019050919050565b600060208201905081810360008301526151f5816151b9565b9050919050565b61520581613de6565b82525050565b60006080820190506152206000830187613f98565b61522d60208301866151fc565b61523a6040830185613f98565b6152476060830184613f98565b95945050505050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006152ac602c83613a76565b91506152b782615250565b604082019050919050565b600060208201905081810360008301526152db8161529f565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b600061533e602983613a76565b9150615349826152e2565b604082019050919050565b6000602082019050818103600083015261536d81615331565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006153d0602483613a76565b91506153db82615374565b604082019050919050565b600060208201905081810360008301526153ff816153c3565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061543c601983613a76565b915061544782615406565b602082019050919050565b6000602082019050818103600083015261546b8161542f565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006154ce603283613a76565b91506154d982615472565b604082019050919050565b600060208201905081810360008301526154fd816154c1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061553e82613b26565b915061554983613b26565b92508261555957615558615504565b5b828204905092915050565b600061556f82613b26565b915061557a83613b26565b92508261558a57615589615504565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006080820190506155d96000830187613f98565b6155e66020830186613c51565b6155f36040830185613bbb565b6156006060830184613f98565b95945050505050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b600061563f600283614e3d565b915061564a82615609565b600282019050919050565b6000819050919050565b61567061566b82613db0565b615655565b82525050565b600061568182615632565b915061568d828561565f565b60208201915061569d828461565f565b6020820191508190509392505050565b60006080820190506156c26000830187613bbb565b6156cf6020830186613bbb565b6156dc6040830185613c51565b81810360608301526156ee8184613ed2565b905095945050505050565b600081519050615708816139dc565b92915050565b600060208284031215615724576157236139a6565b5b6000615732848285016156f9565b91505092915050565b6000615747828561565f565b602082019150615757828461565f565b6020820191508190509392505050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061579d602083613a76565b91506157a882615767565b602082019050919050565b600060208201905081810360008301526157cc81615790565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615809601c83613a76565b9150615814826157d3565b602082019050919050565b60006020820190508181036000830152615838816157fc565b905091905056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a264697066735822122034c58282462d9c19b6eb18ecfe711136f6df0c5db6b4fa5ee5b1558ab2eb911c64736f6c634300080c00336080604052604051620022d2380380620022d2833981810160405281019062000029919062000668565b805182511462000070576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000679062000774565b60405180910390fd5b6000825111620000b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000ae90620007e6565b60405180910390fd5b60005b8251811015620001265762000110838281518110620000de57620000dd62000808565b5b6020026020010151838381518110620000fc57620000fb62000808565b5b60200260200101516200012f60201b60201c565b80806200011d9062000866565b915050620000ba565b50505062000b02565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620001a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000199906200092a565b60405180910390fd5b60008111620001e8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001df906200099c565b60405180910390fd5b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146200026d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002649062000a34565b60405180910390fd5b6004829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508060005462000324919062000a56565b6000819055507f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac82826040516200035d92919062000ad5565b60405180910390a15050565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620003cd8262000382565b810181811067ffffffffffffffff82111715620003ef57620003ee62000393565b5b80604052505050565b60006200040462000369565b9050620004128282620003c2565b919050565b600067ffffffffffffffff82111562000435576200043462000393565b5b602082029050602081019050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000478826200044b565b9050919050565b6200048a816200046b565b81146200049657600080fd5b50565b600081519050620004aa816200047f565b92915050565b6000620004c7620004c18462000417565b620003f8565b90508083825260208201905060208402830185811115620004ed57620004ec62000446565b5b835b818110156200051a578062000505888262000499565b845260208401935050602081019050620004ef565b5050509392505050565b600082601f8301126200053c576200053b6200037d565b5b81516200054e848260208601620004b0565b91505092915050565b600067ffffffffffffffff82111562000575576200057462000393565b5b602082029050602081019050919050565b6000819050919050565b6200059b8162000586565b8114620005a757600080fd5b50565b600081519050620005bb8162000590565b92915050565b6000620005d8620005d28462000557565b620003f8565b90508083825260208201905060208402830185811115620005fe57620005fd62000446565b5b835b818110156200062b5780620006168882620005aa565b84526020840193505060208101905062000600565b5050509392505050565b600082601f8301126200064d576200064c6200037d565b5b81516200065f848260208601620005c1565b91505092915050565b6000806040838503121562000682576200068162000373565b5b600083015167ffffffffffffffff811115620006a357620006a262000378565b5b620006b18582860162000524565b925050602083015167ffffffffffffffff811115620006d557620006d462000378565b5b620006e38582860162000635565b9150509250929050565b600082825260208201905092915050565b7f5061796d656e7453706c69747465723a2070617965657320616e64207368617260008201527f6573206c656e677468206d69736d617463680000000000000000000000000000602082015250565b60006200075c603283620006ed565b91506200076982620006fe565b604082019050919050565b600060208201905081810360008301526200078f816200074d565b9050919050565b7f5061796d656e7453706c69747465723a206e6f20706179656573000000000000600082015250565b6000620007ce601a83620006ed565b9150620007db8262000796565b602082019050919050565b600060208201905081810360008301526200080181620007bf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620008738262000586565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415620008a957620008a862000837565b5b600182019050919050565b7f5061796d656e7453706c69747465723a206163636f756e74206973207468652060008201527f7a65726f20616464726573730000000000000000000000000000000000000000602082015250565b600062000912602c83620006ed565b91506200091f82620008b4565b604082019050919050565b60006020820190508181036000830152620009458162000903565b9050919050565b7f5061796d656e7453706c69747465723a20736861726573206172652030000000600082015250565b600062000984601d83620006ed565b915062000991826200094c565b602082019050919050565b60006020820190508181036000830152620009b78162000975565b9050919050565b7f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960008201527f2068617320736861726573000000000000000000000000000000000000000000602082015250565b600062000a1c602b83620006ed565b915062000a2982620009be565b604082019050919050565b6000602082019050818103600083015262000a4f8162000a0d565b9050919050565b600062000a638262000586565b915062000a708362000586565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000aa85762000aa762000837565b5b828201905092915050565b62000abe816200046b565b82525050565b62000acf8162000586565b82525050565b600060408201905062000aec600083018562000ab3565b62000afb602083018462000ac4565b9392505050565b6117c08062000b126000396000f3fe60806040526004361061008a5760003560e01c80638b83209b116100595780638b83209b146101905780639852595c146101cd578063ce7c2ac21461020a578063d79779b214610247578063e33b7de314610284576100d1565b806319165587146100d65780633a98ef39146100ff578063406072a91461012a57806348b7504414610167576100d1565b366100d1577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7706100b86102af565b346040516100c7929190610d87565b60405180910390a1005b600080fd5b3480156100e257600080fd5b506100fd60048036038101906100f89190610df3565b6102b7565b005b34801561010b57600080fd5b50610114610462565b6040516101219190610e20565b60405180910390f35b34801561013657600080fd5b50610151600480360381019061014c9190610ea5565b61046b565b60405161015e9190610e20565b60405180910390f35b34801561017357600080fd5b5061018e60048036038101906101899190610ea5565b6104f2565b005b34801561019c57600080fd5b506101b760048036038101906101b29190610f11565b6107ab565b6040516101c49190610f3e565b60405180910390f35b3480156101d957600080fd5b506101f460048036038101906101ef9190610f59565b6107f3565b6040516102019190610e20565b60405180910390f35b34801561021657600080fd5b50610231600480360381019061022c9190610f59565b61083c565b60405161023e9190610e20565b60405180910390f35b34801561025357600080fd5b5061026e60048036038101906102699190610f86565b610885565b60405161027b9190610e20565b60405180910390f35b34801561029057600080fd5b506102996108ce565b6040516102a69190610e20565b60405180910390f35b600033905090565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090611036565b60405180910390fd5b60006103436108ce565b4761034e9190611085565b905060006103658383610360866107f3565b6108d8565b905060008114156103ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a29061114d565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546103fa9190611085565b9250508190555080600160008282546104139190611085565b925050819055506104248382610946565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b05683826040516104559291906111cc565b60405180910390a1505050565b60008054905090565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056b90611036565b60405180910390fd5b600061057f83610885565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016105b89190610f3e565b602060405180830381865afa1580156105d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f9919061120a565b6106039190611085565b9050600061061b8383610616878761046b565b6108d8565b90506000811415610661576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106589061114d565b60405180910390fd5b80600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546106ed9190611085565b9250508190555080600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546107439190611085565b92505081905550610755848483610a3a565b8373ffffffffffffffffffffffffffffffffffffffff167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a848360405161079d929190610d87565b60405180910390a250505050565b6000600482815481106107c1576107c0611237565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600154905090565b600081600054600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054856109299190611266565b61093391906112ef565b61093d9190611320565b90509392505050565b80471015610989576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610980906113a0565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516109af906113f1565b60006040518083038185875af1925050503d80600081146109ec576040519150601f19603f3d011682016040523d82523d6000602084013e6109f1565b606091505b5050905080610a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2c90611478565b60405180910390fd5b505050565b610abb8363a9059cbb60e01b8484604051602401610a59929190610d87565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610ac0565b505050565b6000610b22826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16610b879092919063ffffffff16565b9050600081511115610b825780806020019051810190610b4291906114d0565b610b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b789061156f565b60405180910390fd5b5b505050565b6060610b968484600085610b9f565b90509392505050565b606082471015610be4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdb90611601565b60405180910390fd5b610bed85610cb3565b610c2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c239061166d565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051610c5591906116fc565b60006040518083038185875af1925050503d8060008114610c92576040519150601f19603f3d011682016040523d82523d6000602084013e610c97565b606091505b5091509150610ca7828286610cc6565b92505050949350505050565b600080823b905060008111915050919050565b60608315610cd657829050610d26565b600083511115610ce95782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1d9190611768565b60405180910390fd5b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610d5882610d2d565b9050919050565b610d6881610d4d565b82525050565b6000819050919050565b610d8181610d6e565b82525050565b6000604082019050610d9c6000830185610d5f565b610da96020830184610d78565b9392505050565b600080fd5b6000610dc082610d2d565b9050919050565b610dd081610db5565b8114610ddb57600080fd5b50565b600081359050610ded81610dc7565b92915050565b600060208284031215610e0957610e08610db0565b5b6000610e1784828501610dde565b91505092915050565b6000602082019050610e356000830184610d78565b92915050565b6000610e4682610d4d565b9050919050565b610e5681610e3b565b8114610e6157600080fd5b50565b600081359050610e7381610e4d565b92915050565b610e8281610d4d565b8114610e8d57600080fd5b50565b600081359050610e9f81610e79565b92915050565b60008060408385031215610ebc57610ebb610db0565b5b6000610eca85828601610e64565b9250506020610edb85828601610e90565b9150509250929050565b610eee81610d6e565b8114610ef957600080fd5b50565b600081359050610f0b81610ee5565b92915050565b600060208284031215610f2757610f26610db0565b5b6000610f3584828501610efc565b91505092915050565b6000602082019050610f536000830184610d5f565b92915050565b600060208284031215610f6f57610f6e610db0565b5b6000610f7d84828501610e90565b91505092915050565b600060208284031215610f9c57610f9b610db0565b5b6000610faa84828501610e64565b91505092915050565b600082825260208201905092915050565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b6000611020602683610fb3565b915061102b82610fc4565b604082019050919050565b6000602082019050818103600083015261104f81611013565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061109082610d6e565b915061109b83610d6e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156110d0576110cf611056565b5b828201905092915050565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b6000611137602b83610fb3565b9150611142826110db565b604082019050919050565b600060208201905081810360008301526111668161112a565b9050919050565b6000819050919050565b600061119261118d61118884610d2d565b61116d565b610d2d565b9050919050565b60006111a482611177565b9050919050565b60006111b682611199565b9050919050565b6111c6816111ab565b82525050565b60006040820190506111e160008301856111bd565b6111ee6020830184610d78565b9392505050565b60008151905061120481610ee5565b92915050565b6000602082840312156112205761121f610db0565b5b600061122e848285016111f5565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061127182610d6e565b915061127c83610d6e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156112b5576112b4611056565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006112fa82610d6e565b915061130583610d6e565b925082611315576113146112c0565b5b828204905092915050565b600061132b82610d6e565b915061133683610d6e565b92508282101561134957611348611056565b5b828203905092915050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b600061138a601d83610fb3565b915061139582611354565b602082019050919050565b600060208201905081810360008301526113b98161137d565b9050919050565b600081905092915050565b50565b60006113db6000836113c0565b91506113e6826113cb565b600082019050919050565b60006113fc826113ce565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000611462603a83610fb3565b915061146d82611406565b604082019050919050565b6000602082019050818103600083015261149181611455565b9050919050565b60008115159050919050565b6114ad81611498565b81146114b857600080fd5b50565b6000815190506114ca816114a4565b92915050565b6000602082840312156114e6576114e5610db0565b5b60006114f4848285016114bb565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000611559602a83610fb3565b9150611564826114fd565b604082019050919050565b600060208201905081810360008301526115888161154c565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b60006115eb602683610fb3565b91506115f68261158f565b604082019050919050565b6000602082019050818103600083015261161a816115de565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000611657601d83610fb3565b915061166282611621565b602082019050919050565b600060208201905081810360008301526116868161164a565b9050919050565b600081519050919050565b60005b838110156116b657808201518184015260208101905061169b565b838111156116c5576000848401525b50505050565b60006116d68261168d565b6116e081856113c0565b93506116f0818560208601611698565b80840191505092915050565b600061170882846116cb565b915081905092915050565b600081519050919050565b6000601f19601f8301169050919050565b600061173a82611713565b6117448185610fb3565b9350611754818560208601611698565b61175d8161171e565b840191505092915050565b60006020820190508181036000830152611782818461172f565b90509291505056fea26469706673582212208d81af7c22b88a8f66c6609ab6d485e5d6ce693e885950292d603c95dd01ecee64736f6c634300080c0033454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c742900000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000000184d6f6d656e7469626c65732047656e657369732050617373000000000000000000000000000000000000000000000000000000000000000000000000000000034d475000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d51546a504e7432766f4b43466d7232324d5a6f3474507872516a48677533344d75706e3962387136796471640000000000000000000000000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000002a303fe4b53000000000000000000000000000000000000000000000000000001cdda4faccd000000000000000000000000000000000000000000000000000000000000000008ae0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000003ff1f962b8a13919d3e43cdb56e096e52b2ecab600000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001
Deployed Bytecode
0x60806040526004361061027d5760003560e01c8063611f3f101161014f578063b88d4fde116100c1578063d26ea6c01161007a578063d26ea6c014610938578063d2cab05614610961578063d52c57e01461097d578063e985e9c5146109a6578063f2fde38b146109e3578063f73c814b14610a0c5761027d565b8063b88d4fde1461082a578063b8fc105114610853578063bb660c0a1461087e578063bd32fb66146108bb578063c87b56dd146108e4578063d1beca64146109215761027d565b806379b6ed361161011357806379b6ed361461074d5780638da5cb5b1461077857806395d89b41146107a3578063a0712d68146107ce578063a10866ef146107ea578063a22cb465146108015761027d565b8063611f3f10146106665780636352211e146106915780636c0360eb146106ce57806370a08231146106f9578063715018a6146107365761027d565b806319165587116101f357806332e367c7116101ac57806332e367c7146105905780633408e470146105a757806342842e0e146105d257806351830227146105fb57806355f804b3146106265780635b8ad4291461064f5761027d565b8063191655871461048257806320379ee5146104ab57806323b872dd146104d65780632a85db55146104ff5780632d0335ab1461052857806332cb6b0c146105655761027d565b80630c53c51c116102455780630c53c51c1461037b5780630f7e5970146103ab5780630fcf2e75146103d657806310b5454d1461040157806317e7f2951461042c57806318160ddd146104575761027d565b806301ffc9a71461028257806306fdde03146102bf578063081812fc146102ea578063095ea7b3146103275780630aaef28514610350575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190613a08565b610a35565b6040516102b69190613a50565b60405180910390f35b3480156102cb57600080fd5b506102d4610b17565b6040516102e19190613b04565b60405180910390f35b3480156102f657600080fd5b50610311600480360381019061030c9190613b5c565b610ba9565b60405161031e9190613bca565b60405180910390f35b34801561033357600080fd5b5061034e60048036038101906103499190613c11565b610c2e565b005b34801561035c57600080fd5b50610365610d46565b6040516103729190613c60565b60405180910390f35b61039560048036038101906103909190613e1f565b610d4c565b6040516103a29190613f0b565b60405180910390f35b3480156103b757600080fd5b506103c0610fbe565b6040516103cd9190613b04565b60405180910390f35b3480156103e257600080fd5b506103eb610ff7565b6040516103f89190613a50565b60405180910390f35b34801561040d57600080fd5b5061041661100a565b6040516104239190613a50565b60405180910390f35b34801561043857600080fd5b5061044161101d565b60405161044e9190613c60565b60405180910390f35b34801561046357600080fd5b5061046c611023565b6040516104799190613c60565b60405180910390f35b34801561048e57600080fd5b506104a960048036038101906104a49190613f6b565b611040565b005b3480156104b757600080fd5b506104c061114c565b6040516104cd9190613fa7565b60405180910390f35b3480156104e257600080fd5b506104fd60048036038101906104f89190613fc2565b611156565b005b34801561050b57600080fd5b50610526600480360381019061052191906140b6565b6111b6565b005b34801561053457600080fd5b5061054f600480360381019061054a91906140ff565b61124c565b60405161055c9190613c60565b60405180910390f35b34801561057157600080fd5b5061057a611295565b6040516105879190613c60565b60405180910390f35b34801561059c57600080fd5b506105a561129b565b005b3480156105b357600080fd5b506105bc61135b565b6040516105c99190613c60565b60405180910390f35b3480156105de57600080fd5b506105f960048036038101906105f49190613fc2565b611368565b005b34801561060757600080fd5b50610610611388565b60405161061d9190613a50565b60405180910390f35b34801561063257600080fd5b5061064d600480360381019061064891906140b6565b61139b565b005b34801561065b57600080fd5b50610664611431565b005b34801561067257600080fd5b5061067b6114ca565b6040516106889190613c60565b60405180910390f35b34801561069d57600080fd5b506106b860048036038101906106b39190613b5c565b6114d0565b6040516106c59190613bca565b60405180910390f35b3480156106da57600080fd5b506106e3611582565b6040516106f09190613b04565b60405180910390f35b34801561070557600080fd5b50610720600480360381019061071b91906140ff565b611610565b60405161072d9190613c60565b60405180910390f35b34801561074257600080fd5b5061074b6116c8565b005b34801561075957600080fd5b50610762611750565b60405161076f9190613b04565b60405180910390f35b34801561078457600080fd5b5061078d6117de565b60405161079a9190613bca565b60405180910390f35b3480156107af57600080fd5b506107b8611808565b6040516107c59190613b04565b60405180910390f35b6107e860048036038101906107e39190613b5c565b61189a565b005b3480156107f657600080fd5b506107ff611b16565b005b34801561080d57600080fd5b5061082860048036038101906108239190614158565b611bbe565b005b34801561083657600080fd5b50610851600480360381019061084c9190614198565b611bd4565b005b34801561085f57600080fd5b50610868611c36565b6040516108759190613c60565b60405180910390f35b34801561088a57600080fd5b506108a560048036038101906108a091906140ff565b611c3c565b6040516108b29190613c60565b60405180910390f35b3480156108c757600080fd5b506108e260048036038101906108dd919061421b565b611c92565b005b3480156108f057600080fd5b5061090b60048036038101906109069190613b5c565b611d18565b6040516109189190613b04565b60405180910390f35b34801561092d57600080fd5b50610936611e3b565b005b34801561094457600080fd5b5061095f600480360381019061095a91906140ff565b611ee3565b005b61097b600480360381019061097691906142a8565b611fa3565b005b34801561098957600080fd5b506109a4600480360381019061099f9190614308565b6122d4565b005b3480156109b257600080fd5b506109cd60048036038101906109c89190614348565b6123f8565b6040516109da9190613a50565b60405180910390f35b3480156109ef57600080fd5b50610a0a6004803603810190610a0591906140ff565b61259d565b005b348015610a1857600080fd5b50610a336004803603810190610a2e91906140ff565b612695565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b0057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b105750610b0f8261287f565b5b9050919050565b606060008054610b26906143b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610b52906143b7565b8015610b9f5780601f10610b7457610100808354040283529160200191610b9f565b820191906000526020600020905b815481529060010190602001808311610b8257829003601f168201915b5050505050905090565b6000610bb4826128e9565b610bf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bea9061445b565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c39826114d0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca1906144ed565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cc9612955565b73ffffffffffffffffffffffffffffffffffffffff161480610cf85750610cf781610cf2612955565b6123f8565b5b610d37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2e9061457f565b60405180910390fd5b610d418383612964565b505050565b60105481565b606060006040518060600160405280600860008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481526020018873ffffffffffffffffffffffffffffffffffffffff168152602001878152509050610dcf8782878787612a1d565b610e0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0590614611565b60405180910390fd5b610e616001600860008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612b2690919063ffffffff16565b600860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b873388604051610ed793929190614640565b60405180910390a16000803073ffffffffffffffffffffffffffffffffffffffff16888a604051602001610f0c929190614702565b604051602081830303815290604052604051610f28919061472a565b6000604051808303816000865af19150503d8060008114610f65576040519150601f19603f3d011682016040523d82523d6000602084013e610f6a565b606091505b509150915081610faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa69061478d565b60405180910390fd5b80935050505095945050505050565b6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b601360149054906101000a900460ff1681565b601560009054906101000a900460ff1681565b600e5481565b600060016110316012612b3c565b61103b91906147dc565b905090565b611048612955565b73ffffffffffffffffffffffffffffffffffffffff166110666117de565b73ffffffffffffffffffffffffffffffffffffffff16146110bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b39061485c565b60405180910390fd5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166319165587826040518263ffffffff1660e01b8152600401611117919061487c565b600060405180830381600087803b15801561113157600080fd5b505af1158015611145573d6000803e3d6000fd5b5050505050565b6000600754905090565b611167611161612955565b82612b4a565b6111a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119d90614909565b60405180910390fd5b6111b1838383612c28565b505050565b6111be612955565b73ffffffffffffffffffffffffffffffffffffffff166111dc6117de565b73ffffffffffffffffffffffffffffffffffffffff1614611232576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112299061485c565b60405180910390fd5b80601890805190602001906112489291906138f9565b5050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600f5481565b6112a3612955565b73ffffffffffffffffffffffffffffffffffffffff166112c16117de565b73ffffffffffffffffffffffffffffffffffffffff1614611317576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130e9061485c565b60405180910390fd5b6000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000804690508091505090565b61138383838360405180602001604052806000815250611bd4565b505050565b601760009054906101000a900460ff1681565b6113a3612955565b73ffffffffffffffffffffffffffffffffffffffff166113c16117de565b73ffffffffffffffffffffffffffffffffffffffff1614611417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140e9061485c565b60405180910390fd5b806019908051906020019061142d9291906138f9565b5050565b611439612955565b73ffffffffffffffffffffffffffffffffffffffff166114576117de565b73ffffffffffffffffffffffffffffffffffffffff16146114ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a49061485c565b60405180910390fd5b6001601760006101000a81548160ff021916908315150217905550565b600d5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611579576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115709061499b565b60405180910390fd5b80915050919050565b6019805461158f906143b7565b80601f01602080910402602001604051908101604052809291908181526020018280546115bb906143b7565b80156116085780601f106115dd57610100808354040283529160200191611608565b820191906000526020600020905b8154815290600101906020018083116115eb57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611681576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167890614a2d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116d0612955565b73ffffffffffffffffffffffffffffffffffffffff166116ee6117de565b73ffffffffffffffffffffffffffffffffffffffff1614611744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173b9061485c565b60405180910390fd5b61174e6000612e84565b565b6018805461175d906143b7565b80601f0160208091040260200160405190810160405280929190818152602001828054611789906143b7565b80156117d65780601f106117ab576101008083540402835291602001916117d6565b820191906000526020600020905b8154815290600101906020018083116117b957829003601f168201915b505050505081565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611817906143b7565b80601f0160208091040260200160405190810160405280929190818152602001828054611843906143b7565b80156118905780601f1061186557610100808354040283529160200191611890565b820191906000526020600020905b81548152906001019060200180831161187357829003601f168201915b5050505050905090565b6002600c5414156118e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d790614a99565b60405180910390fd5b6002600c81905550601360149054906101000a900460ff16611937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192e90614b05565b60405180910390fd5b600f54600182611945611023565b61194f9190614b25565b61195991906147dc565b10611999576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199090614bc7565b60405180910390fd5b6011546001826119a991906147dc565b106119e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e090614c59565b60405180910390fd5b6119f233611c3c565b6001826119ff91906147dc565b10611a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3690614cc5565b60405180910390fd5b80600d54611a4d9190614ce5565b341015611a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8690614d8b565b60405180910390fd5b611a993382612f4a565b611aa281612fa4565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611b0a573d6000803e3d6000fd5b506001600c8190555050565b611b1e612955565b73ffffffffffffffffffffffffffffffffffffffff16611b3c6117de565b73ffffffffffffffffffffffffffffffffffffffff1614611b92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b899061485c565b60405180910390fd5b601360149054906101000a900460ff1615601360146101000a81548160ff021916908315150217905550565b611bd0611bc9612955565b8383612fe9565b5050565b611be5611bdf612955565b83612b4a565b611c24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1b90614909565b60405180910390fd5b611c3084848484613156565b50505050565b60115481565b6000601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601054611c8b91906147dc565b9050919050565b611c9a612955565b73ffffffffffffffffffffffffffffffffffffffff16611cb86117de565b73ffffffffffffffffffffffffffffffffffffffff1614611d0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d059061485c565b60405180910390fd5b8060168190555050565b6060611d23826128e9565b611d62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5990614e1d565b60405180910390fd5b601760009054906101000a900460ff16611e085760188054611d83906143b7565b80601f0160208091040260200160405190810160405280929190818152602001828054611daf906143b7565b8015611dfc5780601f10611dd157610100808354040283529160200191611dfc565b820191906000526020600020905b815481529060010190602001808311611ddf57829003601f168201915b50505050509050611e36565b6019611e13836131b2565b604051602001611e24929190614f0d565b60405160208183030381529060405290505b919050565b611e43612955565b73ffffffffffffffffffffffffffffffffffffffff16611e616117de565b73ffffffffffffffffffffffffffffffffffffffff1614611eb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eae9061485c565b60405180910390fd5b601560009054906101000a900460ff1615601560006101000a81548160ff021916908315150217905550565b611eeb612955565b73ffffffffffffffffffffffffffffffffffffffff16611f096117de565b73ffffffffffffffffffffffffffffffffffffffff1614611f5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f569061485c565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6002600c541415611fe9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe090614a99565b60405180910390fd5b6002600c81905550601560009054906101000a900460ff16612040576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203790614f7d565b60405180910390fd5b600f5460018461204e611023565b6120589190614b25565b61206291906147dc565b106120a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209990614bc7565b60405180910390fd5b6011546001846120b291906147dc565b106120f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e990614c59565b60405180910390fd5b6120fb33611c3c565b60018461210891906147dc565b10612148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213f90614cc5565b60405180910390fd5b82600e546121569190614ce5565b341015612198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218f90614d8b565b60405180910390fd5b61220c828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601654336040516020016121f19190614f9d565b60405160208183030381529060405280519060200120613313565b61224b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224290615004565b60405180910390fd5b6122553384612f4a565b61225e83612fa4565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156122c6573d6000803e3d6000fd5b506001600c81905550505050565b6122dc612955565b73ffffffffffffffffffffffffffffffffffffffff166122fa6117de565b73ffffffffffffffffffffffffffffffffffffffff1614612350576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123479061485c565b60405180910390fd5b600f5460018361235e611023565b6123689190614b25565b61237291906147dc565b106123b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a990614bc7565b60405180910390fd5b60005b828110156123f35760006123c96012612b3c565b90506123d560126127b8565b6123df838261332a565b5080806123eb90615024565b9150506123b5565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461252f576000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b81526004016124c69190613bca565b602060405180830381865afa1580156124e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250791906150ab565b73ffffffffffffffffffffffffffffffffffffffff16141561252d576001915050612597565b505b600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561258a5760019050612597565b6125948383613348565b90505b92915050565b6125a5612955565b73ffffffffffffffffffffffffffffffffffffffff166125c36117de565b73ffffffffffffffffffffffffffffffffffffffff1614612619576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126109061485c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612689576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126809061514a565b60405180910390fd5b61269281612e84565b50565b61269d612955565b73ffffffffffffffffffffffffffffffffffffffff166126bb6117de565b73ffffffffffffffffffffffffffffffffffffffff1614612711576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127089061485c565b60405180910390fd5b600b60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6001816000016000828254019250508190555050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561287857600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff81830151169250505061287c565b3390505b90565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600061295f6127ce565b905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166129d7836114d0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415612a8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a85906151dc565b60405180910390fd5b6001612aa1612a9c876133dc565b613444565b83868660405160008152602001604052604051612ac1949392919061520b565b6020604051602081039080840390855afa158015612ae3573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b60008183612b349190614b25565b905092915050565b600081600001549050919050565b6000612b55826128e9565b612b94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8b906152c2565b60405180910390fd5b6000612b9f836114d0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612c0e57508373ffffffffffffffffffffffffffffffffffffffff16612bf684610ba9565b73ffffffffffffffffffffffffffffffffffffffff16145b80612c1f5750612c1e81856123f8565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612c48826114d0565b73ffffffffffffffffffffffffffffffffffffffff1614612c9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9590615354565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d05906153e6565b60405180910390fd5b612d1983838361347d565b612d24600082612964565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d7491906147dc565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612dcb9190614b25565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80601460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f999190614b25565b925050819055505050565b60005b81811015612fe5576000612fbb6012612b3c565b9050612fc760126127b8565b612fd1338261332a565b508080612fdd90615024565b915050612fa7565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304f90615452565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516131499190613a50565b60405180910390a3505050565b613161848484612c28565b61316d84848484613482565b6131ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131a3906154e4565b60405180910390fd5b50505050565b606060008214156131fa576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061330e565b600082905060005b6000821461322c57808061321590615024565b915050600a826132259190615533565b9150613202565b60008167ffffffffffffffff81111561324857613247613c85565b5b6040519080825280601f01601f19166020018201604052801561327a5781602001600182028036833780820191505090505b5090505b600085146133075760018261329391906147dc565b9150600a856132a29190615564565b60306132ae9190614b25565b60f81b8183815181106132c4576132c3615595565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133009190615533565b945061327e565b8093505050505b919050565b600082613320858461360a565b1490509392505050565b6133448282604051806020016040528060008152506136bd565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600060405180608001604052806043815260200161584060439139805190602001208260000151836020015184604001518051906020012060405160200161342794939291906155c4565b604051602081830303815290604052805190602001209050919050565b600061344e61114c565b82604051602001613460929190615676565b604051602081830303815290604052805190602001209050919050565b505050565b60006134a38473ffffffffffffffffffffffffffffffffffffffff16613718565b156135fd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026134cc612955565b8786866040518563ffffffff1660e01b81526004016134ee94939291906156ad565b6020604051808303816000875af192505050801561352a57506040513d601f19601f82011682018060405250810190613527919061570e565b60015b6135ad573d806000811461355a576040519150601f19603f3d011682016040523d82523d6000602084013e61355f565b606091505b506000815114156135a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161359c906154e4565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613602565b600190505b949350505050565b60008082905060005b84518110156136b257600085828151811061363157613630615595565b5b6020026020010151905080831161367257828160405160200161365592919061573b565b60405160208183030381529060405280519060200120925061369e565b808360405160200161368592919061573b565b6040516020818303038152906040528051906020012092505b5080806136aa90615024565b915050613613565b508091505092915050565b6136c7838361372b565b6136d46000848484613482565b613713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161370a906154e4565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561379b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613792906157b3565b60405180910390fd5b6137a4816128e9565b156137e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137db9061581f565b60405180910390fd5b6137f06000838361347d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546138409190614b25565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054613905906143b7565b90600052602060002090601f016020900481019282613927576000855561396e565b82601f1061394057805160ff191683800117855561396e565b8280016001018555821561396e579182015b8281111561396d578251825591602001919060010190613952565b5b50905061397b919061397f565b5090565b5b80821115613998576000816000905550600101613980565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6139e5816139b0565b81146139f057600080fd5b50565b600081359050613a02816139dc565b92915050565b600060208284031215613a1e57613a1d6139a6565b5b6000613a2c848285016139f3565b91505092915050565b60008115159050919050565b613a4a81613a35565b82525050565b6000602082019050613a656000830184613a41565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613aa5578082015181840152602081019050613a8a565b83811115613ab4576000848401525b50505050565b6000601f19601f8301169050919050565b6000613ad682613a6b565b613ae08185613a76565b9350613af0818560208601613a87565b613af981613aba565b840191505092915050565b60006020820190508181036000830152613b1e8184613acb565b905092915050565b6000819050919050565b613b3981613b26565b8114613b4457600080fd5b50565b600081359050613b5681613b30565b92915050565b600060208284031215613b7257613b716139a6565b5b6000613b8084828501613b47565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613bb482613b89565b9050919050565b613bc481613ba9565b82525050565b6000602082019050613bdf6000830184613bbb565b92915050565b613bee81613ba9565b8114613bf957600080fd5b50565b600081359050613c0b81613be5565b92915050565b60008060408385031215613c2857613c276139a6565b5b6000613c3685828601613bfc565b9250506020613c4785828601613b47565b9150509250929050565b613c5a81613b26565b82525050565b6000602082019050613c756000830184613c51565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613cbd82613aba565b810181811067ffffffffffffffff82111715613cdc57613cdb613c85565b5b80604052505050565b6000613cef61399c565b9050613cfb8282613cb4565b919050565b600067ffffffffffffffff821115613d1b57613d1a613c85565b5b613d2482613aba565b9050602081019050919050565b82818337600083830152505050565b6000613d53613d4e84613d00565b613ce5565b905082815260208101848484011115613d6f57613d6e613c80565b5b613d7a848285613d31565b509392505050565b600082601f830112613d9757613d96613c7b565b5b8135613da7848260208601613d40565b91505092915050565b6000819050919050565b613dc381613db0565b8114613dce57600080fd5b50565b600081359050613de081613dba565b92915050565b600060ff82169050919050565b613dfc81613de6565b8114613e0757600080fd5b50565b600081359050613e1981613df3565b92915050565b600080600080600060a08688031215613e3b57613e3a6139a6565b5b6000613e4988828901613bfc565b955050602086013567ffffffffffffffff811115613e6a57613e696139ab565b5b613e7688828901613d82565b9450506040613e8788828901613dd1565b9350506060613e9888828901613dd1565b9250506080613ea988828901613e0a565b9150509295509295909350565b600081519050919050565b600082825260208201905092915050565b6000613edd82613eb6565b613ee78185613ec1565b9350613ef7818560208601613a87565b613f0081613aba565b840191505092915050565b60006020820190508181036000830152613f258184613ed2565b905092915050565b6000613f3882613b89565b9050919050565b613f4881613f2d565b8114613f5357600080fd5b50565b600081359050613f6581613f3f565b92915050565b600060208284031215613f8157613f806139a6565b5b6000613f8f84828501613f56565b91505092915050565b613fa181613db0565b82525050565b6000602082019050613fbc6000830184613f98565b92915050565b600080600060608486031215613fdb57613fda6139a6565b5b6000613fe986828701613bfc565b9350506020613ffa86828701613bfc565b925050604061400b86828701613b47565b9150509250925092565b600067ffffffffffffffff8211156140305761402f613c85565b5b61403982613aba565b9050602081019050919050565b600061405961405484614015565b613ce5565b90508281526020810184848401111561407557614074613c80565b5b614080848285613d31565b509392505050565b600082601f83011261409d5761409c613c7b565b5b81356140ad848260208601614046565b91505092915050565b6000602082840312156140cc576140cb6139a6565b5b600082013567ffffffffffffffff8111156140ea576140e96139ab565b5b6140f684828501614088565b91505092915050565b600060208284031215614115576141146139a6565b5b600061412384828501613bfc565b91505092915050565b61413581613a35565b811461414057600080fd5b50565b6000813590506141528161412c565b92915050565b6000806040838503121561416f5761416e6139a6565b5b600061417d85828601613bfc565b925050602061418e85828601614143565b9150509250929050565b600080600080608085870312156141b2576141b16139a6565b5b60006141c087828801613bfc565b94505060206141d187828801613bfc565b93505060406141e287828801613b47565b925050606085013567ffffffffffffffff811115614203576142026139ab565b5b61420f87828801613d82565b91505092959194509250565b600060208284031215614231576142306139a6565b5b600061423f84828501613dd1565b91505092915050565b600080fd5b600080fd5b60008083601f84011261426857614267613c7b565b5b8235905067ffffffffffffffff81111561428557614284614248565b5b6020830191508360208202830111156142a1576142a061424d565b5b9250929050565b6000806000604084860312156142c1576142c06139a6565b5b60006142cf86828701613b47565b935050602084013567ffffffffffffffff8111156142f0576142ef6139ab565b5b6142fc86828701614252565b92509250509250925092565b6000806040838503121561431f5761431e6139a6565b5b600061432d85828601613b47565b925050602061433e85828601613bfc565b9150509250929050565b6000806040838503121561435f5761435e6139a6565b5b600061436d85828601613bfc565b925050602061437e85828601613bfc565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806143cf57607f821691505b602082108114156143e3576143e2614388565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614445602c83613a76565b9150614450826143e9565b604082019050919050565b6000602082019050818103600083015261447481614438565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006144d7602183613a76565b91506144e28261447b565b604082019050919050565b60006020820190508181036000830152614506816144ca565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000614569603883613a76565b91506145748261450d565b604082019050919050565b600060208201905081810360008301526145988161455c565b9050919050565b7f5369676e657220616e64207369676e617475726520646f206e6f74206d61746360008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b60006145fb602183613a76565b91506146068261459f565b604082019050919050565b6000602082019050818103600083015261462a816145ee565b9050919050565b61463a81613f2d565b82525050565b60006060820190506146556000830186613bbb565b6146626020830185614631565b81810360408301526146748184613ed2565b9050949350505050565b600081905092915050565b600061469482613eb6565b61469e818561467e565b93506146ae818560208601613a87565b80840191505092915050565b60008160601b9050919050565b60006146d2826146ba565b9050919050565b60006146e4826146c7565b9050919050565b6146fc6146f782613ba9565b6146d9565b82525050565b600061470e8285614689565b915061471a82846146eb565b6014820191508190509392505050565b60006147368284614689565b915081905092915050565b7f46756e6374696f6e2063616c6c206e6f74207375636365737366756c00000000600082015250565b6000614777601c83613a76565b915061478282614741565b602082019050919050565b600060208201905081810360008301526147a68161476a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006147e782613b26565b91506147f283613b26565b925082821015614805576148046147ad565b5b828203905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614846602083613a76565b915061485182614810565b602082019050919050565b6000602082019050818103600083015261487581614839565b9050919050565b60006020820190506148916000830184614631565b92915050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006148f3603183613a76565b91506148fe82614897565b604082019050919050565b60006020820190508181036000830152614922816148e6565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000614985602983613a76565b915061499082614929565b604082019050919050565b600060208201905081810360008301526149b481614978565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614a17602a83613a76565b9150614a22826149bb565b604082019050919050565b60006020820190508181036000830152614a4681614a0a565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614a83601f83613a76565b9150614a8e82614a4d565b602082019050919050565b60006020820190508181036000830152614ab281614a76565b9050919050565b7f53616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b6000614aef601283613a76565b9150614afa82614ab9565b602082019050919050565b60006020820190508181036000830152614b1e81614ae2565b9050919050565b6000614b3082613b26565b9150614b3b83613b26565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b7057614b6f6147ad565b5b828201905092915050565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b6000614bb1601283613a76565b9150614bbc82614b7b565b602082019050919050565b60006020820190508181036000830152614be081614ba4565b9050919050565b7f547279696e6720746f206d696e7420746f6f206d616e7920617420612074696d60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000614c43602183613a76565b9150614c4e82614be7565b604082019050919050565b60006020820190508181036000830152614c7281614c36565b9050919050565b7f4d696e74696e67206c696d697420657863656564656400000000000000000000600082015250565b6000614caf601683613a76565b9150614cba82614c79565b602082019050919050565b60006020820190508181036000830152614cde81614ca2565b9050919050565b6000614cf082613b26565b9150614cfb83613b26565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d3457614d336147ad565b5b828202905092915050565b7f496e73756666696369656e74207061796d656e74000000000000000000000000600082015250565b6000614d75601483613a76565b9150614d8082614d3f565b602082019050919050565b60006020820190508181036000830152614da481614d68565b9050919050565b7f4552433732314d657461446174613a2055524920517565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614e07602f83613a76565b9150614e1282614dab565b604082019050919050565b60006020820190508181036000830152614e3681614dfa565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154614e6a816143b7565b614e748186614e3d565b94506001821660008114614e8f5760018114614ea057614ed3565b60ff19831686528186019350614ed3565b614ea985614e48565b60005b83811015614ecb57815481890152600182019150602081019050614eac565b838801955050505b50505092915050565b6000614ee782613a6b565b614ef18185614e3d565b9350614f01818560208601613a87565b80840191505092915050565b6000614f198285614e5d565b9150614f258284614edc565b91508190509392505050565b7f57686974656c6973742073616c65206973206e6f742061637469766500000000600082015250565b6000614f67601c83613a76565b9150614f7282614f31565b602082019050919050565b60006020820190508181036000830152614f9681614f5a565b9050919050565b6000614fa982846146eb565b60148201915081905092915050565b7f696e76616c6964206d65726b6c652070726f6f66000000000000000000000000600082015250565b6000614fee601483613a76565b9150614ff982614fb8565b602082019050919050565b6000602082019050818103600083015261501d81614fe1565b9050919050565b600061502f82613b26565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615062576150616147ad565b5b600182019050919050565b600061507882613ba9565b9050919050565b6150888161506d565b811461509357600080fd5b50565b6000815190506150a58161507f565b92915050565b6000602082840312156150c1576150c06139a6565b5b60006150cf84828501615096565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615134602683613a76565b915061513f826150d8565b604082019050919050565b6000602082019050818103600083015261516381615127565b9050919050565b7f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360008201527f49474e4552000000000000000000000000000000000000000000000000000000602082015250565b60006151c6602583613a76565b91506151d18261516a565b604082019050919050565b600060208201905081810360008301526151f5816151b9565b9050919050565b61520581613de6565b82525050565b60006080820190506152206000830187613f98565b61522d60208301866151fc565b61523a6040830185613f98565b6152476060830184613f98565b95945050505050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006152ac602c83613a76565b91506152b782615250565b604082019050919050565b600060208201905081810360008301526152db8161529f565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b600061533e602983613a76565b9150615349826152e2565b604082019050919050565b6000602082019050818103600083015261536d81615331565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006153d0602483613a76565b91506153db82615374565b604082019050919050565b600060208201905081810360008301526153ff816153c3565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061543c601983613a76565b915061544782615406565b602082019050919050565b6000602082019050818103600083015261546b8161542f565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006154ce603283613a76565b91506154d982615472565b604082019050919050565b600060208201905081810360008301526154fd816154c1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061553e82613b26565b915061554983613b26565b92508261555957615558615504565b5b828204905092915050565b600061556f82613b26565b915061557a83613b26565b92508261558a57615589615504565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006080820190506155d96000830187613f98565b6155e66020830186613c51565b6155f36040830185613bbb565b6156006060830184613f98565b95945050505050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b600061563f600283614e3d565b915061564a82615609565b600282019050919050565b6000819050919050565b61567061566b82613db0565b615655565b82525050565b600061568182615632565b915061568d828561565f565b60208201915061569d828461565f565b6020820191508190509392505050565b60006080820190506156c26000830187613bbb565b6156cf6020830186613bbb565b6156dc6040830185613c51565b81810360608301526156ee8184613ed2565b905095945050505050565b600081519050615708816139dc565b92915050565b600060208284031215615724576157236139a6565b5b6000615732848285016156f9565b91505092915050565b6000615747828561565f565b602082019150615757828461565f565b6020820191508190509392505050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061579d602083613a76565b91506157a882615767565b602082019050919050565b600060208201905081810360008301526157cc81615790565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615809601c83613a76565b9150615814826157d3565b602082019050919050565b60006020820190508181036000830152615838816157fc565b905091905056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a264697066735822122034c58282462d9c19b6eb18ecfe711136f6df0c5db6b4fa5ee5b1558ab2eb911c64736f6c634300080c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000000184d6f6d656e7469626c65732047656e657369732050617373000000000000000000000000000000000000000000000000000000000000000000000000000000034d475000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d51546a504e7432766f4b43466d7232324d5a6f3474507872516a48677533344d75706e3962387136796471640000000000000000000000000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000002a303fe4b53000000000000000000000000000000000000000000000000000001cdda4faccd000000000000000000000000000000000000000000000000000000000000000008ae0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000003ff1f962b8a13919d3e43cdb56e096e52b2ecab600000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001
-----Decoded View---------------
Arg [0] : _name (string): Momentibles Genesis Pass
Arg [1] : _symbol (string): MGP
Arg [2] : _preRevealURI (string): ipfs://QmQTjPNt2voKCFmr22MZo4tPxrQjHgu34Mupn9b8q6ydqd
Arg [3] : params (uint256[]): 190000000000000000,130000000000000000,2222,2,2
Arg [4] : payees (address[]): 0x3ff1F962B8a13919d3e43CDb56E096E52B2ECab6
Arg [5] : shares (uint256[]): 1
-----Encoded View---------------
23 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [3] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000260
Arg [5] : 00000000000000000000000000000000000000000000000000000000000002a0
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000018
Arg [7] : 4d6f6d656e7469626c65732047656e6573697320506173730000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [9] : 4d47500000000000000000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [11] : 697066733a2f2f516d51546a504e7432766f4b43466d7232324d5a6f34745078
Arg [12] : 72516a48677533344d75706e3962387136796471640000000000000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [14] : 00000000000000000000000000000000000000000000000002a303fe4b530000
Arg [15] : 00000000000000000000000000000000000000000000000001cdda4faccd0000
Arg [16] : 00000000000000000000000000000000000000000000000000000000000008ae
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [20] : 0000000000000000000000003ff1f962b8a13919d3e43cdb56e096e52b2ecab6
Arg [21] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [22] : 0000000000000000000000000000000000000000000000000000000000000001
Deployed Bytecode Sourcemap
72804:5241:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39921:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40866:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42425:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41948:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73044:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66111:1151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63266:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73864:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75795:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72975:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75270:107;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77931:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64275:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43175:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77805:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67688:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73012:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69272:109;;;;;;;;;;;;;:::i;:::-;;64384:161;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43585:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77075:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77691:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77608:75;;;;;;;;;;;;;:::i;:::-;;72941:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40560:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77144:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40290:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54070:103;;;;;;;;;;;;;:::i;:::-;;77111:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53419:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41035:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74028:580;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73911:109;;;;;;;;;;;;;:::i;:::-;;42718:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43841:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73081:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75493:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76085:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77174:426;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75845:118;;;;;;;;;;;;;:::i;:::-;;69146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76216:803;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74616:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69653:550;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54328:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69389:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39921:305;40023:4;40075:25;40060:40;;;:11;:40;;;;:105;;;;40132:33;40117:48;;;:11;:48;;;;40060:105;:158;;;;40182:36;40206:11;40182:23;:36::i;:::-;40060:158;40040:178;;39921:305;;;:::o;40866:100::-;40920:13;40953:5;40946:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40866:100;:::o;42425:221::-;42501:7;42529:16;42537:7;42529;:16::i;:::-;42521:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42614:15;:24;42630:7;42614:24;;;;;;;;;;;;;;;;;;;;;42607:31;;42425:221;;;:::o;41948:411::-;42029:13;42045:23;42060:7;42045:14;:23::i;:::-;42029:39;;42093:5;42087:11;;:2;:11;;;;42079:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;42187:5;42171:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;42196:37;42213:5;42220:12;:10;:12::i;:::-;42196:16;:37::i;:::-;42171:62;42149:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;42330:21;42339:2;42343:7;42330:8;:21::i;:::-;42018:341;41948:411;;:::o;73044:30::-;;;;:::o;66111:1151::-;66312:12;66337:29;66369:152;;;;;;;;66407:6;:19;66414:11;66407:19;;;;;;;;;;;;;;;;66369:152;;;;66447:11;66369:152;;;;;;66492:17;66369:152;;;66337:184;;66556:45;66563:11;66576:6;66584:4;66590;66596;66556:6;:45::i;:::-;66534:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;66751:26;66775:1;66751:6;:19;66758:11;66751:19;;;;;;;;;;;;;;;;:23;;:26;;;;:::i;:::-;66729:6;:19;66736:11;66729:19;;;;;;;;;;;;;;;:48;;;;66795:126;66833:11;66867:10;66893:17;66795:126;;;;;;;;:::i;:::-;;;;;;;;67032:12;67046:23;67081:4;67073:18;;67123:17;67142:11;67106:48;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67073:92;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67031:134;;;;67184:7;67176:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;67244:10;67237:17;;;;;66111:1151;;;;;;;:::o;63266:43::-;;;;;;;;;;;;;;;;;;;:::o;73864:38::-;;;;;;;;;;;;;:::o;75795:41::-;;;;;;;;;;;;;:::o;72975:30::-;;;;:::o;75270:107::-;75314:7;75368:1;75341:24;:14;:22;:24::i;:::-;:28;;;;:::i;:::-;75334:35;;75270:107;:::o;77931:111::-;53650:12;:10;:12::i;:::-;53639:23;;:7;:5;:7::i;:::-;:23;;;53631:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;78001:16:::1;;;;;;;;;;;:24;;;78026:7;78001:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;77931:111:::0;:::o;64275:101::-;64326:7;64353:15;;64346:22;;64275:101;:::o;43175:339::-;43370:41;43389:12;:10;:12::i;:::-;43403:7;43370:18;:41::i;:::-;43362:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;43478:28;43488:4;43494:2;43498:7;43478:9;:28::i;:::-;43175:339;;;:::o;77805:118::-;53650:12;:10;:12::i;:::-;53639:23;;:7;:5;:7::i;:::-;:23;;;53631:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;77902:13:::1;77887:12;:28;;;;;;;;;;;;:::i;:::-;;77805:118:::0;:::o;67688:107::-;67741:13;67775:6;:12;67782:4;67775:12;;;;;;;;;;;;;;;;67767:20;;67688:107;;;:::o;73012:25::-;;;;:::o;69272:109::-;53650:12;:10;:12::i;:::-;53639:23;;:7;:5;:7::i;:::-;:23;;;53631:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69369:3:::1;69338:20;;:35;;;;;;;;;;;;;;;;;;69272:109::o:0;64384:161::-;64427:7;64447:10;64498:9;64492:15;;64535:2;64528:9;;;64384:161;:::o;43585:185::-;43723:39;43740:4;43746:2;43750:7;43723:39;;;;;;;;;;;;:16;:39::i;:::-;43585:185;;;:::o;77075:28::-;;;;;;;;;;;;;:::o;77691:104::-;53650:12;:10;:12::i;:::-;53639:23;;:7;:5;:7::i;:::-;:23;;;53631:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;77776:11:::1;77766:7;:21;;;;;;;;;;;;:::i;:::-;;77691:104:::0;:::o;77608:75::-;53650:12;:10;:12::i;:::-;53639:23;;:7;:5;:7::i;:::-;:23;;;53631:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;77671:4:::1;77660:8;;:15;;;;;;;;;;;;;;;;;;77608:75::o:0;72941:27::-;;;;:::o;40560:239::-;40632:7;40652:13;40668:7;:16;40676:7;40668:16;;;;;;;;;;;;;;;;;;;;;40652:32;;40720:1;40703:19;;:5;:19;;;;40695:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40786:5;40779:12;;;40560:239;;;:::o;77144:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40290:208::-;40362:7;40407:1;40390:19;;:5;:19;;;;40382:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;40474:9;:16;40484:5;40474:16;;;;;;;;;;;;;;;;40467:23;;40290:208;;;:::o;54070:103::-;53650:12;:10;:12::i;:::-;53639:23;;:7;:5;:7::i;:::-;:23;;;53631:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54135:30:::1;54162:1;54135:18;:30::i;:::-;54070:103::o:0;77111:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53419:87::-;53465:7;53492:6;;;;;;;;;;;53485:13;;53419:87;:::o;41035:104::-;41091:13;41124:7;41117:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41035:104;:::o;74028:580::-;5428:1;6026:7;;:19;;6018:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;5428:1;6159:7;:18;;;;74104::::1;;;;;;;;;;;74096:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;74192:10;;74188:1;74180:5;74164:13;:11;:13::i;:::-;:21;;;;:::i;:::-;:25;;;;:::i;:::-;:38;74156:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;74256:13;;74252:1;74244:5;:9;;;;:::i;:::-;:25;74236:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;74338:28;74355:10;74338:16;:28::i;:::-;74334:1;74326:5;:9;;;;:::i;:::-;:40;74318:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;74440:5;74425:12;;:20;;;;:::i;:::-;74412:9;:33;;74404:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;74483:34;74499:10;74511:5;74483:15;:34::i;:::-;74530:12;74536:5;74530;:12::i;:::-;74563:16;;;;;;;;;;;74555:34;;:45;74590:9;74555:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;5384:1:::0;6338:7;:22;;;;74028:580;:::o;73911:109::-;53650:12;:10;:12::i;:::-;53639:23;;:7;:5;:7::i;:::-;:23;;;53631:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73994:18:::1;;;;;;;;;;;73993:19;73972:18;;:40;;;;;;;;;;;;;;;;;;73911:109::o:0;42718:155::-;42813:52;42832:12;:10;:12::i;:::-;42846:8;42856;42813:18;:52::i;:::-;42718:155;;:::o;43841:328::-;44016:41;44035:12;:10;:12::i;:::-;44049:7;44016:18;:41::i;:::-;44008:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;44122:39;44136:4;44142:2;44146:7;44155:5;44122:13;:39::i;:::-;43841:328;;;;:::o;73081:28::-;;;;:::o;75493:136::-;75556:7;75601:12;:20;75614:6;75601:20;;;;;;;;;;;;;;;;75583:15;;:38;;;;:::i;:::-;75576:45;;75493:136;;;:::o;76085:123::-;53650:12;:10;:12::i;:::-;53639:23;;:7;:5;:7::i;:::-;:23;;;53631:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76189:11:::1;76166:20;:34;;;;76085:123:::0;:::o;77174:426::-;77294:13;77348:16;77356:7;77348;:16::i;:::-;77326:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;77457:8;;;;;;;;;;;77452:61;;77489:12;77482:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77452:61;77556:7;77565:25;77582:7;77565:16;:25::i;:::-;77539:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;77525:67;;77174:426;;;;:::o;75845:118::-;53650:12;:10;:12::i;:::-;53639:23;;:7;:5;:7::i;:::-;:23;;;53631:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75934:21:::1;;;;;;;;;;;75933:22;75909:21;;:46;;;;;;;;;;;;;;;;;;75845:118::o:0;69146:::-;53650:12;:10;:12::i;:::-;53639:23;;:7;:5;:7::i;:::-;:23;;;53631:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69248:8:::1;69225:20;;:31;;;;;;;;;;;;;;;;;;69146:118:::0;:::o;76216:803::-;5428:1;6026:7;;:19;;6018:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;5428:1;6159:7;:18;;;;76333:21:::1;;;;;;;;;;;76325:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;76434:10;;76430:1;76422:5;76406:13;:11;:13::i;:::-;:21;;;;:::i;:::-;:25;;;;:::i;:::-;:38;76398:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;76498:13;;76494:1;76486:5;:9;;;;:::i;:::-;:25;76478:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;76580:28;76597:10;76580:16;:28::i;:::-;76576:1;76568:5;:9;;;;:::i;:::-;:40;76560:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;76685:5;76667:15;;:23;;;;:::i;:::-;76654:9;:36;;76646:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;76748:94;76767:11;;76748:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76780:20;;76829:10;76812:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;76802:39;;;;;;76748:18;:94::i;:::-;76726:155;;;;;;;;;;;;:::i;:::-;;;;;;;;;76894:34;76910:10;76922:5;76894:15;:34::i;:::-;76941:12;76947:5;76941;:12::i;:::-;76974:16;;;;;;;;;;;76966:34;;:45;77001:9;76966:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;5384:1:::0;6338:7;:22;;;;76216:803;;;:::o;74616:376::-;53650:12;:10;:12::i;:::-;53639:23;;:7;:5;:7::i;:::-;:23;;;53631:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74737:10:::1;;74733:1;74725:5;74709:13;:11;:13::i;:::-;:21;;;;:::i;:::-;:25;;;;:::i;:::-;:38;74701:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;74786:9;74781:204;74805:5;74801:1;:9;74781:204;;;74832:22;74857:24;:14;:22;:24::i;:::-;74832:49;;74896:26;:14;:24;:26::i;:::-;74937:36;74947:9;74958:14;74937:9;:36::i;:::-;74817:168;74812:3;;;;;:::i;:::-;;;;74781:204;;;;74616:376:::0;;:::o;69653:550::-;69780:4;69838:3;69806:36;;:20;;;;;;;;;;;:36;;;69802:251;;69859:27;69903:20;;;;;;;;;;;69859:65;;69985:9;69943:51;;69951:13;:21;;;69973:6;69951:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69943:51;;;69939:103;;;70022:4;70015:11;;;;;69939:103;69844:209;69802:251;70069:15;:26;70085:9;70069:26;;;;;;;;;;;;;;;;;;;;;;;;;70065:70;;;70119:4;70112:11;;;;70065:70;70154:41;70177:6;70185:9;70154:22;:41::i;:::-;70147:48;;69653:550;;;;;:::o;54328:201::-;53650:12;:10;:12::i;:::-;53639:23;;:7;:5;:7::i;:::-;:23;;;53631:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54437:1:::1;54417:22;;:8;:22;;;;54409:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;54493:28;54512:8;54493:18;:28::i;:::-;54328:201:::0;:::o;69389:147::-;53650:12;:10;:12::i;:::-;53639:23;;:7;:5;:7::i;:::-;:23;;;53631:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69498:15:::1;:30;69514:13;69498:30;;;;;;;;;;;;;;;;;;;;;;;;;69497:31;69464:15;:30;69480:13;69464:30;;;;;;;;;;;;;;;;:64;;;;;;;;;;;;;;;;;;69389:147:::0;:::o;1025:127::-;1132:1;1114:7;:14;;;:19;;;;;;;;;;;1025:127;:::o;55024:650::-;55095:22;55161:4;55139:27;;:10;:27;;;55135:508;;;55183:18;55204:8;;55183:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55227:13;55243:8;;:15;;55227:31;;55495:42;55465:5;55458;55454:17;55448:24;55422:134;55412:144;;55282:289;;55135:508;;;55620:10;55603:28;;55135:508;55024:650;:::o;38369:157::-;38454:4;38493:25;38478:40;;;:11;:40;;;;38471:47;;38369:157;;;:::o;45679:127::-;45744:4;45796:1;45768:30;;:7;:16;45776:7;45768:16;;;;;;;;;;;;;;;;;;;;;:30;;;;45761:37;;45679:127;;;:::o;70347:161::-;70437:14;70476:24;:22;:24::i;:::-;70469:31;;70347:161;:::o;49661:174::-;49763:2;49736:15;:24;49752:7;49736:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;49819:7;49815:2;49781:46;;49790:23;49805:7;49790:14;:23::i;:::-;49781:46;;;;;;;;;;;;49661:174;;:::o;67803:486::-;67981:4;68024:1;68006:20;;:6;:20;;;;67998:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;68122:159;68150:47;68169:27;68189:6;68169:19;:27::i;:::-;68150:18;:47::i;:::-;68216:4;68239;68262;68122:159;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68099:182;;:6;:182;;;68079:202;;67803:486;;;;;;;:::o;58541:98::-;58599:7;58630:1;58626;:5;;;;:::i;:::-;58619:12;;58541:98;;;;:::o;903:114::-;968:7;995;:14;;;988:21;;903:114;;;:::o;45973:348::-;46066:4;46091:16;46099:7;46091;:16::i;:::-;46083:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46167:13;46183:23;46198:7;46183:14;:23::i;:::-;46167:39;;46236:5;46225:16;;:7;:16;;;:51;;;;46269:7;46245:31;;:20;46257:7;46245:11;:20::i;:::-;:31;;;46225:51;:87;;;;46280:32;46297:5;46304:7;46280:16;:32::i;:::-;46225:87;46217:96;;;45973:348;;;;:::o;48965:578::-;49124:4;49097:31;;:23;49112:7;49097:14;:23::i;:::-;:31;;;49089:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;49207:1;49193:16;;:2;:16;;;;49185:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;49263:39;49284:4;49290:2;49294:7;49263:20;:39::i;:::-;49367:29;49384:1;49388:7;49367:8;:29::i;:::-;49428:1;49409:9;:15;49419:4;49409:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;49457:1;49440:9;:13;49450:2;49440:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;49488:2;49469:7;:16;49477:7;49469:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;49527:7;49523:2;49508:27;;49517:4;49508:27;;;;;;;;;;;;48965:578;;;:::o;54689:191::-;54763:16;54782:6;;;;;;;;;;;54763:25;;54808:8;54799:6;;:17;;;;;;;;;;;;;;;;;;54863:8;54832:40;;54853:8;54832:40;;;;;;;;;;;;54752:128;54689:191;:::o;75637:112::-;75736:5;75712:12;:20;75725:6;75712:20;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;75637:112;;:::o;75000:262::-;75055:9;75050:205;75074:5;75070:1;:9;75050:205;;;75101:22;75126:24;:14;:22;:24::i;:::-;75101:49;;75165:26;:14;:24;:26::i;:::-;75206:37;75216:10;75228:14;75206:9;:37::i;:::-;75086:169;75081:3;;;;;:::i;:::-;;;;75050:205;;;;75000:262;:::o;49977:315::-;50132:8;50123:17;;:5;:17;;;;50115:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;50219:8;50181:18;:25;50200:5;50181:25;;;;;;;;;;;;;;;:35;50207:8;50181:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;50265:8;50243:41;;50258:5;50243:41;;;50275:8;50243:41;;;;;;:::i;:::-;;;;;;;;49977:315;;;:::o;45051:::-;45208:28;45218:4;45224:2;45228:7;45208:9;:28::i;:::-;45255:48;45278:4;45284:2;45288:7;45297:5;45255:22;:48::i;:::-;45247:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;45051:315;;;;:::o;1859:723::-;1915:13;2145:1;2136:5;:10;2132:53;;;2163:10;;;;;;;;;;;;;;;;;;;;;2132:53;2195:12;2210:5;2195:20;;2226:14;2251:78;2266:1;2258:4;:9;2251:78;;2284:8;;;;;:::i;:::-;;;;2315:2;2307:10;;;;;:::i;:::-;;;2251:78;;;2339:19;2371:6;2361:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2339:39;;2389:154;2405:1;2396:5;:10;2389:154;;2433:1;2423:11;;;;;:::i;:::-;;;2500:2;2492:5;:10;;;;:::i;:::-;2479:2;:24;;;;:::i;:::-;2466:39;;2449:6;2456;2449:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2529:2;2520:11;;;;;:::i;:::-;;;2389:154;;;2567:6;2553:21;;;;;1859:723;;;;:::o;71421:190::-;71546:4;71599;71570:25;71583:5;71590:4;71570:12;:25::i;:::-;:33;71563:40;;71421:190;;;;;:::o;46663:110::-;46739:26;46749:2;46753:7;46739:26;;;;;;;;;;;;:9;:26::i;:::-;46663:110;;:::o;42944:164::-;43041:4;43065:18;:25;43084:5;43065:25;;;;;;;;;;;;;;;:35;43091:8;43065:35;;;;;;;;;;;;;;;;;;;;;;;;;43058:42;;42944:164;;;;:::o;67270:410::-;67380:7;65447:100;;;;;;;;;;;;;;;;;65427:127;;;;;;67534:6;:12;;;67569:6;:11;;;67613:6;:24;;;67603:35;;;;;;67453:204;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67425:247;;;;;;67405:267;;67270:410;;;:::o;64914:258::-;65013:7;65115:20;:18;:20::i;:::-;65137:11;65086:63;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65058:106;;;;;;65038:126;;64914:258;;;:::o;52228:126::-;;;;:::o;50857:799::-;51012:4;51033:15;:2;:13;;;:15::i;:::-;51029:620;;;51085:2;51069:36;;;51106:12;:10;:12::i;:::-;51120:4;51126:7;51135:5;51069:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;51065:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51328:1;51311:6;:13;:18;51307:272;;;51354:60;;;;;;;;;;:::i;:::-;;;;;;;;51307:272;51529:6;51523:13;51514:6;51510:2;51506:15;51499:38;51065:529;51202:41;;;51192:51;;;:6;:51;;;;51185:58;;;;;51029:620;51633:4;51626:11;;50857:799;;;;;;;:::o;71973:701::-;72056:7;72076:20;72099:4;72076:27;;72119:9;72114:523;72138:5;:12;72134:1;:16;72114:523;;;72172:20;72195:5;72201:1;72195:8;;;;;;;;:::i;:::-;;;;;;;;72172:31;;72238:12;72222;:28;72218:408;;72392:12;72406;72375:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;72365:55;;;;;;72350:70;;72218:408;;;72582:12;72596;72565:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;72555:55;;;;;;72540:70;;72218:408;72157:480;72152:3;;;;;:::i;:::-;;;;72114:523;;;;72654:12;72647:19;;;71973:701;;;;:::o;47000:321::-;47130:18;47136:2;47140:7;47130:5;:18::i;:::-;47181:54;47212:1;47216:2;47220:7;47229:5;47181:22;:54::i;:::-;47159:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;47000:321;;;:::o;10087:387::-;10147:4;10355:12;10422:7;10410:20;10402:28;;10465:1;10458:4;:8;10451:15;;;10087:387;;;:::o;47657:382::-;47751:1;47737:16;;:2;:16;;;;47729:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;47810:16;47818:7;47810;:16::i;:::-;47809:17;47801:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;47872:45;47901:1;47905:2;47909:7;47872:20;:45::i;:::-;47947:1;47930:9;:13;47940:2;47930:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;47978:2;47959:7;:16;47967:7;47959:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;48023:7;48019:2;47998:33;;48015:1;47998:33;;;;;;;;;;;;47657:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:117::-;5399:1;5396;5389:12;5413:117;5522:1;5519;5512:12;5536:180;5584:77;5581:1;5574:88;5681:4;5678:1;5671:15;5705:4;5702:1;5695:15;5722:281;5805:27;5827:4;5805:27;:::i;:::-;5797:6;5793:40;5935:6;5923:10;5920:22;5899:18;5887:10;5884:34;5881:62;5878:88;;;5946:18;;:::i;:::-;5878:88;5986:10;5982:2;5975:22;5765:238;5722:281;;:::o;6009:129::-;6043:6;6070:20;;:::i;:::-;6060:30;;6099:33;6127:4;6119:6;6099:33;:::i;:::-;6009:129;;;:::o;6144:307::-;6205:4;6295:18;6287:6;6284:30;6281:56;;;6317:18;;:::i;:::-;6281:56;6355:29;6377:6;6355:29;:::i;:::-;6347:37;;6439:4;6433;6429:15;6421:23;;6144:307;;;:::o;6457:154::-;6541:6;6536:3;6531;6518:30;6603:1;6594:6;6589:3;6585:16;6578:27;6457:154;;;:::o;6617:410::-;6694:5;6719:65;6735:48;6776:6;6735:48;:::i;:::-;6719:65;:::i;:::-;6710:74;;6807:6;6800:5;6793:21;6845:4;6838:5;6834:16;6883:3;6874:6;6869:3;6865:16;6862:25;6859:112;;;6890:79;;:::i;:::-;6859:112;6980:41;7014:6;7009:3;7004;6980:41;:::i;:::-;6700:327;6617:410;;;;;:::o;7046:338::-;7101:5;7150:3;7143:4;7135:6;7131:17;7127:27;7117:122;;7158:79;;:::i;:::-;7117:122;7275:6;7262:20;7300:78;7374:3;7366:6;7359:4;7351:6;7347:17;7300:78;:::i;:::-;7291:87;;7107:277;7046:338;;;;:::o;7390:77::-;7427:7;7456:5;7445:16;;7390:77;;;:::o;7473:122::-;7546:24;7564:5;7546:24;:::i;:::-;7539:5;7536:35;7526:63;;7585:1;7582;7575:12;7526:63;7473:122;:::o;7601:139::-;7647:5;7685:6;7672:20;7663:29;;7701:33;7728:5;7701:33;:::i;:::-;7601:139;;;;:::o;7746:86::-;7781:7;7821:4;7814:5;7810:16;7799:27;;7746:86;;;:::o;7838:118::-;7909:22;7925:5;7909:22;:::i;:::-;7902:5;7899:33;7889:61;;7946:1;7943;7936:12;7889:61;7838:118;:::o;7962:135::-;8006:5;8044:6;8031:20;8022:29;;8060:31;8085:5;8060:31;:::i;:::-;7962:135;;;;:::o;8103:1085::-;8205:6;8213;8221;8229;8237;8286:3;8274:9;8265:7;8261:23;8257:33;8254:120;;;8293:79;;:::i;:::-;8254:120;8413:1;8438:53;8483:7;8474:6;8463:9;8459:22;8438:53;:::i;:::-;8428:63;;8384:117;8568:2;8557:9;8553:18;8540:32;8599:18;8591:6;8588:30;8585:117;;;8621:79;;:::i;:::-;8585:117;8726:62;8780:7;8771:6;8760:9;8756:22;8726:62;:::i;:::-;8716:72;;8511:287;8837:2;8863:53;8908:7;8899:6;8888:9;8884:22;8863:53;:::i;:::-;8853:63;;8808:118;8965:2;8991:53;9036:7;9027:6;9016:9;9012:22;8991:53;:::i;:::-;8981:63;;8936:118;9093:3;9120:51;9163:7;9154:6;9143:9;9139:22;9120:51;:::i;:::-;9110:61;;9064:117;8103:1085;;;;;;;;:::o;9194:98::-;9245:6;9279:5;9273:12;9263:22;;9194:98;;;:::o;9298:168::-;9381:11;9415:6;9410:3;9403:19;9455:4;9450:3;9446:14;9431:29;;9298:168;;;;:::o;9472:360::-;9558:3;9586:38;9618:5;9586:38;:::i;:::-;9640:70;9703:6;9698:3;9640:70;:::i;:::-;9633:77;;9719:52;9764:6;9759:3;9752:4;9745:5;9741:16;9719:52;:::i;:::-;9796:29;9818:6;9796:29;:::i;:::-;9791:3;9787:39;9780:46;;9562:270;9472:360;;;;:::o;9838:309::-;9949:4;9987:2;9976:9;9972:18;9964:26;;10036:9;10030:4;10026:20;10022:1;10011:9;10007:17;10000:47;10064:76;10135:4;10126:6;10064:76;:::i;:::-;10056:84;;9838:309;;;;:::o;10153:104::-;10198:7;10227:24;10245:5;10227:24;:::i;:::-;10216:35;;10153:104;;;:::o;10263:138::-;10344:32;10370:5;10344:32;:::i;:::-;10337:5;10334:43;10324:71;;10391:1;10388;10381:12;10324:71;10263:138;:::o;10407:155::-;10461:5;10499:6;10486:20;10477:29;;10515:41;10550:5;10515:41;:::i;:::-;10407:155;;;;:::o;10568:345::-;10635:6;10684:2;10672:9;10663:7;10659:23;10655:32;10652:119;;;10690:79;;:::i;:::-;10652:119;10810:1;10835:61;10888:7;10879:6;10868:9;10864:22;10835:61;:::i;:::-;10825:71;;10781:125;10568:345;;;;:::o;10919:118::-;11006:24;11024:5;11006:24;:::i;:::-;11001:3;10994:37;10919:118;;:::o;11043:222::-;11136:4;11174:2;11163:9;11159:18;11151:26;;11187:71;11255:1;11244:9;11240:17;11231:6;11187:71;:::i;:::-;11043:222;;;;:::o;11271:619::-;11348:6;11356;11364;11413:2;11401:9;11392:7;11388:23;11384:32;11381:119;;;11419:79;;:::i;:::-;11381:119;11539:1;11564:53;11609:7;11600:6;11589:9;11585:22;11564:53;:::i;:::-;11554:63;;11510:117;11666:2;11692:53;11737:7;11728:6;11717:9;11713:22;11692:53;:::i;:::-;11682:63;;11637:118;11794:2;11820:53;11865:7;11856:6;11845:9;11841:22;11820:53;:::i;:::-;11810:63;;11765:118;11271:619;;;;;:::o;11896:308::-;11958:4;12048:18;12040:6;12037:30;12034:56;;;12070:18;;:::i;:::-;12034:56;12108:29;12130:6;12108:29;:::i;:::-;12100:37;;12192:4;12186;12182:15;12174:23;;11896:308;;;:::o;12210:412::-;12288:5;12313:66;12329:49;12371:6;12329:49;:::i;:::-;12313:66;:::i;:::-;12304:75;;12402:6;12395:5;12388:21;12440:4;12433:5;12429:16;12478:3;12469:6;12464:3;12460:16;12457:25;12454:112;;;12485:79;;:::i;:::-;12454:112;12575:41;12609:6;12604:3;12599;12575:41;:::i;:::-;12294:328;12210:412;;;;;:::o;12642:340::-;12698:5;12747:3;12740:4;12732:6;12728:17;12724:27;12714:122;;12755:79;;:::i;:::-;12714:122;12872:6;12859:20;12897:79;12972:3;12964:6;12957:4;12949:6;12945:17;12897:79;:::i;:::-;12888:88;;12704:278;12642:340;;;;:::o;12988:509::-;13057:6;13106:2;13094:9;13085:7;13081:23;13077:32;13074:119;;;13112:79;;:::i;:::-;13074:119;13260:1;13249:9;13245:17;13232:31;13290:18;13282:6;13279:30;13276:117;;;13312:79;;:::i;:::-;13276:117;13417:63;13472:7;13463:6;13452:9;13448:22;13417:63;:::i;:::-;13407:73;;13203:287;12988:509;;;;:::o;13503:329::-;13562:6;13611:2;13599:9;13590:7;13586:23;13582:32;13579:119;;;13617:79;;:::i;:::-;13579:119;13737:1;13762:53;13807:7;13798:6;13787:9;13783:22;13762:53;:::i;:::-;13752:63;;13708:117;13503:329;;;;:::o;13838:116::-;13908:21;13923:5;13908:21;:::i;:::-;13901:5;13898:32;13888:60;;13944:1;13941;13934:12;13888:60;13838:116;:::o;13960:133::-;14003:5;14041:6;14028:20;14019:29;;14057:30;14081:5;14057:30;:::i;:::-;13960:133;;;;:::o;14099:468::-;14164:6;14172;14221:2;14209:9;14200:7;14196:23;14192:32;14189:119;;;14227:79;;:::i;:::-;14189:119;14347:1;14372:53;14417:7;14408:6;14397:9;14393:22;14372:53;:::i;:::-;14362:63;;14318:117;14474:2;14500:50;14542:7;14533:6;14522:9;14518:22;14500:50;:::i;:::-;14490:60;;14445:115;14099:468;;;;;:::o;14573:943::-;14668:6;14676;14684;14692;14741:3;14729:9;14720:7;14716:23;14712:33;14709:120;;;14748:79;;:::i;:::-;14709:120;14868:1;14893:53;14938:7;14929:6;14918:9;14914:22;14893:53;:::i;:::-;14883:63;;14839:117;14995:2;15021:53;15066:7;15057:6;15046:9;15042:22;15021:53;:::i;:::-;15011:63;;14966:118;15123:2;15149:53;15194:7;15185:6;15174:9;15170:22;15149:53;:::i;:::-;15139:63;;15094:118;15279:2;15268:9;15264:18;15251:32;15310:18;15302:6;15299:30;15296:117;;;15332:79;;:::i;:::-;15296:117;15437:62;15491:7;15482:6;15471:9;15467:22;15437:62;:::i;:::-;15427:72;;15222:287;14573:943;;;;;;;:::o;15522:329::-;15581:6;15630:2;15618:9;15609:7;15605:23;15601:32;15598:119;;;15636:79;;:::i;:::-;15598:119;15756:1;15781:53;15826:7;15817:6;15806:9;15802:22;15781:53;:::i;:::-;15771:63;;15727:117;15522:329;;;;:::o;15857:117::-;15966:1;15963;15956:12;15980:117;16089:1;16086;16079:12;16120:568;16193:8;16203:6;16253:3;16246:4;16238:6;16234:17;16230:27;16220:122;;16261:79;;:::i;:::-;16220:122;16374:6;16361:20;16351:30;;16404:18;16396:6;16393:30;16390:117;;;16426:79;;:::i;:::-;16390:117;16540:4;16532:6;16528:17;16516:29;;16594:3;16586:4;16578:6;16574:17;16564:8;16560:32;16557:41;16554:128;;;16601:79;;:::i;:::-;16554:128;16120:568;;;;;:::o;16694:704::-;16789:6;16797;16805;16854:2;16842:9;16833:7;16829:23;16825:32;16822:119;;;16860:79;;:::i;:::-;16822:119;16980:1;17005:53;17050:7;17041:6;17030:9;17026:22;17005:53;:::i;:::-;16995:63;;16951:117;17135:2;17124:9;17120:18;17107:32;17166:18;17158:6;17155:30;17152:117;;;17188:79;;:::i;:::-;17152:117;17301:80;17373:7;17364:6;17353:9;17349:22;17301:80;:::i;:::-;17283:98;;;;17078:313;16694:704;;;;;:::o;17404:474::-;17472:6;17480;17529:2;17517:9;17508:7;17504:23;17500:32;17497:119;;;17535:79;;:::i;:::-;17497:119;17655:1;17680:53;17725:7;17716:6;17705:9;17701:22;17680:53;:::i;:::-;17670:63;;17626:117;17782:2;17808:53;17853:7;17844:6;17833:9;17829:22;17808:53;:::i;:::-;17798:63;;17753:118;17404:474;;;;;:::o;17884:::-;17952:6;17960;18009:2;17997:9;17988:7;17984:23;17980:32;17977:119;;;18015:79;;:::i;:::-;17977:119;18135:1;18160:53;18205:7;18196:6;18185:9;18181:22;18160:53;:::i;:::-;18150:63;;18106:117;18262:2;18288:53;18333:7;18324:6;18313:9;18309:22;18288:53;:::i;:::-;18278:63;;18233:118;17884:474;;;;;:::o;18364:180::-;18412:77;18409:1;18402:88;18509:4;18506:1;18499:15;18533:4;18530:1;18523:15;18550:320;18594:6;18631:1;18625:4;18621:12;18611:22;;18678:1;18672:4;18668:12;18699:18;18689:81;;18755:4;18747:6;18743:17;18733:27;;18689:81;18817:2;18809:6;18806:14;18786:18;18783:38;18780:84;;;18836:18;;:::i;:::-;18780:84;18601:269;18550:320;;;:::o;18876:231::-;19016:34;19012:1;19004:6;19000:14;18993:58;19085:14;19080:2;19072:6;19068:15;19061:39;18876:231;:::o;19113:366::-;19255:3;19276:67;19340:2;19335:3;19276:67;:::i;:::-;19269:74;;19352:93;19441:3;19352:93;:::i;:::-;19470:2;19465:3;19461:12;19454:19;;19113:366;;;:::o;19485:419::-;19651:4;19689:2;19678:9;19674:18;19666:26;;19738:9;19732:4;19728:20;19724:1;19713:9;19709:17;19702:47;19766:131;19892:4;19766:131;:::i;:::-;19758:139;;19485:419;;;:::o;19910:220::-;20050:34;20046:1;20038:6;20034:14;20027:58;20119:3;20114:2;20106:6;20102:15;20095:28;19910:220;:::o;20136:366::-;20278:3;20299:67;20363:2;20358:3;20299:67;:::i;:::-;20292:74;;20375:93;20464:3;20375:93;:::i;:::-;20493:2;20488:3;20484:12;20477:19;;20136:366;;;:::o;20508:419::-;20674:4;20712:2;20701:9;20697:18;20689:26;;20761:9;20755:4;20751:20;20747:1;20736:9;20732:17;20725:47;20789:131;20915:4;20789:131;:::i;:::-;20781:139;;20508:419;;;:::o;20933:243::-;21073:34;21069:1;21061:6;21057:14;21050:58;21142:26;21137:2;21129:6;21125:15;21118:51;20933:243;:::o;21182:366::-;21324:3;21345:67;21409:2;21404:3;21345:67;:::i;:::-;21338:74;;21421:93;21510:3;21421:93;:::i;:::-;21539:2;21534:3;21530:12;21523:19;;21182:366;;;:::o;21554:419::-;21720:4;21758:2;21747:9;21743:18;21735:26;;21807:9;21801:4;21797:20;21793:1;21782:9;21778:17;21771:47;21835:131;21961:4;21835:131;:::i;:::-;21827:139;;21554:419;;;:::o;21979:220::-;22119:34;22115:1;22107:6;22103:14;22096:58;22188:3;22183:2;22175:6;22171:15;22164:28;21979:220;:::o;22205:366::-;22347:3;22368:67;22432:2;22427:3;22368:67;:::i;:::-;22361:74;;22444:93;22533:3;22444:93;:::i;:::-;22562:2;22557:3;22553:12;22546:19;;22205:366;;;:::o;22577:419::-;22743:4;22781:2;22770:9;22766:18;22758:26;;22830:9;22824:4;22820:20;22816:1;22805:9;22801:17;22794:47;22858:131;22984:4;22858:131;:::i;:::-;22850:139;;22577:419;;;:::o;23002:142::-;23105:32;23131:5;23105:32;:::i;:::-;23100:3;23093:45;23002:142;;:::o;23150:561::-;23333:4;23371:2;23360:9;23356:18;23348:26;;23384:71;23452:1;23441:9;23437:17;23428:6;23384:71;:::i;:::-;23465:88;23549:2;23538:9;23534:18;23525:6;23465:88;:::i;:::-;23600:9;23594:4;23590:20;23585:2;23574:9;23570:18;23563:48;23628:76;23699:4;23690:6;23628:76;:::i;:::-;23620:84;;23150:561;;;;;;:::o;23717:147::-;23818:11;23855:3;23840:18;;23717:147;;;;:::o;23870:373::-;23974:3;24002:38;24034:5;24002:38;:::i;:::-;24056:88;24137:6;24132:3;24056:88;:::i;:::-;24049:95;;24153:52;24198:6;24193:3;24186:4;24179:5;24175:16;24153:52;:::i;:::-;24230:6;24225:3;24221:16;24214:23;;23978:265;23870:373;;;;:::o;24249:94::-;24282:8;24330:5;24326:2;24322:14;24301:35;;24249:94;;;:::o;24349:::-;24388:7;24417:20;24431:5;24417:20;:::i;:::-;24406:31;;24349:94;;;:::o;24449:100::-;24488:7;24517:26;24537:5;24517:26;:::i;:::-;24506:37;;24449:100;;;:::o;24555:157::-;24660:45;24680:24;24698:5;24680:24;:::i;:::-;24660:45;:::i;:::-;24655:3;24648:58;24555:157;;:::o;24718:412::-;24876:3;24898:93;24987:3;24978:6;24898:93;:::i;:::-;24891:100;;25001:75;25072:3;25063:6;25001:75;:::i;:::-;25101:2;25096:3;25092:12;25085:19;;25121:3;25114:10;;24718:412;;;;;:::o;25136:271::-;25266:3;25288:93;25377:3;25368:6;25288:93;:::i;:::-;25281:100;;25398:3;25391:10;;25136:271;;;;:::o;25413:178::-;25553:30;25549:1;25541:6;25537:14;25530:54;25413:178;:::o;25597:366::-;25739:3;25760:67;25824:2;25819:3;25760:67;:::i;:::-;25753:74;;25836:93;25925:3;25836:93;:::i;:::-;25954:2;25949:3;25945:12;25938:19;;25597:366;;;:::o;25969:419::-;26135:4;26173:2;26162:9;26158:18;26150:26;;26222:9;26216:4;26212:20;26208:1;26197:9;26193:17;26186:47;26250:131;26376:4;26250:131;:::i;:::-;26242:139;;25969:419;;;:::o;26394:180::-;26442:77;26439:1;26432:88;26539:4;26536:1;26529:15;26563:4;26560:1;26553:15;26580:191;26620:4;26640:20;26658:1;26640:20;:::i;:::-;26635:25;;26674:20;26692:1;26674:20;:::i;:::-;26669:25;;26713:1;26710;26707:8;26704:34;;;26718:18;;:::i;:::-;26704:34;26763:1;26760;26756:9;26748:17;;26580:191;;;;:::o;26777:182::-;26917:34;26913:1;26905:6;26901:14;26894:58;26777:182;:::o;26965:366::-;27107:3;27128:67;27192:2;27187:3;27128:67;:::i;:::-;27121:74;;27204:93;27293:3;27204:93;:::i;:::-;27322:2;27317:3;27313:12;27306:19;;26965:366;;;:::o;27337:419::-;27503:4;27541:2;27530:9;27526:18;27518:26;;27590:9;27584:4;27580:20;27576:1;27565:9;27561:17;27554:47;27618:131;27744:4;27618:131;:::i;:::-;27610:139;;27337:419;;;:::o;27762:254::-;27871:4;27909:2;27898:9;27894:18;27886:26;;27922:87;28006:1;27995:9;27991:17;27982:6;27922:87;:::i;:::-;27762:254;;;;:::o;28022:236::-;28162:34;28158:1;28150:6;28146:14;28139:58;28231:19;28226:2;28218:6;28214:15;28207:44;28022:236;:::o;28264:366::-;28406:3;28427:67;28491:2;28486:3;28427:67;:::i;:::-;28420:74;;28503:93;28592:3;28503:93;:::i;:::-;28621:2;28616:3;28612:12;28605:19;;28264:366;;;:::o;28636:419::-;28802:4;28840:2;28829:9;28825:18;28817:26;;28889:9;28883:4;28879:20;28875:1;28864:9;28860:17;28853:47;28917:131;29043:4;28917:131;:::i;:::-;28909:139;;28636:419;;;:::o;29061:228::-;29201:34;29197:1;29189:6;29185:14;29178:58;29270:11;29265:2;29257:6;29253:15;29246:36;29061:228;:::o;29295:366::-;29437:3;29458:67;29522:2;29517:3;29458:67;:::i;:::-;29451:74;;29534:93;29623:3;29534:93;:::i;:::-;29652:2;29647:3;29643:12;29636:19;;29295:366;;;:::o;29667:419::-;29833:4;29871:2;29860:9;29856:18;29848:26;;29920:9;29914:4;29910:20;29906:1;29895:9;29891:17;29884:47;29948:131;30074:4;29948:131;:::i;:::-;29940:139;;29667:419;;;:::o;30092:229::-;30232:34;30228:1;30220:6;30216:14;30209:58;30301:12;30296:2;30288:6;30284:15;30277:37;30092:229;:::o;30327:366::-;30469:3;30490:67;30554:2;30549:3;30490:67;:::i;:::-;30483:74;;30566:93;30655:3;30566:93;:::i;:::-;30684:2;30679:3;30675:12;30668:19;;30327:366;;;:::o;30699:419::-;30865:4;30903:2;30892:9;30888:18;30880:26;;30952:9;30946:4;30942:20;30938:1;30927:9;30923:17;30916:47;30980:131;31106:4;30980:131;:::i;:::-;30972:139;;30699:419;;;:::o;31124:181::-;31264:33;31260:1;31252:6;31248:14;31241:57;31124:181;:::o;31311:366::-;31453:3;31474:67;31538:2;31533:3;31474:67;:::i;:::-;31467:74;;31550:93;31639:3;31550:93;:::i;:::-;31668:2;31663:3;31659:12;31652:19;;31311:366;;;:::o;31683:419::-;31849:4;31887:2;31876:9;31872:18;31864:26;;31936:9;31930:4;31926:20;31922:1;31911:9;31907:17;31900:47;31964:131;32090:4;31964:131;:::i;:::-;31956:139;;31683:419;;;:::o;32108:168::-;32248:20;32244:1;32236:6;32232:14;32225:44;32108:168;:::o;32282:366::-;32424:3;32445:67;32509:2;32504:3;32445:67;:::i;:::-;32438:74;;32521:93;32610:3;32521:93;:::i;:::-;32639:2;32634:3;32630:12;32623:19;;32282:366;;;:::o;32654:419::-;32820:4;32858:2;32847:9;32843:18;32835:26;;32907:9;32901:4;32897:20;32893:1;32882:9;32878:17;32871:47;32935:131;33061:4;32935:131;:::i;:::-;32927:139;;32654:419;;;:::o;33079:305::-;33119:3;33138:20;33156:1;33138:20;:::i;:::-;33133:25;;33172:20;33190:1;33172:20;:::i;:::-;33167:25;;33326:1;33258:66;33254:74;33251:1;33248:81;33245:107;;;33332:18;;:::i;:::-;33245:107;33376:1;33373;33369:9;33362:16;;33079:305;;;;:::o;33390:168::-;33530:20;33526:1;33518:6;33514:14;33507:44;33390:168;:::o;33564:366::-;33706:3;33727:67;33791:2;33786:3;33727:67;:::i;:::-;33720:74;;33803:93;33892:3;33803:93;:::i;:::-;33921:2;33916:3;33912:12;33905:19;;33564:366;;;:::o;33936:419::-;34102:4;34140:2;34129:9;34125:18;34117:26;;34189:9;34183:4;34179:20;34175:1;34164:9;34160:17;34153:47;34217:131;34343:4;34217:131;:::i;:::-;34209:139;;33936:419;;;:::o;34361:220::-;34501:34;34497:1;34489:6;34485:14;34478:58;34570:3;34565:2;34557:6;34553:15;34546:28;34361:220;:::o;34587:366::-;34729:3;34750:67;34814:2;34809:3;34750:67;:::i;:::-;34743:74;;34826:93;34915:3;34826:93;:::i;:::-;34944:2;34939:3;34935:12;34928:19;;34587:366;;;:::o;34959:419::-;35125:4;35163:2;35152:9;35148:18;35140:26;;35212:9;35206:4;35202:20;35198:1;35187:9;35183:17;35176:47;35240:131;35366:4;35240:131;:::i;:::-;35232:139;;34959:419;;;:::o;35384:172::-;35524:24;35520:1;35512:6;35508:14;35501:48;35384:172;:::o;35562:366::-;35704:3;35725:67;35789:2;35784:3;35725:67;:::i;:::-;35718:74;;35801:93;35890:3;35801:93;:::i;:::-;35919:2;35914:3;35910:12;35903:19;;35562:366;;;:::o;35934:419::-;36100:4;36138:2;36127:9;36123:18;36115:26;;36187:9;36181:4;36177:20;36173:1;36162:9;36158:17;36151:47;36215:131;36341:4;36215:131;:::i;:::-;36207:139;;35934:419;;;:::o;36359:348::-;36399:7;36422:20;36440:1;36422:20;:::i;:::-;36417:25;;36456:20;36474:1;36456:20;:::i;:::-;36451:25;;36644:1;36576:66;36572:74;36569:1;36566:81;36561:1;36554:9;36547:17;36543:105;36540:131;;;36651:18;;:::i;:::-;36540:131;36699:1;36696;36692:9;36681:20;;36359:348;;;;:::o;36713:170::-;36853:22;36849:1;36841:6;36837:14;36830:46;36713:170;:::o;36889:366::-;37031:3;37052:67;37116:2;37111:3;37052:67;:::i;:::-;37045:74;;37128:93;37217:3;37128:93;:::i;:::-;37246:2;37241:3;37237:12;37230:19;;36889:366;;;:::o;37261:419::-;37427:4;37465:2;37454:9;37450:18;37442:26;;37514:9;37508:4;37504:20;37500:1;37489:9;37485:17;37478:47;37542:131;37668:4;37542:131;:::i;:::-;37534:139;;37261:419;;;:::o;37686:234::-;37826:34;37822:1;37814:6;37810:14;37803:58;37895:17;37890:2;37882:6;37878:15;37871:42;37686:234;:::o;37926:366::-;38068:3;38089:67;38153:2;38148:3;38089:67;:::i;:::-;38082:74;;38165:93;38254:3;38165:93;:::i;:::-;38283:2;38278:3;38274:12;38267:19;;37926:366;;;:::o;38298:419::-;38464:4;38502:2;38491:9;38487:18;38479:26;;38551:9;38545:4;38541:20;38537:1;38526:9;38522:17;38515:47;38579:131;38705:4;38579:131;:::i;:::-;38571:139;;38298:419;;;:::o;38723:148::-;38825:11;38862:3;38847:18;;38723:148;;;;:::o;38877:141::-;38926:4;38949:3;38941:11;;38972:3;38969:1;38962:14;39006:4;39003:1;38993:18;38985:26;;38877:141;;;:::o;39048:845::-;39151:3;39188:5;39182:12;39217:36;39243:9;39217:36;:::i;:::-;39269:89;39351:6;39346:3;39269:89;:::i;:::-;39262:96;;39389:1;39378:9;39374:17;39405:1;39400:137;;;;39551:1;39546:341;;;;39367:520;;39400:137;39484:4;39480:9;39469;39465:25;39460:3;39453:38;39520:6;39515:3;39511:16;39504:23;;39400:137;;39546:341;39613:38;39645:5;39613:38;:::i;:::-;39673:1;39687:154;39701:6;39698:1;39695:13;39687:154;;;39775:7;39769:14;39765:1;39760:3;39756:11;39749:35;39825:1;39816:7;39812:15;39801:26;;39723:4;39720:1;39716:12;39711:17;;39687:154;;;39870:6;39865:3;39861:16;39854:23;;39553:334;;39367:520;;39155:738;;39048:845;;;;:::o;39899:377::-;40005:3;40033:39;40066:5;40033:39;:::i;:::-;40088:89;40170:6;40165:3;40088:89;:::i;:::-;40081:96;;40186:52;40231:6;40226:3;40219:4;40212:5;40208:16;40186:52;:::i;:::-;40263:6;40258:3;40254:16;40247:23;;40009:267;39899:377;;;;:::o;40282:429::-;40459:3;40481:92;40569:3;40560:6;40481:92;:::i;:::-;40474:99;;40590:95;40681:3;40672:6;40590:95;:::i;:::-;40583:102;;40702:3;40695:10;;40282:429;;;;;:::o;40717:178::-;40857:30;40853:1;40845:6;40841:14;40834:54;40717:178;:::o;40901:366::-;41043:3;41064:67;41128:2;41123:3;41064:67;:::i;:::-;41057:74;;41140:93;41229:3;41140:93;:::i;:::-;41258:2;41253:3;41249:12;41242:19;;40901:366;;;:::o;41273:419::-;41439:4;41477:2;41466:9;41462:18;41454:26;;41526:9;41520:4;41516:20;41512:1;41501:9;41497:17;41490:47;41554:131;41680:4;41554:131;:::i;:::-;41546:139;;41273:419;;;:::o;41698:256::-;41810:3;41825:75;41896:3;41887:6;41825:75;:::i;:::-;41925:2;41920:3;41916:12;41909:19;;41945:3;41938:10;;41698:256;;;;:::o;41960:170::-;42100:22;42096:1;42088:6;42084:14;42077:46;41960:170;:::o;42136:366::-;42278:3;42299:67;42363:2;42358:3;42299:67;:::i;:::-;42292:74;;42375:93;42464:3;42375:93;:::i;:::-;42493:2;42488:3;42484:12;42477:19;;42136:366;;;:::o;42508:419::-;42674:4;42712:2;42701:9;42697:18;42689:26;;42761:9;42755:4;42751:20;42747:1;42736:9;42732:17;42725:47;42789:131;42915:4;42789:131;:::i;:::-;42781:139;;42508:419;;;:::o;42933:233::-;42972:3;42995:24;43013:5;42995:24;:::i;:::-;42986:33;;43041:66;43034:5;43031:77;43028:103;;;43111:18;;:::i;:::-;43028:103;43158:1;43151:5;43147:13;43140:20;;42933:233;;;:::o;43172:125::-;43238:7;43267:24;43285:5;43267:24;:::i;:::-;43256:35;;43172:125;;;:::o;43303:180::-;43405:53;43452:5;43405:53;:::i;:::-;43398:5;43395:64;43385:92;;43473:1;43470;43463:12;43385:92;43303:180;:::o;43489:201::-;43575:5;43606:6;43600:13;43591:22;;43622:62;43678:5;43622:62;:::i;:::-;43489:201;;;;:::o;43696:409::-;43795:6;43844:2;43832:9;43823:7;43819:23;43815:32;43812:119;;;43850:79;;:::i;:::-;43812:119;43970:1;43995:93;44080:7;44071:6;44060:9;44056:22;43995:93;:::i;:::-;43985:103;;43941:157;43696:409;;;;:::o;44111:225::-;44251:34;44247:1;44239:6;44235:14;44228:58;44320:8;44315:2;44307:6;44303:15;44296:33;44111:225;:::o;44342:366::-;44484:3;44505:67;44569:2;44564:3;44505:67;:::i;:::-;44498:74;;44581:93;44670:3;44581:93;:::i;:::-;44699:2;44694:3;44690:12;44683:19;;44342:366;;;:::o;44714:419::-;44880:4;44918:2;44907:9;44903:18;44895:26;;44967:9;44961:4;44957:20;44953:1;44942:9;44938:17;44931:47;44995:131;45121:4;44995:131;:::i;:::-;44987:139;;44714:419;;;:::o;45139:224::-;45279:34;45275:1;45267:6;45263:14;45256:58;45348:7;45343:2;45335:6;45331:15;45324:32;45139:224;:::o;45369:366::-;45511:3;45532:67;45596:2;45591:3;45532:67;:::i;:::-;45525:74;;45608:93;45697:3;45608:93;:::i;:::-;45726:2;45721:3;45717:12;45710:19;;45369:366;;;:::o;45741:419::-;45907:4;45945:2;45934:9;45930:18;45922:26;;45994:9;45988:4;45984:20;45980:1;45969:9;45965:17;45958:47;46022:131;46148:4;46022:131;:::i;:::-;46014:139;;45741:419;;;:::o;46166:112::-;46249:22;46265:5;46249:22;:::i;:::-;46244:3;46237:35;46166:112;;:::o;46284:545::-;46457:4;46495:3;46484:9;46480:19;46472:27;;46509:71;46577:1;46566:9;46562:17;46553:6;46509:71;:::i;:::-;46590:68;46654:2;46643:9;46639:18;46630:6;46590:68;:::i;:::-;46668:72;46736:2;46725:9;46721:18;46712:6;46668:72;:::i;:::-;46750;46818:2;46807:9;46803:18;46794:6;46750:72;:::i;:::-;46284:545;;;;;;;:::o;46835:231::-;46975:34;46971:1;46963:6;46959:14;46952:58;47044:14;47039:2;47031:6;47027:15;47020:39;46835:231;:::o;47072:366::-;47214:3;47235:67;47299:2;47294:3;47235:67;:::i;:::-;47228:74;;47311:93;47400:3;47311:93;:::i;:::-;47429:2;47424:3;47420:12;47413:19;;47072:366;;;:::o;47444:419::-;47610:4;47648:2;47637:9;47633:18;47625:26;;47697:9;47691:4;47687:20;47683:1;47672:9;47668:17;47661:47;47725:131;47851:4;47725:131;:::i;:::-;47717:139;;47444:419;;;:::o;47869:228::-;48009:34;48005:1;47997:6;47993:14;47986:58;48078:11;48073:2;48065:6;48061:15;48054:36;47869:228;:::o;48103:366::-;48245:3;48266:67;48330:2;48325:3;48266:67;:::i;:::-;48259:74;;48342:93;48431:3;48342:93;:::i;:::-;48460:2;48455:3;48451:12;48444:19;;48103:366;;;:::o;48475:419::-;48641:4;48679:2;48668:9;48664:18;48656:26;;48728:9;48722:4;48718:20;48714:1;48703:9;48699:17;48692:47;48756:131;48882:4;48756:131;:::i;:::-;48748:139;;48475:419;;;:::o;48900:223::-;49040:34;49036:1;49028:6;49024:14;49017:58;49109:6;49104:2;49096:6;49092:15;49085:31;48900:223;:::o;49129:366::-;49271:3;49292:67;49356:2;49351:3;49292:67;:::i;:::-;49285:74;;49368:93;49457:3;49368:93;:::i;:::-;49486:2;49481:3;49477:12;49470:19;;49129:366;;;:::o;49501:419::-;49667:4;49705:2;49694:9;49690:18;49682:26;;49754:9;49748:4;49744:20;49740:1;49729:9;49725:17;49718:47;49782:131;49908:4;49782:131;:::i;:::-;49774:139;;49501:419;;;:::o;49926:175::-;50066:27;50062:1;50054:6;50050:14;50043:51;49926:175;:::o;50107:366::-;50249:3;50270:67;50334:2;50329:3;50270:67;:::i;:::-;50263:74;;50346:93;50435:3;50346:93;:::i;:::-;50464:2;50459:3;50455:12;50448:19;;50107:366;;;:::o;50479:419::-;50645:4;50683:2;50672:9;50668:18;50660:26;;50732:9;50726:4;50722:20;50718:1;50707:9;50703:17;50696:47;50760:131;50886:4;50760:131;:::i;:::-;50752:139;;50479:419;;;:::o;50904:237::-;51044:34;51040:1;51032:6;51028:14;51021:58;51113:20;51108:2;51100:6;51096:15;51089:45;50904:237;:::o;51147:366::-;51289:3;51310:67;51374:2;51369:3;51310:67;:::i;:::-;51303:74;;51386:93;51475:3;51386:93;:::i;:::-;51504:2;51499:3;51495:12;51488:19;;51147:366;;;:::o;51519:419::-;51685:4;51723:2;51712:9;51708:18;51700:26;;51772:9;51766:4;51762:20;51758:1;51747:9;51743:17;51736:47;51800:131;51926:4;51800:131;:::i;:::-;51792:139;;51519:419;;;:::o;51944:180::-;51992:77;51989:1;51982:88;52089:4;52086:1;52079:15;52113:4;52110:1;52103:15;52130:185;52170:1;52187:20;52205:1;52187:20;:::i;:::-;52182:25;;52221:20;52239:1;52221:20;:::i;:::-;52216:25;;52260:1;52250:35;;52265:18;;:::i;:::-;52250:35;52307:1;52304;52300:9;52295:14;;52130:185;;;;:::o;52321:176::-;52353:1;52370:20;52388:1;52370:20;:::i;:::-;52365:25;;52404:20;52422:1;52404:20;:::i;:::-;52399:25;;52443:1;52433:35;;52448:18;;:::i;:::-;52433:35;52489:1;52486;52482:9;52477:14;;52321:176;;;;:::o;52503:180::-;52551:77;52548:1;52541:88;52648:4;52645:1;52638:15;52672:4;52669:1;52662:15;52689:553;52866:4;52904:3;52893:9;52889:19;52881:27;;52918:71;52986:1;52975:9;52971:17;52962:6;52918:71;:::i;:::-;52999:72;53067:2;53056:9;53052:18;53043:6;52999:72;:::i;:::-;53081;53149:2;53138:9;53134:18;53125:6;53081:72;:::i;:::-;53163;53231:2;53220:9;53216:18;53207:6;53163:72;:::i;:::-;52689:553;;;;;;;:::o;53248:214::-;53388:66;53384:1;53376:6;53372:14;53365:90;53248:214;:::o;53468:400::-;53628:3;53649:84;53731:1;53726:3;53649:84;:::i;:::-;53642:91;;53742:93;53831:3;53742:93;:::i;:::-;53860:1;53855:3;53851:11;53844:18;;53468:400;;;:::o;53874:79::-;53913:7;53942:5;53931:16;;53874:79;;;:::o;53959:157::-;54064:45;54084:24;54102:5;54084:24;:::i;:::-;54064:45;:::i;:::-;54059:3;54052:58;53959:157;;:::o;54122:663::-;54363:3;54385:148;54529:3;54385:148;:::i;:::-;54378:155;;54543:75;54614:3;54605:6;54543:75;:::i;:::-;54643:2;54638:3;54634:12;54627:19;;54656:75;54727:3;54718:6;54656:75;:::i;:::-;54756:2;54751:3;54747:12;54740:19;;54776:3;54769:10;;54122:663;;;;;:::o;54791:640::-;54986:4;55024:3;55013:9;55009:19;55001:27;;55038:71;55106:1;55095:9;55091:17;55082:6;55038:71;:::i;:::-;55119:72;55187:2;55176:9;55172:18;55163:6;55119:72;:::i;:::-;55201;55269:2;55258:9;55254:18;55245:6;55201:72;:::i;:::-;55320:9;55314:4;55310:20;55305:2;55294:9;55290:18;55283:48;55348:76;55419:4;55410:6;55348:76;:::i;:::-;55340:84;;54791:640;;;;;;;:::o;55437:141::-;55493:5;55524:6;55518:13;55509:22;;55540:32;55566:5;55540:32;:::i;:::-;55437:141;;;;:::o;55584:349::-;55653:6;55702:2;55690:9;55681:7;55677:23;55673:32;55670:119;;;55708:79;;:::i;:::-;55670:119;55828:1;55853:63;55908:7;55899:6;55888:9;55884:22;55853:63;:::i;:::-;55843:73;;55799:127;55584:349;;;;:::o;55939:397::-;56079:3;56094:75;56165:3;56156:6;56094:75;:::i;:::-;56194:2;56189:3;56185:12;56178:19;;56207:75;56278:3;56269:6;56207:75;:::i;:::-;56307:2;56302:3;56298:12;56291:19;;56327:3;56320:10;;55939:397;;;;;:::o;56342:182::-;56482:34;56478:1;56470:6;56466:14;56459:58;56342:182;:::o;56530:366::-;56672:3;56693:67;56757:2;56752:3;56693:67;:::i;:::-;56686:74;;56769:93;56858:3;56769:93;:::i;:::-;56887:2;56882:3;56878:12;56871:19;;56530:366;;;:::o;56902:419::-;57068:4;57106:2;57095:9;57091:18;57083:26;;57155:9;57149:4;57145:20;57141:1;57130:9;57126:17;57119:47;57183:131;57309:4;57183:131;:::i;:::-;57175:139;;56902:419;;;:::o;57327:178::-;57467:30;57463:1;57455:6;57451:14;57444:54;57327:178;:::o;57511:366::-;57653:3;57674:67;57738:2;57733:3;57674:67;:::i;:::-;57667:74;;57750:93;57839:3;57750:93;:::i;:::-;57868:2;57863:3;57859:12;57852:19;;57511:366;;;:::o;57883:419::-;58049:4;58087:2;58076:9;58072:18;58064:26;;58136:9;58130:4;58126:20;58122:1;58111:9;58107:17;58100:47;58164:131;58290:4;58164:131;:::i;:::-;58156:139;;57883:419;;;:::o
Swarm Source
ipfs://8d81af7c22b88a8f66c6609ab6d485e5d6ce693e885950292d603c95dd01ecee
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.