Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
LeonPay
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-03-16 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } } /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } uint256[50] private __gap; } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; mapping(address => bool) public isTrusted; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); event BridgeContractChanged(address indexed newBridgeContract); event NewPrivilegedContract(address indexed _contract); event RemovedPrivilegedContract(address indexed _contract); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } /**@dev Allows to add a trusted DeFi contract */ function addPrivilegedContract(address _trustedDeFiContract) public onlyOwner { isTrusted[_trustedDeFiContract] = true; emit NewPrivilegedContract(_trustedDeFiContract); } function removePrivilegedContract(address _trustedDeFiContract) public onlyOwner { isTrusted[_trustedDeFiContract] = false; emit RemovedPrivilegedContract(_trustedDeFiContract); } function __Ownable_init_unchained() internal initializer { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Returns the address of the bridge contract address. */ function trusted() public view virtual returns (bool) { return isTrusted[_msgSender()]; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Throws if called by any account other than the owner/trusted. */ modifier onlyTrustedAndOwner() { require(trusted() == true || owner() == _msgSender(), "Ownable: caller is not the owner/trusted"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } uint256[49] private __gap; } interface IERC20PermitUpgradeable { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * _Available since v3.4._ */ abstract contract EIP712Upgradeable is Initializable { /* solhint-disable var-name-mixedcase */ bytes32 private _HASHED_NAME; bytes32 private _HASHED_VERSION; bytes32 private constant _TYPE_HASH = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"); /* solhint-enable var-name-mixedcase */ /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ function __EIP712_init(string memory name, string memory version) internal initializer { __EIP712_init_unchained(name, version); } function __EIP712_init_unchained(string memory name, string memory version) internal initializer { bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedVersion = keccak256(bytes(version)); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash()); } function _buildDomainSeparator( bytes32 typeHash, bytes32 nameHash, bytes32 versionHash ) private view returns (bytes32) { return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this))); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSAUpgradeable.toTypedDataHash(_domainSeparatorV4(), structHash); } /** * @dev The hash of the name parameter for the EIP712 domain. * * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs * are a concern. */ function _EIP712NameHash() internal virtual view returns (bytes32) { return _HASHED_NAME; } /** * @dev The hash of the version parameter for the EIP712 domain. * * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs * are a concern. */ function _EIP712VersionHash() internal virtual view returns (bytes32) { return _HASHED_VERSION; } uint256[50] private __gap; } /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSAUpgradeable { /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return recover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return recover(hash, r, vs); } else { revert("ECDSA: invalid signature length"); } } /** * @dev Overload of {ECDSA-recover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { bytes32 s; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } return recover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. require( uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value" ); require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value"); // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); require(signer != address(0), "ECDSA: invalid signature"); return signer; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library CountersUpgradeable { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/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; } } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @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); } /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20MetadataUpgradeable is IERC20Upgradeable { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * An {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Additionally, we added a fee calcualation for use if transaction fees ever became necessary * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20WithFeesUpgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable, OwnableUpgradeable { uint256 public basisPointsRate = 1; uint256 public maximumFee = 10; // Fee constants in order of transparency uint256 constant MAX_SETTABLE_BASIS_POINTS = 2; uint256 constant MAX_SETTABLE_FEE = 11; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ function __ERC20_init(string memory name_, string memory symbol_) internal initializer { __Context_init_unchained(); __ERC20_init_unchained(name_, symbol_); } function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 6; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev returns a calculated fee for a transfer event */ function calcFee(uint _value) internal view returns (uint256) { uint fee = (_value * basisPointsRate) / 10000; if (fee > maximumFee) { fee = maximumFee; } return fee; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { uint256 fee = calcFee(amount); uint256 newAmount = amount - fee; _transfer(_msgSender(), recipient, newAmount); if (fee > 0) { _transfer(_msgSender(), owner(), fee); } return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { uint256 fee = calcFee(amount); uint256 newAmount = amount - fee; _transfer(sender, recipient, newAmount); if (fee > 0) { _transfer(sender, owner(), fee); } uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - `recipient` cannot be the zero address. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens 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 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} uint256[45] private __gap; function setParams(uint newBasisPoints, uint newMaxFee) public onlyOwner { // Ensure transparency by hardcoding limit beyond which fees can never be added require(newBasisPoints < MAX_SETTABLE_BASIS_POINTS); require(newMaxFee < MAX_SETTABLE_FEE); basisPointsRate = newBasisPoints; maximumFee = newMaxFee * uint(10)**decimals(); emit Params(basisPointsRate, maximumFee); } // Called if contract ever adds fees event Params(uint feeBasisPoints, uint maxFee); } /** * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * _Available since v3.4._ */ abstract contract ERC20PermitUpgradeable is Initializable, ERC20WithFeesUpgradeable, IERC20PermitUpgradeable, EIP712Upgradeable { using CountersUpgradeable for CountersUpgradeable.Counter; mapping(address => CountersUpgradeable.Counter) private _nonces; // solhint-disable-next-line var-name-mixedcase bytes32 private _PERMIT_TYPEHASH; /** * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`. * * It's a good idea to use the same `name` that is defined as the ERC20 token name. */ function __ERC20Permit_init(string memory name) internal initializer { __Context_init_unchained(); __EIP712_init_unchained(name, "1"); __ERC20Permit_init_unchained(); } function __ERC20Permit_init_unchained() internal initializer { _PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");} /** * @dev See {IERC20Permit-permit}. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual override { require(block.timestamp <= deadline, "ERC20Permit: expired deadline"); bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline)); bytes32 hash = _hashTypedDataV4(structHash); address signer = ECDSAUpgradeable.recover(hash, v, r, s); require(signer == owner, "ERC20Permit: invalid signature"); _approve(owner, spender, value); } /** * @dev See {IERC20Permit-nonces}. */ function nonces(address owner) public view virtual override returns (uint256) { return _nonces[owner].current(); } /** * @dev See {IERC20Permit-DOMAIN_SEPARATOR}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view override returns (bytes32) { return _domainSeparatorV4(); } /** * @dev "Consume a nonce": return the current value and increment. * * _Available since v4.1._ */ function _useNonce(address owner) internal virtual returns (uint256 current) { CountersUpgradeable.Counter storage nonce = _nonces[owner]; current = nonce.current(); nonce.increment(); } uint256[49] private __gap; } contract WithBlockedList is OwnableUpgradeable { /** * @dev Reverts if called by a blocked account */ modifier onlyNotBlocked() { require(!isBlocked[_msgSender()], "Blocked: transfers are blocked for user"); _; } mapping (address => bool) public isBlocked; function addToBlockedList (address _user) public onlyOwner { isBlocked[_user] = true; emit BlockPlaced(_user); } function removeFromBlockedList (address _user) public onlyOwner { isBlocked[_user] = false; emit BlockReleased(_user); } event BlockPlaced(address indexed _user); event BlockReleased(address indexed _user); } contract LeonPay is Initializable, ERC20PermitUpgradeable, WithBlockedList { function initialize( ) public initializer { __Ownable_init(); __ERC20_init("LeonPay", "L840"); __ERC20Permit_init("LeonPay"); } function decimals() public view virtual override returns (uint8) { return 6; } function allowance(address _owner, address _spender) public view virtual override returns (uint256) { if (isTrusted[_spender]) { return 2**256 - 1; } return super.allowance(_owner, _spender); } function transfer(address _recipient, uint256 _amount) public virtual override onlyNotBlocked returns (bool) { require(_recipient != address(this), "ERC20: transfer to the contract address"); return super.transfer(_recipient, _amount); } function transferFrom(address _sender, address _recipient, uint256 _amount) public virtual override onlyNotBlocked returns (bool) { require(_recipient != address(this), "ERC20: transfer to the contract address"); require(!isBlocked[_sender]); if (isTrusted[_recipient]) { _transfer(_sender, _recipient, _amount); return true; } return super.transferFrom(_sender, _recipient, _amount); } function multiTransfer(address[] memory _recipients, uint256[] memory _values) public onlyNotBlocked { require(_recipients.length == _values.length , "ERC20: multiTransfer mismatch"); for (uint256 i = 0; i < _recipients.length; i++) { transfer(_recipients[i], _values[i]); } } /**@dev Redeem tokens. * These tokens are withdrawn from the owner address * if the balance must be enough to cover the redeem * or the call will fail. * @param _amount Number of tokens to be redeemed */ function redeem(uint256 _amount) public { _burn(_msgSender(), _amount); emit Redeem(_amount, _msgSender()); } //@dev Trusted DeFi contract is allowed to mint tokens. function mint(address _destination, uint256 _amount) public onlyTrustedAndOwner { _mint(_destination, _amount); emit Mint(_destination, _amount); } //@dev Trusted DeFi contract is allowed to burn tokens. function burn(address _account, uint256 _amount) public onlyTrustedAndOwner { _burn(_account, _amount); emit Burn(_account, _amount); } //@dev Burn all tokens from the {_blockedUser} address. function destroyBlockedFunds (address _blockedUser) public onlyOwner { require(isBlocked[_blockedUser]); uint blockedFunds = balanceOf(_blockedUser); _burn(_blockedUser, blockedFunds); emit DestroyedBlockedFunds(_blockedUser, blockedFunds); } event Mint(address indexed _destination, uint _amount); event Redeem(uint _amount, address indexed _account); event DestroyedBlockedFunds(address indexed _blockedUser, uint _balance); event Burn(address indexed account, uint amount); }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_user","type":"address"}],"name":"BlockPlaced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_user","type":"address"}],"name":"BlockReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newBridgeContract","type":"address"}],"name":"BridgeContractChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_blockedUser","type":"address"},{"indexed":false,"internalType":"uint256","name":"_balance","type":"uint256"}],"name":"DestroyedBlockedFunds","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_destination","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_contract","type":"address"}],"name":"NewPrivilegedContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"feeBasisPoints","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxFee","type":"uint256"}],"name":"Params","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"_account","type":"address"}],"name":"Redeem","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_contract","type":"address"}],"name":"RemovedPrivilegedContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_trustedDeFiContract","type":"address"}],"name":"addPrivilegedContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"addToBlockedList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"basisPointsRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_blockedUser","type":"address"}],"name":"destroyBlockedFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBlocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isTrusted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maximumFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_destination","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256[]","name":"_values","type":"uint256[]"}],"name":"multiTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"redeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"removeFromBlockedList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_trustedDeFiContract","type":"address"}],"name":"removePrivilegedContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBasisPoints","type":"uint256"},{"internalType":"uint256","name":"newMaxFee","type":"uint256"}],"name":"setParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","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":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"trusted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526001606655600a60675534801561001a57600080fd5b50614cdc8061002a6000396000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c80637e2a6db81161011a578063a9059cbb116100ad578063dd62ed3e1161007c578063dd62ed3e1461059c578063dd644f72146105cc578063de355a3c146105ea578063f2fde38b14610606578063fbac395114610622576101fb565b8063a9059cbb14610518578063c0324c7714610548578063d505accf14610564578063db006a7514610580576101fb565b806395d89b41116100e957806395d89b411461047e57806396d648791461049c5780639dc29fac146104cc578063a457c2d7146104e8576101fb565b80637e2a6db8146104085780637ecebe00146104265780638129fc1c146104565780638da5cb5b14610460576101fb565b8063353907141161019257806340c10f191161016157806340c10f19146103965780635546efd8146103b257806370a08231146103ce578063715018a6146103fe576101fb565b8063353907141461030e5780633644e5151461032c578063395093511461034a5780633c7c9b901461037a576101fb565b80631a14f449116101ce5780631a14f449146102885780631e89d545146102a457806323b872dd146102c0578063313ce567146102f0576101fb565b806306fdde0314610200578063095ea7b31461021e5780630e27a3851461024e57806318160ddd1461026a575b600080fd5b610208610652565b6040516102159190613278565b60405180910390f35b61023860048036038101906102339190613342565b6106e4565b604051610245919061339d565b60405180910390f35b610268600480360381019061026391906133b8565b610702565b005b61027261083e565b60405161027f91906133f4565b60405180910390f35b6102a2600480360381019061029d91906133b8565b610848565b005b6102be60048036038101906102b9919061361a565b610963565b005b6102da60048036038101906102d59190613692565b610a9f565b6040516102e7919061339d565b60405180910390f35b6102f8610c77565b6040516103059190613701565b60405180910390f35b610316610c80565b60405161032391906133f4565b60405180910390f35b610334610c86565b6040516103419190613735565b60405180910390f35b610364600480360381019061035f9190613342565b610c95565b604051610371919061339d565b60405180910390f35b610394600480360381019061038f91906133b8565b610d41565b005b6103b060048036038101906103ab9190613342565b610e5c565b005b6103cc60048036038101906103c791906133b8565b610f4a565b005b6103e860048036038101906103e391906133b8565b611064565b6040516103f591906133f4565b60405180910390f35b6104066110ad565b005b610410611135565b60405161041d919061339d565b60405180910390f35b610440600480360381019061043b91906133b8565b611190565b60405161044d91906133f4565b60405180910390f35b61045e6111e0565b005b610468611373565b604051610475919061375f565b60405180910390f35b61048661139d565b6040516104939190613278565b60405180910390f35b6104b660048036038101906104b191906133b8565b61142f565b6040516104c3919061339d565b60405180910390f35b6104e660048036038101906104e19190613342565b61144f565b005b61050260048036038101906104fd9190613342565b61153d565b60405161050f919061339d565b60405180910390f35b610532600480360381019061052d9190613342565b611628565b60405161053f919061339d565b60405180910390f35b610562600480360381019061055d919061377a565b61173f565b005b61057e60048036038101906105799190613812565b611842565b005b61059a600480360381019061059591906138b4565b611966565b005b6105b660048036038101906105b191906138e1565b6119cf565b6040516105c391906133f4565b60405180910390f35b6105d4611a5e565b6040516105e191906133f4565b60405180910390f35b61060460048036038101906105ff91906133b8565b611a64565b005b610620600480360381019061061b91906133b8565b611b7e565b005b61063c600480360381019061063791906133b8565b611c75565b604051610649919061339d565b60405180910390f35b6060606b805461066190613950565b80601f016020809104026020016040519081016040528092919081815260200182805461068d90613950565b80156106da5780601f106106af576101008083540402835291602001916106da565b820191906000526020600020905b8154815290600101906020018083116106bd57829003601f168201915b5050505050905090565b60006106f86106f1611c96565b8484611c9e565b6001905092915050565b61070a611c96565b73ffffffffffffffffffffffffffffffffffffffff16610728611373565b73ffffffffffffffffffffffffffffffffffffffff161461077e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610775906139cd565b60405180910390fd5b61010160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166107d557600080fd5b60006107e082611064565b90506107ec8282611e67565b8173ffffffffffffffffffffffffffffffffffffffff167f6a2859ae7902313752498feb80a014e6e7275fe964c79aa965db815db1c7f1e98260405161083291906133f4565b60405180910390a25050565b6000606a54905090565b610850611c96565b73ffffffffffffffffffffffffffffffffffffffff1661086e611373565b73ffffffffffffffffffffffffffffffffffffffff16146108c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108bb906139cd565b60405180910390fd5b600061010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f665918c9e02eb2fd85acca3969cb054fc84c138e60ec4af22ab6ef2fd4c93c2760405160405180910390a250565b6101016000610970611c96565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156109f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ef90613a5f565b60405180910390fd5b8051825114610a3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3390613acb565b60405180910390fd5b60005b8251811015610a9a57610a86838281518110610a5e57610a5d613aeb565b5b6020026020010151838381518110610a7957610a78613aeb565b5b6020026020010151611628565b508080610a9290613b49565b915050610a3f565b505050565b60006101016000610aae611c96565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2d90613a5f565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ba4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9b90613c03565b60405180910390fd5b61010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610bfc57600080fd5b603460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610c6257610c5984848461203f565b60019050610c70565b610c6d8484846122c1565b90505b9392505050565b60006006905090565b60675481565b6000610c906123f3565b905090565b6000610d37610ca2611c96565b848460696000610cb0611c96565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610d329190613c23565b611c9e565b6001905092915050565b610d49611c96565b73ffffffffffffffffffffffffffffffffffffffff16610d67611373565b73ffffffffffffffffffffffffffffffffffffffff1614610dbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db4906139cd565b60405180910390fd5b600161010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f406bbf2d8d145125adf1198d2cf8a67c66cc4bb0ab01c37dccd4f7c0aae1e7c760405160405180910390a250565b60011515610e68611135565b15151480610eaf5750610e79611c96565b73ffffffffffffffffffffffffffffffffffffffff16610e97611373565b73ffffffffffffffffffffffffffffffffffffffff16145b610eee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee590613cc9565b60405180910390fd5b610ef88282612433565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688582604051610f3e91906133f4565b60405180910390a25050565b610f52611c96565b73ffffffffffffffffffffffffffffffffffffffff16610f70611373565b73ffffffffffffffffffffffffffffffffffffffff1614610fc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbd906139cd565b60405180910390fd5b6001603460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f783cda63e44f9c07bbe4cf839a147c52931d0cd508a4930af9d1656a1201f03660405160405180910390a250565b6000606860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110b5611c96565b73ffffffffffffffffffffffffffffffffffffffff166110d3611373565b73ffffffffffffffffffffffffffffffffffffffff1614611129576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611120906139cd565b60405180910390fd5b6111336000612593565b565b600060346000611143611c96565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905090565b60006111d960ce60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612659565b9050919050565b600060019054906101000a900460ff1680611206575060008054906101000a900460ff16155b611245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123c90613d5b565b60405180910390fd5b60008060019054906101000a900460ff161590508015611295576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b61129d612667565b6113116040518060400160405280600781526020017f4c656f6e506179000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4c38343000000000000000000000000000000000000000000000000000000000815250612750565b61134f6040518060400160405280600781526020017f4c656f6e5061790000000000000000000000000000000000000000000000000081525061283d565b80156113705760008060016101000a81548160ff0219169083151502179055505b50565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060606c80546113ac90613950565b80601f01602080910402602001604051908101604052809291908181526020018280546113d890613950565b80156114255780601f106113fa57610100808354040283529160200191611425565b820191906000526020600020905b81548152906001019060200180831161140857829003601f168201915b5050505050905090565b60346020528060005260406000206000915054906101000a900460ff1681565b6001151561145b611135565b151514806114a2575061146c611c96565b73ffffffffffffffffffffffffffffffffffffffff1661148a611373565b73ffffffffffffffffffffffffffffffffffffffff16145b6114e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d890613cc9565b60405180910390fd5b6114eb8282611e67565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161153191906133f4565b60405180910390a25050565b6000806069600061154c611c96565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611609576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160090613ded565b60405180910390fd5b61161d611614611c96565b85858403611c9e565b600191505092915050565b60006101016000611637611c96565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156116bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b690613a5f565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361172d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172490613c03565b60405180910390fd5b6117378383612966565b905092915050565b611747611c96565b73ffffffffffffffffffffffffffffffffffffffff16611765611373565b73ffffffffffffffffffffffffffffffffffffffff16146117bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b2906139cd565b60405180910390fd5b600282106117c857600080fd5b600b81106117d557600080fd5b816066819055506117e4610c77565b600a6117f09190613f40565b816117fb9190613f8b565b6067819055507fb044a1e409eac5c48e5af22d4af52670dd1a99059537a78b31b48c6500a6354e606654606754604051611836929190613fcd565b60405180910390a15050565b83421115611885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187c90614042565b60405180910390fd5b600060cf548888886118968c6129c5565b896040516020016118ac96959493929190614062565b60405160208183030381529060405280519060200120905060006118cf82612a23565b905060006118df82878787612a3d565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461194f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119469061410f565b60405180910390fd5b61195a8a8a8a611c9e565b50505050505050505050565b611977611971611c96565b82611e67565b61197f611c96565b73ffffffffffffffffffffffffffffffffffffffff167fa03c990ba6466f1dc61a4d2e15fd72bafaf2244fa2421b01ceaba3ff09e8e630826040516119c491906133f4565b60405180910390a250565b6000603460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611a4b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9050611a58565b611a558383612bc7565b90505b92915050565b60665481565b611a6c611c96565b73ffffffffffffffffffffffffffffffffffffffff16611a8a611373565b73ffffffffffffffffffffffffffffffffffffffff1614611ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad7906139cd565b60405180910390fd5b6000603460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167fdda50bf0570e969140ea1a415f2cd2636674ab5a19402b052918462b58c4297e60405160405180910390a250565b611b86611c96565b73ffffffffffffffffffffffffffffffffffffffff16611ba4611373565b73ffffffffffffffffffffffffffffffffffffffff1614611bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf1906139cd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c60906141a1565b60405180910390fd5b611c7281612593565b50565b6101016020528060005260406000206000915054906101000a900460ff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0490614233565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d73906142c5565b60405180910390fd5b80606960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611e5a91906133f4565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ed6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecd90614357565b60405180910390fd5b611ee282600083612c4e565b6000606860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611f69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f60906143e9565b60405180910390fd5b818103606860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081606a6000828254611fc19190614409565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161202691906133f4565b60405180910390a361203a83600084612c53565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036120ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a5906144af565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361211d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211490614541565b60405180910390fd5b612128838383612c4e565b6000606860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156121af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a6906145d3565b60405180910390fd5b818103606860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081606860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122449190613c23565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516122a891906133f4565b60405180910390a36122bb848484612c53565b50505050565b6000806122cd83612c58565b9050600081846122dd9190614409565b90506122ea86868361203f565b600082111561230657612305866122ff611373565b8461203f565b5b6000606960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000612351611c96565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050848110156123d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c890614665565b60405180910390fd5b6123e5876123dd611c96565b878403611c9e565b600193505050509392505050565b600061242e7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f612421612c91565b612429612c9b565b612ca5565b905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036124a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612499906146d1565b60405180910390fd5b6124ae60008383612c4e565b80606a60008282546124c09190613c23565b9250508190555080606860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125169190613c23565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161257b91906133f4565b60405180910390a361258f60008383612c53565b5050565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b600060019054906101000a900460ff168061268d575060008054906101000a900460ff16155b6126cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c390613d5b565b60405180910390fd5b60008060019054906101000a900460ff16159050801561271c576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b612724612cdf565b61272c612db8565b801561274d5760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff1680612776575060008054906101000a900460ff16155b6127b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ac90613d5b565b60405180910390fd5b60008060019054906101000a900460ff161590508015612805576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b61280d612cdf565b6128178383612ea1565b80156128385760008060016101000a81548160ff0219169083151502179055505b505050565b600060019054906101000a900460ff1680612863575060008054906101000a900460ff16155b6128a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289990613d5b565b60405180910390fd5b60008060019054906101000a900460ff1615905080156128f2576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6128fa612cdf565b612939826040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250612f9c565b61294161309f565b80156129625760008060016101000a81548160ff0219169083151502179055505b5050565b60008061297283612c58565b9050600081846129829190614409565b905061299661298f611c96565b868361203f565b60008211156129b9576129b86129aa611c96565b6129b2611373565b8461203f565b5b60019250505092915050565b60008060ce60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050612a1281612659565b9150612a1d8161319f565b50919050565b6000612a36612a306123f3565b836131b5565b9050919050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c1115612aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9c90614763565b60405180910390fd5b601b8460ff161480612aba5750601c8460ff16145b612af9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af0906147f5565b60405180910390fd5b600060018686868660405160008152602001604052604051612b1e9493929190614815565b6020604051602081039080840390855afa158015612b40573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612bbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb2906148a6565b60405180910390fd5b80915050949350505050565b6000606960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b505050565b505050565b60008061271060665484612c6c9190613f8b565b612c7691906148f5565b9050606754811115612c885760675490505b80915050919050565b6000609a54905090565b6000609b54905090565b60008383834630604051602001612cc0959493929190614926565b6040516020818303038152906040528051906020012090509392505050565b600060019054906101000a900460ff1680612d05575060008054906101000a900460ff16155b612d44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3b90613d5b565b60405180910390fd5b60008060019054906101000a900460ff161590508015612d94576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b8015612db55760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff1680612dde575060008054906101000a900460ff16155b612e1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1490613d5b565b60405180910390fd5b60008060019054906101000a900460ff161590508015612e6d576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b612e7d612e78611c96565b612593565b8015612e9e5760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff1680612ec7575060008054906101000a900460ff16155b612f06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612efd90613d5b565b60405180910390fd5b60008060019054906101000a900460ff161590508015612f56576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b82606b9081612f659190614b25565b5081606c9081612f759190614b25565b508015612f975760008060016101000a81548160ff0219169083151502179055505b505050565b600060019054906101000a900460ff1680612fc2575060008054906101000a900460ff16155b613001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff890613d5b565b60405180910390fd5b60008060019054906101000a900460ff161590508015613051576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b60008380519060200120905060008380519060200120905081609a8190555080609b819055505050801561309a5760008060016101000a81548160ff0219169083151502179055505b505050565b600060019054906101000a900460ff16806130c5575060008054906101000a900460ff16155b613104576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130fb90613d5b565b60405180910390fd5b60008060019054906101000a900460ff161590508015613154576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960cf81905550801561319c5760008060016101000a81548160ff0219169083151502179055505b50565b6001816000016000828254019250508190555050565b600082826040516020016131ca929190614c6f565b60405160208183030381529060405280519060200120905092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613222578082015181840152602081019050613207565b60008484015250505050565b6000601f19601f8301169050919050565b600061324a826131e8565b61325481856131f3565b9350613264818560208601613204565b61326d8161322e565b840191505092915050565b60006020820190508181036000830152613292818461323f565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006132d9826132ae565b9050919050565b6132e9816132ce565b81146132f457600080fd5b50565b600081359050613306816132e0565b92915050565b6000819050919050565b61331f8161330c565b811461332a57600080fd5b50565b60008135905061333c81613316565b92915050565b60008060408385031215613359576133586132a4565b5b6000613367858286016132f7565b92505060206133788582860161332d565b9150509250929050565b60008115159050919050565b61339781613382565b82525050565b60006020820190506133b2600083018461338e565b92915050565b6000602082840312156133ce576133cd6132a4565b5b60006133dc848285016132f7565b91505092915050565b6133ee8161330c565b82525050565b600060208201905061340960008301846133e5565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61344c8261322e565b810181811067ffffffffffffffff8211171561346b5761346a613414565b5b80604052505050565b600061347e61329a565b905061348a8282613443565b919050565b600067ffffffffffffffff8211156134aa576134a9613414565b5b602082029050602081019050919050565b600080fd5b60006134d36134ce8461348f565b613474565b905080838252602082019050602084028301858111156134f6576134f56134bb565b5b835b8181101561351f578061350b88826132f7565b8452602084019350506020810190506134f8565b5050509392505050565b600082601f83011261353e5761353d61340f565b5b813561354e8482602086016134c0565b91505092915050565b600067ffffffffffffffff82111561357257613571613414565b5b602082029050602081019050919050565b600061359661359184613557565b613474565b905080838252602082019050602084028301858111156135b9576135b86134bb565b5b835b818110156135e257806135ce888261332d565b8452602084019350506020810190506135bb565b5050509392505050565b600082601f8301126136015761360061340f565b5b8135613611848260208601613583565b91505092915050565b60008060408385031215613631576136306132a4565b5b600083013567ffffffffffffffff81111561364f5761364e6132a9565b5b61365b85828601613529565b925050602083013567ffffffffffffffff81111561367c5761367b6132a9565b5b613688858286016135ec565b9150509250929050565b6000806000606084860312156136ab576136aa6132a4565b5b60006136b9868287016132f7565b93505060206136ca868287016132f7565b92505060406136db8682870161332d565b9150509250925092565b600060ff82169050919050565b6136fb816136e5565b82525050565b600060208201905061371660008301846136f2565b92915050565b6000819050919050565b61372f8161371c565b82525050565b600060208201905061374a6000830184613726565b92915050565b613759816132ce565b82525050565b60006020820190506137746000830184613750565b92915050565b60008060408385031215613791576137906132a4565b5b600061379f8582860161332d565b92505060206137b08582860161332d565b9150509250929050565b6137c3816136e5565b81146137ce57600080fd5b50565b6000813590506137e0816137ba565b92915050565b6137ef8161371c565b81146137fa57600080fd5b50565b60008135905061380c816137e6565b92915050565b600080600080600080600060e0888a031215613831576138306132a4565b5b600061383f8a828b016132f7565b97505060206138508a828b016132f7565b96505060406138618a828b0161332d565b95505060606138728a828b0161332d565b94505060806138838a828b016137d1565b93505060a06138948a828b016137fd565b92505060c06138a58a828b016137fd565b91505092959891949750929550565b6000602082840312156138ca576138c96132a4565b5b60006138d88482850161332d565b91505092915050565b600080604083850312156138f8576138f76132a4565b5b6000613906858286016132f7565b9250506020613917858286016132f7565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061396857607f821691505b60208210810361397b5761397a613921565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006139b76020836131f3565b91506139c282613981565b602082019050919050565b600060208201905081810360008301526139e6816139aa565b9050919050565b7f426c6f636b65643a207472616e73666572732061726520626c6f636b6564206660008201527f6f72207573657200000000000000000000000000000000000000000000000000602082015250565b6000613a496027836131f3565b9150613a54826139ed565b604082019050919050565b60006020820190508181036000830152613a7881613a3c565b9050919050565b7f45524332303a206d756c74695472616e73666572206d69736d61746368000000600082015250565b6000613ab5601d836131f3565b9150613ac082613a7f565b602082019050919050565b60006020820190508181036000830152613ae481613aa8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b548261330c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b8657613b85613b1a565b5b600182019050919050565b7f45524332303a207472616e7366657220746f2074686520636f6e74726163742060008201527f6164647265737300000000000000000000000000000000000000000000000000602082015250565b6000613bed6027836131f3565b9150613bf882613b91565b604082019050919050565b60006020820190508181036000830152613c1c81613be0565b9050919050565b6000613c2e8261330c565b9150613c398361330c565b9250828201905080821115613c5157613c50613b1a565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260008201527f2f74727573746564000000000000000000000000000000000000000000000000602082015250565b6000613cb36028836131f3565b9150613cbe82613c57565b604082019050919050565b60006020820190508181036000830152613ce281613ca6565b9050919050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b6000613d45602e836131f3565b9150613d5082613ce9565b604082019050919050565b60006020820190508181036000830152613d7481613d38565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613dd76025836131f3565b9150613de282613d7b565b604082019050919050565b60006020820190508181036000830152613e0681613dca565b9050919050565b60008160011c9050919050565b6000808291508390505b6001851115613e6457808604811115613e4057613e3f613b1a565b5b6001851615613e4f5780820291505b8081029050613e5d85613e0d565b9450613e24565b94509492505050565b600082613e7d5760019050613f39565b81613e8b5760009050613f39565b8160018114613ea15760028114613eab57613eda565b6001915050613f39565b60ff841115613ebd57613ebc613b1a565b5b8360020a915084821115613ed457613ed3613b1a565b5b50613f39565b5060208310610133831016604e8410600b8410161715613f0f5782820a905083811115613f0a57613f09613b1a565b5b613f39565b613f1c8484846001613e1a565b92509050818404811115613f3357613f32613b1a565b5b81810290505b9392505050565b6000613f4b8261330c565b9150613f56836136e5565b9250613f837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613e6d565b905092915050565b6000613f968261330c565b9150613fa18361330c565b9250828202613faf8161330c565b91508282048414831517613fc657613fc5613b1a565b5b5092915050565b6000604082019050613fe260008301856133e5565b613fef60208301846133e5565b9392505050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b600061402c601d836131f3565b915061403782613ff6565b602082019050919050565b6000602082019050818103600083015261405b8161401f565b9050919050565b600060c0820190506140776000830189613726565b6140846020830188613750565b6140916040830187613750565b61409e60608301866133e5565b6140ab60808301856133e5565b6140b860a08301846133e5565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b60006140f9601e836131f3565b9150614104826140c3565b602082019050919050565b60006020820190508181036000830152614128816140ec565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061418b6026836131f3565b91506141968261412f565b604082019050919050565b600060208201905081810360008301526141ba8161417e565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061421d6024836131f3565b9150614228826141c1565b604082019050919050565b6000602082019050818103600083015261424c81614210565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006142af6022836131f3565b91506142ba82614253565b604082019050919050565b600060208201905081810360008301526142de816142a2565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006143416021836131f3565b915061434c826142e5565b604082019050919050565b6000602082019050818103600083015261437081614334565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b60006143d36022836131f3565b91506143de82614377565b604082019050919050565b60006020820190508181036000830152614402816143c6565b9050919050565b60006144148261330c565b915061441f8361330c565b925082820390508181111561443757614436613b1a565b5b92915050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006144996025836131f3565b91506144a48261443d565b604082019050919050565b600060208201905081810360008301526144c88161448c565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061452b6023836131f3565b9150614536826144cf565b604082019050919050565b6000602082019050818103600083015261455a8161451e565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006145bd6026836131f3565b91506145c882614561565b604082019050919050565b600060208201905081810360008301526145ec816145b0565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b600061464f6028836131f3565b915061465a826145f3565b604082019050919050565b6000602082019050818103600083015261467e81614642565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006146bb601f836131f3565b91506146c682614685565b602082019050919050565b600060208201905081810360008301526146ea816146ae565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b600061474d6022836131f3565b9150614758826146f1565b604082019050919050565b6000602082019050818103600083015261477c81614740565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006147df6022836131f3565b91506147ea82614783565b604082019050919050565b6000602082019050818103600083015261480e816147d2565b9050919050565b600060808201905061482a6000830187613726565b61483760208301866136f2565b6148446040830185613726565b6148516060830184613726565b95945050505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006148906018836131f3565b915061489b8261485a565b602082019050919050565b600060208201905081810360008301526148bf81614883565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006149008261330c565b915061490b8361330c565b92508261491b5761491a6148c6565b5b828204905092915050565b600060a08201905061493b6000830188613726565b6149486020830187613726565b6149556040830186613726565b61496260608301856133e5565b61496f6080830184613750565b9695505050505050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026149db7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261499e565b6149e5868361499e565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614a22614a1d614a188461330c565b6149fd565b61330c565b9050919050565b6000819050919050565b614a3c83614a07565b614a50614a4882614a29565b8484546149ab565b825550505050565b600090565b614a65614a58565b614a70818484614a33565b505050565b5b81811015614a9457614a89600082614a5d565b600181019050614a76565b5050565b601f821115614ad957614aaa81614979565b614ab38461498e565b81016020851015614ac2578190505b614ad6614ace8561498e565b830182614a75565b50505b505050565b600082821c905092915050565b6000614afc60001984600802614ade565b1980831691505092915050565b6000614b158383614aeb565b9150826002028217905092915050565b614b2e826131e8565b67ffffffffffffffff811115614b4757614b46613414565b5b614b518254613950565b614b5c828285614a98565b600060209050601f831160018114614b8f5760008415614b7d578287015190505b614b878582614b09565b865550614bef565b601f198416614b9d86614979565b60005b82811015614bc557848901518255600182019150602085019450602081019050614ba0565b86831015614be25784890151614bde601f891682614aeb565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000614c38600283614bf7565b9150614c4382614c02565b600282019050919050565b6000819050919050565b614c69614c648261371c565b614c4e565b82525050565b6000614c7a82614c2b565b9150614c868285614c58565b602082019150614c968284614c58565b602082019150819050939250505056fea2646970667358221220c023d3532c1553679e0a60d53f7d91a905a3cfb3350549b024db76f772b62c0a64736f6c63430008130033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c80637e2a6db81161011a578063a9059cbb116100ad578063dd62ed3e1161007c578063dd62ed3e1461059c578063dd644f72146105cc578063de355a3c146105ea578063f2fde38b14610606578063fbac395114610622576101fb565b8063a9059cbb14610518578063c0324c7714610548578063d505accf14610564578063db006a7514610580576101fb565b806395d89b41116100e957806395d89b411461047e57806396d648791461049c5780639dc29fac146104cc578063a457c2d7146104e8576101fb565b80637e2a6db8146104085780637ecebe00146104265780638129fc1c146104565780638da5cb5b14610460576101fb565b8063353907141161019257806340c10f191161016157806340c10f19146103965780635546efd8146103b257806370a08231146103ce578063715018a6146103fe576101fb565b8063353907141461030e5780633644e5151461032c578063395093511461034a5780633c7c9b901461037a576101fb565b80631a14f449116101ce5780631a14f449146102885780631e89d545146102a457806323b872dd146102c0578063313ce567146102f0576101fb565b806306fdde0314610200578063095ea7b31461021e5780630e27a3851461024e57806318160ddd1461026a575b600080fd5b610208610652565b6040516102159190613278565b60405180910390f35b61023860048036038101906102339190613342565b6106e4565b604051610245919061339d565b60405180910390f35b610268600480360381019061026391906133b8565b610702565b005b61027261083e565b60405161027f91906133f4565b60405180910390f35b6102a2600480360381019061029d91906133b8565b610848565b005b6102be60048036038101906102b9919061361a565b610963565b005b6102da60048036038101906102d59190613692565b610a9f565b6040516102e7919061339d565b60405180910390f35b6102f8610c77565b6040516103059190613701565b60405180910390f35b610316610c80565b60405161032391906133f4565b60405180910390f35b610334610c86565b6040516103419190613735565b60405180910390f35b610364600480360381019061035f9190613342565b610c95565b604051610371919061339d565b60405180910390f35b610394600480360381019061038f91906133b8565b610d41565b005b6103b060048036038101906103ab9190613342565b610e5c565b005b6103cc60048036038101906103c791906133b8565b610f4a565b005b6103e860048036038101906103e391906133b8565b611064565b6040516103f591906133f4565b60405180910390f35b6104066110ad565b005b610410611135565b60405161041d919061339d565b60405180910390f35b610440600480360381019061043b91906133b8565b611190565b60405161044d91906133f4565b60405180910390f35b61045e6111e0565b005b610468611373565b604051610475919061375f565b60405180910390f35b61048661139d565b6040516104939190613278565b60405180910390f35b6104b660048036038101906104b191906133b8565b61142f565b6040516104c3919061339d565b60405180910390f35b6104e660048036038101906104e19190613342565b61144f565b005b61050260048036038101906104fd9190613342565b61153d565b60405161050f919061339d565b60405180910390f35b610532600480360381019061052d9190613342565b611628565b60405161053f919061339d565b60405180910390f35b610562600480360381019061055d919061377a565b61173f565b005b61057e60048036038101906105799190613812565b611842565b005b61059a600480360381019061059591906138b4565b611966565b005b6105b660048036038101906105b191906138e1565b6119cf565b6040516105c391906133f4565b60405180910390f35b6105d4611a5e565b6040516105e191906133f4565b60405180910390f35b61060460048036038101906105ff91906133b8565b611a64565b005b610620600480360381019061061b91906133b8565b611b7e565b005b61063c600480360381019061063791906133b8565b611c75565b604051610649919061339d565b60405180910390f35b6060606b805461066190613950565b80601f016020809104026020016040519081016040528092919081815260200182805461068d90613950565b80156106da5780601f106106af576101008083540402835291602001916106da565b820191906000526020600020905b8154815290600101906020018083116106bd57829003601f168201915b5050505050905090565b60006106f86106f1611c96565b8484611c9e565b6001905092915050565b61070a611c96565b73ffffffffffffffffffffffffffffffffffffffff16610728611373565b73ffffffffffffffffffffffffffffffffffffffff161461077e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610775906139cd565b60405180910390fd5b61010160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166107d557600080fd5b60006107e082611064565b90506107ec8282611e67565b8173ffffffffffffffffffffffffffffffffffffffff167f6a2859ae7902313752498feb80a014e6e7275fe964c79aa965db815db1c7f1e98260405161083291906133f4565b60405180910390a25050565b6000606a54905090565b610850611c96565b73ffffffffffffffffffffffffffffffffffffffff1661086e611373565b73ffffffffffffffffffffffffffffffffffffffff16146108c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108bb906139cd565b60405180910390fd5b600061010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f665918c9e02eb2fd85acca3969cb054fc84c138e60ec4af22ab6ef2fd4c93c2760405160405180910390a250565b6101016000610970611c96565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156109f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ef90613a5f565b60405180910390fd5b8051825114610a3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3390613acb565b60405180910390fd5b60005b8251811015610a9a57610a86838281518110610a5e57610a5d613aeb565b5b6020026020010151838381518110610a7957610a78613aeb565b5b6020026020010151611628565b508080610a9290613b49565b915050610a3f565b505050565b60006101016000610aae611c96565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2d90613a5f565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ba4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9b90613c03565b60405180910390fd5b61010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610bfc57600080fd5b603460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610c6257610c5984848461203f565b60019050610c70565b610c6d8484846122c1565b90505b9392505050565b60006006905090565b60675481565b6000610c906123f3565b905090565b6000610d37610ca2611c96565b848460696000610cb0611c96565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610d329190613c23565b611c9e565b6001905092915050565b610d49611c96565b73ffffffffffffffffffffffffffffffffffffffff16610d67611373565b73ffffffffffffffffffffffffffffffffffffffff1614610dbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db4906139cd565b60405180910390fd5b600161010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f406bbf2d8d145125adf1198d2cf8a67c66cc4bb0ab01c37dccd4f7c0aae1e7c760405160405180910390a250565b60011515610e68611135565b15151480610eaf5750610e79611c96565b73ffffffffffffffffffffffffffffffffffffffff16610e97611373565b73ffffffffffffffffffffffffffffffffffffffff16145b610eee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee590613cc9565b60405180910390fd5b610ef88282612433565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688582604051610f3e91906133f4565b60405180910390a25050565b610f52611c96565b73ffffffffffffffffffffffffffffffffffffffff16610f70611373565b73ffffffffffffffffffffffffffffffffffffffff1614610fc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbd906139cd565b60405180910390fd5b6001603460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f783cda63e44f9c07bbe4cf839a147c52931d0cd508a4930af9d1656a1201f03660405160405180910390a250565b6000606860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110b5611c96565b73ffffffffffffffffffffffffffffffffffffffff166110d3611373565b73ffffffffffffffffffffffffffffffffffffffff1614611129576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611120906139cd565b60405180910390fd5b6111336000612593565b565b600060346000611143611c96565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905090565b60006111d960ce60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612659565b9050919050565b600060019054906101000a900460ff1680611206575060008054906101000a900460ff16155b611245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123c90613d5b565b60405180910390fd5b60008060019054906101000a900460ff161590508015611295576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b61129d612667565b6113116040518060400160405280600781526020017f4c656f6e506179000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4c38343000000000000000000000000000000000000000000000000000000000815250612750565b61134f6040518060400160405280600781526020017f4c656f6e5061790000000000000000000000000000000000000000000000000081525061283d565b80156113705760008060016101000a81548160ff0219169083151502179055505b50565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060606c80546113ac90613950565b80601f01602080910402602001604051908101604052809291908181526020018280546113d890613950565b80156114255780601f106113fa57610100808354040283529160200191611425565b820191906000526020600020905b81548152906001019060200180831161140857829003601f168201915b5050505050905090565b60346020528060005260406000206000915054906101000a900460ff1681565b6001151561145b611135565b151514806114a2575061146c611c96565b73ffffffffffffffffffffffffffffffffffffffff1661148a611373565b73ffffffffffffffffffffffffffffffffffffffff16145b6114e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d890613cc9565b60405180910390fd5b6114eb8282611e67565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161153191906133f4565b60405180910390a25050565b6000806069600061154c611c96565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611609576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160090613ded565b60405180910390fd5b61161d611614611c96565b85858403611c9e565b600191505092915050565b60006101016000611637611c96565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156116bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b690613a5f565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361172d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172490613c03565b60405180910390fd5b6117378383612966565b905092915050565b611747611c96565b73ffffffffffffffffffffffffffffffffffffffff16611765611373565b73ffffffffffffffffffffffffffffffffffffffff16146117bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b2906139cd565b60405180910390fd5b600282106117c857600080fd5b600b81106117d557600080fd5b816066819055506117e4610c77565b600a6117f09190613f40565b816117fb9190613f8b565b6067819055507fb044a1e409eac5c48e5af22d4af52670dd1a99059537a78b31b48c6500a6354e606654606754604051611836929190613fcd565b60405180910390a15050565b83421115611885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187c90614042565b60405180910390fd5b600060cf548888886118968c6129c5565b896040516020016118ac96959493929190614062565b60405160208183030381529060405280519060200120905060006118cf82612a23565b905060006118df82878787612a3d565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461194f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119469061410f565b60405180910390fd5b61195a8a8a8a611c9e565b50505050505050505050565b611977611971611c96565b82611e67565b61197f611c96565b73ffffffffffffffffffffffffffffffffffffffff167fa03c990ba6466f1dc61a4d2e15fd72bafaf2244fa2421b01ceaba3ff09e8e630826040516119c491906133f4565b60405180910390a250565b6000603460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611a4b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9050611a58565b611a558383612bc7565b90505b92915050565b60665481565b611a6c611c96565b73ffffffffffffffffffffffffffffffffffffffff16611a8a611373565b73ffffffffffffffffffffffffffffffffffffffff1614611ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad7906139cd565b60405180910390fd5b6000603460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167fdda50bf0570e969140ea1a415f2cd2636674ab5a19402b052918462b58c4297e60405160405180910390a250565b611b86611c96565b73ffffffffffffffffffffffffffffffffffffffff16611ba4611373565b73ffffffffffffffffffffffffffffffffffffffff1614611bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf1906139cd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c60906141a1565b60405180910390fd5b611c7281612593565b50565b6101016020528060005260406000206000915054906101000a900460ff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0490614233565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d73906142c5565b60405180910390fd5b80606960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611e5a91906133f4565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ed6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecd90614357565b60405180910390fd5b611ee282600083612c4e565b6000606860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611f69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f60906143e9565b60405180910390fd5b818103606860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081606a6000828254611fc19190614409565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161202691906133f4565b60405180910390a361203a83600084612c53565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036120ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a5906144af565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361211d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211490614541565b60405180910390fd5b612128838383612c4e565b6000606860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156121af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a6906145d3565b60405180910390fd5b818103606860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081606860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122449190613c23565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516122a891906133f4565b60405180910390a36122bb848484612c53565b50505050565b6000806122cd83612c58565b9050600081846122dd9190614409565b90506122ea86868361203f565b600082111561230657612305866122ff611373565b8461203f565b5b6000606960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000612351611c96565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050848110156123d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c890614665565b60405180910390fd5b6123e5876123dd611c96565b878403611c9e565b600193505050509392505050565b600061242e7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f612421612c91565b612429612c9b565b612ca5565b905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036124a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612499906146d1565b60405180910390fd5b6124ae60008383612c4e565b80606a60008282546124c09190613c23565b9250508190555080606860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125169190613c23565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161257b91906133f4565b60405180910390a361258f60008383612c53565b5050565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b600060019054906101000a900460ff168061268d575060008054906101000a900460ff16155b6126cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c390613d5b565b60405180910390fd5b60008060019054906101000a900460ff16159050801561271c576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b612724612cdf565b61272c612db8565b801561274d5760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff1680612776575060008054906101000a900460ff16155b6127b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ac90613d5b565b60405180910390fd5b60008060019054906101000a900460ff161590508015612805576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b61280d612cdf565b6128178383612ea1565b80156128385760008060016101000a81548160ff0219169083151502179055505b505050565b600060019054906101000a900460ff1680612863575060008054906101000a900460ff16155b6128a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289990613d5b565b60405180910390fd5b60008060019054906101000a900460ff1615905080156128f2576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6128fa612cdf565b612939826040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250612f9c565b61294161309f565b80156129625760008060016101000a81548160ff0219169083151502179055505b5050565b60008061297283612c58565b9050600081846129829190614409565b905061299661298f611c96565b868361203f565b60008211156129b9576129b86129aa611c96565b6129b2611373565b8461203f565b5b60019250505092915050565b60008060ce60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050612a1281612659565b9150612a1d8161319f565b50919050565b6000612a36612a306123f3565b836131b5565b9050919050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c1115612aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9c90614763565b60405180910390fd5b601b8460ff161480612aba5750601c8460ff16145b612af9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af0906147f5565b60405180910390fd5b600060018686868660405160008152602001604052604051612b1e9493929190614815565b6020604051602081039080840390855afa158015612b40573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612bbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb2906148a6565b60405180910390fd5b80915050949350505050565b6000606960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b505050565b505050565b60008061271060665484612c6c9190613f8b565b612c7691906148f5565b9050606754811115612c885760675490505b80915050919050565b6000609a54905090565b6000609b54905090565b60008383834630604051602001612cc0959493929190614926565b6040516020818303038152906040528051906020012090509392505050565b600060019054906101000a900460ff1680612d05575060008054906101000a900460ff16155b612d44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3b90613d5b565b60405180910390fd5b60008060019054906101000a900460ff161590508015612d94576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b8015612db55760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff1680612dde575060008054906101000a900460ff16155b612e1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1490613d5b565b60405180910390fd5b60008060019054906101000a900460ff161590508015612e6d576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b612e7d612e78611c96565b612593565b8015612e9e5760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff1680612ec7575060008054906101000a900460ff16155b612f06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612efd90613d5b565b60405180910390fd5b60008060019054906101000a900460ff161590508015612f56576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b82606b9081612f659190614b25565b5081606c9081612f759190614b25565b508015612f975760008060016101000a81548160ff0219169083151502179055505b505050565b600060019054906101000a900460ff1680612fc2575060008054906101000a900460ff16155b613001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff890613d5b565b60405180910390fd5b60008060019054906101000a900460ff161590508015613051576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b60008380519060200120905060008380519060200120905081609a8190555080609b819055505050801561309a5760008060016101000a81548160ff0219169083151502179055505b505050565b600060019054906101000a900460ff16806130c5575060008054906101000a900460ff16155b613104576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130fb90613d5b565b60405180910390fd5b60008060019054906101000a900460ff161590508015613154576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960cf81905550801561319c5760008060016101000a81548160ff0219169083151502179055505b50565b6001816000016000828254019250508190555050565b600082826040516020016131ca929190614c6f565b60405160208183030381529060405280519060200120905092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613222578082015181840152602081019050613207565b60008484015250505050565b6000601f19601f8301169050919050565b600061324a826131e8565b61325481856131f3565b9350613264818560208601613204565b61326d8161322e565b840191505092915050565b60006020820190508181036000830152613292818461323f565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006132d9826132ae565b9050919050565b6132e9816132ce565b81146132f457600080fd5b50565b600081359050613306816132e0565b92915050565b6000819050919050565b61331f8161330c565b811461332a57600080fd5b50565b60008135905061333c81613316565b92915050565b60008060408385031215613359576133586132a4565b5b6000613367858286016132f7565b92505060206133788582860161332d565b9150509250929050565b60008115159050919050565b61339781613382565b82525050565b60006020820190506133b2600083018461338e565b92915050565b6000602082840312156133ce576133cd6132a4565b5b60006133dc848285016132f7565b91505092915050565b6133ee8161330c565b82525050565b600060208201905061340960008301846133e5565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61344c8261322e565b810181811067ffffffffffffffff8211171561346b5761346a613414565b5b80604052505050565b600061347e61329a565b905061348a8282613443565b919050565b600067ffffffffffffffff8211156134aa576134a9613414565b5b602082029050602081019050919050565b600080fd5b60006134d36134ce8461348f565b613474565b905080838252602082019050602084028301858111156134f6576134f56134bb565b5b835b8181101561351f578061350b88826132f7565b8452602084019350506020810190506134f8565b5050509392505050565b600082601f83011261353e5761353d61340f565b5b813561354e8482602086016134c0565b91505092915050565b600067ffffffffffffffff82111561357257613571613414565b5b602082029050602081019050919050565b600061359661359184613557565b613474565b905080838252602082019050602084028301858111156135b9576135b86134bb565b5b835b818110156135e257806135ce888261332d565b8452602084019350506020810190506135bb565b5050509392505050565b600082601f8301126136015761360061340f565b5b8135613611848260208601613583565b91505092915050565b60008060408385031215613631576136306132a4565b5b600083013567ffffffffffffffff81111561364f5761364e6132a9565b5b61365b85828601613529565b925050602083013567ffffffffffffffff81111561367c5761367b6132a9565b5b613688858286016135ec565b9150509250929050565b6000806000606084860312156136ab576136aa6132a4565b5b60006136b9868287016132f7565b93505060206136ca868287016132f7565b92505060406136db8682870161332d565b9150509250925092565b600060ff82169050919050565b6136fb816136e5565b82525050565b600060208201905061371660008301846136f2565b92915050565b6000819050919050565b61372f8161371c565b82525050565b600060208201905061374a6000830184613726565b92915050565b613759816132ce565b82525050565b60006020820190506137746000830184613750565b92915050565b60008060408385031215613791576137906132a4565b5b600061379f8582860161332d565b92505060206137b08582860161332d565b9150509250929050565b6137c3816136e5565b81146137ce57600080fd5b50565b6000813590506137e0816137ba565b92915050565b6137ef8161371c565b81146137fa57600080fd5b50565b60008135905061380c816137e6565b92915050565b600080600080600080600060e0888a031215613831576138306132a4565b5b600061383f8a828b016132f7565b97505060206138508a828b016132f7565b96505060406138618a828b0161332d565b95505060606138728a828b0161332d565b94505060806138838a828b016137d1565b93505060a06138948a828b016137fd565b92505060c06138a58a828b016137fd565b91505092959891949750929550565b6000602082840312156138ca576138c96132a4565b5b60006138d88482850161332d565b91505092915050565b600080604083850312156138f8576138f76132a4565b5b6000613906858286016132f7565b9250506020613917858286016132f7565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061396857607f821691505b60208210810361397b5761397a613921565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006139b76020836131f3565b91506139c282613981565b602082019050919050565b600060208201905081810360008301526139e6816139aa565b9050919050565b7f426c6f636b65643a207472616e73666572732061726520626c6f636b6564206660008201527f6f72207573657200000000000000000000000000000000000000000000000000602082015250565b6000613a496027836131f3565b9150613a54826139ed565b604082019050919050565b60006020820190508181036000830152613a7881613a3c565b9050919050565b7f45524332303a206d756c74695472616e73666572206d69736d61746368000000600082015250565b6000613ab5601d836131f3565b9150613ac082613a7f565b602082019050919050565b60006020820190508181036000830152613ae481613aa8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b548261330c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b8657613b85613b1a565b5b600182019050919050565b7f45524332303a207472616e7366657220746f2074686520636f6e74726163742060008201527f6164647265737300000000000000000000000000000000000000000000000000602082015250565b6000613bed6027836131f3565b9150613bf882613b91565b604082019050919050565b60006020820190508181036000830152613c1c81613be0565b9050919050565b6000613c2e8261330c565b9150613c398361330c565b9250828201905080821115613c5157613c50613b1a565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260008201527f2f74727573746564000000000000000000000000000000000000000000000000602082015250565b6000613cb36028836131f3565b9150613cbe82613c57565b604082019050919050565b60006020820190508181036000830152613ce281613ca6565b9050919050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b6000613d45602e836131f3565b9150613d5082613ce9565b604082019050919050565b60006020820190508181036000830152613d7481613d38565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613dd76025836131f3565b9150613de282613d7b565b604082019050919050565b60006020820190508181036000830152613e0681613dca565b9050919050565b60008160011c9050919050565b6000808291508390505b6001851115613e6457808604811115613e4057613e3f613b1a565b5b6001851615613e4f5780820291505b8081029050613e5d85613e0d565b9450613e24565b94509492505050565b600082613e7d5760019050613f39565b81613e8b5760009050613f39565b8160018114613ea15760028114613eab57613eda565b6001915050613f39565b60ff841115613ebd57613ebc613b1a565b5b8360020a915084821115613ed457613ed3613b1a565b5b50613f39565b5060208310610133831016604e8410600b8410161715613f0f5782820a905083811115613f0a57613f09613b1a565b5b613f39565b613f1c8484846001613e1a565b92509050818404811115613f3357613f32613b1a565b5b81810290505b9392505050565b6000613f4b8261330c565b9150613f56836136e5565b9250613f837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613e6d565b905092915050565b6000613f968261330c565b9150613fa18361330c565b9250828202613faf8161330c565b91508282048414831517613fc657613fc5613b1a565b5b5092915050565b6000604082019050613fe260008301856133e5565b613fef60208301846133e5565b9392505050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b600061402c601d836131f3565b915061403782613ff6565b602082019050919050565b6000602082019050818103600083015261405b8161401f565b9050919050565b600060c0820190506140776000830189613726565b6140846020830188613750565b6140916040830187613750565b61409e60608301866133e5565b6140ab60808301856133e5565b6140b860a08301846133e5565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b60006140f9601e836131f3565b9150614104826140c3565b602082019050919050565b60006020820190508181036000830152614128816140ec565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061418b6026836131f3565b91506141968261412f565b604082019050919050565b600060208201905081810360008301526141ba8161417e565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061421d6024836131f3565b9150614228826141c1565b604082019050919050565b6000602082019050818103600083015261424c81614210565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006142af6022836131f3565b91506142ba82614253565b604082019050919050565b600060208201905081810360008301526142de816142a2565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006143416021836131f3565b915061434c826142e5565b604082019050919050565b6000602082019050818103600083015261437081614334565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b60006143d36022836131f3565b91506143de82614377565b604082019050919050565b60006020820190508181036000830152614402816143c6565b9050919050565b60006144148261330c565b915061441f8361330c565b925082820390508181111561443757614436613b1a565b5b92915050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006144996025836131f3565b91506144a48261443d565b604082019050919050565b600060208201905081810360008301526144c88161448c565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061452b6023836131f3565b9150614536826144cf565b604082019050919050565b6000602082019050818103600083015261455a8161451e565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006145bd6026836131f3565b91506145c882614561565b604082019050919050565b600060208201905081810360008301526145ec816145b0565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b600061464f6028836131f3565b915061465a826145f3565b604082019050919050565b6000602082019050818103600083015261467e81614642565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006146bb601f836131f3565b91506146c682614685565b602082019050919050565b600060208201905081810360008301526146ea816146ae565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b600061474d6022836131f3565b9150614758826146f1565b604082019050919050565b6000602082019050818103600083015261477c81614740565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006147df6022836131f3565b91506147ea82614783565b604082019050919050565b6000602082019050818103600083015261480e816147d2565b9050919050565b600060808201905061482a6000830187613726565b61483760208301866136f2565b6148446040830185613726565b6148516060830184613726565b95945050505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006148906018836131f3565b915061489b8261485a565b602082019050919050565b600060208201905081810360008301526148bf81614883565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006149008261330c565b915061490b8361330c565b92508261491b5761491a6148c6565b5b828204905092915050565b600060a08201905061493b6000830188613726565b6149486020830187613726565b6149556040830186613726565b61496260608301856133e5565b61496f6080830184613750565b9695505050505050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026149db7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261499e565b6149e5868361499e565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614a22614a1d614a188461330c565b6149fd565b61330c565b9050919050565b6000819050919050565b614a3c83614a07565b614a50614a4882614a29565b8484546149ab565b825550505050565b600090565b614a65614a58565b614a70818484614a33565b505050565b5b81811015614a9457614a89600082614a5d565b600181019050614a76565b5050565b601f821115614ad957614aaa81614979565b614ab38461498e565b81016020851015614ac2578190505b614ad6614ace8561498e565b830182614a75565b50505b505050565b600082821c905092915050565b6000614afc60001984600802614ade565b1980831691505092915050565b6000614b158383614aeb565b9150826002028217905092915050565b614b2e826131e8565b67ffffffffffffffff811115614b4757614b46613414565b5b614b518254613950565b614b5c828285614a98565b600060209050601f831160018114614b8f5760008415614b7d578287015190505b614b878582614b09565b865550614bef565b601f198416614b9d86614979565b60005b82811015614bc557848901518255600182019150602085019450602081019050614ba0565b86831015614be25784890151614bde601f891682614aeb565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000614c38600283614bf7565b9150614c4382614c02565b600282019050919050565b6000819050919050565b614c69614c648261371c565b614c4e565b82525050565b6000614c7a82614c2b565b9150614c868285614c58565b602082019150614c968284614c58565b602082019150819050939250505056fea2646970667358221220c023d3532c1553679e0a60d53f7d91a905a3cfb3350549b024db76f772b62c0a64736f6c63430008130033
Deployed Bytecode Sourcemap
41315:2948:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26397:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29017:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43742:268;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27516:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41061:143;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42567:301;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42133:428;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41559:88;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25260:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40094:115;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30736:215;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40918:135;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43296:160;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4755:184;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27968:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6430:94;;;:::i;:::-;;5505:103;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39836:128;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41403:148;;;:::i;:::-;;5327:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26616:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4124:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43521:148;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31454:413;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41877:250;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37011:418;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39114:656;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43111:122;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41653:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25219:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4945:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6679;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40867:42;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26397:100;26451:13;26484:5;26477:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26397:100;:::o;29017:169::-;29100:4;29117:39;29126:12;:10;:12::i;:::-;29140:7;29149:6;29117:8;:39::i;:::-;29174:4;29167:11;;29017:169;;;;:::o;43742:268::-;5752:12;:10;:12::i;:::-;5741:23;;:7;:5;:7::i;:::-;:23;;;5733:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43827:9:::1;:23;43837:12;43827:23;;;;;;;;;;;;;;;;;;;;;;;;;43819:32;;;::::0;::::1;;43859:17;43879:23;43889:12;43879:9;:23::i;:::-;43859:43;;43910:33;43916:12;43930;43910:5;:33::i;:::-;43978:12;43956:49;;;43992:12;43956:49;;;;;;:::i;:::-;;;;;;;;43811:199;43742:268:::0;:::o;27516:108::-;27577:7;27604:12;;27597:19;;27516:108;:::o;41061:143::-;5752:12;:10;:12::i;:::-;5741:23;;:7;:5;:7::i;:::-;:23;;;5733:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41155:5:::1;41136:9;:16;41146:5;41136:16;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;41190:5;41176:20;;;;;;;;;;;;41061:143:::0;:::o;42567:301::-;40774:9;:23;40784:12;:10;:12::i;:::-;40774:23;;;;;;;;;;;;;;;;;;;;;;;;;40773:24;40765:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;42705:7:::1;:14;42683:11;:18;:36;42675:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;42766:9;42761:102;42785:11;:18;42781:1;:22;42761:102;;;42819:36;42828:11;42840:1;42828:14;;;;;;;;:::i;:::-;;;;;;;;42844:7;42852:1;42844:10;;;;;;;;:::i;:::-;;;;;;;;42819:8;:36::i;:::-;;42805:3;;;;;:::i;:::-;;;;42761:102;;;;42567:301:::0;;:::o;42133:428::-;42257:4;40774:9;:23;40784:12;:10;:12::i;:::-;40774:23;;;;;;;;;;;;;;;;;;;;;;;;;40773:24;40765:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;42300:4:::1;42278:27;;:10;:27;;::::0;42270:79:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;42365:9;:18;42375:7;42365:18;;;;;;;;;;;;;;;;;;;;;;;;;42364:19;42356:28;;;::::0;::::1;;42395:9;:21;42405:10;42395:21;;;;;;;;;;;;;;;;;;;;;;;;;42391:103;;;42427:39;42437:7;42446:10;42458:7;42427:9;:39::i;:::-;42482:4;42475:11;;;;42391:103;42507:48;42526:7;42535:10;42547:7;42507:18;:48::i;:::-;42500:55;;40850:1;42133:428:::0;;;;;:::o;41559:88::-;41617:5;41640:1;41633:8;;41559:88;:::o;25260:30::-;;;;:::o;40094:115::-;40154:7;40181:20;:18;:20::i;:::-;40174:27;;40094:115;:::o;30736:215::-;30824:4;30841:80;30850:12;:10;:12::i;:::-;30864:7;30910:10;30873:11;:25;30885:12;:10;:12::i;:::-;30873:25;;;;;;;;;;;;;;;:34;30899:7;30873:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;30841:8;:80::i;:::-;30939:4;30932:11;;30736:215;;;;:::o;40918:135::-;5752:12;:10;:12::i;:::-;5741:23;;:7;:5;:7::i;:::-;:23;;;5733:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41007:4:::1;40988:9;:16;40998:5;40988:16;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;41039:5;41027:18;;;;;;;;;;;;40918:135:::0;:::o;43296:160::-;5983:4;5970:17;;:9;:7;:9::i;:::-;:17;;;:44;;;;6002:12;:10;:12::i;:::-;5991:23;;:7;:5;:7::i;:::-;:23;;;5970:44;5962:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;43383:28:::1;43389:12;43403:7;43383:5;:28::i;:::-;43428:12;43423:27;;;43442:7;43423:27;;;;;;:::i;:::-;;;;;;;;43296:160:::0;;:::o;4755:184::-;5752:12;:10;:12::i;:::-;5741:23;;:7;:5;:7::i;:::-;:23;;;5733:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4874:4:::1;4840:9;:31;4850:20;4840:31;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;4912:20;4890:43;;;;;;;;;;;;4755:184:::0;:::o;27968:127::-;28042:7;28069:9;:18;28079:7;28069:18;;;;;;;;;;;;;;;;28062:25;;27968:127;;;:::o;6430:94::-;5752:12;:10;:12::i;:::-;5741:23;;:7;:5;:7::i;:::-;:23;;;5733:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6495:21:::1;6513:1;6495:9;:21::i;:::-;6430:94::o:0;5505:103::-;5553:4;5577:9;:23;5587:12;:10;:12::i;:::-;5577:23;;;;;;;;;;;;;;;;;;;;;;;;;5570:30;;5505:103;:::o;39836:128::-;39905:7;39932:24;:7;:14;39940:5;39932:14;;;;;;;;;;;;;;;:22;:24::i;:::-;39925:31;;39836:128;;;:::o;41403:148::-;2163:13;;;;;;;;;;;:30;;;;2181:12;;;;;;;;;;2180:13;2163:30;2155:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;2257:19;2280:13;;;;;;;;;;;2279:14;2257:36;;2308:14;2304:101;;;2355:4;2339:13;;:20;;;;;;;;;;;;;;;;;;2389:4;2374:12;;:19;;;;;;;;;;;;;;;;;;2304:101;41455:16:::1;:14;:16::i;:::-;41478:31;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;::::0;:12:::1;:31::i;:::-;41516:29;;;;;;;;;;;;;;;;;::::0;:18:::1;:29::i;:::-;2435:14:::0;2431:68;;;2482:5;2466:13;;:21;;;;;;;;;;;;;;;;;;2431:68;2144:362;41403:148::o;5327:87::-;5373:7;5400:6;;;;;;;;;;;5393:13;;5327:87;:::o;26616:104::-;26672:13;26705:7;26698:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26616:104;:::o;4124:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;43521:148::-;5983:4;5970:17;;:9;:7;:9::i;:::-;:17;;;:44;;;;6002:12;:10;:12::i;:::-;5991:23;;:7;:5;:7::i;:::-;:23;;;5970:44;5962:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;43604:24:::1;43610:8;43620:7;43604:5;:24::i;:::-;43645:8;43640:23;;;43655:7;43640:23;;;;;;:::i;:::-;;;;;;;;43521:148:::0;;:::o;31454:413::-;31547:4;31564:24;31591:11;:25;31603:12;:10;:12::i;:::-;31591:25;;;;;;;;;;;;;;;:34;31617:7;31591:34;;;;;;;;;;;;;;;;31564:61;;31664:15;31644:16;:35;;31636:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;31757:67;31766:12;:10;:12::i;:::-;31780:7;31808:15;31789:16;:34;31757:8;:67::i;:::-;31855:4;31848:11;;;31454:413;;;;:::o;41877:250::-;41980:4;40774:9;:23;40784:12;:10;:12::i;:::-;40774:23;;;;;;;;;;;;;;;;;;;;;;;;;40773:24;40765:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;42023:4:::1;42001:27;;:10;:27;;::::0;41993:79:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;42086:35;42101:10;42113:7;42086:14;:35::i;:::-;42079:42;;41877:250:::0;;;;:::o;37011:418::-;5752:12;:10;:12::i;:::-;5741:23;;:7;:5;:7::i;:::-;:23;;;5733:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25389:1:::1;37188:14;:42;37180:51;;;::::0;::::1;;25433:2;37248:9;:28;37240:37;;;::::0;::::1;;37304:14;37286:15;:32;;;;37362:10;:8;:10::i;:::-;37357:2;37352:20;;;;:::i;:::-;37340:9;:32;;;;:::i;:::-;37327:10;:45;;;;37388:35;37395:15;;37412:10;;37388:35;;;;;;;:::i;:::-;;;;;;;;37011:418:::0;;:::o;39114:656::-;39358:8;39339:15;:27;;39331:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;39413:18;39455:16;;39473:5;39480:7;39489:5;39496:16;39506:5;39496:9;:16::i;:::-;39514:8;39444:79;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39434:90;;;;;;39413:111;;39537:12;39552:28;39569:10;39552:16;:28::i;:::-;39537:43;;39593:14;39610:39;39635:4;39641:1;39644;39647;39610:24;:39::i;:::-;39593:56;;39678:5;39668:15;;:6;:15;;;39660:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;39731:31;39740:5;39747:7;39756:5;39731:8;:31::i;:::-;39320:450;;;39114:656;;;;;;;:::o;43111:122::-;43158:28;43164:12;:10;:12::i;:::-;43178:7;43158:5;:28::i;:::-;43214:12;:10;:12::i;:::-;43198:29;;;43205:7;43198:29;;;;;;:::i;:::-;;;;;;;;43111:122;:::o;41653:218::-;41744:7;41764:9;:19;41774:8;41764:19;;;;;;;;;;;;;;;;;;;;;;;;;41760:59;;;41801:10;41794:17;;;;41760:59;41832:33;41848:6;41856:8;41832:15;:33::i;:::-;41825:40;;41653:218;;;;;:::o;25219:34::-;;;;:::o;4945:192::-;5752:12;:10;:12::i;:::-;5741:23;;:7;:5;:7::i;:::-;:23;;;5733:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5067:5:::1;5033:9;:31;5043:20;5033:31;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;5110:20;5084:47;;;;;;;;;;;;4945:192:::0;:::o;6679:::-;5752:12;:10;:12::i;:::-;5741:23;;:7;:5;:7::i;:::-;:23;;;5733:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6788:1:::1;6768:22;;:8;:22;;::::0;6760:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;6844:19;6854:8;6844:9;:19::i;:::-;6679:192:::0;:::o;40867:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;3253:98::-;3306:7;3333:10;3326:17;;3253:98;:::o;35138:380::-;35291:1;35274:19;;:5;:19;;;35266:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35372:1;35353:21;;:7;:21;;;35345:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35456:6;35426:11;:18;35438:5;35426:18;;;;;;;;;;;;;;;:27;35445:7;35426:27;;;;;;;;;;;;;;;:36;;;;35494:7;35478:32;;35487:5;35478:32;;;35503:6;35478:32;;;;;;:::i;:::-;;;;;;;;35138:380;;;:::o;34109:591::-;34212:1;34193:21;;:7;:21;;;34185:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;34265:49;34286:7;34303:1;34307:6;34265:20;:49::i;:::-;34327:22;34352:9;:18;34362:7;34352:18;;;;;;;;;;;;;;;;34327:43;;34407:6;34389:14;:24;;34381:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;34526:6;34509:14;:23;34488:9;:18;34498:7;34488:18;;;;;;;;;;;;;;;:44;;;;34570:6;34554:12;;:22;;;;;;;:::i;:::-;;;;;;;;34620:1;34594:37;;34603:7;34594:37;;;34624:6;34594:37;;;;;;:::i;:::-;;;;;;;;34644:48;34664:7;34681:1;34685:6;34644:19;:48::i;:::-;34174:526;34109:591;;:::o;32357:733::-;32515:1;32497:20;;:6;:20;;;32489:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;32599:1;32578:23;;:9;:23;;;32570:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;32654:47;32675:6;32683:9;32694:6;32654:20;:47::i;:::-;32714:21;32738:9;:17;32748:6;32738:17;;;;;;;;;;;;;;;;32714:41;;32791:6;32774:13;:23;;32766:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;32912:6;32896:13;:22;32876:9;:17;32886:6;32876:17;;;;;;;;;;;;;;;:42;;;;32964:6;32940:9;:20;32950:9;32940:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;33005:9;32988:35;;32997:6;32988:35;;;33016:6;32988:35;;;;;;:::i;:::-;;;;;;;;33036:46;33056:6;33064:9;33075:6;33036:19;:46::i;:::-;32478:612;32357:733;;;:::o;29668:659::-;29808:4;29825:11;29839:15;29847:6;29839:7;:15::i;:::-;29825:29;;29865:17;29894:3;29885:6;:12;;;;:::i;:::-;29865:32;;29908:39;29918:6;29926:9;29937;29908;:39::i;:::-;29968:1;29962:3;:7;29958:71;;;29986:31;29996:6;30004:7;:5;:7::i;:::-;30013:3;29986:9;:31::i;:::-;29958:71;30041:24;30068:11;:19;30080:6;30068:19;;;;;;;;;;;;;;;:33;30088:12;:10;:12::i;:::-;30068:33;;;;;;;;;;;;;;;;30041:60;;30140:6;30120:16;:26;;30112:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;30227:57;30236:6;30244:12;:10;:12::i;:::-;30277:6;30258:16;:25;30227:8;:57::i;:::-;30315:4;30308:11;;;;;29668:659;;;;;:::o;11435:162::-;11488:7;11515:74;10168:95;11549:17;:15;:17::i;:::-;11568:20;:18;:20::i;:::-;11515:21;:74::i;:::-;11508:81;;11435:162;:::o;33377:399::-;33480:1;33461:21;;:7;:21;;;33453:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33531:49;33560:1;33564:7;33573:6;33531:20;:49::i;:::-;33609:6;33593:12;;:22;;;;;;;:::i;:::-;;;;;;;;33648:6;33626:9;:18;33636:7;33626:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;33691:7;33670:37;;33687:1;33670:37;;;33700:6;33670:37;;;;;;:::i;:::-;;;;;;;;33720:48;33748:1;33752:7;33761:6;33720:19;:48::i;:::-;33377:399;;:::o;6879:173::-;6935:16;6954:6;;;;;;;;;;;6935:25;;6980:8;6971:6;;:17;;;;;;;;;;;;;;;;;;7035:8;7004:40;;7025:8;7004:40;;;;;;;;;;;;6924:128;6879:173;:::o;20110:114::-;20175:7;20202;:14;;;20195:21;;20110:114;;;:::o;4561:129::-;2163:13;;;;;;;;;;;:30;;;;2181:12;;;;;;;;;;2180:13;2163:30;2155:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;2257:19;2280:13;;;;;;;;;;;2279:14;2257:36;;2308:14;2304:101;;;2355:4;2339:13;;:20;;;;;;;;;;;;;;;;;;2389:4;2374:12;;:19;;;;;;;;;;;;;;;;;;2304:101;4619:26:::1;:24;:26::i;:::-;4656;:24;:26::i;:::-;2435:14:::0;2431:68;;;2482:5;2466:13;;:21;;;;;;;;;;;;;;;;;;2431:68;2144:362;4561:129::o;25981:181::-;2163:13;;;;;;;;;;;:30;;;;2181:12;;;;;;;;;;2180:13;2163:30;2155:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;2257:19;2280:13;;;;;;;;;;;2279:14;2257:36;;2308:14;2304:101;;;2355:4;2339:13;;:20;;;;;;;;;;;;;;;;;;2389:4;2374:12;;:19;;;;;;;;;;;;;;;;;;2304:101;26079:26:::1;:24;:26::i;:::-;26116:38;26139:5;26146:7;26116:22;:38::i;:::-;2435:14:::0;2431:68;;;2482:5;2466:13;;:21;;;;;;;;;;;;;;;;;;2431:68;2144:362;25981:181;;:::o;38652:200::-;2163:13;;;;;;;;;;;:30;;;;2181:12;;;;;;;;;;2180:13;2163:30;2155:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;2257:19;2280:13;;;;;;;;;;;2279:14;2257:36;;2308:14;2304:101;;;2355:4;2339:13;;:20;;;;;;;;;;;;;;;;;;2389:4;2374:12;;:19;;;;;;;;;;;;;;;;;;2304:101;38732:26:::1;:24;:26::i;:::-;38769:34;38793:4;38769:34;;;;;;;;;;;;;;;;::::0;:23:::1;:34::i;:::-;38814:30;:28;:30::i;:::-;2435:14:::0;2431:68;;;2482:5;2466:13;;:21;;;;;;;;;;;;;;;;;;2431:68;2144:362;38652:200;:::o;28308:348::-;28394:4;28411:11;28425:15;28433:6;28425:7;:15::i;:::-;28411:29;;28451:17;28480:3;28471:6;:12;;;;:::i;:::-;28451:32;;28494:45;28504:12;:10;:12::i;:::-;28518:9;28529;28494;:45::i;:::-;28560:1;28554:3;:7;28550:77;;;28578:37;28588:12;:10;:12::i;:::-;28602:7;:5;:7::i;:::-;28611:3;28578:9;:37::i;:::-;28550:77;28644:4;28637:11;;;;28308:348;;;;:::o;40347:218::-;40407:15;40435:41;40479:7;:14;40487:5;40479:14;;;;;;;;;;;;;;;40435:58;;40514:15;:5;:13;:15::i;:::-;40504:25;;40540:17;:5;:15;:17::i;:::-;40424:141;40347:218;;;:::o;12510:178::-;12587:7;12614:66;12647:20;:18;:20::i;:::-;12669:10;12614:32;:66::i;:::-;12607:73;;12510:178;;;:::o;16732:1512::-;16860:7;17799:66;17793:1;17785:10;;:80;;17763:164;;;;;;;;;;;;:::i;:::-;;;;;;;;;17951:2;17946:1;:7;;;:18;;;;17962:2;17957:1;:7;;;17946:18;17938:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;18101:14;18118:24;18128:4;18134:1;18137;18140;18118:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18101:41;;18179:1;18161:20;;:6;:20;;;18153:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;18230:6;18223:13;;;16732:1512;;;;;;:::o;28719:151::-;28808:7;28835:11;:18;28847:5;28835:18;;;;;;;;;;;;;;;:27;28854:7;28835:27;;;;;;;;;;;;;;;;28828:34;;28719:151;;;;:::o;36118:125::-;;;;:::o;36847:124::-;;;;:::o;27705:200::-;27758:7;27774:8;27814:5;27795:15;;27786:6;:24;;;;:::i;:::-;27785:34;;;;:::i;:::-;27774:45;;27836:10;;27830:3;:16;27826:57;;;27865:10;;27859:16;;27826:57;27896:3;27889:10;;;27705:200;;;:::o;12932:105::-;12990:7;13017:12;;13010:19;;12932:105;:::o;13284:111::-;13345:7;13372:15;;13365:22;;13284:111;:::o;11605:263::-;11749:7;11797:8;11807;11817:11;11830:13;11853:4;11786:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;11776:84;;;;;;11769:91;;11605:263;;;;;:::o;3182:65::-;2163:13;;;;;;;;;;;:30;;;;2181:12;;;;;;;;;;2180:13;2163:30;2155:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;2257:19;2280:13;;;;;;;;;;;2279:14;2257:36;;2308:14;2304:101;;;2355:4;2339:13;;:20;;;;;;;;;;;;;;;;;;2389:4;2374:12;;:19;;;;;;;;;;;;;;;;;;2304:101;2435:14;2431:68;;;2482:5;2466:13;;:21;;;;;;;;;;;;;;;;;;2431:68;2144:362;3182:65::o;5147:99::-;2163:13;;;;;;;;;;;:30;;;;2181:12;;;;;;;;;;2180:13;2163:30;2155:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;2257:19;2280:13;;;;;;;;;;;2279:14;2257:36;;2308:14;2304:101;;;2355:4;2339:13;;:20;;;;;;;;;;;;;;;;;;2389:4;2374:12;;:19;;;;;;;;;;;;;;;;;;2304:101;5215:23:::1;5225:12;:10;:12::i;:::-;5215:9;:23::i;:::-;2435:14:::0;2431:68;;;2482:5;2466:13;;:21;;;;;;;;;;;;;;;;;;2431:68;2144:362;5147:99::o;26170:157::-;2163:13;;;;;;;;;;;:30;;;;2181:12;;;;;;;;;;2180:13;2163:30;2155:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;2257:19;2280:13;;;;;;;;;;;2279:14;2257:36;;2308:14;2304:101;;;2355:4;2339:13;;:20;;;;;;;;;;;;;;;;;;2389:4;2374:12;;:19;;;;;;;;;;;;;;;;;;2304:101;26286:5:::1;26278;:13;;;;;;:::i;:::-;;26312:7;26302;:17;;;;;;:::i;:::-;;2435:14:::0;2431:68;;;2482:5;2466:13;;:21;;;;;;;;;;;;;;;;;;2431:68;2144:362;26170:157;;:::o;11047:297::-;2163:13;;;;;;;;;;;:30;;;;2181:12;;;;;;;;;;2180:13;2163:30;2155:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;2257:19;2280:13;;;;;;;;;;;2279:14;2257:36;;2308:14;2304:101;;;2355:4;2339:13;;:20;;;;;;;;;;;;;;;;;;2389:4;2374:12;;:19;;;;;;;;;;;;;;;;;;2304:101;11155:18:::1;11192:4;11176:22;;;;;;11155:43;;11209:21;11249:7;11233:25;;;;;;11209:49;;11284:10;11269:12;:25;;;;11323:13;11305:15;:31;;;;11144:200;;2435:14:::0;2431:68;;;2482:5;2466:13;;:21;;;;;;;;;;;;;;;;;;2431:68;2144:362;11047:297;;:::o;38860:188::-;2163:13;;;;;;;;;;;:30;;;;2181:12;;;;;;;;;;2180:13;2163:30;2155:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;2257:19;2280:13;;;;;;;;;;;2279:14;2257:36;;2308:14;2304:101;;;2355:4;2339:13;;:20;;;;;;;;;;;;;;;;;;2389:4;2374:12;;:19;;;;;;;;;;;;;;;;;;2304:101;38951:95:::1;38932:16;:114;;;;2435:14:::0;2431:68;;;2482:5;2466:13;;:21;;;;;;;;;;;;;;;;;;2431:68;2144:362;38860:188::o;20232:127::-;20339:1;20321:7;:14;;;:19;;;;;;;;;;;20232:127;:::o;19163:196::-;19256:7;19322:15;19339:10;19293:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;19283:68;;;;;;19276:75;;19163:196;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1349:75::-;1382:6;1415:2;1409:9;1399:19;;1349:75;:::o;1430:117::-;1539:1;1536;1529:12;1553:117;1662:1;1659;1652:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:329::-;3505:6;3554:2;3542:9;3533:7;3529:23;3525:32;3522:119;;;3560:79;;:::i;:::-;3522:119;3680:1;3705:53;3750:7;3741:6;3730:9;3726:22;3705:53;:::i;:::-;3695:63;;3651:117;3446:329;;;;:::o;3781:118::-;3868:24;3886:5;3868:24;:::i;:::-;3863:3;3856:37;3781:118;;:::o;3905:222::-;3998:4;4036:2;4025:9;4021:18;4013:26;;4049:71;4117:1;4106:9;4102:17;4093:6;4049:71;:::i;:::-;3905:222;;;;:::o;4133:117::-;4242:1;4239;4232:12;4256:180;4304:77;4301:1;4294:88;4401:4;4398:1;4391:15;4425:4;4422:1;4415:15;4442:281;4525:27;4547:4;4525:27;:::i;:::-;4517:6;4513:40;4655:6;4643:10;4640:22;4619:18;4607:10;4604:34;4601:62;4598:88;;;4666:18;;:::i;:::-;4598:88;4706:10;4702:2;4695:22;4485:238;4442:281;;:::o;4729:129::-;4763:6;4790:20;;:::i;:::-;4780:30;;4819:33;4847:4;4839:6;4819:33;:::i;:::-;4729:129;;;:::o;4864:311::-;4941:4;5031:18;5023:6;5020:30;5017:56;;;5053:18;;:::i;:::-;5017:56;5103:4;5095:6;5091:17;5083:25;;5163:4;5157;5153:15;5145:23;;4864:311;;;:::o;5181:117::-;5290:1;5287;5280:12;5321:710;5417:5;5442:81;5458:64;5515:6;5458:64;:::i;:::-;5442:81;:::i;:::-;5433:90;;5543:5;5572:6;5565:5;5558:21;5606:4;5599:5;5595:16;5588:23;;5659:4;5651:6;5647:17;5639:6;5635:30;5688:3;5680:6;5677:15;5674:122;;;5707:79;;:::i;:::-;5674:122;5822:6;5805:220;5839:6;5834:3;5831:15;5805:220;;;5914:3;5943:37;5976:3;5964:10;5943:37;:::i;:::-;5938:3;5931:50;6010:4;6005:3;6001:14;5994:21;;5881:144;5865:4;5860:3;5856:14;5849:21;;5805:220;;;5809:21;5423:608;;5321:710;;;;;:::o;6054:370::-;6125:5;6174:3;6167:4;6159:6;6155:17;6151:27;6141:122;;6182:79;;:::i;:::-;6141:122;6299:6;6286:20;6324:94;6414:3;6406:6;6399:4;6391:6;6387:17;6324:94;:::i;:::-;6315:103;;6131:293;6054:370;;;;:::o;6430:311::-;6507:4;6597:18;6589:6;6586:30;6583:56;;;6619:18;;:::i;:::-;6583:56;6669:4;6661:6;6657:17;6649:25;;6729:4;6723;6719:15;6711:23;;6430:311;;;:::o;6764:710::-;6860:5;6885:81;6901:64;6958:6;6901:64;:::i;:::-;6885:81;:::i;:::-;6876:90;;6986:5;7015:6;7008:5;7001:21;7049:4;7042:5;7038:16;7031:23;;7102:4;7094:6;7090:17;7082:6;7078:30;7131:3;7123:6;7120:15;7117:122;;;7150:79;;:::i;:::-;7117:122;7265:6;7248:220;7282:6;7277:3;7274:15;7248:220;;;7357:3;7386:37;7419:3;7407:10;7386:37;:::i;:::-;7381:3;7374:50;7453:4;7448:3;7444:14;7437:21;;7324:144;7308:4;7303:3;7299:14;7292:21;;7248:220;;;7252:21;6866:608;;6764:710;;;;;:::o;7497:370::-;7568:5;7617:3;7610:4;7602:6;7598:17;7594:27;7584:122;;7625:79;;:::i;:::-;7584:122;7742:6;7729:20;7767:94;7857:3;7849:6;7842:4;7834:6;7830:17;7767:94;:::i;:::-;7758:103;;7574:293;7497:370;;;;:::o;7873:894::-;7991:6;7999;8048:2;8036:9;8027:7;8023:23;8019:32;8016:119;;;8054:79;;:::i;:::-;8016:119;8202:1;8191:9;8187:17;8174:31;8232:18;8224:6;8221:30;8218:117;;;8254:79;;:::i;:::-;8218:117;8359:78;8429:7;8420:6;8409:9;8405:22;8359:78;:::i;:::-;8349:88;;8145:302;8514:2;8503:9;8499:18;8486:32;8545:18;8537:6;8534:30;8531:117;;;8567:79;;:::i;:::-;8531:117;8672:78;8742:7;8733:6;8722:9;8718:22;8672:78;:::i;:::-;8662:88;;8457:303;7873:894;;;;;:::o;8773:619::-;8850:6;8858;8866;8915:2;8903:9;8894:7;8890:23;8886:32;8883:119;;;8921:79;;:::i;:::-;8883:119;9041:1;9066:53;9111:7;9102:6;9091:9;9087:22;9066:53;:::i;:::-;9056:63;;9012:117;9168:2;9194:53;9239:7;9230:6;9219:9;9215:22;9194:53;:::i;:::-;9184:63;;9139:118;9296:2;9322:53;9367:7;9358:6;9347:9;9343:22;9322:53;:::i;:::-;9312:63;;9267:118;8773:619;;;;;:::o;9398:86::-;9433:7;9473:4;9466:5;9462:16;9451:27;;9398:86;;;:::o;9490:112::-;9573:22;9589:5;9573:22;:::i;:::-;9568:3;9561:35;9490:112;;:::o;9608:214::-;9697:4;9735:2;9724:9;9720:18;9712:26;;9748:67;9812:1;9801:9;9797:17;9788:6;9748:67;:::i;:::-;9608:214;;;;:::o;9828:77::-;9865:7;9894:5;9883:16;;9828:77;;;:::o;9911:118::-;9998:24;10016:5;9998:24;:::i;:::-;9993:3;9986:37;9911:118;;:::o;10035:222::-;10128:4;10166:2;10155:9;10151:18;10143:26;;10179:71;10247:1;10236:9;10232:17;10223:6;10179:71;:::i;:::-;10035:222;;;;:::o;10263:118::-;10350:24;10368:5;10350:24;:::i;:::-;10345:3;10338:37;10263:118;;:::o;10387:222::-;10480:4;10518:2;10507:9;10503:18;10495:26;;10531:71;10599:1;10588:9;10584:17;10575:6;10531:71;:::i;:::-;10387:222;;;;:::o;10615:474::-;10683:6;10691;10740:2;10728:9;10719:7;10715:23;10711:32;10708:119;;;10746:79;;:::i;:::-;10708:119;10866:1;10891:53;10936:7;10927:6;10916:9;10912:22;10891:53;:::i;:::-;10881:63;;10837:117;10993:2;11019:53;11064:7;11055:6;11044:9;11040:22;11019:53;:::i;:::-;11009:63;;10964:118;10615:474;;;;;:::o;11095:118::-;11166:22;11182:5;11166:22;:::i;:::-;11159:5;11156:33;11146:61;;11203:1;11200;11193:12;11146:61;11095:118;:::o;11219:135::-;11263:5;11301:6;11288:20;11279:29;;11317:31;11342:5;11317:31;:::i;:::-;11219:135;;;;:::o;11360:122::-;11433:24;11451:5;11433:24;:::i;:::-;11426:5;11423:35;11413:63;;11472:1;11469;11462:12;11413:63;11360:122;:::o;11488:139::-;11534:5;11572:6;11559:20;11550:29;;11588:33;11615:5;11588:33;:::i;:::-;11488:139;;;;:::o;11633:1199::-;11744:6;11752;11760;11768;11776;11784;11792;11841:3;11829:9;11820:7;11816:23;11812:33;11809:120;;;11848:79;;:::i;:::-;11809:120;11968:1;11993:53;12038:7;12029:6;12018:9;12014:22;11993:53;:::i;:::-;11983:63;;11939:117;12095:2;12121:53;12166:7;12157:6;12146:9;12142:22;12121:53;:::i;:::-;12111:63;;12066:118;12223:2;12249:53;12294:7;12285:6;12274:9;12270:22;12249:53;:::i;:::-;12239:63;;12194:118;12351:2;12377:53;12422:7;12413:6;12402:9;12398:22;12377:53;:::i;:::-;12367:63;;12322:118;12479:3;12506:51;12549:7;12540:6;12529:9;12525:22;12506:51;:::i;:::-;12496:61;;12450:117;12606:3;12633:53;12678:7;12669:6;12658:9;12654:22;12633:53;:::i;:::-;12623:63;;12577:119;12735:3;12762:53;12807:7;12798:6;12787:9;12783:22;12762:53;:::i;:::-;12752:63;;12706:119;11633:1199;;;;;;;;;;:::o;12838:329::-;12897:6;12946:2;12934:9;12925:7;12921:23;12917:32;12914:119;;;12952:79;;:::i;:::-;12914:119;13072:1;13097:53;13142:7;13133:6;13122:9;13118:22;13097:53;:::i;:::-;13087:63;;13043:117;12838:329;;;;:::o;13173:474::-;13241:6;13249;13298:2;13286:9;13277:7;13273:23;13269:32;13266:119;;;13304:79;;:::i;:::-;13266:119;13424:1;13449:53;13494:7;13485:6;13474:9;13470:22;13449:53;:::i;:::-;13439:63;;13395:117;13551:2;13577:53;13622:7;13613:6;13602:9;13598:22;13577:53;:::i;:::-;13567:63;;13522:118;13173:474;;;;;:::o;13653:180::-;13701:77;13698:1;13691:88;13798:4;13795:1;13788:15;13822:4;13819:1;13812:15;13839:320;13883:6;13920:1;13914:4;13910:12;13900:22;;13967:1;13961:4;13957:12;13988:18;13978:81;;14044:4;14036:6;14032:17;14022:27;;13978:81;14106:2;14098:6;14095:14;14075:18;14072:38;14069:84;;14125:18;;:::i;:::-;14069:84;13890:269;13839:320;;;:::o;14165:182::-;14305:34;14301:1;14293:6;14289:14;14282:58;14165:182;:::o;14353:366::-;14495:3;14516:67;14580:2;14575:3;14516:67;:::i;:::-;14509:74;;14592:93;14681:3;14592:93;:::i;:::-;14710:2;14705:3;14701:12;14694:19;;14353:366;;;:::o;14725:419::-;14891:4;14929:2;14918:9;14914:18;14906:26;;14978:9;14972:4;14968:20;14964:1;14953:9;14949:17;14942:47;15006:131;15132:4;15006:131;:::i;:::-;14998:139;;14725:419;;;:::o;15150:226::-;15290:34;15286:1;15278:6;15274:14;15267:58;15359:9;15354:2;15346:6;15342:15;15335:34;15150:226;:::o;15382:366::-;15524:3;15545:67;15609:2;15604:3;15545:67;:::i;:::-;15538:74;;15621:93;15710:3;15621:93;:::i;:::-;15739:2;15734:3;15730:12;15723:19;;15382:366;;;:::o;15754:419::-;15920:4;15958:2;15947:9;15943:18;15935:26;;16007:9;16001:4;15997:20;15993:1;15982:9;15978:17;15971:47;16035:131;16161:4;16035:131;:::i;:::-;16027:139;;15754:419;;;:::o;16179:179::-;16319:31;16315:1;16307:6;16303:14;16296:55;16179:179;:::o;16364:366::-;16506:3;16527:67;16591:2;16586:3;16527:67;:::i;:::-;16520:74;;16603:93;16692:3;16603:93;:::i;:::-;16721:2;16716:3;16712:12;16705:19;;16364:366;;;:::o;16736:419::-;16902:4;16940:2;16929:9;16925:18;16917:26;;16989:9;16983:4;16979:20;16975:1;16964:9;16960:17;16953:47;17017:131;17143:4;17017:131;:::i;:::-;17009:139;;16736:419;;;:::o;17161:180::-;17209:77;17206:1;17199:88;17306:4;17303:1;17296:15;17330:4;17327:1;17320:15;17347:180;17395:77;17392:1;17385:88;17492:4;17489:1;17482:15;17516:4;17513:1;17506:15;17533:233;17572:3;17595:24;17613:5;17595:24;:::i;:::-;17586:33;;17641:66;17634:5;17631:77;17628:103;;17711:18;;:::i;:::-;17628:103;17758:1;17751:5;17747:13;17740:20;;17533:233;;;:::o;17772:226::-;17912:34;17908:1;17900:6;17896:14;17889:58;17981:9;17976:2;17968:6;17964:15;17957:34;17772:226;:::o;18004:366::-;18146:3;18167:67;18231:2;18226:3;18167:67;:::i;:::-;18160:74;;18243:93;18332:3;18243:93;:::i;:::-;18361:2;18356:3;18352:12;18345:19;;18004:366;;;:::o;18376:419::-;18542:4;18580:2;18569:9;18565:18;18557:26;;18629:9;18623:4;18619:20;18615:1;18604:9;18600:17;18593:47;18657:131;18783:4;18657:131;:::i;:::-;18649:139;;18376:419;;;:::o;18801:191::-;18841:3;18860:20;18878:1;18860:20;:::i;:::-;18855:25;;18894:20;18912:1;18894:20;:::i;:::-;18889:25;;18937:1;18934;18930:9;18923:16;;18958:3;18955:1;18952:10;18949:36;;;18965:18;;:::i;:::-;18949:36;18801:191;;;;:::o;18998:227::-;19138:34;19134:1;19126:6;19122:14;19115:58;19207:10;19202:2;19194:6;19190:15;19183:35;18998:227;:::o;19231:366::-;19373:3;19394:67;19458:2;19453:3;19394:67;:::i;:::-;19387:74;;19470:93;19559:3;19470:93;:::i;:::-;19588:2;19583:3;19579:12;19572:19;;19231:366;;;:::o;19603:419::-;19769:4;19807:2;19796:9;19792:18;19784:26;;19856:9;19850:4;19846:20;19842:1;19831:9;19827:17;19820:47;19884:131;20010:4;19884:131;:::i;:::-;19876:139;;19603:419;;;:::o;20028:233::-;20168:34;20164:1;20156:6;20152:14;20145:58;20237:16;20232:2;20224:6;20220:15;20213:41;20028:233;:::o;20267:366::-;20409:3;20430:67;20494:2;20489:3;20430:67;:::i;:::-;20423:74;;20506:93;20595:3;20506:93;:::i;:::-;20624:2;20619:3;20615:12;20608:19;;20267:366;;;:::o;20639:419::-;20805:4;20843:2;20832:9;20828:18;20820:26;;20892:9;20886:4;20882:20;20878:1;20867:9;20863:17;20856:47;20920:131;21046:4;20920:131;:::i;:::-;20912:139;;20639:419;;;:::o;21064:224::-;21204:34;21200:1;21192:6;21188:14;21181:58;21273:7;21268:2;21260:6;21256:15;21249:32;21064:224;:::o;21294:366::-;21436:3;21457:67;21521:2;21516:3;21457:67;:::i;:::-;21450:74;;21533:93;21622:3;21533:93;:::i;:::-;21651:2;21646:3;21642:12;21635:19;;21294:366;;;:::o;21666:419::-;21832:4;21870:2;21859:9;21855:18;21847:26;;21919:9;21913:4;21909:20;21905:1;21894:9;21890:17;21883:47;21947:131;22073:4;21947:131;:::i;:::-;21939:139;;21666:419;;;:::o;22091:102::-;22133:8;22180:5;22177:1;22173:13;22152:34;;22091:102;;;:::o;22199:848::-;22260:5;22267:4;22291:6;22282:15;;22315:5;22306:14;;22329:712;22350:1;22340:8;22337:15;22329:712;;;22445:4;22440:3;22436:14;22430:4;22427:24;22424:50;;;22454:18;;:::i;:::-;22424:50;22504:1;22494:8;22490:16;22487:451;;;22919:4;22912:5;22908:16;22899:25;;22487:451;22969:4;22963;22959:15;22951:23;;22999:32;23022:8;22999:32;:::i;:::-;22987:44;;22329:712;;;22199:848;;;;;;;:::o;23053:1073::-;23107:5;23298:8;23288:40;;23319:1;23310:10;;23321:5;;23288:40;23347:4;23337:36;;23364:1;23355:10;;23366:5;;23337:36;23433:4;23481:1;23476:27;;;;23517:1;23512:191;;;;23426:277;;23476:27;23494:1;23485:10;;23496:5;;;23512:191;23557:3;23547:8;23544:17;23541:43;;;23564:18;;:::i;:::-;23541:43;23613:8;23610:1;23606:16;23597:25;;23648:3;23641:5;23638:14;23635:40;;;23655:18;;:::i;:::-;23635:40;23688:5;;;23426:277;;23812:2;23802:8;23799:16;23793:3;23787:4;23784:13;23780:36;23762:2;23752:8;23749:16;23744:2;23738:4;23735:12;23731:35;23715:111;23712:246;;;23868:8;23862:4;23858:19;23849:28;;23903:3;23896:5;23893:14;23890:40;;;23910:18;;:::i;:::-;23890:40;23943:5;;23712:246;23983:42;24021:3;24011:8;24005:4;24002:1;23983:42;:::i;:::-;23968:57;;;;24057:4;24052:3;24048:14;24041:5;24038:25;24035:51;;;24066:18;;:::i;:::-;24035:51;24115:4;24108:5;24104:16;24095:25;;23053:1073;;;;;;:::o;24132:281::-;24190:5;24214:23;24232:4;24214:23;:::i;:::-;24206:31;;24258:25;24274:8;24258:25;:::i;:::-;24246:37;;24302:104;24339:66;24329:8;24323:4;24302:104;:::i;:::-;24293:113;;24132:281;;;;:::o;24419:410::-;24459:7;24482:20;24500:1;24482:20;:::i;:::-;24477:25;;24516:20;24534:1;24516:20;:::i;:::-;24511:25;;24571:1;24568;24564:9;24593:30;24611:11;24593:30;:::i;:::-;24582:41;;24772:1;24763:7;24759:15;24756:1;24753:22;24733:1;24726:9;24706:83;24683:139;;24802:18;;:::i;:::-;24683:139;24467:362;24419:410;;;;:::o;24835:332::-;24956:4;24994:2;24983:9;24979:18;24971:26;;25007:71;25075:1;25064:9;25060:17;25051:6;25007:71;:::i;:::-;25088:72;25156:2;25145:9;25141:18;25132:6;25088:72;:::i;:::-;24835:332;;;;;:::o;25173:179::-;25313:31;25309:1;25301:6;25297:14;25290:55;25173:179;:::o;25358:366::-;25500:3;25521:67;25585:2;25580:3;25521:67;:::i;:::-;25514:74;;25597:93;25686:3;25597:93;:::i;:::-;25715:2;25710:3;25706:12;25699:19;;25358:366;;;:::o;25730:419::-;25896:4;25934:2;25923:9;25919:18;25911:26;;25983:9;25977:4;25973:20;25969:1;25958:9;25954:17;25947:47;26011:131;26137:4;26011:131;:::i;:::-;26003:139;;25730:419;;;:::o;26155:775::-;26388:4;26426:3;26415:9;26411:19;26403:27;;26440:71;26508:1;26497:9;26493:17;26484:6;26440:71;:::i;:::-;26521:72;26589:2;26578:9;26574:18;26565:6;26521:72;:::i;:::-;26603;26671:2;26660:9;26656:18;26647:6;26603:72;:::i;:::-;26685;26753:2;26742:9;26738:18;26729:6;26685:72;:::i;:::-;26767:73;26835:3;26824:9;26820:19;26811:6;26767:73;:::i;:::-;26850;26918:3;26907:9;26903:19;26894:6;26850:73;:::i;:::-;26155:775;;;;;;;;;:::o;26936:180::-;27076:32;27072:1;27064:6;27060:14;27053:56;26936:180;:::o;27122:366::-;27264:3;27285:67;27349:2;27344:3;27285:67;:::i;:::-;27278:74;;27361:93;27450:3;27361:93;:::i;:::-;27479:2;27474:3;27470:12;27463:19;;27122:366;;;:::o;27494:419::-;27660:4;27698:2;27687:9;27683:18;27675:26;;27747:9;27741:4;27737:20;27733:1;27722:9;27718:17;27711:47;27775:131;27901:4;27775:131;:::i;:::-;27767:139;;27494:419;;;:::o;27919:225::-;28059:34;28055:1;28047:6;28043:14;28036:58;28128:8;28123:2;28115:6;28111:15;28104:33;27919:225;:::o;28150:366::-;28292:3;28313:67;28377:2;28372:3;28313:67;:::i;:::-;28306:74;;28389:93;28478:3;28389:93;:::i;:::-;28507:2;28502:3;28498:12;28491:19;;28150:366;;;:::o;28522:419::-;28688:4;28726:2;28715:9;28711:18;28703:26;;28775:9;28769:4;28765:20;28761:1;28750:9;28746:17;28739:47;28803:131;28929:4;28803:131;:::i;:::-;28795:139;;28522:419;;;:::o;28947:223::-;29087:34;29083:1;29075:6;29071:14;29064:58;29156:6;29151:2;29143:6;29139:15;29132:31;28947:223;:::o;29176:366::-;29318:3;29339:67;29403:2;29398:3;29339:67;:::i;:::-;29332:74;;29415:93;29504:3;29415:93;:::i;:::-;29533:2;29528:3;29524:12;29517:19;;29176:366;;;:::o;29548:419::-;29714:4;29752:2;29741:9;29737:18;29729:26;;29801:9;29795:4;29791:20;29787:1;29776:9;29772:17;29765:47;29829:131;29955:4;29829:131;:::i;:::-;29821:139;;29548:419;;;:::o;29973:221::-;30113:34;30109:1;30101:6;30097:14;30090:58;30182:4;30177:2;30169:6;30165:15;30158:29;29973:221;:::o;30200:366::-;30342:3;30363:67;30427:2;30422:3;30363:67;:::i;:::-;30356:74;;30439:93;30528:3;30439:93;:::i;:::-;30557:2;30552:3;30548:12;30541:19;;30200:366;;;:::o;30572:419::-;30738:4;30776:2;30765:9;30761:18;30753:26;;30825:9;30819:4;30815:20;30811:1;30800:9;30796:17;30789:47;30853:131;30979:4;30853:131;:::i;:::-;30845:139;;30572:419;;;:::o;30997:220::-;31137:34;31133:1;31125:6;31121:14;31114:58;31206:3;31201:2;31193:6;31189:15;31182:28;30997:220;:::o;31223:366::-;31365:3;31386:67;31450:2;31445:3;31386:67;:::i;:::-;31379:74;;31462:93;31551:3;31462:93;:::i;:::-;31580:2;31575:3;31571:12;31564:19;;31223:366;;;:::o;31595:419::-;31761:4;31799:2;31788:9;31784:18;31776:26;;31848:9;31842:4;31838:20;31834:1;31823:9;31819:17;31812:47;31876:131;32002:4;31876:131;:::i;:::-;31868:139;;31595:419;;;:::o;32020:221::-;32160:34;32156:1;32148:6;32144:14;32137:58;32229:4;32224:2;32216:6;32212:15;32205:29;32020:221;:::o;32247:366::-;32389:3;32410:67;32474:2;32469:3;32410:67;:::i;:::-;32403:74;;32486:93;32575:3;32486:93;:::i;:::-;32604:2;32599:3;32595:12;32588:19;;32247:366;;;:::o;32619:419::-;32785:4;32823:2;32812:9;32808:18;32800:26;;32872:9;32866:4;32862:20;32858:1;32847:9;32843:17;32836:47;32900:131;33026:4;32900:131;:::i;:::-;32892:139;;32619:419;;;:::o;33044:194::-;33084:4;33104:20;33122:1;33104:20;:::i;:::-;33099:25;;33138:20;33156:1;33138:20;:::i;:::-;33133:25;;33182:1;33179;33175:9;33167:17;;33206:1;33200:4;33197:11;33194:37;;;33211:18;;:::i;:::-;33194:37;33044:194;;;;:::o;33244:224::-;33384:34;33380:1;33372:6;33368:14;33361:58;33453:7;33448:2;33440:6;33436:15;33429:32;33244:224;:::o;33474:366::-;33616:3;33637:67;33701:2;33696:3;33637:67;:::i;:::-;33630:74;;33713:93;33802:3;33713:93;:::i;:::-;33831:2;33826:3;33822:12;33815:19;;33474:366;;;:::o;33846:419::-;34012:4;34050:2;34039:9;34035:18;34027:26;;34099:9;34093:4;34089:20;34085:1;34074:9;34070:17;34063:47;34127:131;34253:4;34127:131;:::i;:::-;34119:139;;33846:419;;;:::o;34271:222::-;34411:34;34407:1;34399:6;34395:14;34388:58;34480:5;34475:2;34467:6;34463:15;34456:30;34271:222;:::o;34499:366::-;34641:3;34662:67;34726:2;34721:3;34662:67;:::i;:::-;34655:74;;34738:93;34827:3;34738:93;:::i;:::-;34856:2;34851:3;34847:12;34840:19;;34499:366;;;:::o;34871:419::-;35037:4;35075:2;35064:9;35060:18;35052:26;;35124:9;35118:4;35114:20;35110:1;35099:9;35095:17;35088:47;35152:131;35278:4;35152:131;:::i;:::-;35144:139;;34871:419;;;:::o;35296:225::-;35436:34;35432:1;35424:6;35420:14;35413:58;35505:8;35500:2;35492:6;35488:15;35481:33;35296:225;:::o;35527:366::-;35669:3;35690:67;35754:2;35749:3;35690:67;:::i;:::-;35683:74;;35766:93;35855:3;35766:93;:::i;:::-;35884:2;35879:3;35875:12;35868:19;;35527:366;;;:::o;35899:419::-;36065:4;36103:2;36092:9;36088:18;36080:26;;36152:9;36146:4;36142:20;36138:1;36127:9;36123:17;36116:47;36180:131;36306:4;36180:131;:::i;:::-;36172:139;;35899:419;;;:::o;36324:227::-;36464:34;36460:1;36452:6;36448:14;36441:58;36533:10;36528:2;36520:6;36516:15;36509:35;36324:227;:::o;36557:366::-;36699:3;36720:67;36784:2;36779:3;36720:67;:::i;:::-;36713:74;;36796:93;36885:3;36796:93;:::i;:::-;36914:2;36909:3;36905:12;36898:19;;36557:366;;;:::o;36929:419::-;37095:4;37133:2;37122:9;37118:18;37110:26;;37182:9;37176:4;37172:20;37168:1;37157:9;37153:17;37146:47;37210:131;37336:4;37210:131;:::i;:::-;37202:139;;36929:419;;;:::o;37354:181::-;37494:33;37490:1;37482:6;37478:14;37471:57;37354:181;:::o;37541:366::-;37683:3;37704:67;37768:2;37763:3;37704:67;:::i;:::-;37697:74;;37780:93;37869:3;37780:93;:::i;:::-;37898:2;37893:3;37889:12;37882:19;;37541:366;;;:::o;37913:419::-;38079:4;38117:2;38106:9;38102:18;38094:26;;38166:9;38160:4;38156:20;38152:1;38141:9;38137:17;38130:47;38194:131;38320:4;38194:131;:::i;:::-;38186:139;;37913:419;;;:::o;38338:221::-;38478:34;38474:1;38466:6;38462:14;38455:58;38547:4;38542:2;38534:6;38530:15;38523:29;38338:221;:::o;38565:366::-;38707:3;38728:67;38792:2;38787:3;38728:67;:::i;:::-;38721:74;;38804:93;38893:3;38804:93;:::i;:::-;38922:2;38917:3;38913:12;38906:19;;38565:366;;;:::o;38937:419::-;39103:4;39141:2;39130:9;39126:18;39118:26;;39190:9;39184:4;39180:20;39176:1;39165:9;39161:17;39154:47;39218:131;39344:4;39218:131;:::i;:::-;39210:139;;38937:419;;;:::o;39362:221::-;39502:34;39498:1;39490:6;39486:14;39479:58;39571:4;39566:2;39558:6;39554:15;39547:29;39362:221;:::o;39589:366::-;39731:3;39752:67;39816:2;39811:3;39752:67;:::i;:::-;39745:74;;39828:93;39917:3;39828:93;:::i;:::-;39946:2;39941:3;39937:12;39930:19;;39589:366;;;:::o;39961:419::-;40127:4;40165:2;40154:9;40150:18;40142:26;;40214:9;40208:4;40204:20;40200:1;40189:9;40185:17;40178:47;40242:131;40368:4;40242:131;:::i;:::-;40234:139;;39961:419;;;:::o;40386:545::-;40559:4;40597:3;40586:9;40582:19;40574:27;;40611:71;40679:1;40668:9;40664:17;40655:6;40611:71;:::i;:::-;40692:68;40756:2;40745:9;40741:18;40732:6;40692:68;:::i;:::-;40770:72;40838:2;40827:9;40823:18;40814:6;40770:72;:::i;:::-;40852;40920:2;40909:9;40905:18;40896:6;40852:72;:::i;:::-;40386:545;;;;;;;:::o;40937:174::-;41077:26;41073:1;41065:6;41061:14;41054:50;40937:174;:::o;41117:366::-;41259:3;41280:67;41344:2;41339:3;41280:67;:::i;:::-;41273:74;;41356:93;41445:3;41356:93;:::i;:::-;41474:2;41469:3;41465:12;41458:19;;41117:366;;;:::o;41489:419::-;41655:4;41693:2;41682:9;41678:18;41670:26;;41742:9;41736:4;41732:20;41728:1;41717:9;41713:17;41706:47;41770:131;41896:4;41770:131;:::i;:::-;41762:139;;41489:419;;;:::o;41914:180::-;41962:77;41959:1;41952:88;42059:4;42056:1;42049:15;42083:4;42080:1;42073:15;42100:185;42140:1;42157:20;42175:1;42157:20;:::i;:::-;42152:25;;42191:20;42209:1;42191:20;:::i;:::-;42186:25;;42230:1;42220:35;;42235:18;;:::i;:::-;42220:35;42277:1;42274;42270:9;42265:14;;42100:185;;;;:::o;42291:664::-;42496:4;42534:3;42523:9;42519:19;42511:27;;42548:71;42616:1;42605:9;42601:17;42592:6;42548:71;:::i;:::-;42629:72;42697:2;42686:9;42682:18;42673:6;42629:72;:::i;:::-;42711;42779:2;42768:9;42764:18;42755:6;42711:72;:::i;:::-;42793;42861:2;42850:9;42846:18;42837:6;42793:72;:::i;:::-;42875:73;42943:3;42932:9;42928:19;42919:6;42875:73;:::i;:::-;42291:664;;;;;;;;:::o;42961:141::-;43010:4;43033:3;43025:11;;43056:3;43053:1;43046:14;43090:4;43087:1;43077:18;43069:26;;42961:141;;;:::o;43108:93::-;43145:6;43192:2;43187;43180:5;43176:14;43172:23;43162:33;;43108:93;;;:::o;43207:107::-;43251:8;43301:5;43295:4;43291:16;43270:37;;43207:107;;;;:::o;43320:393::-;43389:6;43439:1;43427:10;43423:18;43462:97;43492:66;43481:9;43462:97;:::i;:::-;43580:39;43610:8;43599:9;43580:39;:::i;:::-;43568:51;;43652:4;43648:9;43641:5;43637:21;43628:30;;43701:4;43691:8;43687:19;43680:5;43677:30;43667:40;;43396:317;;43320:393;;;;;:::o;43719:60::-;43747:3;43768:5;43761:12;;43719:60;;;:::o;43785:142::-;43835:9;43868:53;43886:34;43895:24;43913:5;43895:24;:::i;:::-;43886:34;:::i;:::-;43868:53;:::i;:::-;43855:66;;43785:142;;;:::o;43933:75::-;43976:3;43997:5;43990:12;;43933:75;;;:::o;44014:269::-;44124:39;44155:7;44124:39;:::i;:::-;44185:91;44234:41;44258:16;44234:41;:::i;:::-;44226:6;44219:4;44213:11;44185:91;:::i;:::-;44179:4;44172:105;44090:193;44014:269;;;:::o;44289:73::-;44334:3;44289:73;:::o;44368:189::-;44445:32;;:::i;:::-;44486:65;44544:6;44536;44530:4;44486:65;:::i;:::-;44421:136;44368:189;;:::o;44563:186::-;44623:120;44640:3;44633:5;44630:14;44623:120;;;44694:39;44731:1;44724:5;44694:39;:::i;:::-;44667:1;44660:5;44656:13;44647:22;;44623:120;;;44563:186;;:::o;44755:543::-;44856:2;44851:3;44848:11;44845:446;;;44890:38;44922:5;44890:38;:::i;:::-;44974:29;44992:10;44974:29;:::i;:::-;44964:8;44960:44;45157:2;45145:10;45142:18;45139:49;;;45178:8;45163:23;;45139:49;45201:80;45257:22;45275:3;45257:22;:::i;:::-;45247:8;45243:37;45230:11;45201:80;:::i;:::-;44860:431;;44845:446;44755:543;;;:::o;45304:117::-;45358:8;45408:5;45402:4;45398:16;45377:37;;45304:117;;;;:::o;45427:169::-;45471:6;45504:51;45552:1;45548:6;45540:5;45537:1;45533:13;45504:51;:::i;:::-;45500:56;45585:4;45579;45575:15;45565:25;;45478:118;45427:169;;;;:::o;45601:295::-;45677:4;45823:29;45848:3;45842:4;45823:29;:::i;:::-;45815:37;;45885:3;45882:1;45878:11;45872:4;45869:21;45861:29;;45601:295;;;;:::o;45901:1395::-;46018:37;46051:3;46018:37;:::i;:::-;46120:18;46112:6;46109:30;46106:56;;;46142:18;;:::i;:::-;46106:56;46186:38;46218:4;46212:11;46186:38;:::i;:::-;46271:67;46331:6;46323;46317:4;46271:67;:::i;:::-;46365:1;46389:4;46376:17;;46421:2;46413:6;46410:14;46438:1;46433:618;;;;47095:1;47112:6;47109:77;;;47161:9;47156:3;47152:19;47146:26;47137:35;;47109:77;47212:67;47272:6;47265:5;47212:67;:::i;:::-;47206:4;47199:81;47068:222;46403:887;;46433:618;46485:4;46481:9;46473:6;46469:22;46519:37;46551:4;46519:37;:::i;:::-;46578:1;46592:208;46606:7;46603:1;46600:14;46592:208;;;46685:9;46680:3;46676:19;46670:26;46662:6;46655:42;46736:1;46728:6;46724:14;46714:24;;46783:2;46772:9;46768:18;46755:31;;46629:4;46626:1;46622:12;46617:17;;46592:208;;;46828:6;46819:7;46816:19;46813:179;;;46886:9;46881:3;46877:19;46871:26;46929:48;46971:4;46963:6;46959:17;46948:9;46929:48;:::i;:::-;46921:6;46914:64;46836:156;46813:179;47038:1;47034;47026:6;47022:14;47018:22;47012:4;47005:36;46440:611;;;46403:887;;45993:1303;;;45901:1395;;:::o;47302:148::-;47404:11;47441:3;47426:18;;47302:148;;;;:::o;47456:214::-;47596:66;47592:1;47584:6;47580:14;47573:90;47456:214;:::o;47676:400::-;47836:3;47857:84;47939:1;47934:3;47857:84;:::i;:::-;47850:91;;47950:93;48039:3;47950:93;:::i;:::-;48068:1;48063:3;48059:11;48052:18;;47676:400;;;:::o;48082:79::-;48121:7;48150:5;48139:16;;48082:79;;;:::o;48167:157::-;48272:45;48292:24;48310:5;48292:24;:::i;:::-;48272:45;:::i;:::-;48267:3;48260:58;48167:157;;:::o;48330:663::-;48571:3;48593:148;48737:3;48593:148;:::i;:::-;48586:155;;48751:75;48822:3;48813:6;48751:75;:::i;:::-;48851:2;48846:3;48842:12;48835:19;;48864:75;48935:3;48926:6;48864:75;:::i;:::-;48964:2;48959:3;48955:12;48948:19;;48984:3;48977:10;;48330:663;;;;;:::o
Swarm Source
ipfs://c023d3532c1553679e0a60d53f7d91a905a3cfb3350549b024db76f772b62c0a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.