Ready to onboard to Polygon? With MetaMask Portfolio, you're in control.
15M+ users trust MoonPay. Checkout with your preferred payment method.
Get up to 0.5% cashback per purchase and receive daily interest.
3000+ Slots, 20+ Cryptos, 75K Raffle, Sports Promos - World's largest Crypto Casino & Sportsbook - Provably Fair!
Play in crypto to make deposits and withdrawals easy! Register and get a free daily shot at a progressive jackpot.
Play and Win POL!
Daily free Spin 50000 Matic ,760% Deposit Bonus, 20%Rakeback, And Get 1000000 Matic free bonus on BC.Game
Deposit BONUS 300% and Cashbacks. without verification!
Join Metawin for the ultimate Web3 Casino Experience. Frictionless Signup & Instant Withdrawals. Play Now & Earn $MWIN Points.
Overview
MATIC Balance
MATIC Value
$0.00Token Holdings
Could not find any matches!
- ERC-20 Tokens (>100)43,767 AAVE [ACCESS AAVE.ASIA]! AAVE.asia (AAVE [...)9,650 Access Airdrop Link [zksyon.one]! Airdrop: Z... (Access...)3,420 Access [1000ena.org] to receive your token! Ethena [10... (Access...)9,860 ACCESS [ETH-ENA.VIP] TO RECEIVE TOKENS! ETHNA [ETH... (ACCESS...)345,870 ACCESS [TURBO-AI.APP] TO RECEIVE YOUR COINS! TURBO [TUR... (ACCESS...)29,367 SIMP$ SimpSwap.f... (SIMP)1 Acces Zerolends.com to calim rewardAcces Zerole... (Acces ...)1 BTCBitcoin (BTC)2 BFWTBlue Fen Win... (BFWT)80,000 nft.bitconnect666.comFree NFT go ... (nft.bi...)80,000 https://pepe-erc.vipFree Pepe go... (https:...)80,000 pepe-erc.vipFree PEPE go... (pepe-e...)100 Some very long token symbol www.ankr.com .HELLO . (Some v...)100 IGTInfinity Gol... (IGT)1 MBNFTmbirdNFT.com (MBNFT)300,000 MNEPMinereum Polygon50 SCTsanitize-blo... (SCT)829,170 SYTSaveYourToke... (SYT)1 Some very long token symbol *Some very lo... (Some v...)1 Some very long token symbol /Some very lo... (Some v...)1 Some very long token symbol /Some very lo... (Some v...)1 Some very long token symbol }Some very lo... (Some v...)1 Some very long token symbolSome very lo... (Some v...)888,888 vanity-address.iovanity-addre... (vanity...)1 ZKMAZERO KNOWLED... (ZKMA)1 zerolends.comzerolends.co... (zerole...)7,864 TokenERC-20 TOKEN*[Suspicious]900,000,000 TokenERC-20 TOKEN*[Suspicious]745,900 TokenERC-20 TOKEN*[Suspicious]745,000 TokenERC-20 TOKEN*[Suspicious]9,467 TokenERC-20 TOKEN*[Suspicious]7,800 TokenERC-20 TOKEN*[Suspicious]8,726 TokenERC-20 TOKEN*[Suspicious]9,543 TokenERC-20 TOKEN*[Suspicious]7,680 TokenERC-20 TOKEN*[Suspicious]9,543 TokenERC-20 TOKEN*[Suspicious]110,000 TokenERC-20 TOKEN*[Suspicious]8,750 TokenERC-20 TOKEN*[Suspicious]8,750 TokenERC-20 TOKEN*[Suspicious]7,800 TokenERC-20 TOKEN*[Suspicious]7,800 TokenERC-20 TOKEN*[Suspicious]900,000,000 TokenERC-20 TOKEN*[Suspicious]3,680 TokenERC-20 TOKEN*[Suspicious]90,000,000,000 TokenERC-20 TOKEN*[Suspicious]900,000,000 TokenERC-20 TOKEN*[Suspicious]989 TokenERC-20 TOKEN*[Suspicious]1 TokenERC-20 TOKEN*[Suspicious]1 TokenERC-20 TOKEN*[Suspicious]1 TokenERC-20 TOKEN*[Suspicious]1 TokenERC-20 TOKEN*[Suspicious]60,000 TokenERC-20 TOKEN*[Suspicious]1 TokenERC-20 TOKEN*[Suspicious]1 TokenERC-20 TOKEN*[Suspicious]10,000 TokenERC-20 TOKEN*[Unsafe]10,000 TokenERC-20 TOKEN*[Unsafe]10,000 TokenERC-20 TOKEN*[Unsafe]10,000 TokenERC-20 TOKEN*[Unsafe]10,000 TokenERC-20 TOKEN*[Unsafe]527,642 TokenERC-20 TOKEN*[Unsafe]90,000,000 TokenERC-20 TOKEN*[Spam]90,000,000 TokenERC-20 TOKEN*[Spam]90,000,000 TokenERC-20 TOKEN*[Spam]90,000,000 TokenERC-20 TOKEN*[Spam]2,985 TokenERC-20 TOKEN*[Spam]8 TokenERC-20 TOKEN*[Spam]368,520 TokenERC-20 TOKEN*[Spam]27,500 TokenERC-20 TOKEN*[Spam]550,000 TokenERC-20 TOKEN*[Spam]550,000 TokenERC-20 TOKEN*[Spam]550,000 TokenERC-20 TOKEN*[Spam]8,726 TokenERC-20 TOKEN*[Spam]8,400 TokenERC-20 TOKEN*[Spam]8 TokenERC-20 TOKEN*[Spam]8,273 TokenERC-20 TOKEN*[Spam]8,273 TokenERC-20 TOKEN*[Spam]4,376 TokenERC-20 TOKEN*[Spam]85,600 TokenERC-20 TOKEN*[Spam]550,000 TokenERC-20 TOKEN*[Spam]900,000,000 TokenERC-20 TOKEN*[Spam]956 TokenERC-20 TOKEN*[Spam]78,530 TokenERC-20 TOKEN*[Spam]9,000,000,000 TokenERC-20 TOKEN*[Spam]35,800 TokenERC-20 TOKEN*[Spam]9,000,000 TokenERC-20 TOKEN*[Spam]9,000,000,000 TokenERC-20 TOKEN*[Spam]9,000,000 TokenERC-20 TOKEN*[Spam]20 TokenERC-20 TOKEN*[Spam]9,000,000,000 TokenERC-20 TOKEN*[Spam]1 TokenERC-20 TOKEN*[Spam]1 TokenERC-20 TOKEN*[Spam]1 TokenERC-20 TOKEN*[Spam]1 TokenERC-20 TOKEN*[Spam]1 TokenERC-20 TOKEN*[Spam]647,800 TokenERC-20 TOKEN*[Spam]1 TokenERC-20 TOKEN*[Spam]1 TokenERC-20 TOKEN*[Spam]39 TokenERC-20 TOKEN*[Spam]1 TokenERC-20 TOKEN*[Spam]1 TokenERC-20 TOKEN*[Spam]1 TokenERC-20 TOKEN*[Spam]NFT Tokens (34)GIVEAWAY$100,000,000ERC-1155NFT Voucher3 stETHERC-1155Vouchers5 stETH EventERC-1155NFT Voucher5000 USDCERC-1155NFT Voucher5000 USDCERC-1155NFT Voucher5000 USDT VoucherERC-1155NFTVoucher5000$ CYBERERC-1155Vouchers50M $SHIB VoucherERC-1155AAVE-V3-LPAave LP PositionsERC-1155AAVE-V3-POSAave Positions AirdropERC-1155AAVE-V3-POSAave Positions AirdropERC-1155AAVE-V3-POSAave Positions AirdropERC-1155APE COINAPE NFT TICKETSERC-1155APE COINAPE NFT TICKETSERC-1155APE COINAPE NFT TICKETSERC-1155NFT VoucherSTAXERC-1155UNI-V3-PoSUniswap V3 Positions NFT-V1ERC-1155UNI-V3-PoSUniswap V3 Positions NFT-V1ERC-1155UNI-V3-PoSUniswap V3 Positions NFT-V1ERC-1155ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]Advanced Filter
- Filter by Tx Type:
- Tx
- Internal Tx
- ERC-20
- NFTs
Latest 25 from a total of 426,902 transactions
Transaction Hash MethodBlockFromToRegister Identit... 60221305 2024-08-05 11:46:20 1 min ago 1722858380 IN 0 MATIC$0.00 0.10399106 344.60601958 Register Identit... 60221252 2024-08-05 11:44:06 4 mins ago 1722858246 IN 0 MATIC$0.00 0.09201816 285.99361687 Register Identit... 60220942 2024-08-05 11:32:56 15 mins ago 1722857576 IN 0 MATIC$0.00 0.07871681 260.85208774 Register Identit... 60220608 2024-08-05 11:20:36 27 mins ago 1722856836 IN 0 MATIC$0.00 0.09035685 299.39316274 Register Identit... 60220576 2024-08-05 11:19:28 28 mins ago 1722856768 IN 0 MATIC$0.00 0.08960432 296.93117761 Register Identit... 60220529 2024-08-05 11:17:48 30 mins ago 1722856668 IN 0 MATIC$0.00 0.08155655 270.24451062 Register Identit... 60220510 2024-08-05 11:17:06 31 mins ago 1722856626 IN 0 MATIC$0.00 0.09107022 283.07557104 Register Identit... 60220493 2024-08-05 11:16:30 31 mins ago 1722856590 IN 0 MATIC$0.00 0.09024011 299.02614903 Register Identit... 60220435 2024-08-05 11:13:56 34 mins ago 1722856436 IN 0 MATIC$0.00 0.08920658 277.25521389 Register Identit... 60220147 2024-08-05 11:03:44 44 mins ago 1722855824 IN 0 MATIC$0.00 0.06921599 229.34391256 Register Identit... 60220146 2024-08-05 11:03:42 44 mins ago 1722855822 IN 0 MATIC$0.00 0.06920865 229.34391256 Register Identit... 60220091 2024-08-05 11:01:44 46 mins ago 1722855704 IN 0 MATIC$0.00 0.07085308 234.79323063 Register Identit... 60219873 2024-08-05 10:53:30 54 mins ago 1722855210 IN 0 MATIC$0.00 0.06636424 219.90352678 Register Identit... 60219853 2024-08-05 10:52:46 55 mins ago 1722855166 IN 0 MATIC$0.00 0.06636688 219.90352678 Register Identit... 60219726 2024-08-05 10:48:16 1 hrs ago 1722854896 IN 0 MATIC$0.00 0.06636688 219.90352678 Register Identit... 60219721 2024-08-05 10:48:06 1 hr ago 1722854886 IN 0 MATIC$0.00 0.07075373 219.90352678 Register Identit... 60219721 2024-08-05 10:48:06 1 hr ago 1722854886 IN 0 MATIC$0.00 0.06635984 219.90352678 Register Identit... 60219507 2024-08-05 10:40:00 1 hr ago 1722854400 IN 0 MATIC$0.00 0.06636248 219.90352678 Register Identit... 60219426 2024-08-05 10:37:08 1 hr ago 1722854228 IN 0 MATIC$0.00 0.06635984 219.90352678 Register Identit... 60219208 2024-08-05 10:29:10 1 hr ago 1722853750 IN 0 MATIC$0.00 0.06049348 200.45558291 Register Identit... 60219047 2024-08-05 10:23:10 1 hr ago 1722853390 IN 0 MATIC$0.00 0.10651555 352.93425939 Register Identit... 60219036 2024-08-05 10:22:46 1 hr ago 1722853366 IN 0 MATIC$0.00 0.12627074 392.47548536 Register Identit... 60218989 2024-08-05 10:21:06 1 hr ago 1722853266 IN 0 MATIC$0.00 0.12207931 379.44767158 Register Identit... 60218511 2024-08-05 10:03:38 1 hr ago 1722852218 IN 0 MATIC$0.00 0.05524004 171.68677552 Register Identit... 60218449 2024-08-05 10:01:28 1 hr ago 1722852088 IN 0 MATIC$0.00 0.07501987 248.57480415 Latest 25 internal transactions (View All)
Parent Transaction Hash Block From To 60221305 2024-08-05 11:46:20 1 min ago 1722858380 Contract Creation 0 MATIC$0.00 60221252 2024-08-05 11:44:06 4 mins ago 1722858246 Contract Creation 0 MATIC$0.00 60220942 2024-08-05 11:32:56 15 mins ago 1722857576 Contract Creation 0 MATIC$0.00 60220608 2024-08-05 11:20:36 27 mins ago 1722856836 Contract Creation 0 MATIC$0.00 60220576 2024-08-05 11:19:28 28 mins ago 1722856768 Contract Creation 0 MATIC$0.00 60220529 2024-08-05 11:17:48 30 mins ago 1722856668 Contract Creation 0 MATIC$0.00 60220510 2024-08-05 11:17:06 31 mins ago 1722856626 Contract Creation 0 MATIC$0.00 60220493 2024-08-05 11:16:30 31 mins ago 1722856590 Contract Creation 0 MATIC$0.00 60220435 2024-08-05 11:13:56 34 mins ago 1722856436 Contract Creation 0 MATIC$0.00 60220147 2024-08-05 11:03:44 44 mins ago 1722855824 Contract Creation 0 MATIC$0.00 60220146 2024-08-05 11:03:42 44 mins ago 1722855822 Contract Creation 0 MATIC$0.00 60220091 2024-08-05 11:01:44 46 mins ago 1722855704 Contract Creation 0 MATIC$0.00 60219873 2024-08-05 10:53:30 54 mins ago 1722855210 Contract Creation 0 MATIC$0.00 60219853 2024-08-05 10:52:46 55 mins ago 1722855166 Contract Creation 0 MATIC$0.00 60219726 2024-08-05 10:48:16 1 hrs ago 1722854896 Contract Creation 0 MATIC$0.00 60219721 2024-08-05 10:48:06 1 hr ago 1722854886 Contract Creation 0 MATIC$0.00 60219721 2024-08-05 10:48:06 1 hr ago 1722854886 Contract Creation 0 MATIC$0.00 60219507 2024-08-05 10:40:00 1 hr ago 1722854400 Contract Creation 0 MATIC$0.00 60219426 2024-08-05 10:37:08 1 hr ago 1722854228 Contract Creation 0 MATIC$0.00 60219208 2024-08-05 10:29:10 1 hr ago 1722853750 Contract Creation 0 MATIC$0.00 60219047 2024-08-05 10:23:10 1 hr ago 1722853390 Contract Creation 0 MATIC$0.00 60219036 2024-08-05 10:22:46 1 hr ago 1722853366 Contract Creation 0 MATIC$0.00 60218989 2024-08-05 10:21:06 1 hr ago 1722853266 Contract Creation 0 MATIC$0.00 60218511 2024-08-05 10:03:38 1 hr ago 1722852218 Contract Creation 0 MATIC$0.00 60218449 2024-08-05 10:01:28 1 hr ago 1722852088 Contract Creation 0 MATIC$0.00 Loading...LoadingThis contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.Contract Name:Registry
Compiler Versionv0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
- library ECDSA
- - function _throwError(RecoverError err ...
- - function tryRecover(bytes32 hash, byt ...
- - function recover(bytes32 hash, bytes ...
- - function tryRecover(
- - function recover(
- - function tryRecover(
- - function recover(
- - function toEthSignedMessageHash(bytes ...
- - function toTypedDataHash(bytes32 doma ...
- interface IERC20
- - function totalSupply()
- - function balanceOf(address account)
- - function transfer(address recipient, ...
- - function allowance(address owner, add ...
- - function approve(address spender, uin ...
- - function transferFrom(
- - function upgrade(uint256 value)
- interface IHermesContract
- - function initialize(address _token, a ...
- - function openChannel(address _party, ...
- - function getOperator()
- - function getStake()
- - function getStatus()
- contract Ownable
- - function owner()
- - function transferOwnership(address ne ...
- contract FundsRecovery is Ownable, ...
- - function setFundsDestination(address ...
- - function getFundsDestination()
- - function claimEthers()
- - function claimTokens(address _token)
- contract Utils
- - function getChainID()
- - function max(uint a, uint b)
- - function min(uint a, uint b)
- - function round(uint a, uint m)
- interface Channel
- - function initialize(address _token, a ...
- contract Registry is FundsRecovery ... *
- - function()
- - function initialize(address _tokenAdd ...
- - function isInitialized()
- - function registerIdentity(address _he ...
- - function openConsumerChannel(address ...
- - function openConsumerChannel(address ...
- - function _openChannel(address _identi ...
- - function registerHermes(address _herm ...
- - function getChannelAddress(address _i ...
- - function getHermes(address _hermesId)
- - function getHermesAddress(address _he ...
- - function getHermesAddress(address _he ...
- - function getHermesURL(address _hermes ...
- - function updateHermesURL(address _her ...
- - function getCreate2Address(bytes32 _s ...
- - function getProxyCode(address _implem ...
- - function deployMiniProxy(uint256 _sal ...
- - function getBeneficiary(address _iden ...
- - function setBeneficiary(address _iden ...
- - function setMinimalHermesStake(uint25 ...
- - function getChannelImplementation()
- - function getChannelImplementation(uin ...
- - function getHermesImplementation()
- - function getHermesImplementation(uint ...
- - function setImplementations(address _ ...
- - function getLastImplVer()
- - function isSmartContract(address _add ...
- - function hasParentRegistry()
- - function isRegistered(address _identi ...
- - function isHermes(address _hermesId)
- - function isActiveHermes(address _herm ...
- - function isChannelOpened(address _ide ...
- - function transferCollectedFeeTo(addre ...
/** *Submitted for verification at polygonscan.com on 2021-11-28 */ /** *Submitted for verification at polygonscan.com on 2021-10-18 */ // File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } abstract contract IERC20Token is IERC20 { function upgrade(uint256 value) public virtual; } interface IHermesContract { enum Status { Active, Paused, Punishment, Closed } function initialize(address _token, address _operator, uint16 _hermesFee, uint256 _minStake, uint256 _maxStake, address payable _routerAddress) external; function openChannel(address _party, uint256 _amountToLend) external; function getOperator() external view returns (address); function getStake() external view returns (uint256); function getStatus() external view returns (Status); } contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); function owner() public view returns (address) { return _owner; } modifier onlyOwner() { require(_owner == msg.sender || _owner == address(0x0), "Ownable: caller is not the owner"); _; } function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } contract FundsRecovery is Ownable, ReentrancyGuard { address payable internal fundsDestination; IERC20Token public token; event DestinationChanged(address indexed previousDestination, address indexed newDestination); /** * Setting new destination of funds recovery. */ function setFundsDestination(address payable _newDestination) public virtual onlyOwner { require(_newDestination != address(0)); emit DestinationChanged(fundsDestination, _newDestination); fundsDestination = _newDestination; } /** * Getting funds destination address. */ function getFundsDestination() public view returns (address) { return fundsDestination; } /** * Possibility to recover funds in case they were sent to this address before smart contract deployment */ function claimEthers() public nonReentrant { require(fundsDestination != address(0)); fundsDestination.transfer(address(this).balance); } /** Transfers selected tokens into owner address. */ function claimTokens(address _token) public nonReentrant { require(fundsDestination != address(0)); require(_token != address(token), "native token funds can't be recovered"); uint256 _amount = IERC20Token(_token).balanceOf(address(this)); IERC20Token(_token).transfer(fundsDestination, _amount); } } contract Utils { function getChainID() internal view returns (uint256) { uint256 chainID; assembly { chainID := chainid() } return chainID; } function max(uint a, uint b) internal pure returns (uint) { return a > b ? a : b; } function min(uint a, uint b) internal pure returns (uint) { return a < b ? a : b; } function round(uint a, uint m) internal pure returns (uint ) { return ((a + m - 1) / m) * m; } } interface Channel { function initialize(address _token, address _dex, address _identityHash, address _hermesId, uint256 _fee) external; } contract Registry is FundsRecovery, Utils { using ECDSA for bytes32; uint256 public lastNonce; address payable public dex; // Any uniswap v2 compatible DEX router address uint256 public minimalHermesStake; Registry public parentRegistry; // If there is parent registry, we will check for struct Implementation { address channelImplAddress; address hermesImplAddress; } Implementation[] internal implementations; struct Hermes { address operator; // hermes operator who will sign promises uint256 implVer; // version of hermes implementation smart contract function() external view returns(uint256) stake; bytes url; // hermes service URL } mapping(address => Hermes) private hermeses; mapping(address => address) private identities; // key: identity, value: beneficiary wallet address event RegisteredIdentity(address indexed identity, address beneficiary); event RegisteredHermes(address indexed hermesId, address hermesOperator, bytes ur); event HermesURLUpdated(address indexed hermesId, bytes newURL); event ConsumerChannelCreated(address indexed identity, address indexed hermesId, address channelAddress); event BeneficiaryChanged(address indexed identity, address newBeneficiary); event MinimalHermesStakeChanged(uint256 newMinimalStake); // Reject any ethers sent to this smart-contract receive() external payable { revert("Registry: Rejecting tx with ethers sent"); } // We're using `initialize` instead of `constructor` to ensure easy way to deploy Registry into // deterministic address on any EVM compatible chain. Registry should be first be deployed using // `deployRegistry` scripts and then initialized with wanted token and implementations. function initialize(address _tokenAddress, address payable _dexAddress, uint256 _minimalHermesStake, address _channelImplementation, address _hermesImplementation, address payable _parentRegistry) public onlyOwner { require(!isInitialized(), "Registry: is already initialized"); minimalHermesStake = _minimalHermesStake; require(_tokenAddress != address(0)); token = IERC20Token(_tokenAddress); require(_dexAddress != address(0)); dex = _dexAddress; // Set initial channel implementations setImplementations(_channelImplementation, _hermesImplementation); // We set initial owner to be sure transferOwnership(msg.sender); // Set parent registry, if `0x0` then this is root registry parentRegistry = Registry(_parentRegistry); } function isInitialized() public view returns (bool) { return address(token) != address(0); } // Register provider and open his channel with given hermes // _stakeAmount - it's amount of tokens staked into hermes to guarantee incomming channel's balance. // _beneficiary - payout address during settlements in hermes channel, if provided 0x0 then will be set to consumer channel address. function registerIdentity(address _hermesId, uint256 _stakeAmount, uint256 _transactorFee, address _beneficiary, bytes memory _signature) public { require(isActiveHermes(_hermesId), "Registry: provided hermes have to be active"); // Check if given signature is valid address _identity = keccak256(abi.encodePacked(getChainID(), address(this), _hermesId, _stakeAmount, _transactorFee, _beneficiary)).recover(_signature); require(_identity != address(0), "Registry: wrong identity signature"); // Tokens amount to get from channel to cover tx fee and provider's stake uint256 _totalFee = _stakeAmount + _transactorFee; require(_totalFee <= token.balanceOf(getChannelAddress(_identity, _hermesId)), "Registry: not enought funds in channel to cover fees"); // Open consumer channel _openChannel(_identity, _hermesId, _beneficiary, _totalFee); // If stake is provided we additionally are opening channel with hermes (a.k.a provider channel) if (_stakeAmount > 0) { IHermesContract(_hermesId).openChannel(_identity, _stakeAmount); } // Pay fee for transaction maker if (_transactorFee > 0) { token.transfer(msg.sender, _transactorFee); } } // Deploys consumer channel and sets beneficiary as newly created channel address function openConsumerChannel(address _hermesId, uint256 _transactorFee, bytes memory _signature) public { require(isActiveHermes(_hermesId), "Registry: provided hermes have to be active"); // Check if given signature is valid address _identity = keccak256(abi.encodePacked(getChainID(), address(this), _hermesId, _transactorFee)).recover(_signature); require(_identity != address(0), "Registry: wrong channel openinig signature"); require(_transactorFee <= token.balanceOf(getChannelAddress(_identity, _hermesId)), "Registry: not enought funds in channel to cover fees"); _openChannel(_identity, _hermesId, address(0), _transactorFee); } // Allows to securely deploy channel's smart contract without consumer signature function openConsumerChannel(address _identity, address _hermesId) public { require(isActiveHermes(_hermesId), "Registry: provided hermes have to be active"); require(!isChannelOpened(_identity, _hermesId), "Registry: such consumer channel is already opened"); _openChannel(_identity, _hermesId, address(0), 0); } // Deploy payment channel for given consumer identity // We're using minimal proxy (EIP1167) to save on gas cost and blockchain space. function _openChannel(address _identity, address _hermesId, address _beneficiary, uint256 _fee) internal returns (address) { bytes32 _salt = keccak256(abi.encodePacked(_identity, _hermesId)); bytes memory _code = getProxyCode(getChannelImplementation(hermeses[_hermesId].implVer)); Channel _channel = Channel(deployMiniProxy(uint256(_salt), _code)); _channel.initialize(address(token), dex, _identity, _hermesId, _fee); emit ConsumerChannelCreated(_identity, _hermesId, address(_channel)); // If beneficiary was not provided, then we're going to use consumer channel for that if (_beneficiary == address(0)) { _beneficiary = address(_channel); } // Mark identity as registered (only during first channel opening) if (!isRegistered(_identity)) { identities[_identity] = _beneficiary; emit RegisteredIdentity(_identity, _beneficiary); } return address(_channel); } function registerHermes(address _hermesOperator, uint256 _hermesStake, uint16 _hermesFee, uint256 _minChannelStake, uint256 _maxChannelStake, bytes memory _url) public { require(isInitialized(), "Registry: only initialized registry can register hermeses"); require(_hermesOperator != address(0), "Registry: hermes operator can't be zero address"); require(_hermesStake >= minimalHermesStake, "Registry: hermes have to stake at least minimal stake amount"); address _hermesId = getHermesAddress(_hermesOperator); require(!isHermes(_hermesId), "Registry: hermes already registered"); // Deploy hermes contract (mini proxy which is pointing to implementation) IHermesContract _hermes = IHermesContract(deployMiniProxy(uint256(uint160(_hermesOperator)), getProxyCode(getHermesImplementation()))); // Transfer stake into hermes smart contract token.transferFrom(msg.sender, address(_hermes), _hermesStake); // Initialise hermes _hermes.initialize(address(token), _hermesOperator, _hermesFee, _minChannelStake, _maxChannelStake, dex); // Save info about newly created hermes hermeses[_hermesId] = Hermes(_hermesOperator, getLastImplVer(), _hermes.getStake, _url); // Approve hermes contract to `transferFrom` registry (used during hermes channel openings) token.approve(_hermesId, type(uint256).max); emit RegisteredHermes(_hermesId, _hermesOperator, _url); } function getChannelAddress(address _identity, address _hermesId) public view returns (address) { bytes32 _code = keccak256(getProxyCode(getChannelImplementation(hermeses[_hermesId].implVer))); bytes32 _salt = keccak256(abi.encodePacked(_identity, _hermesId)); return getCreate2Address(_salt, _code); } function getHermes(address _hermesId) public view returns (Hermes memory) { return isHermes(_hermesId) || !hasParentRegistry() ? hermeses[_hermesId] : parentRegistry.getHermes(_hermesId); } function getHermesAddress(address _hermesOperator) public view returns (address) { bytes32 _code = keccak256(getProxyCode(getHermesImplementation())); return getCreate2Address(bytes32(uint256(uint160(_hermesOperator))), _code); } function getHermesAddress(address _hermesOperator, uint256 _implVer) public view returns (address) { bytes32 _code = keccak256(getProxyCode(getHermesImplementation(_implVer))); return getCreate2Address(bytes32(uint256(uint160(_hermesOperator))), _code); } function getHermesURL(address _hermesId) public view returns (bytes memory) { return hermeses[_hermesId].url; } function updateHermesURL(address _hermesId, bytes memory _url, bytes memory _signature) public { require(isActiveHermes(_hermesId), "Registry: provided hermes has to be active"); // Check if given signature is valid address _operator = keccak256(abi.encodePacked(address(this), _hermesId, _url, lastNonce++)).recover(_signature); require(_operator == hermeses[_hermesId].operator, "wrong signature"); // Update URL hermeses[_hermesId].url = _url; emit HermesURLUpdated(_hermesId, _url); } // ------------ UTILS ------------ function getCreate2Address(bytes32 _salt, bytes32 _code) internal view returns (address) { return address(uint160(uint256(keccak256(abi.encodePacked( bytes1(0xff), address(this), bytes32(_salt), bytes32(_code) ))))); } function getProxyCode(address _implementation) public pure returns (bytes memory) { // `_code` is EIP 1167 - Minimal Proxy Contract // more information: https://eips.ethereum.org/EIPS/eip-1167 bytes memory _code = hex"3d602d80600a3d3981f3363d3d373d3d3d363d73bebebebebebebebebebebebebebebebebebebebe5af43d82803e903d91602b57fd5bf3"; bytes20 _targetBytes = bytes20(_implementation); for (uint8 i = 0; i < 20; i++) { _code[20 + i] = _targetBytes[i]; } return _code; } function deployMiniProxy(uint256 _salt, bytes memory _code) internal returns (address payable) { address payable _addr; assembly { _addr := create2(0, add(_code, 0x20), mload(_code), _salt) if iszero(extcodesize(_addr)) { revert(0, 0) } } return _addr; } function getBeneficiary(address _identity) public view returns (address) { if (hasParentRegistry()) return parentRegistry.getBeneficiary(_identity); return identities[_identity]; } function setBeneficiary(address _identity, address _newBeneficiary, bytes memory _signature) public { require(_newBeneficiary != address(0), "Registry: beneficiary can't be zero address"); // Always set beneficiary into root registry if (hasParentRegistry()) { parentRegistry.setBeneficiary(_identity, _newBeneficiary, _signature); } else { lastNonce = lastNonce + 1; // In signatures we should always use root registry (for backward compatibility) address _rootRegistry = hasParentRegistry() ? address(parentRegistry) : address(this); address _signer = keccak256(abi.encodePacked(getChainID(), _rootRegistry, _identity, _newBeneficiary, lastNonce)).recover(_signature); require(_signer == _identity, "Registry: have to be signed by identity owner"); identities[_identity] = _newBeneficiary; emit BeneficiaryChanged(_identity, _newBeneficiary); } } function setMinimalHermesStake(uint256 _newMinimalStake) public onlyOwner { require(isInitialized(), "Registry: only initialized registry can set new minimal hermes stake"); minimalHermesStake = _newMinimalStake; emit MinimalHermesStakeChanged(_newMinimalStake); } // -------- UTILS TO WORK WITH CHANNEL AND HERMES IMPLEMENTATIONS --------- function getChannelImplementation() public view returns (address) { return implementations[getLastImplVer()].channelImplAddress; } function getChannelImplementation(uint256 _implVer) public view returns (address) { return implementations[_implVer].channelImplAddress; } function getHermesImplementation() public view returns (address) { return implementations[getLastImplVer()].hermesImplAddress; } function getHermesImplementation(uint256 _implVer) public view returns (address) { return implementations[_implVer].hermesImplAddress; } function setImplementations(address _newChannelImplAddress, address _newHermesImplAddress) public onlyOwner { require(isInitialized(), "Registry: only initialized registry can set new implementations"); require(isSmartContract(_newChannelImplAddress) && isSmartContract(_newHermesImplAddress), "Registry: implementations have to be smart contracts"); implementations.push(Implementation(_newChannelImplAddress, _newHermesImplAddress)); } // Version of latest hermes and channel implementations function getLastImplVer() public view returns (uint256) { return implementations.length-1; } // ------------------------------------------------------------------------ function isSmartContract(address _addr) internal view returns (bool) { uint _codeLength; assembly { _codeLength := extcodesize(_addr) } return _codeLength != 0; } // If `parentRegistry` is not set, this is root registry and should return false function hasParentRegistry() public view returns (bool) { return address(parentRegistry) != address(0); } function isRegistered(address _identity) public view returns (bool) { if (hasParentRegistry()) return parentRegistry.isRegistered(_identity); // If we know its beneficiary address it is registered identity return identities[_identity] != address(0); } function isHermes(address _hermesId) public view returns (bool) { // To check if it actually properly created hermes address, we need to check if he has operator // and if with that operator we'll get proper hermes address which has code deployed there. address _hermesOperator = hermeses[_hermesId].operator; uint256 _implVer = hermeses[_hermesId].implVer; address _addr = getHermesAddress(_hermesOperator, _implVer); if (_addr != _hermesId) return false; // hermesId should be same as generated address return isSmartContract(_addr) || parentRegistry.isHermes(_hermesId); } function isActiveHermes(address _hermesId) internal view returns (bool) { // First we have to ensure that given address is registered hermes and only then check its status require(isHermes(_hermesId), "Registry: hermes have to be registered"); IHermesContract.Status status = IHermesContract(_hermesId).getStatus(); return status == IHermesContract.Status.Active; } function isChannelOpened(address _identity, address _hermesId) public view returns (bool) { return isSmartContract(getChannelAddress(_identity, _hermesId)) || isSmartContract(parentRegistry.getChannelAddress(_identity, _hermesId)); } function transferCollectedFeeTo(address _beneficiary) public onlyOwner{ uint256 _collectedFee = token.balanceOf(address(this)); require(_collectedFee > 0, "collected fee cannot be less than zero"); token.transfer(_beneficiary, _collectedFee); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"identity","type":"address"},{"indexed":false,"internalType":"address","name":"newBeneficiary","type":"address"}],"name":"BeneficiaryChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"identity","type":"address"},{"indexed":true,"internalType":"address","name":"hermesId","type":"address"},{"indexed":false,"internalType":"address","name":"channelAddress","type":"address"}],"name":"ConsumerChannelCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousDestination","type":"address"},{"indexed":true,"internalType":"address","name":"newDestination","type":"address"}],"name":"DestinationChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"hermesId","type":"address"},{"indexed":false,"internalType":"bytes","name":"newURL","type":"bytes"}],"name":"HermesURLUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMinimalStake","type":"uint256"}],"name":"MinimalHermesStakeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"hermesId","type":"address"},{"indexed":false,"internalType":"address","name":"hermesOperator","type":"address"},{"indexed":false,"internalType":"bytes","name":"ur","type":"bytes"}],"name":"RegisteredHermes","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"identity","type":"address"},{"indexed":false,"internalType":"address","name":"beneficiary","type":"address"}],"name":"RegisteredIdentity","type":"event"},{"inputs":[],"name":"claimEthers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"claimTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dex","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"}],"name":"getBeneficiary","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"},{"internalType":"address","name":"_hermesId","type":"address"}],"name":"getChannelAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_implVer","type":"uint256"}],"name":"getChannelImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChannelImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFundsDestination","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_hermesId","type":"address"}],"name":"getHermes","outputs":[{"components":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"implVer","type":"uint256"},{"internalType":"function () view external returns (uint256)","name":"stake","type":"function"},{"internalType":"bytes","name":"url","type":"bytes"}],"internalType":"struct Registry.Hermes","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_hermesOperator","type":"address"},{"internalType":"uint256","name":"_implVer","type":"uint256"}],"name":"getHermesAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_hermesOperator","type":"address"}],"name":"getHermesAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_implVer","type":"uint256"}],"name":"getHermesImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHermesImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_hermesId","type":"address"}],"name":"getHermesURL","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastImplVer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_implementation","type":"address"}],"name":"getProxyCode","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"hasParentRegistry","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"address payable","name":"_dexAddress","type":"address"},{"internalType":"uint256","name":"_minimalHermesStake","type":"uint256"},{"internalType":"address","name":"_channelImplementation","type":"address"},{"internalType":"address","name":"_hermesImplementation","type":"address"},{"internalType":"address payable","name":"_parentRegistry","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"},{"internalType":"address","name":"_hermesId","type":"address"}],"name":"isChannelOpened","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_hermesId","type":"address"}],"name":"isHermes","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"}],"name":"isRegistered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimalHermesStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_hermesId","type":"address"},{"internalType":"uint256","name":"_transactorFee","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"openConsumerChannel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"},{"internalType":"address","name":"_hermesId","type":"address"}],"name":"openConsumerChannel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"parentRegistry","outputs":[{"internalType":"contract Registry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_hermesOperator","type":"address"},{"internalType":"uint256","name":"_hermesStake","type":"uint256"},{"internalType":"uint16","name":"_hermesFee","type":"uint16"},{"internalType":"uint256","name":"_minChannelStake","type":"uint256"},{"internalType":"uint256","name":"_maxChannelStake","type":"uint256"},{"internalType":"bytes","name":"_url","type":"bytes"}],"name":"registerHermes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_hermesId","type":"address"},{"internalType":"uint256","name":"_stakeAmount","type":"uint256"},{"internalType":"uint256","name":"_transactorFee","type":"uint256"},{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"registerIdentity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"},{"internalType":"address","name":"_newBeneficiary","type":"address"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"setBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_newDestination","type":"address"}],"name":"setFundsDestination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newChannelImplAddress","type":"address"},{"internalType":"address","name":"_newHermesImplAddress","type":"address"}],"name":"setImplementations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMinimalStake","type":"uint256"}],"name":"setMinimalHermesStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20Token","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"transferCollectedFeeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_hermesId","type":"address"},{"internalType":"bytes","name":"_url","type":"bytes"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"updateHermesURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405234801561001057600080fd5b5060018055613725806100246000396000f3fe6080604052600436106102295760003560e01c8063acc831d011610123578063d16f38c8116100ab578063e617aaac1161006f578063e617aaac146106c5578063f2fde38b146106e5578063f58c5b6e14610705578063fc0c546a14610723578063ff9935cb1461074357600080fd5b8063d16f38c814610618578063d5929fe314610638578063df8de3e714610658578063e0b6c32314610678578063e3252537146106a557600080fd5b8063c957543b116100f2578063c957543b14610578578063c9b84d4d14610598578063cdd596e0146105b8578063cf10c969146105d8578063d0171d79146105f857600080fd5b8063acc831d0146104f8578063add10dda14610518578063bf1eb88a14610538578063c3c5a5471461055857600080fd5b80636332b080116101b157806385bff3411161017557806385bff341146104585780638cfef547146104785780638da5cb5b146104985780639936a87b146104b6578063ab867213146104cb57600080fd5b80636332b080146103e357806366cf5875146103f8578063692058c21461040e5780636931b5501461042e5780637c671a211461044357600080fd5b806341ca71ab116101f857806341ca71ab146103275780634787d09c1461035f5780634b6bd6be1461037f578063505a1b311461039f57806352631ab4146103bf57600080fd5b806304614e0b146102905780631de9db40146102b2578063238e130a146102e7578063392e53cd1461030757600080fd5b3661028b5760405162461bcd60e51b815260206004820152602760248201527f52656769737472793a2052656a656374696e67207478207769746820657468656044820152661c9cc81cd95b9d60ca1b60648201526084015b60405180910390fd5b600080fd5b34801561029c57600080fd5b506102b06102ab366004612f01565b610763565b005b3480156102be57600080fd5b506102d26102cd366004612f5a565b61091c565b60405190151581526020015b60405180910390f35b3480156102f357600080fd5b506102b0610302366004612f93565b6109c5565b34801561031357600080fd5b506003546001600160a01b031615156102d2565b34801561033357600080fd5b50610347610342366004612fb0565b610a72565b6040516001600160a01b0390911681526020016102de565b34801561036b57600080fd5b506102b061037a366004612f5a565b610aa7565b34801561038b57600080fd5b5061034761039a366004612fc9565b610b4f565b3480156103ab57600080fd5b506103476103ba366004612f93565b610b83565b3480156103cb57600080fd5b506103d560045481565b6040519081526020016102de565b3480156103ef57600080fd5b506103d5610c40565b34801561040457600080fd5b506103d560065481565b34801561041a57600080fd5b50600554610347906001600160a01b031681565b34801561043a57600080fd5b506102b0610c57565b34801561044f57600080fd5b50610347610d04565b34801561046457600080fd5b506102b0610473366004612f5a565b610d3f565b34801561048457600080fd5b50610347610493366004612fb0565b610f16565b3480156104a457600080fd5b506000546001600160a01b0316610347565b3480156104c257600080fd5b50610347610f4e565b3480156104d757600080fd5b506104eb6104e6366004612f93565b610f8c565b6040516102de9190613051565b34801561050457600080fd5b50610347610513366004612f93565b611029565b34801561052457600080fd5b506102b0610533366004613064565b611054565b34801561054457600080fd5b506104eb610553366004612f93565b6111c7565b34801561056457600080fd5b506102d2610573366004612f93565b611276565b34801561058457600080fd5b506102b0610593366004612fb0565b61132f565b3480156105a457600080fd5b50600754610347906001600160a01b031681565b3480156105c457600080fd5b506102d26105d3366004612f93565b611434565b3480156105e457600080fd5b506102b06105f33660046130d0565b61151a565b34801561060457600080fd5b506102b0610613366004613146565b6117c2565b34801561062457600080fd5b506007546001600160a01b031615156102d2565b34801561064457600080fd5b506102b0610653366004613192565b611a10565b34801561066457600080fd5b506102b0610673366004612f93565b611ebc565b34801561068457600080fd5b50610698610693366004612f93565b6120a0565b6040516102de9190613217565b3480156106b157600080fd5b506102b06106c0366004612f93565b612264565b3480156106d157600080fd5b506103476106e0366004612f5a565b612405565b3480156106f157600080fd5b506102b0610700366004612f93565b61248e565b34801561071157600080fd5b506002546001600160a01b0316610347565b34801561072f57600080fd5b50600354610347906001600160a01b031681565b34801561074f57600080fd5b506102b061075e366004613263565b61258c565b61076c836126bb565b6107885760405162461bcd60e51b8152600401610282906132dc565b60006107ec82466040805160208101929092526001600160601b031930606090811b8216928401929092529088901b166054820152606881018690526088015b604051602081830303815290604052805190602001206127b290919063ffffffff16565b90506001600160a01b0381166108575760405162461bcd60e51b815260206004820152602a60248201527f52656769737472793a2077726f6e67206368616e6e656c206f70656e696e6967604482015269207369676e617475726560b01b6064820152608401610282565b6003546001600160a01b03166370a082316108728387612405565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b1580156108b157600080fd5b505afa1580156108c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e99190613327565b8311156109085760405162461bcd60e51b815260040161028290613340565b61091581856000866127d6565b5050505050565b600061093161092b8484612405565b3b151590565b806109be5750600754604051633985eaab60e21b81526001600160a01b03858116600483015284811660248301526109be92169063e617aaac9060440160206040518083038186803b15801561098657600080fd5b505afa15801561099a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092b9190613394565b9392505050565b6000546001600160a01b03163314806109e757506000546001600160a01b0316155b610a035760405162461bcd60e51b8152600401610282906133b1565b6001600160a01b038116610a1657600080fd5b6002546040516001600160a01b038084169216907fe1a66d77649cf0a57b9937073549f30f1c82bb865aaf066d2f299e37a62c6aad90600090a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b600060088281548110610a8757610a876133e6565b60009182526020909120600290910201546001600160a01b031692915050565b610ab0816126bb565b610acc5760405162461bcd60e51b8152600401610282906132dc565b610ad6828261091c565b15610b3d5760405162461bcd60e51b815260206004820152603160248201527f52656769737472793a207375636820636f6e73756d6572206368616e6e656c206044820152701a5cc8185b1c9958591e481bdc195b9959607a1b6064820152608401610282565b610b4a82826000806127d6565b505050565b600080610b5e6104e684610f16565b80516020909101209050610b7b6001600160a01b038516826129b0565b949350505050565b6000610b996007546001600160a01b0316151590565b15610c215760075460405163505a1b3160e01b81526001600160a01b0384811660048301529091169063505a1b319060240160206040518083038186803b158015610be357600080fd5b505afa158015610bf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1b9190613394565b92915050565b506001600160a01b039081166000908152600a60205260409020541690565b600854600090610c5290600190613412565b905090565b60026001541415610caa5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610282565b60026001819055546001600160a01b0316610cc457600080fd5b6002546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610cfd573d6000803e3d6000fd5b5060018055565b60006008610d10610c40565b81548110610d2057610d206133e6565b60009182526020909120600290910201546001600160a01b0316919050565b6000546001600160a01b0316331480610d6157506000546001600160a01b0316155b610d7d5760405162461bcd60e51b8152600401610282906133b1565b6003546001600160a01b0316610dfb5760405162461bcd60e51b815260206004820152603f60248201527f52656769737472793a206f6e6c7920696e697469616c697a656420726567697360448201527f7472792063616e20736574206e657720696d706c656d656e746174696f6e73006064820152608401610282565b813b15158015610e0b5750803b15155b610e745760405162461bcd60e51b815260206004820152603460248201527f52656769737472793a20696d706c656d656e746174696f6e73206861766520746044820152736f20626520736d61727420636f6e74726163747360601b6064820152608401610282565b604080518082019091526001600160a01b0392831681529082166020820190815260088054600181018255600091909152915160029092027ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3810180549385166001600160a01b031994851617905590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee49091018054919093169116179055565b600060088281548110610f2b57610f2b6133e6565b60009182526020909120600160029092020101546001600160a01b031692915050565b60006008610f5a610c40565b81548110610f6a57610f6a6133e6565b60009182526020909120600160029092020101546001600160a01b0316919050565b606060006040518060600160405280603781526020016136b9603791399050606083901b60005b60148160ff16101561102057818160ff1660148110610fd457610fd46133e6565b1a60f81b83610fe4836014613429565b60ff1681518110610ff757610ff76133e6565b60200101906001600160f81b031916908160001a905350806110188161344e565b915050610fb3565b50909392505050565b6000806110376104e6610f4e565b805160209091012090506109be6001600160a01b038416826129b0565b61105d836126bb565b6110bc5760405162461bcd60e51b815260206004820152602a60248201527f52656769737472793a2070726f7669646564206865726d65732068617320746f6044820152692062652061637469766560b01b6064820152608401610282565b60006110ef82308686600460008154809291906110d89061346e565b919050556040516020016107c89493929190613489565b6001600160a01b038086166000908152600960205260409020549192508083169116146111505760405162461bcd60e51b815260206004820152600f60248201526e77726f6e67207369676e617475726560881b6044820152606401610282565b6001600160a01b0384166000908152600960209081526040909120845161117f92600390920191860190612d65565b50836001600160a01b03167fd8c638c85547b8717e0d5ca292cff6dbe8fc02fa6e6863a047971c39511643c7846040516111b99190613051565b60405180910390a250505050565b6001600160a01b03811660009081526009602052604090206003018054606091906111f1906134d6565b80601f016020809104026020016040519081016040528092919081815260200182805461121d906134d6565b801561126a5780601f1061123f5761010080835404028352916020019161126a565b820191906000526020600020905b81548152906001019060200180831161124d57829003601f168201915b50505050509050919050565b600061128c6007546001600160a01b0316151590565b1561130e5760075460405163c3c5a54760e01b81526001600160a01b0384811660048301529091169063c3c5a5479060240160206040518083038186803b1580156112d657600080fd5b505afa1580156112ea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1b9190613511565b506001600160a01b039081166000908152600a602052604090205416151590565b6000546001600160a01b031633148061135157506000546001600160a01b0316155b61136d5760405162461bcd60e51b8152600401610282906133b1565b6003546001600160a01b03166113f95760405162461bcd60e51b8152602060048201526044602482018190527f52656769737472793a206f6e6c7920696e697469616c697a6564207265676973908201527f7472792063616e20736574206e6577206d696e696d616c206865726d6573207360648201526374616b6560e01b608482015260a401610282565b60068190556040518181527f645a9c74d34a0b1095b113252ad5e9afa0373f15b4b21760fb3a24b4b9d1ec309060200160405180910390a150565b6001600160a01b038082166000908152600960205260408120805460019091015491921690826114648383610b4f565b9050846001600160a01b0316816001600160a01b03161461148a57506000949350505050565b803b151580611511575060075460405163066eacb760e51b81526001600160a01b0387811660048301529091169063cdd596e09060240160206040518083038186803b1580156114d957600080fd5b505afa1580156114ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115119190613511565b95945050505050565b611523856126bb565b61153f5760405162461bcd60e51b8152600401610282906132dc565b600061159482466040805160208101929092526001600160601b031930606090811b8216928401929092528a821b81166054840152606883018a9052608883018990529087901b1660a882015260bc016107c8565b90506001600160a01b0381166115f75760405162461bcd60e51b815260206004820152602260248201527f52656769737472793a2077726f6e67206964656e74697479207369676e617475604482015261726560f01b6064820152608401610282565b60006116038587613533565b6003549091506001600160a01b03166370a08231611621848a612405565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561166057600080fd5b505afa158015611674573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116989190613327565b8111156116b75760405162461bcd60e51b815260040161028290613340565b6116c3828886846127d6565b50851561172d576040516324f453d160e01b81526001600160a01b038381166004830152602482018890528816906324f453d190604401600060405180830381600087803b15801561171457600080fd5b505af1158015611728573d6000803e3d6000fd5b505050505b84156117b95760035460405163a9059cbb60e01b8152336004820152602481018790526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b15801561177f57600080fd5b505af1158015611793573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b79190613511565b505b50505050505050565b6001600160a01b03821661182c5760405162461bcd60e51b815260206004820152602b60248201527f52656769737472793a2062656e65666963696172792063616e2774206265207a60448201526a65726f206164647265737360a81b6064820152608401610282565b6007546001600160a01b03161561189f5760075460405163d0171d7960e01b81526001600160a01b039091169063d0171d79906118719086908690869060040161354b565b600060405180830381600087803b15801561188b57600080fd5b505af11580156117b9573d6000803e3d6000fd5b6004546118ad906001613533565b60045560006118c66007546001600160a01b0316151590565b6118d057306118dd565b6007546001600160a01b03165b9050600061192d83466004546040805160208101939093526001600160601b0319606088811b8216928501929092528a821b811660548501529089901b166068830152607c820152609c016107c8565b9050846001600160a01b0316816001600160a01b0316146119a65760405162461bcd60e51b815260206004820152602d60248201527f52656769737472793a206861766520746f206265207369676e6564206279206960448201526c3232b73a34ba3c9037bbb732b960991b6064820152608401610282565b6001600160a01b038581166000818152600a602090815260409182902080546001600160a01b0319169489169485179055905192835290917f768099735d1c322a05a5b9d7b76d99682a1833d3f7055e5ede25e0f2eeaa8c6d910160405180910390a25050505050565b6003546001600160a01b0316611a8e5760405162461bcd60e51b815260206004820152603960248201527f52656769737472793a206f6e6c7920696e697469616c697a656420726567697360448201527f7472792063616e207265676973746572206865726d65736573000000000000006064820152608401610282565b6001600160a01b038616611afc5760405162461bcd60e51b815260206004820152602f60248201527f52656769737472793a206865726d6573206f70657261746f722063616e27742060448201526e6265207a65726f206164647265737360881b6064820152608401610282565b600654851015611b745760405162461bcd60e51b815260206004820152603c60248201527f52656769737472793a206865726d6573206861766520746f207374616b65206160448201527f74206c65617374206d696e696d616c207374616b6520616d6f756e74000000006064820152608401610282565b6000611b7f87611029565b9050611b8a81611434565b15611be35760405162461bcd60e51b815260206004820152602360248201527f52656769737472793a206865726d657320616c726561647920726567697374656044820152621c995960ea1b6064820152608401610282565b6000611c02886001600160a01b0316611bfd6104e6610f4e565b612a01565b6003546040516323b872dd60e01b81523360048201526001600160a01b038084166024830152604482018b90529293509116906323b872dd90606401602060405180830381600087803b158015611c5857600080fd5b505af1158015611c6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c909190613511565b5060035460055460405163699a088560e01b81526001600160a01b0392831660048201528a8316602482015261ffff89166044820152606481018890526084810187905290821660a48201529082169063699a08859060c401600060405180830381600087803b158015611d0357600080fd5b505af1158015611d17573d6000803e3d6000fd5b505050506040518060800160405280896001600160a01b03168152602001611d3d610c40565b815263fc0e3d90602084811b640100000000600160c01b0390811692909217604090811b828501529283018790526001600160a01b03868116600090815260098352849020855181546001600160a01b0319169216919091178155848201516001820155848401516002820180546001600160c01b03191663ffffffff9290961c91821691909416179390931790915560608301518051611de49260038501920190612d65565b505060035460405163095ea7b360e01b81526001600160a01b0385811660048301526000196024830152909116915063095ea7b390604401602060405180830381600087803b158015611e3657600080fd5b505af1158015611e4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6e9190613511565b50816001600160a01b03167ff06d60cc2f463635fd237ad87f1d007af54840b82e7e4561707b1be63d91c2608985604051611eaa929190613577565b60405180910390a25050505050505050565b60026001541415611f0f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610282565b60026001819055546001600160a01b0316611f2957600080fd5b6003546001600160a01b0382811691161415611f955760405162461bcd60e51b815260206004820152602560248201527f6e617469766520746f6b656e2066756e64732063616e2774206265207265636f6044820152641d995c995960da1b6064820152608401610282565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b158015611fd757600080fd5b505afa158015611feb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200f9190613327565b60025460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb90604401602060405180830381600087803b15801561205f57600080fd5b505af1158015612073573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120979190613511565b50506001805550565b60408051608081018252600080825260208201819052918101919091526060808201526120cc82611434565b806120e057506007546001600160a01b0316155b61216a5760075460405163e0b6c32360e01b81526001600160a01b0384811660048301529091169063e0b6c3239060240160006040518083038186803b15801561212957600080fd5b505afa15801561213d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612165919081019061359b565b610c1b565b6001600160a01b038083166000908152600960209081526040918290208251608081018452815490941684526001810154918401919091526002810154640100000000600160c01b03811663ffffffff90911617821b918301919091526003810180546060840191906121dc906134d6565b80601f0160208091040260200160405190810160405280929190818152602001828054612208906134d6565b80156122555780601f1061222a57610100808354040283529160200191612255565b820191906000526020600020905b81548152906001019060200180831161223857829003601f168201915b50505050508152505092915050565b6000546001600160a01b031633148061228657506000546001600160a01b0316155b6122a25760405162461bcd60e51b8152600401610282906133b1565b6003546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b1580156122e657600080fd5b505afa1580156122fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061231e9190613327565b90506000811161237f5760405162461bcd60e51b815260206004820152602660248201527f636f6c6c6563746564206665652063616e6e6f74206265206c657373207468616044820152656e207a65726f60d01b6064820152608401610282565b60035460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490529091169063a9059cbb90604401602060405180830381600087803b1580156123cd57600080fd5b505af11580156123e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4a9190613511565b6001600160a01b0381166000908152600960205260408120600101548190612430906104e690610a72565b8051906020012090506000848460405160200161246c929190606092831b6001600160601b031990811682529190921b16601482015260280190565b60405160208183030381529060405280519060200120905061151181836129b0565b6000546001600160a01b03163314806124b057506000546001600160a01b0316155b6124cc5760405162461bcd60e51b8152600401610282906133b1565b6001600160a01b0381166125315760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610282565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314806125ae57506000546001600160a01b0316155b6125ca5760405162461bcd60e51b8152600401610282906133b1565b6003546001600160a01b0316156126235760405162461bcd60e51b815260206004820181905260248201527f52656769737472793a20697320616c726561647920696e697469616c697a65646044820152606401610282565b60068490556001600160a01b03861661263b57600080fd5b600380546001600160a01b0319166001600160a01b0388811691909117909155851661266657600080fd5b600580546001600160a01b0319166001600160a01b03871617905561268b8383610d3f565b6126943361248e565b600780546001600160a01b0319166001600160a01b03929092169190911790555050505050565b60006126c682611434565b6127215760405162461bcd60e51b815260206004820152602660248201527f52656769737472793a206865726d6573206861766520746f20626520726567696044820152651cdd195c995960d21b6064820152608401610282565b6000826001600160a01b0316634e69d5606040518163ffffffff1660e01b815260040160206040518083038186803b15801561275c57600080fd5b505afa158015612770573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127949190613681565b905060008160038111156127aa576127aa6136a2565b149392505050565b60008060006127c18585612a1b565b915091506127ce81612a8b565b509392505050565b6040516001600160601b0319606086811b8216602084015285901b1660348201526000908190604801604051602081830303815290604052805190602001209050600061284d6104e660096000896001600160a01b03166001600160a01b0316815260200190815260200160002060010154610a72565b9050600061285b8383612a01565b600354600554604051637b809f7b60e11b81526001600160a01b03928316600482015290821660248201528a8216604482015289821660648201526084810188905291925082169063f7013ef69060a401600060405180830381600087803b1580156128c657600080fd5b505af11580156128da573d6000803e3d6000fd5b50506040516001600160a01b038481168252808b1693508b1691507f2ed7bcf2ff03098102c7003d7ce2a633e4b49b8198b07de5383cdf4c0ab9228b9060200160405180910390a36001600160a01b038616612934578095505b61293d88611276565b6129a5576001600160a01b038881166000818152600a602090815260409182902080546001600160a01b031916948b169485179055905192835290917fefaf768237c22e140a862d5d375ad5c153479fac3f8bcf8b580a1651fd62c3ef910160405180910390a25b979650505050505050565b604080516001600160f81b03196020808301919091523060601b6001600160601b03191660218301526035820194909452605580820193909352815180820390930183526075019052805191012090565b600080838351602085016000f59050803b6109be57600080fd5b600080825160411415612a525760208301516040840151606085015160001a612a4687828585612c49565b94509450505050612a84565b825160401415612a7c5760208301516040840151612a71868383612d36565b935093505050612a84565b506000905060025b9250929050565b6000816004811115612a9f57612a9f6136a2565b1415612aa85750565b6001816004811115612abc57612abc6136a2565b1415612b0a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610282565b6002816004811115612b1e57612b1e6136a2565b1415612b6c5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610282565b6003816004811115612b8057612b806136a2565b1415612bd95760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610282565b6004816004811115612bed57612bed6136a2565b1415612c465760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610282565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612c805750600090506003612d2d565b8460ff16601b14158015612c9857508460ff16601c14155b15612ca95750600090506004612d2d565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612cfd573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612d2657600060019250925050612d2d565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b01612d5787828885612c49565b935093505050935093915050565b828054612d71906134d6565b90600052602060002090601f016020900481019282612d935760008555612dd9565b82601f10612dac57805160ff1916838001178555612dd9565b82800160010185558215612dd9579182015b82811115612dd9578251825591602001919060010190612dbe565b50612de5929150612de9565b5090565b5b80821115612de55760008155600101612dea565b6001600160a01b0381168114612c4657600080fd5b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715612e4c57612e4c612e13565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715612e7b57612e7b612e13565b604052919050565b600067ffffffffffffffff821115612e9d57612e9d612e13565b50601f01601f191660200190565b600082601f830112612ebc57600080fd5b8135612ecf612eca82612e83565b612e52565b818152846020838601011115612ee457600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215612f1657600080fd5b8335612f2181612dfe565b925060208401359150604084013567ffffffffffffffff811115612f4457600080fd5b612f5086828701612eab565b9150509250925092565b60008060408385031215612f6d57600080fd5b8235612f7881612dfe565b91506020830135612f8881612dfe565b809150509250929050565b600060208284031215612fa557600080fd5b81356109be81612dfe565b600060208284031215612fc257600080fd5b5035919050565b60008060408385031215612fdc57600080fd5b8235612fe781612dfe565b946020939093013593505050565b60005b83811015613010578181015183820152602001612ff8565b8381111561301f576000848401525b50505050565b6000815180845261303d816020860160208601612ff5565b601f01601f19169290920160200192915050565b6020815260006109be6020830184613025565b60008060006060848603121561307957600080fd5b833561308481612dfe565b9250602084013567ffffffffffffffff808211156130a157600080fd5b6130ad87838801612eab565b935060408601359150808211156130c357600080fd5b50612f5086828701612eab565b600080600080600060a086880312156130e857600080fd5b85356130f381612dfe565b94506020860135935060408601359250606086013561311181612dfe565b9150608086013567ffffffffffffffff81111561312d57600080fd5b61313988828901612eab565b9150509295509295909350565b60008060006060848603121561315b57600080fd5b833561316681612dfe565b9250602084013561317681612dfe565b9150604084013567ffffffffffffffff811115612f4457600080fd5b60008060008060008060c087890312156131ab57600080fd5b86356131b681612dfe565b955060208701359450604087013561ffff811681146131d457600080fd5b9350606087013592506080870135915060a087013567ffffffffffffffff8111156131fe57600080fd5b61320a89828a01612eab565b9150509295509295509295565b6020815260018060a01b0382511660208201526020820151604082015267ffffffffffffffff19604083015116606082015260006060830151608080840152610b7b60a0840182613025565b60008060008060008060c0878903121561327c57600080fd5b863561328781612dfe565b9550602087013561329781612dfe565b94506040870135935060608701356132ae81612dfe565b925060808701356132be81612dfe565b915060a08701356132ce81612dfe565b809150509295509295509295565b6020808252602b908201527f52656769737472793a2070726f7669646564206865726d65732068617665207460408201526a6f2062652061637469766560a81b606082015260800190565b60006020828403121561333957600080fd5b5051919050565b60208082526034908201527f52656769737472793a206e6f7420656e6f756768742066756e647320696e206360408201527368616e6e656c20746f20636f766572206665657360601b606082015260800190565b6000602082840312156133a657600080fd5b81516109be81612dfe565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082821015613424576134246133fc565b500390565b600060ff821660ff84168060ff03821115613446576134466133fc565b019392505050565b600060ff821660ff811415613465576134656133fc565b60010192915050565b6000600019821415613482576134826133fc565b5060010190565b60006bffffffffffffffffffffffff19808760601b168352808660601b1660148401525083516134c0816028850160208801612ff5565b6028920191820192909252604801949350505050565b600181811c908216806134ea57607f821691505b6020821081141561350b57634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561352357600080fd5b815180151581146109be57600080fd5b60008219821115613546576135466133fc565b500190565b6001600160a01b0384811682528316602082015260606040820181905260009061151190830184613025565b6001600160a01b0383168152604060208201819052600090610b7b90830184613025565b600060208083850312156135ae57600080fd5b825167ffffffffffffffff808211156135c657600080fd5b90840190608082870312156135da57600080fd5b6135e2612e29565b82516135ed81612dfe565b81528284015184820152604083015167ffffffffffffffff198116811461361357600080fd5b604082015260608301518281111561362a57600080fd5b80840193505086601f84011261363f57600080fd5b8251915061364f612eca83612e83565b828152878584860101111561366357600080fd5b61367283868301878701612ff5565b60608201529695505050505050565b60006020828403121561369357600080fd5b8151600481106109be57600080fd5b634e487b7160e01b600052602160045260246000fdfe3d602d80600a3d3981f3363d3d373d3d3d363d73bebebebebebebebebebebebebebebebebebebebe5af43d82803e903d91602b57fd5bf3a264697066735822122036219ab918a429fdce341f2929073e190befbb7c069166e8b963bcc654c35c7664736f6c63430008090033Deployed Bytecode
0x6080604052600436106102295760003560e01c8063acc831d011610123578063d16f38c8116100ab578063e617aaac1161006f578063e617aaac146106c5578063f2fde38b146106e5578063f58c5b6e14610705578063fc0c546a14610723578063ff9935cb1461074357600080fd5b8063d16f38c814610618578063d5929fe314610638578063df8de3e714610658578063e0b6c32314610678578063e3252537146106a557600080fd5b8063c957543b116100f2578063c957543b14610578578063c9b84d4d14610598578063cdd596e0146105b8578063cf10c969146105d8578063d0171d79146105f857600080fd5b8063acc831d0146104f8578063add10dda14610518578063bf1eb88a14610538578063c3c5a5471461055857600080fd5b80636332b080116101b157806385bff3411161017557806385bff341146104585780638cfef547146104785780638da5cb5b146104985780639936a87b146104b6578063ab867213146104cb57600080fd5b80636332b080146103e357806366cf5875146103f8578063692058c21461040e5780636931b5501461042e5780637c671a211461044357600080fd5b806341ca71ab116101f857806341ca71ab146103275780634787d09c1461035f5780634b6bd6be1461037f578063505a1b311461039f57806352631ab4146103bf57600080fd5b806304614e0b146102905780631de9db40146102b2578063238e130a146102e7578063392e53cd1461030757600080fd5b3661028b5760405162461bcd60e51b815260206004820152602760248201527f52656769737472793a2052656a656374696e67207478207769746820657468656044820152661c9cc81cd95b9d60ca1b60648201526084015b60405180910390fd5b600080fd5b34801561029c57600080fd5b506102b06102ab366004612f01565b610763565b005b3480156102be57600080fd5b506102d26102cd366004612f5a565b61091c565b60405190151581526020015b60405180910390f35b3480156102f357600080fd5b506102b0610302366004612f93565b6109c5565b34801561031357600080fd5b506003546001600160a01b031615156102d2565b34801561033357600080fd5b50610347610342366004612fb0565b610a72565b6040516001600160a01b0390911681526020016102de565b34801561036b57600080fd5b506102b061037a366004612f5a565b610aa7565b34801561038b57600080fd5b5061034761039a366004612fc9565b610b4f565b3480156103ab57600080fd5b506103476103ba366004612f93565b610b83565b3480156103cb57600080fd5b506103d560045481565b6040519081526020016102de565b3480156103ef57600080fd5b506103d5610c40565b34801561040457600080fd5b506103d560065481565b34801561041a57600080fd5b50600554610347906001600160a01b031681565b34801561043a57600080fd5b506102b0610c57565b34801561044f57600080fd5b50610347610d04565b34801561046457600080fd5b506102b0610473366004612f5a565b610d3f565b34801561048457600080fd5b50610347610493366004612fb0565b610f16565b3480156104a457600080fd5b506000546001600160a01b0316610347565b3480156104c257600080fd5b50610347610f4e565b3480156104d757600080fd5b506104eb6104e6366004612f93565b610f8c565b6040516102de9190613051565b34801561050457600080fd5b50610347610513366004612f93565b611029565b34801561052457600080fd5b506102b0610533366004613064565b611054565b34801561054457600080fd5b506104eb610553366004612f93565b6111c7565b34801561056457600080fd5b506102d2610573366004612f93565b611276565b34801561058457600080fd5b506102b0610593366004612fb0565b61132f565b3480156105a457600080fd5b50600754610347906001600160a01b031681565b3480156105c457600080fd5b506102d26105d3366004612f93565b611434565b3480156105e457600080fd5b506102b06105f33660046130d0565b61151a565b34801561060457600080fd5b506102b0610613366004613146565b6117c2565b34801561062457600080fd5b506007546001600160a01b031615156102d2565b34801561064457600080fd5b506102b0610653366004613192565b611a10565b34801561066457600080fd5b506102b0610673366004612f93565b611ebc565b34801561068457600080fd5b50610698610693366004612f93565b6120a0565b6040516102de9190613217565b3480156106b157600080fd5b506102b06106c0366004612f93565b612264565b3480156106d157600080fd5b506103476106e0366004612f5a565b612405565b3480156106f157600080fd5b506102b0610700366004612f93565b61248e565b34801561071157600080fd5b506002546001600160a01b0316610347565b34801561072f57600080fd5b50600354610347906001600160a01b031681565b34801561074f57600080fd5b506102b061075e366004613263565b61258c565b61076c836126bb565b6107885760405162461bcd60e51b8152600401610282906132dc565b60006107ec82466040805160208101929092526001600160601b031930606090811b8216928401929092529088901b166054820152606881018690526088015b604051602081830303815290604052805190602001206127b290919063ffffffff16565b90506001600160a01b0381166108575760405162461bcd60e51b815260206004820152602a60248201527f52656769737472793a2077726f6e67206368616e6e656c206f70656e696e6967604482015269207369676e617475726560b01b6064820152608401610282565b6003546001600160a01b03166370a082316108728387612405565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b1580156108b157600080fd5b505afa1580156108c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e99190613327565b8311156109085760405162461bcd60e51b815260040161028290613340565b61091581856000866127d6565b5050505050565b600061093161092b8484612405565b3b151590565b806109be5750600754604051633985eaab60e21b81526001600160a01b03858116600483015284811660248301526109be92169063e617aaac9060440160206040518083038186803b15801561098657600080fd5b505afa15801561099a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092b9190613394565b9392505050565b6000546001600160a01b03163314806109e757506000546001600160a01b0316155b610a035760405162461bcd60e51b8152600401610282906133b1565b6001600160a01b038116610a1657600080fd5b6002546040516001600160a01b038084169216907fe1a66d77649cf0a57b9937073549f30f1c82bb865aaf066d2f299e37a62c6aad90600090a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b600060088281548110610a8757610a876133e6565b60009182526020909120600290910201546001600160a01b031692915050565b610ab0816126bb565b610acc5760405162461bcd60e51b8152600401610282906132dc565b610ad6828261091c565b15610b3d5760405162461bcd60e51b815260206004820152603160248201527f52656769737472793a207375636820636f6e73756d6572206368616e6e656c206044820152701a5cc8185b1c9958591e481bdc195b9959607a1b6064820152608401610282565b610b4a82826000806127d6565b505050565b600080610b5e6104e684610f16565b80516020909101209050610b7b6001600160a01b038516826129b0565b949350505050565b6000610b996007546001600160a01b0316151590565b15610c215760075460405163505a1b3160e01b81526001600160a01b0384811660048301529091169063505a1b319060240160206040518083038186803b158015610be357600080fd5b505afa158015610bf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1b9190613394565b92915050565b506001600160a01b039081166000908152600a60205260409020541690565b600854600090610c5290600190613412565b905090565b60026001541415610caa5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610282565b60026001819055546001600160a01b0316610cc457600080fd5b6002546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610cfd573d6000803e3d6000fd5b5060018055565b60006008610d10610c40565b81548110610d2057610d206133e6565b60009182526020909120600290910201546001600160a01b0316919050565b6000546001600160a01b0316331480610d6157506000546001600160a01b0316155b610d7d5760405162461bcd60e51b8152600401610282906133b1565b6003546001600160a01b0316610dfb5760405162461bcd60e51b815260206004820152603f60248201527f52656769737472793a206f6e6c7920696e697469616c697a656420726567697360448201527f7472792063616e20736574206e657720696d706c656d656e746174696f6e73006064820152608401610282565b813b15158015610e0b5750803b15155b610e745760405162461bcd60e51b815260206004820152603460248201527f52656769737472793a20696d706c656d656e746174696f6e73206861766520746044820152736f20626520736d61727420636f6e74726163747360601b6064820152608401610282565b604080518082019091526001600160a01b0392831681529082166020820190815260088054600181018255600091909152915160029092027ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3810180549385166001600160a01b031994851617905590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee49091018054919093169116179055565b600060088281548110610f2b57610f2b6133e6565b60009182526020909120600160029092020101546001600160a01b031692915050565b60006008610f5a610c40565b81548110610f6a57610f6a6133e6565b60009182526020909120600160029092020101546001600160a01b0316919050565b606060006040518060600160405280603781526020016136b9603791399050606083901b60005b60148160ff16101561102057818160ff1660148110610fd457610fd46133e6565b1a60f81b83610fe4836014613429565b60ff1681518110610ff757610ff76133e6565b60200101906001600160f81b031916908160001a905350806110188161344e565b915050610fb3565b50909392505050565b6000806110376104e6610f4e565b805160209091012090506109be6001600160a01b038416826129b0565b61105d836126bb565b6110bc5760405162461bcd60e51b815260206004820152602a60248201527f52656769737472793a2070726f7669646564206865726d65732068617320746f6044820152692062652061637469766560b01b6064820152608401610282565b60006110ef82308686600460008154809291906110d89061346e565b919050556040516020016107c89493929190613489565b6001600160a01b038086166000908152600960205260409020549192508083169116146111505760405162461bcd60e51b815260206004820152600f60248201526e77726f6e67207369676e617475726560881b6044820152606401610282565b6001600160a01b0384166000908152600960209081526040909120845161117f92600390920191860190612d65565b50836001600160a01b03167fd8c638c85547b8717e0d5ca292cff6dbe8fc02fa6e6863a047971c39511643c7846040516111b99190613051565b60405180910390a250505050565b6001600160a01b03811660009081526009602052604090206003018054606091906111f1906134d6565b80601f016020809104026020016040519081016040528092919081815260200182805461121d906134d6565b801561126a5780601f1061123f5761010080835404028352916020019161126a565b820191906000526020600020905b81548152906001019060200180831161124d57829003601f168201915b50505050509050919050565b600061128c6007546001600160a01b0316151590565b1561130e5760075460405163c3c5a54760e01b81526001600160a01b0384811660048301529091169063c3c5a5479060240160206040518083038186803b1580156112d657600080fd5b505afa1580156112ea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1b9190613511565b506001600160a01b039081166000908152600a602052604090205416151590565b6000546001600160a01b031633148061135157506000546001600160a01b0316155b61136d5760405162461bcd60e51b8152600401610282906133b1565b6003546001600160a01b03166113f95760405162461bcd60e51b8152602060048201526044602482018190527f52656769737472793a206f6e6c7920696e697469616c697a6564207265676973908201527f7472792063616e20736574206e6577206d696e696d616c206865726d6573207360648201526374616b6560e01b608482015260a401610282565b60068190556040518181527f645a9c74d34a0b1095b113252ad5e9afa0373f15b4b21760fb3a24b4b9d1ec309060200160405180910390a150565b6001600160a01b038082166000908152600960205260408120805460019091015491921690826114648383610b4f565b9050846001600160a01b0316816001600160a01b03161461148a57506000949350505050565b803b151580611511575060075460405163066eacb760e51b81526001600160a01b0387811660048301529091169063cdd596e09060240160206040518083038186803b1580156114d957600080fd5b505afa1580156114ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115119190613511565b95945050505050565b611523856126bb565b61153f5760405162461bcd60e51b8152600401610282906132dc565b600061159482466040805160208101929092526001600160601b031930606090811b8216928401929092528a821b81166054840152606883018a9052608883018990529087901b1660a882015260bc016107c8565b90506001600160a01b0381166115f75760405162461bcd60e51b815260206004820152602260248201527f52656769737472793a2077726f6e67206964656e74697479207369676e617475604482015261726560f01b6064820152608401610282565b60006116038587613533565b6003549091506001600160a01b03166370a08231611621848a612405565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561166057600080fd5b505afa158015611674573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116989190613327565b8111156116b75760405162461bcd60e51b815260040161028290613340565b6116c3828886846127d6565b50851561172d576040516324f453d160e01b81526001600160a01b038381166004830152602482018890528816906324f453d190604401600060405180830381600087803b15801561171457600080fd5b505af1158015611728573d6000803e3d6000fd5b505050505b84156117b95760035460405163a9059cbb60e01b8152336004820152602481018790526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b15801561177f57600080fd5b505af1158015611793573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b79190613511565b505b50505050505050565b6001600160a01b03821661182c5760405162461bcd60e51b815260206004820152602b60248201527f52656769737472793a2062656e65666963696172792063616e2774206265207a60448201526a65726f206164647265737360a81b6064820152608401610282565b6007546001600160a01b03161561189f5760075460405163d0171d7960e01b81526001600160a01b039091169063d0171d79906118719086908690869060040161354b565b600060405180830381600087803b15801561188b57600080fd5b505af11580156117b9573d6000803e3d6000fd5b6004546118ad906001613533565b60045560006118c66007546001600160a01b0316151590565b6118d057306118dd565b6007546001600160a01b03165b9050600061192d83466004546040805160208101939093526001600160601b0319606088811b8216928501929092528a821b811660548501529089901b166068830152607c820152609c016107c8565b9050846001600160a01b0316816001600160a01b0316146119a65760405162461bcd60e51b815260206004820152602d60248201527f52656769737472793a206861766520746f206265207369676e6564206279206960448201526c3232b73a34ba3c9037bbb732b960991b6064820152608401610282565b6001600160a01b038581166000818152600a602090815260409182902080546001600160a01b0319169489169485179055905192835290917f768099735d1c322a05a5b9d7b76d99682a1833d3f7055e5ede25e0f2eeaa8c6d910160405180910390a25050505050565b6003546001600160a01b0316611a8e5760405162461bcd60e51b815260206004820152603960248201527f52656769737472793a206f6e6c7920696e697469616c697a656420726567697360448201527f7472792063616e207265676973746572206865726d65736573000000000000006064820152608401610282565b6001600160a01b038616611afc5760405162461bcd60e51b815260206004820152602f60248201527f52656769737472793a206865726d6573206f70657261746f722063616e27742060448201526e6265207a65726f206164647265737360881b6064820152608401610282565b600654851015611b745760405162461bcd60e51b815260206004820152603c60248201527f52656769737472793a206865726d6573206861766520746f207374616b65206160448201527f74206c65617374206d696e696d616c207374616b6520616d6f756e74000000006064820152608401610282565b6000611b7f87611029565b9050611b8a81611434565b15611be35760405162461bcd60e51b815260206004820152602360248201527f52656769737472793a206865726d657320616c726561647920726567697374656044820152621c995960ea1b6064820152608401610282565b6000611c02886001600160a01b0316611bfd6104e6610f4e565b612a01565b6003546040516323b872dd60e01b81523360048201526001600160a01b038084166024830152604482018b90529293509116906323b872dd90606401602060405180830381600087803b158015611c5857600080fd5b505af1158015611c6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c909190613511565b5060035460055460405163699a088560e01b81526001600160a01b0392831660048201528a8316602482015261ffff89166044820152606481018890526084810187905290821660a48201529082169063699a08859060c401600060405180830381600087803b158015611d0357600080fd5b505af1158015611d17573d6000803e3d6000fd5b505050506040518060800160405280896001600160a01b03168152602001611d3d610c40565b815263fc0e3d90602084811b640100000000600160c01b0390811692909217604090811b828501529283018790526001600160a01b03868116600090815260098352849020855181546001600160a01b0319169216919091178155848201516001820155848401516002820180546001600160c01b03191663ffffffff9290961c91821691909416179390931790915560608301518051611de49260038501920190612d65565b505060035460405163095ea7b360e01b81526001600160a01b0385811660048301526000196024830152909116915063095ea7b390604401602060405180830381600087803b158015611e3657600080fd5b505af1158015611e4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6e9190613511565b50816001600160a01b03167ff06d60cc2f463635fd237ad87f1d007af54840b82e7e4561707b1be63d91c2608985604051611eaa929190613577565b60405180910390a25050505050505050565b60026001541415611f0f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610282565b60026001819055546001600160a01b0316611f2957600080fd5b6003546001600160a01b0382811691161415611f955760405162461bcd60e51b815260206004820152602560248201527f6e617469766520746f6b656e2066756e64732063616e2774206265207265636f6044820152641d995c995960da1b6064820152608401610282565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b158015611fd757600080fd5b505afa158015611feb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200f9190613327565b60025460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb90604401602060405180830381600087803b15801561205f57600080fd5b505af1158015612073573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120979190613511565b50506001805550565b60408051608081018252600080825260208201819052918101919091526060808201526120cc82611434565b806120e057506007546001600160a01b0316155b61216a5760075460405163e0b6c32360e01b81526001600160a01b0384811660048301529091169063e0b6c3239060240160006040518083038186803b15801561212957600080fd5b505afa15801561213d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612165919081019061359b565b610c1b565b6001600160a01b038083166000908152600960209081526040918290208251608081018452815490941684526001810154918401919091526002810154640100000000600160c01b03811663ffffffff90911617821b918301919091526003810180546060840191906121dc906134d6565b80601f0160208091040260200160405190810160405280929190818152602001828054612208906134d6565b80156122555780601f1061222a57610100808354040283529160200191612255565b820191906000526020600020905b81548152906001019060200180831161223857829003601f168201915b50505050508152505092915050565b6000546001600160a01b031633148061228657506000546001600160a01b0316155b6122a25760405162461bcd60e51b8152600401610282906133b1565b6003546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b1580156122e657600080fd5b505afa1580156122fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061231e9190613327565b90506000811161237f5760405162461bcd60e51b815260206004820152602660248201527f636f6c6c6563746564206665652063616e6e6f74206265206c657373207468616044820152656e207a65726f60d01b6064820152608401610282565b60035460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490529091169063a9059cbb90604401602060405180830381600087803b1580156123cd57600080fd5b505af11580156123e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4a9190613511565b6001600160a01b0381166000908152600960205260408120600101548190612430906104e690610a72565b8051906020012090506000848460405160200161246c929190606092831b6001600160601b031990811682529190921b16601482015260280190565b60405160208183030381529060405280519060200120905061151181836129b0565b6000546001600160a01b03163314806124b057506000546001600160a01b0316155b6124cc5760405162461bcd60e51b8152600401610282906133b1565b6001600160a01b0381166125315760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610282565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314806125ae57506000546001600160a01b0316155b6125ca5760405162461bcd60e51b8152600401610282906133b1565b6003546001600160a01b0316156126235760405162461bcd60e51b815260206004820181905260248201527f52656769737472793a20697320616c726561647920696e697469616c697a65646044820152606401610282565b60068490556001600160a01b03861661263b57600080fd5b600380546001600160a01b0319166001600160a01b0388811691909117909155851661266657600080fd5b600580546001600160a01b0319166001600160a01b03871617905561268b8383610d3f565b6126943361248e565b600780546001600160a01b0319166001600160a01b03929092169190911790555050505050565b60006126c682611434565b6127215760405162461bcd60e51b815260206004820152602660248201527f52656769737472793a206865726d6573206861766520746f20626520726567696044820152651cdd195c995960d21b6064820152608401610282565b6000826001600160a01b0316634e69d5606040518163ffffffff1660e01b815260040160206040518083038186803b15801561275c57600080fd5b505afa158015612770573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127949190613681565b905060008160038111156127aa576127aa6136a2565b149392505050565b60008060006127c18585612a1b565b915091506127ce81612a8b565b509392505050565b6040516001600160601b0319606086811b8216602084015285901b1660348201526000908190604801604051602081830303815290604052805190602001209050600061284d6104e660096000896001600160a01b03166001600160a01b0316815260200190815260200160002060010154610a72565b9050600061285b8383612a01565b600354600554604051637b809f7b60e11b81526001600160a01b03928316600482015290821660248201528a8216604482015289821660648201526084810188905291925082169063f7013ef69060a401600060405180830381600087803b1580156128c657600080fd5b505af11580156128da573d6000803e3d6000fd5b50506040516001600160a01b038481168252808b1693508b1691507f2ed7bcf2ff03098102c7003d7ce2a633e4b49b8198b07de5383cdf4c0ab9228b9060200160405180910390a36001600160a01b038616612934578095505b61293d88611276565b6129a5576001600160a01b038881166000818152600a602090815260409182902080546001600160a01b031916948b169485179055905192835290917fefaf768237c22e140a862d5d375ad5c153479fac3f8bcf8b580a1651fd62c3ef910160405180910390a25b979650505050505050565b604080516001600160f81b03196020808301919091523060601b6001600160601b03191660218301526035820194909452605580820193909352815180820390930183526075019052805191012090565b600080838351602085016000f59050803b6109be57600080fd5b600080825160411415612a525760208301516040840151606085015160001a612a4687828585612c49565b94509450505050612a84565b825160401415612a7c5760208301516040840151612a71868383612d36565b935093505050612a84565b506000905060025b9250929050565b6000816004811115612a9f57612a9f6136a2565b1415612aa85750565b6001816004811115612abc57612abc6136a2565b1415612b0a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610282565b6002816004811115612b1e57612b1e6136a2565b1415612b6c5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610282565b6003816004811115612b8057612b806136a2565b1415612bd95760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610282565b6004816004811115612bed57612bed6136a2565b1415612c465760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610282565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612c805750600090506003612d2d565b8460ff16601b14158015612c9857508460ff16601c14155b15612ca95750600090506004612d2d565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612cfd573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612d2657600060019250925050612d2d565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b01612d5787828885612c49565b935093505050935093915050565b828054612d71906134d6565b90600052602060002090601f016020900481019282612d935760008555612dd9565b82601f10612dac57805160ff1916838001178555612dd9565b82800160010185558215612dd9579182015b82811115612dd9578251825591602001919060010190612dbe565b50612de5929150612de9565b5090565b5b80821115612de55760008155600101612dea565b6001600160a01b0381168114612c4657600080fd5b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715612e4c57612e4c612e13565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715612e7b57612e7b612e13565b604052919050565b600067ffffffffffffffff821115612e9d57612e9d612e13565b50601f01601f191660200190565b600082601f830112612ebc57600080fd5b8135612ecf612eca82612e83565b612e52565b818152846020838601011115612ee457600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215612f1657600080fd5b8335612f2181612dfe565b925060208401359150604084013567ffffffffffffffff811115612f4457600080fd5b612f5086828701612eab565b9150509250925092565b60008060408385031215612f6d57600080fd5b8235612f7881612dfe565b91506020830135612f8881612dfe565b809150509250929050565b600060208284031215612fa557600080fd5b81356109be81612dfe565b600060208284031215612fc257600080fd5b5035919050565b60008060408385031215612fdc57600080fd5b8235612fe781612dfe565b946020939093013593505050565b60005b83811015613010578181015183820152602001612ff8565b8381111561301f576000848401525b50505050565b6000815180845261303d816020860160208601612ff5565b601f01601f19169290920160200192915050565b6020815260006109be6020830184613025565b60008060006060848603121561307957600080fd5b833561308481612dfe565b9250602084013567ffffffffffffffff808211156130a157600080fd5b6130ad87838801612eab565b935060408601359150808211156130c357600080fd5b50612f5086828701612eab565b600080600080600060a086880312156130e857600080fd5b85356130f381612dfe565b94506020860135935060408601359250606086013561311181612dfe565b9150608086013567ffffffffffffffff81111561312d57600080fd5b61313988828901612eab565b9150509295509295909350565b60008060006060848603121561315b57600080fd5b833561316681612dfe565b9250602084013561317681612dfe565b9150604084013567ffffffffffffffff811115612f4457600080fd5b60008060008060008060c087890312156131ab57600080fd5b86356131b681612dfe565b955060208701359450604087013561ffff811681146131d457600080fd5b9350606087013592506080870135915060a087013567ffffffffffffffff8111156131fe57600080fd5b61320a89828a01612eab565b9150509295509295509295565b6020815260018060a01b0382511660208201526020820151604082015267ffffffffffffffff19604083015116606082015260006060830151608080840152610b7b60a0840182613025565b60008060008060008060c0878903121561327c57600080fd5b863561328781612dfe565b9550602087013561329781612dfe565b94506040870135935060608701356132ae81612dfe565b925060808701356132be81612dfe565b915060a08701356132ce81612dfe565b809150509295509295509295565b6020808252602b908201527f52656769737472793a2070726f7669646564206865726d65732068617665207460408201526a6f2062652061637469766560a81b606082015260800190565b60006020828403121561333957600080fd5b5051919050565b60208082526034908201527f52656769737472793a206e6f7420656e6f756768742066756e647320696e206360408201527368616e6e656c20746f20636f766572206665657360601b606082015260800190565b6000602082840312156133a657600080fd5b81516109be81612dfe565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082821015613424576134246133fc565b500390565b600060ff821660ff84168060ff03821115613446576134466133fc565b019392505050565b600060ff821660ff811415613465576134656133fc565b60010192915050565b6000600019821415613482576134826133fc565b5060010190565b60006bffffffffffffffffffffffff19808760601b168352808660601b1660148401525083516134c0816028850160208801612ff5565b6028920191820192909252604801949350505050565b600181811c908216806134ea57607f821691505b6020821081141561350b57634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561352357600080fd5b815180151581146109be57600080fd5b60008219821115613546576135466133fc565b500190565b6001600160a01b0384811682528316602082015260606040820181905260009061151190830184613025565b6001600160a01b0383168152604060208201819052600090610b7b90830184613025565b600060208083850312156135ae57600080fd5b825167ffffffffffffffff808211156135c657600080fd5b90840190608082870312156135da57600080fd5b6135e2612e29565b82516135ed81612dfe565b81528284015184820152604083015167ffffffffffffffff198116811461361357600080fd5b604082015260608301518281111561362a57600080fd5b80840193505086601f84011261363f57600080fd5b8251915061364f612eca83612e83565b828152878584860101111561366357600080fd5b61367283868301878701612ff5565b60608201529695505050505050565b60006020828403121561369357600080fd5b8151600481106109be57600080fd5b634e487b7160e01b600052602160045260246000fdfe3d602d80600a3d3981f3363d3d373d3d3d363d73bebebebebebebebebebebebebebebebebebebebe5af43d82803e903d91602b57fd5bf3a264697066735822122036219ab918a429fdce341f2929073e190befbb7c069166e8b963bcc654c35c7664736f6c63430008090033
Deployed Bytecode Sourcemap
17846:16827:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19365:49;;-1:-1:-1;;;19365:49:0;;216:2:1;19365:49:0;;;198:21:1;255:2;235:18;;;228:30;294:34;274:18;;;267:62;-1:-1:-1;;;345:18:1;;;338:37;392:19;;19365:49:0;;;;;;;;17846:16827;;;;22413:702;;;;;;;;;;-1:-1:-1;22413:702:0;;;;;:::i;:::-;;:::i;:::-;;34139:247;;;;;;;;;;-1:-1:-1;34139:247:0;;;;;:::i;:::-;;:::i;:::-;;;2972:14:1;;2965:22;2947:41;;2935:2;2920:18;34139:247:0;;;;;;;;16012:258;;;;;;;;;;-1:-1:-1;16012:258:0;;;;;:::i;:::-;;:::i;20586:106::-;;;;;;;;;;-1:-1:-1;20664:5:0;;-1:-1:-1;;;;;20664:5:0;20656:28;;20586:106;;31107:152;;;;;;;;;;-1:-1:-1;31107:152:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3608:32:1;;;3590:51;;3578:2;3563:18;31107:152:0;3444:203:1;23209:347:0;;;;;;;;;;-1:-1:-1;23209:347:0;;;;;:::i;:::-;;:::i;27075:278::-;;;;;;;;;;-1:-1:-1;27075:278:0;;;;;:::i;:::-;;:::i;29324:218::-;;;;;;;;;;-1:-1:-1;29324:218:0;;;;;:::i;:::-;;:::i;17927:24::-;;;;;;;;;;;;;;;;;;;4370:25:1;;;4358:2;4343:18;17927:24:0;4224:177:1;32113:106:0;;;;;;;;;;;;;:::i;18043:33::-;;;;;;;;;;;;;;;;17958:26;;;;;;;;;;-1:-1:-1;17958:26:0;;;;-1:-1:-1;;;;;17958:26:0;;;16577:160;;;;;;;;;;;;;:::i;30955:144::-;;;;;;;;;;;;;:::i;31575:469::-;;;;;;;;;;-1:-1:-1;31575:469:0;;;;;:::i;:::-;;:::i;31417:150::-;;;;;;;;;;-1:-1:-1;31417:150:0;;;;;:::i;:::-;;:::i;12613:79::-;;;;;;;;;;-1:-1:-1;12651:7:0;12678:6;-1:-1:-1;;;;;12678:6:0;12613:79;;31267:142;;;;;;;;;;;;;:::i;28405:548::-;;;;;;;;;;-1:-1:-1;28405:548:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;26815:252::-;;;;;;;;;;-1:-1:-1;26815:252:0;;;;;:::i;:::-;;:::i;27494:562::-;;;;;;;;;;-1:-1:-1;27494:562:0;;;;;:::i;:::-;;:::i;27361:125::-;;;;;;;;;;-1:-1:-1;27361:125:0;;;;;:::i;:::-;;:::i;32751:298::-;;;;;;;;;;-1:-1:-1;32751:298:0;;;;;:::i;:::-;;:::i;30568:296::-;;;;;;;;;;-1:-1:-1;30568:296:0;;;;;:::i;:::-;;:::i;18083:30::-;;;;;;;;;;-1:-1:-1;18083:30:0;;;;-1:-1:-1;;;;;18083:30:0;;;33057:658;;;;;;;;;;-1:-1:-1;33057:658:0;;;;;:::i;:::-;;:::i;21009:1309::-;;;;;;;;;;-1:-1:-1;21009:1309:0;;;;;:::i;:::-;;:::i;29550:1010::-;;;;;;;;;;-1:-1:-1;29550:1010:0;;;;;:::i;:::-;;:::i;32624:119::-;;;;;;;;;;-1:-1:-1;32706:14:0;;-1:-1:-1;;;;;32706:14:0;32698:37;;32624:119;;24739:1516;;;;;;;;;;-1:-1:-1;24739:1516:0;;;;;:::i;:::-;;:::i;16816:339::-;;;;;;;;;;-1:-1:-1;16816:339:0;;;;;:::i;:::-;;:::i;26604:203::-;;;;;;;;;;-1:-1:-1;26604:203:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;34394:276::-;;;;;;;;;;-1:-1:-1;34394:276:0;;;;;:::i;:::-;;:::i;26263:333::-;;;;;;;;;;-1:-1:-1;26263:333:0;;;;;:::i;:::-;;:::i;12851:244::-;;;;;;;;;;-1:-1:-1;12851:244:0;;;;;:::i;:::-;;:::i;16339:103::-;;;;;;;;;;-1:-1:-1;16418:16:0;;-1:-1:-1;;;;;16418:16:0;16339:103;;15808:24;;;;;;;;;;-1:-1:-1;15808:24:0;;;;-1:-1:-1;;;;;15808:24:0;;;19726:852;;;;;;;;;;-1:-1:-1;19726:852:0;;;;;:::i;:::-;;:::i;22413:702::-;22536:25;22551:9;22536:14;:25::i;:::-;22528:81;;;;-1:-1:-1;;;22528:81:0;;;;;;;:::i;:::-;22668:17;22688:103;22780:10;17310:9;22698:72;;;;;;10794:19:1;;;;-1:-1:-1;;;;;;22737:4:0;10901:2:1;10897:15;;;10893:24;;10879:12;;;10872:46;;;;10952:15;;;;10948:24;10934:12;;;10927:46;10989:12;;;10982:28;;;11026:13;;22698:72:0;;;;;;;;;;;;;22688:83;;;;;;:91;;:103;;;;:::i;:::-;22668:123;-1:-1:-1;;;;;;22810:23:0;;22802:78;;;;-1:-1:-1;;;22802:78:0;;11252:2:1;22802:78:0;;;11234:21:1;11291:2;11271:18;;;11264:30;11330:34;11310:18;;;11303:62;-1:-1:-1;;;11381:18:1;;;11374:40;11431:19;;22802:78:0;11050:406:1;22802:78:0;22919:5;;-1:-1:-1;;;;;22919:5:0;:15;22935:39;22953:9;22964;22935:17;:39::i;:::-;22919:56;;-1:-1:-1;;;;;;22919:56:0;;;;;;;-1:-1:-1;;;;;3608:32:1;;;22919:56:0;;;3590:51:1;3563:18;;22919:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22901:14;:74;;22893:139;;;;-1:-1:-1;;;22893:139:0;;;;;;;:::i;:::-;23045:62;23058:9;23069;23088:1;23092:14;23045:12;:62::i;:::-;;22517:598;22413:702;;;:::o;34139:247::-;34223:4;34247:56;34263:39;34281:9;34292;34263:17;:39::i;:::-;32458:18;32506:16;;;32310:220;34247:56;:131;;;-1:-1:-1;34323:14:0;;:54;;-1:-1:-1;;;34323:54:0;;-1:-1:-1;;;;;12301:15:1;;;34323:54:0;;;12283:34:1;12353:15;;;12333:18;;;12326:43;34307:71:0;;34323:14;;:32;;12218:18:1;;34323:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;34307:71::-;34240:138;34139:247;-1:-1:-1;;;34139:247:0:o;16012:258::-;12740:6;;-1:-1:-1;;;;;12740:6:0;12750:10;12740:20;;:46;;-1:-1:-1;12782:3:0;12764:6;-1:-1:-1;;;;;12764:6:0;:22;12740:46;12732:91;;;;-1:-1:-1;;;12732:91:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16118:29:0;::::1;16110:38;;;::::0;::::1;;16183:16;::::0;16164:53:::1;::::0;-1:-1:-1;;;;;16164:53:0;;::::1;::::0;16183:16:::1;::::0;16164:53:::1;::::0;16183:16:::1;::::0;16164:53:::1;16228:16;:34:::0;;-1:-1:-1;;;;;;16228:34:0::1;-1:-1:-1::0;;;;;16228:34:0;;;::::1;::::0;;;::::1;::::0;;16012:258::o;31107:152::-;31180:7;31207:15;31223:8;31207:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:44;-1:-1:-1;;;;;31207:44:0;;31107:152;-1:-1:-1;;31107:152:0:o;23209:347::-;23302:25;23317:9;23302:14;:25::i;:::-;23294:81;;;;-1:-1:-1;;;23294:81:0;;;;;;;:::i;:::-;23395:37;23411:9;23422;23395:15;:37::i;:::-;23394:38;23386:100;;;;-1:-1:-1;;;23386:100:0;;13331:2:1;23386:100:0;;;13313:21:1;13370:2;13350:18;;;13343:30;13409:34;13389:18;;;13382:62;-1:-1:-1;;;13460:18:1;;;13453:47;13517:19;;23386:100:0;13129:413:1;23386:100:0;23499:49;23512:9;23523;23542:1;23546;23499:12;:49::i;:::-;;23209:347;;:::o;27075:278::-;27165:7;27185:13;27211:47;27224:33;27248:8;27224:23;:33::i;27211:47::-;27201:58;;;;;;;;-1:-1:-1;27277:68:0;-1:-1:-1;;;;;27303:33:0;;27201:58;27277:17;:68::i;:::-;27270:75;27075:278;-1:-1:-1;;;;27075:278:0:o;29324:218::-;29388:7;29412:19;32706:14;;-1:-1:-1;;;;;32706:14:0;32698:37;;;32624:119;29412:19;29408:85;;;29453:14;;:40;;-1:-1:-1;;;29453:40:0;;-1:-1:-1;;;;;3608:32:1;;;29453:40:0;;;3590:51:1;29453:14:0;;;;:29;;3563:18:1;;29453:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29446:47;29324:218;-1:-1:-1;;29324:218:0:o;29408:85::-;-1:-1:-1;;;;;;29513:21:0;;;;;;;:10;:21;;;;;;;;29324:218::o;32113:106::-;32187:15;:22;32160:7;;32187:24;;32210:1;;32187:24;:::i;:::-;32180:31;;32113:106;:::o;16577:160::-;14755:1;15351:7;;:19;;15343:63;;;;-1:-1:-1;;;15343:63:0;;14011:2:1;15343:63:0;;;13993:21:1;14050:2;14030:18;;;14023:30;14089:33;14069:18;;;14062:61;14140:18;;15343:63:0;13809:355:1;15343:63:0;14755:1;15484:7;:18;;;16639:16;-1:-1:-1;;;;;16639:16:0::1;16631:39;;;::::0;::::1;;16681:16;::::0;:48:::1;::::0;-1:-1:-1;;;;;16681:16:0;;::::1;::::0;16707:21:::1;16681:48:::0;::::1;;;::::0;:16:::1;:48:::0;:16;:48;16707:21;16681:16;:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;14711:1:0;15663:22;;16577:160::o;30955:144::-;31012:7;31039:15;31055:16;:14;:16::i;:::-;31039:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:52;-1:-1:-1;;;;;31039:52:0;;30955:144;-1:-1:-1;30955:144:0:o;31575:469::-;12740:6;;-1:-1:-1;;;;;12740:6:0;12750:10;12740:20;;:46;;-1:-1:-1;12782:3:0;12764:6;-1:-1:-1;;;;;12764:6:0;:22;12740:46;12732:91;;;;-1:-1:-1;;;12732:91:0;;;;;;;:::i;:::-;20664:5;;-1:-1:-1;;;;;20664:5:0;31694:91:::1;;;::::0;-1:-1:-1;;;31694:91:0;;14371:2:1;31694:91:0::1;::::0;::::1;14353:21:1::0;14410:2;14390:18;;;14383:30;14449:34;14429:18;;;14422:62;14520:33;14500:18;;;14493:61;14571:19;;31694:91:0::1;14169:427:1::0;31694:91:0::1;32458:18:::0;;32506:16;;31804:81:::1;;;;-1:-1:-1::0;32458:18:0;;32506:16;;31847:38:::1;31796:146;;;::::0;-1:-1:-1;;;31796:146:0;;14803:2:1;31796:146:0::1;::::0;::::1;14785:21:1::0;14842:2;14822:18;;;14815:30;14881:34;14861:18;;;14854:62;-1:-1:-1;;;14932:18:1;;;14925:50;14992:19;;31796:146:0::1;14601:416:1::0;31796:146:0::1;31974:61;::::0;;;;::::1;::::0;;;-1:-1:-1;;;;;31974:61:0;;::::1;::::0;;;;::::1;;::::0;::::1;::::0;;;31953:15:::1;:83:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;31953:83:0;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;-1:-1:-1::0;;;;;;31953:83:0;;::::1;;::::0;;;;;;;;;;;;;::::1;::::0;::::1;;::::0;;31575:469::o;31417:150::-;31489:7;31516:15;31532:8;31516:25;;;;;;;;:::i;:::-;;;;;;;;;:43;:25;;;;;:43;;-1:-1:-1;;;;;31516:43:0;;31417:150;-1:-1:-1;;31417:150:0:o;31267:142::-;31323:7;31350:15;31366:16;:14;:16::i;:::-;31350:33;;;;;;;;:::i;:::-;;;;;;;;;:51;:33;;;;;:51;;-1:-1:-1;;;;;31350:51:0;;31267:142;-1:-1:-1;31267:142:0:o;28405:548::-;28473:12;28625:18;:136;;;;;;;;;;;;;;;;;;-1:-1:-1;28797:24:0;;;;28774:20;28832:89;28854:2;28850:1;:6;;;28832:89;;;28894:12;28907:1;28894:15;;;;;;;;;:::i;:::-;;;;28878:5;28884:6;28889:1;28884:2;:6;:::i;:::-;28878:13;;;;;;;;;;:::i;:::-;;;;:31;-1:-1:-1;;;;;28878:31:0;;;;;;;;-1:-1:-1;28858:3:0;;;;:::i;:::-;;;;28832:89;;;-1:-1:-1;28940:5:0;;28405:548;-1:-1:-1;;;28405:548:0:o;26815:252::-;26887:7;26907:13;26933:39;26946:25;:23;:25::i;26933:39::-;26923:50;;;;;;;;-1:-1:-1;26991:68:0;-1:-1:-1;;;;;27017:33:0;;26923:50;26991:17;:68::i;27494:562::-;27608:25;27623:9;27608:14;:25::i;:::-;27600:80;;;;-1:-1:-1;;;27600:80:0;;15613:2:1;27600:80:0;;;15595:21:1;15652:2;15632:18;;;15625:30;15691:34;15671:18;;;15664:62;-1:-1:-1;;;15742:18:1;;;15735:40;15792:19;;27600:80:0;15411:406:1;27600:80:0;27739:17;27759:92;27840:10;27794:4;27801:9;27812:4;27818:9;;:11;;;;;;;;;:::i;:::-;;;;;27769:61;;;;;;;;;;;:::i;27759:92::-;-1:-1:-1;;;;;27883:19:0;;;;;;;:8;:19;;;;;:28;27739:112;;-1:-1:-1;27870:41:0;;;27883:28;;27870:41;27862:69;;;;-1:-1:-1;;;27862:69:0;;16753:2:1;27862:69:0;;;16735:21:1;16792:2;16772:18;;;16765:30;-1:-1:-1;;;16811:18:1;;;16804:45;16866:18;;27862:69:0;16551:339:1;27862:69:0;-1:-1:-1;;;;;27967:19:0;;;;;;:8;:19;;;;;;;;:30;;;;:23;;;;;:30;;;;:::i;:::-;;28032:9;-1:-1:-1;;;;;28015:33:0;;28043:4;28015:33;;;;;;:::i;:::-;;;;;;;;27589:467;27494:562;;;:::o;27361:125::-;-1:-1:-1;;;;;27455:19:0;;;;;;:8;:19;;;;;:23;;27448:30;;27423:12;;27455:23;27448:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27361:125;;;:::o;32751:298::-;32813:4;32834:19;32706:14;;-1:-1:-1;;;;;32706:14:0;32698:37;;;32624:119;32834:19;32830:83;;;32875:14;;:38;;-1:-1:-1;;;32875:38:0;;-1:-1:-1;;;;;3608:32:1;;;32875:38:0;;;3590:51:1;32875:14:0;;;;:27;;3563:18:1;;32875:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32830:83::-;-1:-1:-1;;;;;;33006:21:0;;;33039:1;33006:21;;;:10;:21;;;;;;;:35;;;32751:298::o;30568:296::-;12740:6;;-1:-1:-1;;;;;12740:6:0;12750:10;12740:20;;:46;;-1:-1:-1;12782:3:0;12764:6;-1:-1:-1;;;;;12764:6:0;:22;12740:46;12732:91;;;;-1:-1:-1;;;12732:91:0;;;;;;;:::i;:::-;20664:5;;-1:-1:-1;;;;;20664:5:0;30653:96:::1;;;::::0;-1:-1:-1;;;30653:96:0;;17764:2:1;30653:96:0::1;::::0;::::1;17746:21:1::0;17803:2;17783:18;;;17776:30;;;17842:34;17822:18;;;17815:62;17913:34;17893:18;;;17886:62;-1:-1:-1;;;17964:19:1;;;17957:35;18009:19;;30653:96:0::1;17562:472:1::0;30653:96:0::1;30760:18;:37:::0;;;30813:43:::1;::::0;4370:25:1;;;30813:43:0::1;::::0;4358:2:1;4343:18;30813:43:0::1;;;;;;;30568:296:::0;:::o;33057:658::-;-1:-1:-1;;;;;33364:19:0;;;33115:4;33364:19;;;:8;:19;;;;;:28;;;33422:27;;;;33115:4;;33364:28;;33115:4;33476:43;33364:28;33422:27;33476:16;:43::i;:::-;33460:59;;33543:9;-1:-1:-1;;;;;33534:18:0;:5;-1:-1:-1;;;;;33534:18:0;;33530:49;;-1:-1:-1;33574:5:0;;33057:658;-1:-1:-1;;;;33057:658:0:o;33530:49::-;32458:18;;32506:16;;33647:60;;;-1:-1:-1;33673:14:0;;:34;;-1:-1:-1;;;33673:34:0;;-1:-1:-1;;;;;3608:32:1;;;33673:34:0;;;3590:51:1;33673:14:0;;;;:23;;3563:18:1;;33673:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33640:67;33057:658;-1:-1:-1;;;;;33057:658:0:o;21009:1309::-;21173:25;21188:9;21173:14;:25::i;:::-;21165:81;;;;-1:-1:-1;;;21165:81:0;;;;;;;:::i;:::-;21305:17;21325:131;21445:10;17310:9;21335:100;;;;;;18308:19:1;;;;-1:-1:-1;;;;;;21374:4:0;18415:2:1;18411:15;;;18407:24;;18393:12;;;18386:46;;;;18466:15;;;18462:24;;18448:12;;;18441:46;18503:12;;;18496:28;;;18540:13;;;18533:29;;;18597:15;;;;18593:24;18578:13;;;18571:47;18634:13;;21335:100:0;18039:614:1;21325:131:0;21305:151;-1:-1:-1;;;;;;21475:23:0;;21467:70;;;;-1:-1:-1;;;21467:70:0;;18860:2:1;21467:70:0;;;18842:21:1;18899:2;18879:18;;;18872:30;18938:34;18918:18;;;18911:62;-1:-1:-1;;;18989:18:1;;;18982:32;19031:19;;21467:70:0;18658:398:1;21467:70:0;21633:17;21653:29;21668:14;21653:12;:29;:::i;:::-;21714:5;;21633:49;;-1:-1:-1;;;;;;21714:5:0;:15;21730:39;21748:9;21759;21730:17;:39::i;:::-;21714:56;;-1:-1:-1;;;;;;21714:56:0;;;;;;;-1:-1:-1;;;;;3608:32:1;;;21714:56:0;;;3590:51:1;3563:18;;21714:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21701:9;:69;;21693:134;;;;-1:-1:-1;;;21693:134:0;;;;;;;:::i;:::-;21874:59;21887:9;21898;21909:12;21923:9;21874:12;:59::i;:::-;-1:-1:-1;22056:16:0;;22052:112;;22089:63;;-1:-1:-1;;;22089:63:0;;-1:-1:-1;;;;;19386:32:1;;;22089:63:0;;;19368:51:1;19435:18;;;19428:34;;;22089:38:0;;;;;19341:18:1;;22089:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22052:112;22222:18;;22218:93;;22257:5;;:42;;-1:-1:-1;;;22257:42:0;;22272:10;22257:42;;;19368:51:1;19435:18;;;19428:34;;;-1:-1:-1;;;;;22257:5:0;;;;:14;;19341:18:1;;22257:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22218:93;21154:1164;;21009:1309;;;;;:::o;29550:1010::-;-1:-1:-1;;;;;29669:29:0;;29661:85;;;;-1:-1:-1;;;29661:85:0;;19675:2:1;29661:85:0;;;19657:21:1;19714:2;19694:18;;;19687:30;19753:34;19733:18;;;19726:62;-1:-1:-1;;;19804:18:1;;;19797:41;19855:19;;29661:85:0;19473:407:1;29661:85:0;32706:14;;-1:-1:-1;;;;;32706:14:0;32698:37;29813:740;;29853:14;;:69;;-1:-1:-1;;;29853:69:0;;-1:-1:-1;;;;;29853:14:0;;;;:29;;:69;;29883:9;;29894:15;;29911:10;;29853:69;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29813:740;29967:9;;:13;;29979:1;29967:13;:::i;:::-;29955:9;:25;30091:21;30115:19;32706:14;;-1:-1:-1;;;;;32706:14:0;32698:37;;;32624:119;30115:19;:61;;30171:4;30115:61;;;30145:14;;-1:-1:-1;;;;;30145:14:0;30115:61;30091:85;-1:-1:-1;30191:15:0;30209:115;30313:10;17310:9;30293;;30219:84;;;;;;20546:19:1;;;;-1:-1:-1;;;;;;20653:2:1;20649:15;;;20645:24;;20631:12;;;20624:46;;;;20704:15;;;20700:24;;20686:12;;;20679:46;20759:15;;;;20755:24;20741:12;;;20734:46;20796:12;;;20789:28;20833:13;;30219:84:0;20305:547:1;30209:115:0;30191:133;;30358:9;-1:-1:-1;;;;;30347:20:0;:7;-1:-1:-1;;;;;30347:20:0;;30339:78;;;;-1:-1:-1;;;30339:78:0;;21059:2:1;30339:78:0;;;21041:21:1;21098:2;21078:18;;;21071:30;21137:34;21117:18;;;21110:62;-1:-1:-1;;;21188:18:1;;;21181:43;21241:19;;30339:78:0;20857:409:1;30339:78:0;-1:-1:-1;;;;;30434:21:0;;;;;;;:10;:21;;;;;;;;;:39;;-1:-1:-1;;;;;;30434:39:0;;;;;;;;;30495:46;;3590:51:1;;;30434:21:0;;30495:46;;3563:18:1;30495:46:0;;;;;;;29940:613;;29550:1010;;;:::o;24739:1516::-;20664:5;;-1:-1:-1;;;;;20664:5:0;24918:85;;;;-1:-1:-1;;;24918:85:0;;21473:2:1;24918:85:0;;;21455:21:1;21512:2;21492:18;;;21485:30;21551:34;21531:18;;;21524:62;21622:27;21602:18;;;21595:55;21667:19;;24918:85:0;21271:421:1;24918:85:0;-1:-1:-1;;;;;25022:29:0;;25014:89;;;;-1:-1:-1;;;25014:89:0;;21899:2:1;25014:89:0;;;21881:21:1;21938:2;21918:18;;;21911:30;21977:34;21957:18;;;21950:62;-1:-1:-1;;;22028:18:1;;;22021:45;22083:19;;25014:89:0;21697:411:1;25014:89:0;25138:18;;25122:12;:34;;25114:107;;;;-1:-1:-1;;;25114:107:0;;22315:2:1;25114:107:0;;;22297:21:1;22354:2;22334:18;;;22327:30;22393:34;22373:18;;;22366:62;22464:30;22444:18;;;22437:58;22512:19;;25114:107:0;22113:424:1;25114:107:0;25234:17;25254:33;25271:15;25254:16;:33::i;:::-;25234:53;;25307:19;25316:9;25307:8;:19::i;:::-;25306:20;25298:68;;;;-1:-1:-1;;;25298:68:0;;22744:2:1;25298:68:0;;;22726:21:1;22783:2;22763:18;;;22756:30;22822:34;22802:18;;;22795:62;-1:-1:-1;;;22873:18:1;;;22866:33;22916:19;;25298:68:0;22542:399:1;25298:68:0;25463:23;25505:91;25537:15;-1:-1:-1;;;;;25521:33:0;25556:39;25569:25;:23;:25::i;25556:39::-;25505:15;:91::i;:::-;25664:5;;:62;;-1:-1:-1;;;25664:62:0;;25683:10;25664:62;;;23186:34:1;-1:-1:-1;;;;;23256:15:1;;;23236:18;;;23229:43;23288:18;;;23281:34;;;25463:134:0;;-1:-1:-1;25664:5:0;;;:18;;23121::1;;25664:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;25796:5:0;;25869:3;;25769:104;;-1:-1:-1;;;25769:104:0;;-1:-1:-1;;;;;25796:5:0;;;25769:104;;;23665:34:1;23735:15;;;23715:18;;;23708:43;23799:6;23787:19;;23767:18;;;23760:47;23823:18;;;23816:34;;;23866:19;;;23859:35;;;25869:3:0;;;23910:19:1;;;23903:44;25769:18:0;;;;;;23599:19:1;;25769:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25957:65;;;;;;;;25964:15;-1:-1:-1;;;;;25957:65:0;;;;;25981:16;:14;:16::i;:::-;25957:65;;25999:16;25957:65;;;;-1:-1:-1;;;;;25957:65:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25935:19:0;;;-1:-1:-1;25935:19:0;;;:8;:19;;;;;:87;;;;-1:-1:-1;;;;;;25935:87:0;;;;;;;;;;;;;-1:-1:-1;25935:87:0;;;;;;;;;;;;-1:-1:-1;;;;;;25935:87:0;25957:65;25935:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;26136:5:0;;:43;;-1:-1:-1;;;26136:43:0;;-1:-1:-1;;;;;19386:32:1;;;26136:43:0;;;19368:51:1;-1:-1:-1;;19435:18:1;;;19428:34;26136:5:0;;;;-1:-1:-1;26136:13:0;;19341:18:1;;26136:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26214:9;-1:-1:-1;;;;;26197:50:0;;26225:15;26242:4;26197:50;;;;;;;:::i;:::-;;;;;;;;24907:1348;;24739:1516;;;;;;:::o;16816:339::-;14755:1;15351:7;;:19;;15343:63;;;;-1:-1:-1;;;15343:63:0;;14011:2:1;15343:63:0;;;13993:21:1;14050:2;14030:18;;;14023:30;14089:33;14069:18;;;14062:61;14140:18;;15343:63:0;13809:355:1;15343:63:0;14755:1;15484:7;:18;;;16892:16;-1:-1:-1;;;;;16892:16:0::1;16884:39;;;::::0;::::1;;16960:5;::::0;-1:-1:-1;;;;;16942:24:0;;::::1;16960:5:::0;::::1;16942:24;;16934:74;;;::::0;-1:-1:-1;;;16934:74:0;;24479:2:1;16934:74:0::1;::::0;::::1;24461:21:1::0;24518:2;24498:18;;;24491:30;24557:34;24537:18;;;24530:62;-1:-1:-1;;;24608:18:1;;;24601:35;24653:19;;16934:74:0::1;24277:401:1::0;16934:74:0::1;17037:44;::::0;-1:-1:-1;;;17037:44:0;;17075:4:::1;17037:44;::::0;::::1;3590:51:1::0;17019:15:0::1;::::0;-1:-1:-1;;;;;17037:29:0;::::1;::::0;::::1;::::0;3563:18:1;;17037:44:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17121:16;::::0;17092:55:::1;::::0;-1:-1:-1;;;17092:55:0;;-1:-1:-1;;;;;17121:16:0;;::::1;17092:55;::::0;::::1;19368:51:1::0;19435:18;;;19428:34;;;17019:62:0;;-1:-1:-1;17092:28:0;::::1;::::0;::::1;::::0;19341:18:1;;17092:55:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;14711:1:0;15663:22;;-1:-1:-1;16816:339:0:o;26604:203::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26696:19:0;26705:9;26696:8;:19::i;:::-;:43;;;-1:-1:-1;32706:14:0;;-1:-1:-1;;;;;32706:14:0;32698:37;26696:43;:103;;26764:14;;:35;;-1:-1:-1;;;26764:35:0;;-1:-1:-1;;;;;3608:32:1;;;26764:35:0;;;3590:51:1;26764:14:0;;;;:24;;3563:18:1;;26764:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26764:35:0;;;;;;;;;;;;:::i;:::-;26696:103;;;-1:-1:-1;;;;;26742:19:0;;;;;;;:8;:19;;;;;;;;;26696:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26696:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26689:110;26604:203;-1:-1:-1;;26604:203:0:o;34394:276::-;12740:6;;-1:-1:-1;;;;;12740:6:0;12750:10;12740:20;;:46;;-1:-1:-1;12782:3:0;12764:6;-1:-1:-1;;;;;12764:6:0;:22;12740:46;12732:91;;;;-1:-1:-1;;;12732:91:0;;;;;;;:::i;:::-;34499:5:::1;::::0;:30:::1;::::0;-1:-1:-1;;;34499:30:0;;34523:4:::1;34499:30;::::0;::::1;3590:51:1::0;34475:21:0::1;::::0;-1:-1:-1;;;;;34499:5:0::1;::::0;:15:::1;::::0;3563:18:1;;34499:30:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34475:54;;34564:1;34548:13;:17;34540:68;;;::::0;-1:-1:-1;;;34540:68:0;;26439:2:1;34540:68:0::1;::::0;::::1;26421:21:1::0;26478:2;26458:18;;;26451:30;26517:34;26497:18;;;26490:62;-1:-1:-1;;;26568:18:1;;;26561:36;26614:19;;34540:68:0::1;26237:402:1::0;34540:68:0::1;34619:5;::::0;:43:::1;::::0;-1:-1:-1;;;34619:43:0;;-1:-1:-1;;;;;19386:32:1;;;34619:43:0::1;::::0;::::1;19368:51:1::0;19435:18;;;19428:34;;;34619:5:0;;::::1;::::0;:14:::1;::::0;19341:18:1;;34619:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;26263:333::-:0;-1:-1:-1;;;;;26433:19:0;;26349:7;26433:19;;;:8;:19;;;;;:27;;;26349:7;;26395:67;;26408:53;;:24;:53::i;26395:67::-;26385:78;;;;;;26369:94;;26474:13;26517:9;26528;26500:38;;;;;;;;26871:2:1;26867:15;;;-1:-1:-1;;;;;;26863:24:1;;;26851:37;;26922:15;;;;26918:24;26913:2;26904:12;;26897:46;26968:2;26959:12;;26644:333;26500:38:0;;;;;;;;;;;;;26490:49;;;;;;26474:65;;26557:31;26575:5;26582;26557:17;:31::i;12851:244::-;12740:6;;-1:-1:-1;;;;;12740:6:0;12750:10;12740:20;;:46;;-1:-1:-1;12782:3:0;12764:6;-1:-1:-1;;;;;12764:6:0;:22;12740:46;12732:91;;;;-1:-1:-1;;;12732:91:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12940:22:0;::::1;12932:73;;;::::0;-1:-1:-1;;;12932:73:0;;27184:2:1;12932:73:0::1;::::0;::::1;27166:21:1::0;27223:2;27203:18;;;27196:30;27262:34;27242:18;;;27235:62;-1:-1:-1;;;27313:18:1;;;27306:36;27359:19;;12932:73:0::1;26982:402:1::0;12932:73:0::1;13042:6;::::0;;13021:38:::1;::::0;-1:-1:-1;;;;;13021:38:0;;::::1;::::0;13042:6;::::1;::::0;13021:38:::1;::::0;::::1;13070:6;:17:::0;;-1:-1:-1;;;;;;13070:17:0::1;-1:-1:-1::0;;;;;13070:17:0;;;::::1;::::0;;;::::1;::::0;;12851:244::o;19726:852::-;12740:6;;-1:-1:-1;;;;;12740:6:0;12750:10;12740:20;;:46;;-1:-1:-1;12782:3:0;12764:6;-1:-1:-1;;;;;12764:6:0;:22;12740:46;12732:91;;;;-1:-1:-1;;;12732:91:0;;;;;;;:::i;:::-;20664:5;;-1:-1:-1;;;;;20664:5:0;20656:28;19951:61:::1;;;::::0;-1:-1:-1;;;19951:61:0;;27591:2:1;19951:61:0::1;::::0;::::1;27573:21:1::0;;;27610:18;;;27603:30;27669:34;27649:18;;;27642:62;27721:18;;19951:61:0::1;27389:356:1::0;19951:61:0::1;20025:18;:40:::0;;;-1:-1:-1;;;;;20086:27:0;::::1;20078:36;;;::::0;::::1;;20125:5;:34:::0;;-1:-1:-1;;;;;;20125:34:0::1;-1:-1:-1::0;;;;;20125:34:0;;::::1;::::0;;;::::1;::::0;;;20180:25;::::1;20172:34;;;::::0;::::1;;20217:3;:17:::0;;-1:-1:-1;;;;;;20217:17:0::1;-1:-1:-1::0;;;;;20217:17:0;::::1;;::::0;;20295:65:::1;20314:22:::0;20338:21;20295:18:::1;:65::i;:::-;20417:29;20435:10;20417:17;:29::i;:::-;20528:14;:42:::0;;-1:-1:-1;;;;;;20528:42:0::1;-1:-1:-1::0;;;;;20528:42:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;;;19726:852:0:o;33723:408::-;33789:4;33921:19;33930:9;33921:8;:19::i;:::-;33913:70;;;;-1:-1:-1;;;33913:70:0;;27952:2:1;33913:70:0;;;27934:21:1;27991:2;27971:18;;;27964:30;28030:34;28010:18;;;28003:62;-1:-1:-1;;;28081:18:1;;;28074:36;28127:19;;33913:70:0;27750:402:1;33913:70:0;33996:29;34044:9;-1:-1:-1;;;;;34028:36:0;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33996:70;-1:-1:-1;34094:29:0;34084:6;:39;;;;;;;;:::i;:::-;;;33723:408;-1:-1:-1;;;33723:408:0:o;4440:231::-;4518:7;4539:17;4558:18;4580:27;4591:4;4597:9;4580:10;:27::i;:::-;4538:69;;;;4618:18;4630:5;4618:11;:18::i;:::-;-1:-1:-1;4654:9:0;4440:231;-1:-1:-1;;;4440:231:0:o;23709:1022::-;23869:38;;-1:-1:-1;;;;;;26871:2:1;26867:15;;;26863:24;;23869:38:0;;;26851:37:1;26922:15;;;26918:24;26904:12;;;26897:46;23823:7:0;;;;26959:12:1;;23869:38:0;;;;;;;;;;;;23859:49;;;;;;23843:65;;23919:18;23940:67;23953:53;23978:8;:19;23987:9;-1:-1:-1;;;;;23978:19:0;-1:-1:-1;;;;;23978:19:0;;;;;;;;;;;;:27;;;23953:24;:53::i;23940:67::-;23919:88;-1:-1:-1;24018:16:0;24045:38;24069:5;23919:88;24045:15;:38::i;:::-;24123:5;;24131:3;;24095:68;;-1:-1:-1;;;24095:68:0;;-1:-1:-1;;;;;24123:5:0;;;24095:68;;;28869:34:1;24131:3:0;;;28919:18:1;;;28912:43;28991:15;;;28971:18;;;28964:43;29043:15;;;29023:18;;;29016:43;29075:19;;;29068:35;;;24018:66:0;;-1:-1:-1;24095:19:0;;;;;28803::1;;24095:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24181:63:0;;-1:-1:-1;;;;;3608:32:1;;;3590:51;;24181:63:0;;;;-1:-1:-1;24181:63:0;;;-1:-1:-1;24181:63:0;;3578:2:1;3563:18;24181:63:0;;;;;;;-1:-1:-1;;;;;24356:26:0;;24352:91;;24422:8;24399:32;;24352:91;24536:23;24549:9;24536:12;:23::i;:::-;24531:156;;-1:-1:-1;;;;;24576:21:0;;;;;;;:10;:21;;;;;;;;;:36;;-1:-1:-1;;;;;;24576:36:0;;;;;;;;;24632:43;;3590:51:1;;;24576:21:0;;24632:43;;3563:18:1;24632:43:0;;;;;;;24531:156;24714:8;23709:1022;-1:-1:-1;;;;;;;23709:1022:0:o;28104:293::-;28245:140;;;-1:-1:-1;;;;;;28245:140:0;;;;29325:39:1;;;;28311:4:0;29401:2:1;29397:15;-1:-1:-1;;;;;;29393:53:1;29380:11;;;29373:74;29463:12;;;29456:28;;;;29500:12;;;;29493:28;;;;28245:140:0;;;;;;;;;;29537:12:1;;28245:140:0;;28235:151;;;;;;28104:293::o;28961:355::-;29039:15;29067:21;29177:5;29169;29163:12;29156:4;29149:5;29145:16;29142:1;29134:49;29125:58;;29219:5;29207:18;29197:76;;29256:1;29253;29246:12;2330:1308;2411:7;2420:12;2645:9;:16;2665:2;2645:22;2641:990;;;2941:4;2926:20;;2920:27;2991:4;2976:20;;2970:27;3049:4;3034:20;;3028:27;2684:9;3020:36;3092:25;3103:4;3020:36;2920:27;2970;3092:10;:25::i;:::-;3085:32;;;;;;;;;2641:990;3139:9;:16;3159:2;3139:22;3135:496;;;3414:4;3399:20;;3393:27;3465:4;3450:20;;3444:27;3507:23;3518:4;3393:27;3444;3507:10;:23::i;:::-;3500:30;;;;;;;;3135:496;-1:-1:-1;3579:1:0;;-1:-1:-1;3583:35:0;3135:496;2330:1308;;;;;:::o;601:643::-;679:20;670:5;:29;;;;;;;;:::i;:::-;;666:571;;;601:643;:::o;666:571::-;777:29;768:5;:38;;;;;;;;:::i;:::-;;764:473;;;823:34;;-1:-1:-1;;;823:34:0;;29762:2:1;823:34:0;;;29744:21:1;29801:2;29781:18;;;29774:30;29840:26;29820:18;;;29813:54;29884:18;;823:34:0;29560:348:1;764:473:0;888:35;879:5;:44;;;;;;;;:::i;:::-;;875:362;;;940:41;;-1:-1:-1;;;940:41:0;;30115:2:1;940:41:0;;;30097:21:1;30154:2;30134:18;;;30127:30;30193:33;30173:18;;;30166:61;30244:18;;940:41:0;29913:355:1;875:362:0;1012:30;1003:5;:39;;;;;;;;:::i;:::-;;999:238;;;1059:44;;-1:-1:-1;;;1059:44:0;;30475:2:1;1059:44:0;;;30457:21:1;30514:2;30494:18;;;30487:30;30553:34;30533:18;;;30526:62;-1:-1:-1;;;30604:18:1;;;30597:32;30646:19;;1059:44:0;30273:398:1;999:238:0;1134:30;1125:5;:39;;;;;;;;:::i;:::-;;1121:116;;;1181:44;;-1:-1:-1;;;1181:44:0;;30878:2:1;1181:44:0;;;30860:21:1;30917:2;30897:18;;;30890:30;30956:34;30936:18;;;30929:62;-1:-1:-1;;;31007:18:1;;;31000:32;31049:19;;1181:44:0;30676:398:1;1121:116:0;601:643;:::o;5939:1632::-;6070:7;;7004:66;6991:79;;6987:163;;;-1:-1:-1;7103:1:0;;-1:-1:-1;7107:30:0;7087:51;;6987:163;7164:1;:7;;7169:2;7164:7;;:18;;;;;7175:1;:7;;7180:2;7175:7;;7164:18;7160:102;;;-1:-1:-1;7215:1:0;;-1:-1:-1;7219:30:0;7199:51;;7160:102;7376:24;;;7359:14;7376:24;;;;;;;;;31306:25:1;;;31379:4;31367:17;;31347:18;;;31340:45;;;;31401:18;;;31394:34;;;31444:18;;;31437:34;;;7376:24:0;;31278:19:1;;7376:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7376:24:0;;-1:-1:-1;;7376:24:0;;;-1:-1:-1;;;;;;;7415:20:0;;7411:103;;7468:1;7472:29;7452:50;;;;;;;7411:103;7534:6;-1:-1:-1;7542:20:0;;-1:-1:-1;5939:1632:0;;;;;;;;:::o;4934:391::-;5048:7;;-1:-1:-1;;;;;5149:75:0;;5251:3;5247:12;;;5261:2;5243:21;5292:25;5303:4;5243:21;5312:1;5149:75;5292:10;:25::i;:::-;5285:32;;;;;;4934:391;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;422:131:1;-1:-1:-1;;;;;497:31:1;;487:42;;477:70;;543:1;540;533:12;558:127;619:10;614:3;610:20;607:1;600:31;650:4;647:1;640:15;674:4;671:1;664:15;690:253;762:2;756:9;804:4;792:17;;839:18;824:34;;860:22;;;821:62;818:88;;;886:18;;:::i;:::-;922:2;915:22;690:253;:::o;948:275::-;1019:2;1013:9;1084:2;1065:13;;-1:-1:-1;;1061:27:1;1049:40;;1119:18;1104:34;;1140:22;;;1101:62;1098:88;;;1166:18;;:::i;:::-;1202:2;1195:22;948:275;;-1:-1:-1;948:275:1:o;1228:186::-;1276:4;1309:18;1301:6;1298:30;1295:56;;;1331:18;;:::i;:::-;-1:-1:-1;1397:2:1;1376:15;-1:-1:-1;;1372:29:1;1403:4;1368:40;;1228:186::o;1419:462::-;1461:5;1514:3;1507:4;1499:6;1495:17;1491:27;1481:55;;1532:1;1529;1522:12;1481:55;1568:6;1555:20;1599:48;1615:31;1643:2;1615:31;:::i;:::-;1599:48;:::i;:::-;1672:2;1663:7;1656:19;1718:3;1711:4;1706:2;1698:6;1694:15;1690:26;1687:35;1684:55;;;1735:1;1732;1725:12;1684:55;1800:2;1793:4;1785:6;1781:17;1774:4;1765:7;1761:18;1748:55;1848:1;1823:16;;;1841:4;1819:27;1812:38;;;;1827:7;1419:462;-1:-1:-1;;;1419:462:1:o;1886:523::-;1972:6;1980;1988;2041:2;2029:9;2020:7;2016:23;2012:32;2009:52;;;2057:1;2054;2047:12;2009:52;2096:9;2083:23;2115:31;2140:5;2115:31;:::i;:::-;2165:5;-1:-1:-1;2217:2:1;2202:18;;2189:32;;-1:-1:-1;2272:2:1;2257:18;;2244:32;2299:18;2288:30;;2285:50;;;2331:1;2328;2321:12;2285:50;2354:49;2395:7;2386:6;2375:9;2371:22;2354:49;:::i;:::-;2344:59;;;1886:523;;;;;:::o;2414:388::-;2482:6;2490;2543:2;2531:9;2522:7;2518:23;2514:32;2511:52;;;2559:1;2556;2549:12;2511:52;2598:9;2585:23;2617:31;2642:5;2617:31;:::i;:::-;2667:5;-1:-1:-1;2724:2:1;2709:18;;2696:32;2737:33;2696:32;2737:33;:::i;:::-;2789:7;2779:17;;;2414:388;;;;;:::o;2999:255::-;3066:6;3119:2;3107:9;3098:7;3094:23;3090:32;3087:52;;;3135:1;3132;3125:12;3087:52;3174:9;3161:23;3193:31;3218:5;3193:31;:::i;3259:180::-;3318:6;3371:2;3359:9;3350:7;3346:23;3342:32;3339:52;;;3387:1;3384;3377:12;3339:52;-1:-1:-1;3410:23:1;;3259:180;-1:-1:-1;3259:180:1:o;3652:315::-;3720:6;3728;3781:2;3769:9;3760:7;3756:23;3752:32;3749:52;;;3797:1;3794;3787:12;3749:52;3836:9;3823:23;3855:31;3880:5;3855:31;:::i;:::-;3905:5;3957:2;3942:18;;;;3929:32;;-1:-1:-1;;;3652:315:1:o;4630:258::-;4702:1;4712:113;4726:6;4723:1;4720:13;4712:113;;;4802:11;;;4796:18;4783:11;;;4776:39;4748:2;4741:10;4712:113;;;4843:6;4840:1;4837:13;4834:48;;;4878:1;4869:6;4864:3;4860:16;4853:27;4834:48;;4630:258;;;:::o;4893:257::-;4934:3;4972:5;4966:12;4999:6;4994:3;4987:19;5015:63;5071:6;5064:4;5059:3;5055:14;5048:4;5041:5;5037:16;5015:63;:::i;:::-;5132:2;5111:15;-1:-1:-1;;5107:29:1;5098:39;;;;5139:4;5094:50;;4893:257;-1:-1:-1;;4893:257:1:o;5155:217::-;5302:2;5291:9;5284:21;5265:4;5322:44;5362:2;5351:9;5347:18;5339:6;5322:44;:::i;5377:674::-;5472:6;5480;5488;5541:2;5529:9;5520:7;5516:23;5512:32;5509:52;;;5557:1;5554;5547:12;5509:52;5596:9;5583:23;5615:31;5640:5;5615:31;:::i;:::-;5665:5;-1:-1:-1;5721:2:1;5706:18;;5693:32;5744:18;5774:14;;;5771:34;;;5801:1;5798;5791:12;5771:34;5824:49;5865:7;5856:6;5845:9;5841:22;5824:49;:::i;:::-;5814:59;;5926:2;5915:9;5911:18;5898:32;5882:48;;5955:2;5945:8;5942:16;5939:36;;;5971:1;5968;5961:12;5939:36;;5994:51;6037:7;6026:8;6015:9;6011:24;5994:51;:::i;6289:734::-;6393:6;6401;6409;6417;6425;6478:3;6466:9;6457:7;6453:23;6449:33;6446:53;;;6495:1;6492;6485:12;6446:53;6534:9;6521:23;6553:31;6578:5;6553:31;:::i;:::-;6603:5;-1:-1:-1;6655:2:1;6640:18;;6627:32;;-1:-1:-1;6706:2:1;6691:18;;6678:32;;-1:-1:-1;6762:2:1;6747:18;;6734:32;6775:33;6734:32;6775:33;:::i;:::-;6827:7;-1:-1:-1;6885:3:1;6870:19;;6857:33;6913:18;6902:30;;6899:50;;;6945:1;6942;6935:12;6899:50;6968:49;7009:7;7000:6;6989:9;6985:22;6968:49;:::i;:::-;6958:59;;;6289:734;;;;;;;;:::o;7028:596::-;7114:6;7122;7130;7183:2;7171:9;7162:7;7158:23;7154:32;7151:52;;;7199:1;7196;7189:12;7151:52;7238:9;7225:23;7257:31;7282:5;7257:31;:::i;:::-;7307:5;-1:-1:-1;7364:2:1;7349:18;;7336:32;7377:33;7336:32;7377:33;:::i;:::-;7429:7;-1:-1:-1;7487:2:1;7472:18;;7459:32;7514:18;7503:30;;7500:50;;;7546:1;7543;7536:12;7629:830;7741:6;7749;7757;7765;7773;7781;7834:3;7822:9;7813:7;7809:23;7805:33;7802:53;;;7851:1;7848;7841:12;7802:53;7890:9;7877:23;7909:31;7934:5;7909:31;:::i;:::-;7959:5;-1:-1:-1;8011:2:1;7996:18;;7983:32;;-1:-1:-1;8067:2:1;8052:18;;8039:32;8115:6;8102:20;;8090:33;;8080:61;;8137:1;8134;8127:12;8080:61;8160:7;-1:-1:-1;8214:2:1;8199:18;;8186:32;;-1:-1:-1;8265:3:1;8250:19;;8237:33;;-1:-1:-1;8321:3:1;8306:19;;8293:33;8349:18;8338:30;;8335:50;;;8381:1;8378;8371:12;8335:50;8404:49;8445:7;8436:6;8425:9;8421:22;8404:49;:::i;:::-;8394:59;;;7629:830;;;;;;;;:::o;8464:570::-;8639:2;8628:9;8621:21;8714:1;8710;8705:3;8701:11;8697:19;8688:6;8682:13;8678:39;8673:2;8662:9;8658:18;8651:67;8772:2;8764:6;8760:15;8754:22;8749:2;8738:9;8734:18;8727:50;8845:18;8841:23;8835:2;8827:6;8823:15;8817:22;8813:52;8808:2;8797:9;8793:18;8786:80;8602:4;8913:2;8905:6;8901:15;8895:22;8955:4;8948;8937:9;8933:20;8926:34;8977:51;9023:3;9012:9;9008:19;8994:12;8977:51;:::i;9266:898::-;9386:6;9394;9402;9410;9418;9426;9479:3;9467:9;9458:7;9454:23;9450:33;9447:53;;;9496:1;9493;9486:12;9447:53;9535:9;9522:23;9554:31;9579:5;9554:31;:::i;:::-;9604:5;-1:-1:-1;9661:2:1;9646:18;;9633:32;9674:33;9633:32;9674:33;:::i;:::-;9726:7;-1:-1:-1;9780:2:1;9765:18;;9752:32;;-1:-1:-1;9836:2:1;9821:18;;9808:32;9849:33;9808:32;9849:33;:::i;:::-;9901:7;-1:-1:-1;9960:3:1;9945:19;;9932:33;9974;9932;9974;:::i;:::-;10026:7;-1:-1:-1;10085:3:1;10070:19;;10057:33;10099;10057;10099;:::i;:::-;10151:7;10141:17;;;9266:898;;;;;;;;:::o;10169:407::-;10371:2;10353:21;;;10410:2;10390:18;;;10383:30;10449:34;10444:2;10429:18;;10422:62;-1:-1:-1;;;10515:2:1;10500:18;;10493:41;10566:3;10551:19;;10169:407::o;11461:184::-;11531:6;11584:2;11572:9;11563:7;11559:23;11555:32;11552:52;;;11600:1;11597;11590:12;11552:52;-1:-1:-1;11623:16:1;;11461:184;-1:-1:-1;11461:184:1:o;11650:416::-;11852:2;11834:21;;;11891:2;11871:18;;;11864:30;11930:34;11925:2;11910:18;;11903:62;-1:-1:-1;;;11996:2:1;11981:18;;11974:50;12056:3;12041:19;;11650:416::o;12380:251::-;12450:6;12503:2;12491:9;12482:7;12478:23;12474:32;12471:52;;;12519:1;12516;12509:12;12471:52;12551:9;12545:16;12570:31;12595:5;12570:31;:::i;12636:356::-;12838:2;12820:21;;;12857:18;;;12850:30;12916:34;12911:2;12896:18;;12889:62;12983:2;12968:18;;12636:356::o;12997:127::-;13058:10;13053:3;13049:20;13046:1;13039:31;13089:4;13086:1;13079:15;13113:4;13110:1;13103:15;13547:127;13608:10;13603:3;13599:20;13596:1;13589:31;13639:4;13636:1;13629:15;13663:4;13660:1;13653:15;13679:125;13719:4;13747:1;13744;13741:8;13738:34;;;13752:18;;:::i;:::-;-1:-1:-1;13789:9:1;;13679:125::o;15022:204::-;15060:3;15096:4;15093:1;15089:12;15128:4;15125:1;15121:12;15163:3;15157:4;15153:14;15148:3;15145:23;15142:49;;;15171:18;;:::i;:::-;15207:13;;15022:204;-1:-1:-1;;;15022:204:1:o;15231:175::-;15268:3;15312:4;15305:5;15301:16;15341:4;15332:7;15329:17;15326:43;;;15349:18;;:::i;:::-;15398:1;15385:15;;15231:175;-1:-1:-1;;15231:175:1:o;15822:135::-;15861:3;-1:-1:-1;;15882:17:1;;15879:43;;;15902:18;;:::i;:::-;-1:-1:-1;15949:1:1;15938:13;;15822:135::o;15962:584::-;16175:3;16207:26;16203:31;16276:2;16267:6;16263:2;16259:15;16255:24;16250:3;16243:37;16331:2;16322:6;16318:2;16314:15;16310:24;16305:2;16300:3;16296:12;16289:46;;16364:6;16358:13;16380:62;16435:6;16430:2;16425:3;16421:12;16414:4;16406:6;16402:17;16380:62;:::i;:::-;16501:2;16461:16;;16493:11;;;16486:27;;;;16537:2;16529:11;;15962:584;-1:-1:-1;;;;15962:584:1:o;16895:380::-;16974:1;16970:12;;;;17017;;;17038:61;;17092:4;17084:6;17080:17;17070:27;;17038:61;17145:2;17137:6;17134:14;17114:18;17111:38;17108:161;;;17191:10;17186:3;17182:20;17179:1;17172:31;17226:4;17223:1;17216:15;17254:4;17251:1;17244:15;17108:161;;16895:380;;;:::o;17280:277::-;17347:6;17400:2;17388:9;17379:7;17375:23;17371:32;17368:52;;;17416:1;17413;17406:12;17368:52;17448:9;17442:16;17501:5;17494:13;17487:21;17480:5;17477:32;17467:60;;17523:1;17520;17513:12;19061:128;19101:3;19132:1;19128:6;19125:1;19122:13;19119:39;;;19138:18;;:::i;:::-;-1:-1:-1;19174:9:1;;19061:128::o;19885:415::-;-1:-1:-1;;;;;20126:15:1;;;20108:34;;20178:15;;20173:2;20158:18;;20151:43;20230:2;20225;20210:18;;20203:30;;;20051:4;;20250:44;;20275:18;;20267:6;20250:44;:::i;23958:314::-;-1:-1:-1;;;;;24133:32:1;;24115:51;;24202:2;24197;24182:18;;24175:30;;;-1:-1:-1;;24222:44:1;;24247:18;;24239:6;24222:44;:::i;24970:1262::-;25063:6;25094:2;25137;25125:9;25116:7;25112:23;25108:32;25105:52;;;25153:1;25150;25143:12;25105:52;25186:9;25180:16;25215:18;25256:2;25248:6;25245:14;25242:34;;;25272:1;25269;25262:12;25242:34;25295:22;;;;25351:4;25333:16;;;25329:27;25326:47;;;25369:1;25366;25359:12;25326:47;25395:22;;:::i;:::-;25447:2;25441:9;25459:33;25484:7;25459:33;:::i;:::-;25501:22;;25561:11;;;25555:18;25539:14;;;25532:42;25608:2;25600:11;;25594:18;-1:-1:-1;;25639:33:1;;25631:42;;25621:70;;25687:1;25684;25677:12;25621:70;25718:2;25707:14;;25700:27;25766:2;25758:11;;25752:18;25782:16;;;25779:36;;;25811:1;25808;25801:12;25779:36;25842:8;25838:2;25834:17;25824:27;;;25889:7;25882:4;25878:2;25874:13;25870:27;25860:55;;25911:1;25908;25901:12;25860:55;25940:2;25934:9;25924:19;;25965:48;25981:31;26009:2;25981:31;:::i;25965:48::-;26036:2;26029:5;26022:17;26076:7;26071:2;26066;26062;26058:11;26054:20;26051:33;26048:53;;;26097:1;26094;26087:12;26048:53;26110:54;26161:2;26156;26149:5;26145:14;26140:2;26136;26132:11;26110:54;:::i;:::-;26191:2;26180:14;;26173:29;26184:5;24970:1262;-1:-1:-1;;;;;;24970:1262:1:o;28157:270::-;28237:6;28290:2;28278:9;28269:7;28265:23;28261:32;28258:52;;;28306:1;28303;28296:12;28258:52;28338:9;28332:16;28377:1;28370:5;28367:12;28357:40;;28393:1;28390;28383:12;28432:127;28493:10;28488:3;28484:20;28481:1;28474:31;28524:4;28521:1;28514:15;28548:4;28545:1;28538:15
Swarm Source
ipfs://36219ab918a429fdce341f2929073e190befbb7c069166e8b963bcc654c35c76
Loading...LoadingLoading...Loading
Loading...Loading
Loading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingLoading...Loading[ Download: CSV Export ][ Download: CSV Export ]A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.
Address QR Code
My Address - Private Name Tag or Note
My Name Tag:
Private Name Tags (up to 35 characters) can be used for easy identification of addressesPrivate Note:
A private note (up to 500 characters) can be attached to this address.
Please DO NOT store any passwords or private keys here.Compiler specific version warnings:
The compiled contract might be susceptible to VerbatimInvalidDeduplication (low-severity), FullInlinerNonExpressionSplitArgumentEvaluationOrder (low-severity), MissingSideEffectsOnSelectorAccess (low-severity), AbiReencodingHeadOverflowWithStaticArrayCleanup (medium-severity), DirtyBytesArrayToStorage (low-severity), DataLocationChangeInInternalOverride (very low-severity), NestedCalldataArrayAbiReencodingSizeValidation (very low-severity) Solidity Compiler Bugs.
Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.Before You Copy
This website uses cookies to improve your experience. By continuing to use this website, you agree to its Terms and Privacy Policy.