Overview
ETH Balance
0 ETH
ETH Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Name:
NFTBridge
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0-only pragma solidity 0.8.17; import "../../framework/MessageReceiverApp.sol"; import "../../interfaces/IMessageBus.sol"; import "../../../safeguard/Pauser.sol"; // interface for NFT contract, ERC721 and metadata, only funcs needed by NFTBridge interface INFT { function tokenURI(uint256 tokenId) external view returns (string memory); function ownerOf(uint256 tokenId) external view returns (address owner); // we do not support NFT that charges transfer fees function transferFrom( address from, address to, uint256 tokenId ) external; // impl by NFToken contract, mint an NFT with id and uri to user or burn function bridgeMint( address to, uint256 id, string memory uri ) external; function burn(uint256 id) external; } /** @title NFT Bridge */ contract NFTBridge is MessageReceiverApp, Pauser { /// per dest chain id executor fee in this chain's gas token mapping(uint64 => uint256) public destTxFee; /// per dest chain id NFTBridge address mapping(uint64 => address) public destBridge; /// first key is NFT address on this chain, 2nd key is dest chain id, value is address on dest chain mapping(address => mapping(uint64 => address)) public destNFTAddr; /// only set to true if NFT addr on this chain is the orig, so we will use deposit/withdraw instead of burn/mint. /// not applicable for mcn nft (always burn/mint) mapping(address => bool) public origNFT; /// only for non-evm chains and address can't fit 20bytes mapping(uint64 => bytes) public destBridge2; mapping(address => mapping(uint64 => bytes)) public destNFTAddr2; struct NFTMsg { address user; // receiver of minted or withdrawn NFT address nft; // NFT contract on mint/withdraw chain uint256 id; // token ID string uri; // tokenURI from source NFT } // for non-evm dst chain, address type is bytes struct NFTMsg2 { bytes user; // receiver of minted or withdrawn NFT bytes nft; // NFT contract on mint/withdraw chain uint256 id; // token ID string uri; // tokenURI from source NFT } // emit in deposit or burn event Sent(address sender, address srcNft, uint256 id, uint64 dstChid, address receiver, address dstNft); // bytes type for receiver and dstNft event Sent2(address sender, address srcNft, uint256 id, uint64 dstChid, bytes receiver, bytes dstNft); // emit for mint or withdraw message event Received(address receiver, address nft, uint256 id, uint64 srcChid); // emit when params change event SetDestNFT(address srcNft, uint64 dstChid, address dstNft); event SetTxFee(uint64 chid, uint256 fee); event SetDestBridge(uint64 dstChid, address dstNftBridge); event FeeClaimed(uint256 amount); event SetOrigNFT(address nft, bool isOrig); // emit if executeMessage calls nft transfer or bridgeMint returns error event ExtCallErr(bytes returnData); event SetDestNFT2(address srcNft, uint64 dstChid, bytes dstNft); event SetDestBridge2(uint64 dstChid, bytes dstNftBridge); constructor(address _msgBus) { messageBus = _msgBus; } // only to be called by Proxy via delegatecall and will modify Proxy state // initOwner will fail if owner is already set, so only delegateCall will work function init(address _msgBus) external { initOwner(); messageBus = _msgBus; } /** * @notice totalFee returns gas token value to be set in user tx, includes both msg fee and executor fee for dest chain * @dev we assume if dst chain address are bytes, user and nft are same length, otherwise we need to add receiver to args * @param _dstChid dest chain ID * @param _nft address of source NFT contract * @param _id token ID to bridge (need to get accurate tokenURI length) * @return total fee needed for user tx */ function totalFee( uint64 _dstChid, address _nft, uint256 _id ) external view returns (uint256) { string memory _uri = INFT(_nft).tokenURI(_id); bytes memory message; // try non-evm first bytes memory dstNft = destNFTAddr2[_nft][_dstChid]; if (dstNft.length > 0) { message = abi.encode(NFTMsg2(dstNft, dstNft, _id, _uri)); } else { // evm chains or not configured, assume to be evm, 20 bytes address message = abi.encode(NFTMsg(_nft, _nft, _id, _uri)); } return IMessageBus(messageBus).calcFee(message) + destTxFee[_dstChid]; } // ===== called by user /** * @notice locks or burn user's NFT in this contract and send message to mint (or withdraw) on dest chain * @param _nft address of source NFT contract * @param _id nft token ID to bridge * @param _dstChid dest chain ID * @param _receiver receiver address on dest chain */ function sendTo( address _nft, uint256 _id, uint64 _dstChid, address _receiver ) external payable whenNotPaused { require(msg.sender == INFT(_nft).ownerOf(_id), "not token owner"); // must save _uri before burn string memory _uri = INFT(_nft).tokenURI(_id); lockOrBurn(_nft, _id); (address _dstBridge, address _dstNft) = checkAddr(_nft, _dstChid); msgBus(_dstBridge, _dstChid, abi.encode(NFTMsg(_receiver, _dstNft, _id, _uri))); emit Sent(msg.sender, _nft, _id, _dstChid, _receiver, _dstNft); } /** * @notice locks or burn user's NFT in this contract and send message to mint (or withdraw) on dest chain * @param _nft address of source NFT contract * @param _id nft token ID to bridge * @param _dstChid dest chain ID * @param _receiver receiver address on dest chain, arbitrary bytes */ function sendTo( address _nft, uint256 _id, uint64 _dstChid, bytes calldata _receiver ) external payable whenNotPaused { require(msg.sender == INFT(_nft).ownerOf(_id), "not token owner"); // must save _uri before burn string memory _uri = INFT(_nft).tokenURI(_id); lockOrBurn(_nft, _id); (bytes memory _dstBridge, bytes memory _dstNft) = checkAddr2(_nft, _dstChid); msgBus(_dstBridge, _dstChid, abi.encode(NFTMsg2(_receiver, _dstNft, _id, _uri))); emit Sent2(msg.sender, _nft, _id, _dstChid, _receiver, _dstNft); } // ===== called by MCN NFT after NFT is burnt function sendMsg( uint64 _dstChid, address _sender, address _receiver, uint256 _id, string calldata _uri ) external payable whenNotPaused { address _nft = msg.sender; (address _dstBridge, address _dstNft) = checkAddr(_nft, _dstChid); msgBus(_dstBridge, _dstChid, abi.encode(NFTMsg(_receiver, _dstNft, _id, _uri))); emit Sent(_sender, _nft, _id, _dstChid, _receiver, _dstNft); } // for non-evm chains and address can't fit 20bytes or non-hex function sendMsg( uint64 _dstChid, address _sender, bytes calldata _receiver, uint256 _id, string calldata _uri ) external payable whenNotPaused { address _nft = msg.sender; (bytes memory _dstBridge, bytes memory _dstNft) = checkAddr2(_nft, _dstChid); msgBus(_dstBridge, _dstChid, abi.encode(NFTMsg2(_receiver, _dstNft, _id, _uri))); emit Sent2(_sender, _nft, _id, _dstChid, _receiver, _dstNft); } // ===== called by msgbus function executeMessage( address sender, uint64 srcChid, bytes calldata _message, address // executor ) external payable override onlyMessageBus returns (ExecutionStatus) { // Must check sender to ensure msg is from another nft bridge // but we allow retry later in case it's a temporary config error // risk is invalid sender will be retried but this can be easily filtered // in executor or require manual trigger for retry if (paused() || sender != destBridge[srcChid]) { return ExecutionStatus.Retry; } return xferOrMint(_message, srcChid); } function executeMessage( bytes calldata sender, uint64 srcChid, bytes calldata _message, address // executor ) external payable override onlyMessageBus returns (ExecutionStatus) { if (paused() || keccak256(sender) != keccak256(destBridge2[srcChid])) { return ExecutionStatus.Retry; } return xferOrMint(_message, srcChid); } // ===== internal utils // lockOrBurn on sender side function lockOrBurn(address _nft, uint256 _id) internal { if (origNFT[_nft] == true) { // deposit INFT(_nft).transferFrom(msg.sender, address(this), _id); require(INFT(_nft).ownerOf(_id) == address(this), "transfer NFT failed"); } else { // burn INFT(_nft).burn(_id); } } // xferOrMint on receiver side, transfer or mint NFT to receiver function xferOrMint(bytes calldata _message, uint64 srcChid) internal returns (ExecutionStatus) { // withdraw original locked nft back to user, or mint new nft depending on if this is the orig chain of nft NFTMsg memory nftMsg = abi.decode((_message), (NFTMsg)); // if we are on nft orig chain, use transfer, otherwise, use mint // we must never return fail because burnt nft will be lost forever if (origNFT[nftMsg.nft] == true) { try INFT(nftMsg.nft).transferFrom(address(this), nftMsg.user, nftMsg.id) { // do nothing here to move on to emit Received event and return success } catch (bytes memory returnData) { emit ExtCallErr(returnData); return ExecutionStatus.Retry; } } else { try INFT(nftMsg.nft).bridgeMint(nftMsg.user, nftMsg.id, nftMsg.uri) { // do nothing here to move on to emit Received event and return success } catch (bytes memory returnData) { emit ExtCallErr(returnData); return ExecutionStatus.Retry; } } emit Received(nftMsg.user, nftMsg.nft, nftMsg.id, srcChid); return ExecutionStatus.Success; } // check _nft and destChid are valid, return dstBridge and dstNft function checkAddr(address _nft, uint64 _dstChid) internal view returns (address dstBridge, address dstNft) { dstBridge = destBridge[_dstChid]; require(dstBridge != address(0), "dest NFT Bridge not found"); dstNft = destNFTAddr[_nft][_dstChid]; require(dstNft != address(0), "dest NFT not found"); } function checkAddr2(address _nft, uint64 _dstChid) internal view returns (bytes memory dstBridge, bytes memory dstNft) { dstBridge = destBridge2[_dstChid]; require(dstBridge.length != 0, "dest NFT Bridge not found"); dstNft = destNFTAddr2[_nft][_dstChid]; require(dstNft.length != 0, "dest NFT not found"); } // check fee and call msgbus sendMessage function msgBus( address _dstBridge, uint64 _dstChid, bytes memory message ) internal { uint256 fee = IMessageBus(messageBus).calcFee(message); require(msg.value >= fee + destTxFee[_dstChid], "insufficient fee"); IMessageBus(messageBus).sendMessage{value: fee}(_dstBridge, _dstChid, message); } function msgBus( bytes memory _dstBridge, uint64 _dstChid, bytes memory message ) internal { uint256 fee = IMessageBus(messageBus).calcFee(message); require(msg.value >= fee + destTxFee[_dstChid], "insufficient fee"); IMessageBus(messageBus).sendMessage{value: fee}(_dstBridge, _dstChid, message); } // only owner // set per NFT, per chain id, address function setDestNFT( address srcNft, uint64 dstChid, address dstNft ) external onlyOwner { destNFTAddr[srcNft][dstChid] = dstNft; emit SetDestNFT(srcNft, dstChid, dstNft); } // add to destNFTAddr2 function setDestNFT( address srcNft, uint64 dstChid, bytes calldata dstNft ) external onlyOwner { destNFTAddr2[srcNft][dstChid] = dstNft; emit SetDestNFT2(srcNft, dstChid, dstNft); } // set all dest chains function setDestNFTs( address srcNft, uint64[] calldata dstChid, address[] calldata dstNft ) external onlyOwner { require(dstChid.length == dstNft.length, "length mismatch"); for (uint256 i = 0; i < dstChid.length; i++) { destNFTAddr[srcNft][dstChid[i]] = dstNft[i]; } } // set destTxFee function setTxFee(uint64 chid, uint256 fee) external onlyOwner { destTxFee[chid] = fee; emit SetTxFee(chid, fee); } // set per chain id, nft bridge address function setDestBridge(uint64 dstChid, address dstNftBridge) external onlyOwner { destBridge[dstChid] = dstNftBridge; emit SetDestBridge(dstChid, dstNftBridge); } function setDestBridge(uint64 dstChid, bytes calldata dstNftBridge) external onlyOwner { destBridge2[dstChid] = dstNftBridge; emit SetDestBridge2(dstChid, dstNftBridge); } // batch set nft bridge addresses for multiple chainids function setDestBridges(uint64[] calldata dstChid, address[] calldata dstNftBridge) external onlyOwner { for (uint256 i = 0; i < dstChid.length; i++) { destBridge[dstChid[i]] = dstNftBridge[i]; } } // only called on NFT's orig chain, not applicable for mcn nft function setOrigNFT(address _nft) external onlyOwner { origNFT[_nft] = true; emit SetOrigNFT(_nft, true); } // remove origNFT entry function delOrigNFT(address _nft) external onlyOwner { delete origNFT[_nft]; emit SetOrigNFT(_nft, false); } // send all gas token this contract has to owner function claimFee() external onlyOwner { uint256 amount = address(this).balance; payable(msg.sender).transfer(amount); emit FeeClaimed(amount); } }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.8.0; import "../interfaces/IMessageReceiverApp.sol"; import "./MessageBusAddress.sol"; abstract contract MessageReceiverApp is IMessageReceiverApp, MessageBusAddress { modifier onlyMessageBus() { require(msg.sender == messageBus, "caller is not message bus"); _; } /** * @notice Called by MessageBus to execute a message * @param _sender The address of the source app contract * @param _srcChainId The source chain ID where the transfer is originated from * @param _message Arbitrary message bytes originated from and encoded by the source app contract * @param _executor Address who called the MessageBus execution function */ function executeMessage( address _sender, uint64 _srcChainId, bytes calldata _message, address _executor ) external payable virtual override onlyMessageBus returns (ExecutionStatus) {} // execute message from non-evm chain with bytes for sender address, // otherwise same as above. function executeMessage( bytes calldata _sender, uint64 _srcChainId, bytes calldata _message, address _executor ) external payable virtual override onlyMessageBus returns (ExecutionStatus) {} /** * @notice Called by MessageBus to execute a message with an associated token transfer. * The contract is guaranteed to have received the right amount of tokens before this function is called. * @param _sender The address of the source app contract * @param _token The address of the token that comes out of the bridge * @param _amount The amount of tokens received at this contract through the cross-chain bridge. * @param _srcChainId The source chain ID where the transfer is originated from * @param _message Arbitrary message bytes originated from and encoded by the source app contract * @param _executor Address who called the MessageBus execution function */ function executeMessageWithTransfer( address _sender, address _token, uint256 _amount, uint64 _srcChainId, bytes calldata _message, address _executor ) external payable virtual override onlyMessageBus returns (ExecutionStatus) {} /** * @notice Only called by MessageBus if * 1. executeMessageWithTransfer reverts, or * 2. executeMessageWithTransfer returns ExecutionStatus.Fail * The contract is guaranteed to have received the right amount of tokens before this function is called. * @param _sender The address of the source app contract * @param _token The address of the token that comes out of the bridge * @param _amount The amount of tokens received at this contract through the cross-chain bridge. * @param _srcChainId The source chain ID where the transfer is originated from * @param _message Arbitrary message bytes originated from and encoded by the source app contract * @param _executor Address who called the MessageBus execution function */ function executeMessageWithTransferFallback( address _sender, address _token, uint256 _amount, uint64 _srcChainId, bytes calldata _message, address _executor ) external payable virtual override onlyMessageBus returns (ExecutionStatus) {} /** * @notice Called by MessageBus to process refund of the original transfer from this contract. * The contract is guaranteed to have received the refund before this function is called. * @param _token The token address of the original transfer * @param _amount The amount of the original transfer * @param _message The same message associated with the original transfer * @param _executor Address who called the MessageBus execution function */ function executeMessageWithTransferRefund( address _token, uint256 _amount, bytes calldata _message, address _executor ) external payable virtual override onlyMessageBus returns (ExecutionStatus) {} }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.8.0; interface IMessageReceiverApp { enum ExecutionStatus { Fail, // execution failed, finalized Success, // execution succeeded, finalized Retry // execution rejected, can retry later } /** * @notice Called by MessageBus to execute a message * @param _sender The address of the source app contract * @param _srcChainId The source chain ID where the transfer is originated from * @param _message Arbitrary message bytes originated from and encoded by the source app contract * @param _executor Address who called the MessageBus execution function */ function executeMessage( address _sender, uint64 _srcChainId, bytes calldata _message, address _executor ) external payable returns (ExecutionStatus); // same as above, except that sender is an non-evm chain address, // otherwise same as above. function executeMessage( bytes calldata _sender, uint64 _srcChainId, bytes calldata _message, address _executor ) external payable returns (ExecutionStatus); /** * @notice Called by MessageBus to execute a message with an associated token transfer. * The contract is guaranteed to have received the right amount of tokens before this function is called. * @param _sender The address of the source app contract * @param _token The address of the token that comes out of the bridge * @param _amount The amount of tokens received at this contract through the cross-chain bridge. * @param _srcChainId The source chain ID where the transfer is originated from * @param _message Arbitrary message bytes originated from and encoded by the source app contract * @param _executor Address who called the MessageBus execution function */ function executeMessageWithTransfer( address _sender, address _token, uint256 _amount, uint64 _srcChainId, bytes calldata _message, address _executor ) external payable returns (ExecutionStatus); /** * @notice Only called by MessageBus if * 1. executeMessageWithTransfer reverts, or * 2. executeMessageWithTransfer returns ExecutionStatus.Fail * The contract is guaranteed to have received the right amount of tokens before this function is called. * @param _sender The address of the source app contract * @param _token The address of the token that comes out of the bridge * @param _amount The amount of tokens received at this contract through the cross-chain bridge. * @param _srcChainId The source chain ID where the transfer is originated from * @param _message Arbitrary message bytes originated from and encoded by the source app contract * @param _executor Address who called the MessageBus execution function */ function executeMessageWithTransferFallback( address _sender, address _token, uint256 _amount, uint64 _srcChainId, bytes calldata _message, address _executor ) external payable returns (ExecutionStatus); /** * @notice Called by MessageBus to process refund of the original transfer from this contract. * The contract is guaranteed to have received the refund before this function is called. * @param _token The token address of the original transfer * @param _amount The amount of the original transfer * @param _message The same message associated with the original transfer * @param _executor Address who called the MessageBus execution function */ function executeMessageWithTransferRefund( address _token, uint256 _amount, bytes calldata _message, address _executor ) external payable returns (ExecutionStatus); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.8.0; import "../../safeguard/Ownable.sol"; abstract contract MessageBusAddress is Ownable { event MessageBusUpdated(address messageBus); address public messageBus; function setMessageBus(address _messageBus) public onlyOwner { messageBus = _messageBus; emit MessageBusUpdated(messageBus); } }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. * * This adds a normal func that setOwner if _owner is address(0). So we can't allow * renounceOwnership. So we can support Proxy based upgradable contract */ abstract contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(msg.sender); } /** * @dev Only to be called by inherit contracts, in their init func called by Proxy * we require _owner == address(0), which is only possible when it's a delegateCall * because constructor sets _owner in contract state. */ function initOwner() internal { require(_owner == address(0), "owner already set"); _setOwner(msg.sender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == msg.sender, "Ownable: caller is not the owner"); _; } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.8.0; import "../libraries/MsgDataTypes.sol"; interface IMessageBus { /** * @notice Send a message to a contract on another chain. * Sender needs to make sure the uniqueness of the message Id, which is computed as * hash(type.MessageOnly, sender, receiver, srcChainId, srcTxHash, dstChainId, message). * If messages with the same Id are sent, only one of them will succeed at dst chain.. * A fee is charged in the native gas token. * @param _receiver The address of the destination app contract. * @param _dstChainId The destination chain ID. * @param _message Arbitrary message bytes to be decoded by the destination app contract. */ function sendMessage( address _receiver, uint256 _dstChainId, bytes calldata _message ) external payable; // same as above, except that receiver is an non-evm chain address, function sendMessage( bytes calldata _receiver, uint256 _dstChainId, bytes calldata _message ) external payable; /** * @notice Send a message associated with a token transfer to a contract on another chain. * If messages with the same srcTransferId are sent, only one of them will succeed at dst chain.. * A fee is charged in the native token. * @param _receiver The address of the destination app contract. * @param _dstChainId The destination chain ID. * @param _srcBridge The bridge contract to send the transfer with. * @param _srcTransferId The transfer ID. * @param _dstChainId The destination chain ID. * @param _message Arbitrary message bytes to be decoded by the destination app contract. */ function sendMessageWithTransfer( address _receiver, uint256 _dstChainId, address _srcBridge, bytes32 _srcTransferId, bytes calldata _message ) external payable; /** * @notice Execute a message not associated with a transfer. * @param _message Arbitrary message bytes originated from and encoded by the source app contract * @param _sigs The list of signatures sorted by signing addresses in ascending order. A relay must be signed-off by * +2/3 of the sigsVerifier's current signing power to be delivered. * @param _signers The sorted list of signers. * @param _powers The signing powers of the signers. */ function executeMessage( bytes calldata _message, MsgDataTypes.RouteInfo calldata _route, bytes[] calldata _sigs, address[] calldata _signers, uint256[] calldata _powers ) external payable; /** * @notice Execute a message with a successful transfer. * @param _message Arbitrary message bytes originated from and encoded by the source app contract * @param _transfer The transfer info. * @param _sigs The list of signatures sorted by signing addresses in ascending order. A relay must be signed-off by * +2/3 of the sigsVerifier's current signing power to be delivered. * @param _signers The sorted list of signers. * @param _powers The signing powers of the signers. */ function executeMessageWithTransfer( bytes calldata _message, MsgDataTypes.TransferInfo calldata _transfer, bytes[] calldata _sigs, address[] calldata _signers, uint256[] calldata _powers ) external payable; /** * @notice Execute a message with a refunded transfer. * @param _message Arbitrary message bytes originated from and encoded by the source app contract * @param _transfer The transfer info. * @param _sigs The list of signatures sorted by signing addresses in ascending order. A relay must be signed-off by * +2/3 of the sigsVerifier's current signing power to be delivered. * @param _signers The sorted list of signers. * @param _powers The signing powers of the signers. */ function executeMessageWithTransferRefund( bytes calldata _message, // the same message associated with the original transfer MsgDataTypes.TransferInfo calldata _transfer, bytes[] calldata _sigs, address[] calldata _signers, uint256[] calldata _powers ) external payable; /** * @notice Withdraws message fee in the form of native gas token. * @param _account The address receiving the fee. * @param _cumulativeFee The cumulative fee credited to the account. Tracked by SGN. * @param _sigs The list of signatures sorted by signing addresses in ascending order. A withdrawal must be * signed-off by +2/3 of the sigsVerifier's current signing power to be delivered. * @param _signers The sorted list of signers. * @param _powers The signing powers of the signers. */ function withdrawFee( address _account, uint256 _cumulativeFee, bytes[] calldata _sigs, address[] calldata _signers, uint256[] calldata _powers ) external; /** * @notice Calculates the required fee for the message. * @param _message Arbitrary message bytes to be decoded by the destination app contract. @ @return The required fee. */ function calcFee(bytes calldata _message) external view returns (uint256); function liquidityBridge() external view returns (address); function pegBridge() external view returns (address); function pegBridgeV2() external view returns (address); function pegVault() external view returns (address); function pegVaultV2() external view returns (address); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.8.0; library MsgDataTypes { string constant ABORT_PREFIX = "MSG::ABORT:"; // bridge operation type at the sender side (src chain) enum BridgeSendType { Null, Liquidity, PegDeposit, PegBurn, PegV2Deposit, PegV2Burn, PegV2BurnFrom } // bridge operation type at the receiver side (dst chain) enum TransferType { Null, LqRelay, // relay through liquidity bridge LqWithdraw, // withdraw from liquidity bridge PegMint, // mint through pegged token bridge PegWithdraw, // withdraw from original token vault PegV2Mint, // mint through pegged token bridge v2 PegV2Withdraw // withdraw from original token vault v2 } enum MsgType { MessageWithTransfer, MessageOnly } enum TxStatus { Null, Success, Fail, Fallback, Pending // transient state within a transaction } struct TransferInfo { TransferType t; address sender; address receiver; address token; uint256 amount; uint64 wdseq; // only needed for LqWithdraw (refund) uint64 srcChainId; bytes32 refId; bytes32 srcTxHash; // src chain msg tx hash } struct RouteInfo { address sender; address receiver; uint64 srcChainId; bytes32 srcTxHash; // src chain msg tx hash } // used for msg from non-evm chains with longer-bytes address struct RouteInfo2 { bytes sender; address receiver; uint64 srcChainId; bytes32 srcTxHash; } // combination of RouteInfo and RouteInfo2 for easier processing struct Route { address sender; // from RouteInfo bytes senderBytes; // from RouteInfo2 address receiver; uint64 srcChainId; bytes32 srcTxHash; } struct MsgWithTransferExecutionParams { bytes message; TransferInfo transfer; bytes[] sigs; address[] signers; uint256[] powers; } struct BridgeTransferParams { bytes request; bytes[] sigs; address[] signers; uint256[] powers; } }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity 0.8.17; import "@openzeppelin/contracts/security/Pausable.sol"; import "./Ownable.sol"; abstract contract Pauser is Ownable, Pausable { mapping(address => bool) public pausers; event PauserAdded(address account); event PauserRemoved(address account); constructor() { _addPauser(msg.sender); } modifier onlyPauser() { require(isPauser(msg.sender), "Caller is not pauser"); _; } function pause() public onlyPauser { _pause(); } function unpause() public onlyPauser { _unpause(); } function isPauser(address account) public view returns (bool) { return pausers[account]; } function addPauser(address account) public onlyOwner { _addPauser(account); } function removePauser(address account) public onlyOwner { _removePauser(account); } function renouncePauser() public { _removePauser(msg.sender); } function _addPauser(address account) private { require(!isPauser(account), "Account is already pauser"); pausers[account] = true; emit PauserAdded(account); } function _removePauser(address account) private { require(isPauser(account), "Account is not pauser"); pausers[account] = false; emit PauserRemoved(account); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
{ "metadata": { "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 800 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_msgBus","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"returnData","type":"bytes"}],"name":"ExtCallErr","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FeeClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"messageBus","type":"address"}],"name":"MessageBusUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"PauserAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"PauserRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"address","name":"nft","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"srcChid","type":"uint64"}],"name":"Received","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"srcNft","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"dstChid","type":"uint64"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"address","name":"dstNft","type":"address"}],"name":"Sent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"srcNft","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"dstChid","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"receiver","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"dstNft","type":"bytes"}],"name":"Sent2","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"dstChid","type":"uint64"},{"indexed":false,"internalType":"address","name":"dstNftBridge","type":"address"}],"name":"SetDestBridge","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"dstChid","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"dstNftBridge","type":"bytes"}],"name":"SetDestBridge2","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"srcNft","type":"address"},{"indexed":false,"internalType":"uint64","name":"dstChid","type":"uint64"},{"indexed":false,"internalType":"address","name":"dstNft","type":"address"}],"name":"SetDestNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"srcNft","type":"address"},{"indexed":false,"internalType":"uint64","name":"dstChid","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"dstNft","type":"bytes"}],"name":"SetDestNFT2","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"nft","type":"address"},{"indexed":false,"internalType":"bool","name":"isOrig","type":"bool"}],"name":"SetOrigNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"chid","type":"uint64"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"SetTxFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addPauser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nft","type":"address"}],"name":"delOrigNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"}],"name":"destBridge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"}],"name":"destBridge2","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"destNFTAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"destNFTAddr2","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"}],"name":"destTxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"sender","type":"bytes"},{"internalType":"uint64","name":"srcChid","type":"uint64"},{"internalType":"bytes","name":"_message","type":"bytes"},{"internalType":"address","name":"","type":"address"}],"name":"executeMessage","outputs":[{"internalType":"enum IMessageReceiverApp.ExecutionStatus","name":"","type":"uint8"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint64","name":"srcChid","type":"uint64"},{"internalType":"bytes","name":"_message","type":"bytes"},{"internalType":"address","name":"","type":"address"}],"name":"executeMessage","outputs":[{"internalType":"enum IMessageReceiverApp.ExecutionStatus","name":"","type":"uint8"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint64","name":"_srcChainId","type":"uint64"},{"internalType":"bytes","name":"_message","type":"bytes"},{"internalType":"address","name":"_executor","type":"address"}],"name":"executeMessageWithTransfer","outputs":[{"internalType":"enum IMessageReceiverApp.ExecutionStatus","name":"","type":"uint8"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint64","name":"_srcChainId","type":"uint64"},{"internalType":"bytes","name":"_message","type":"bytes"},{"internalType":"address","name":"_executor","type":"address"}],"name":"executeMessageWithTransferFallback","outputs":[{"internalType":"enum IMessageReceiverApp.ExecutionStatus","name":"","type":"uint8"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_message","type":"bytes"},{"internalType":"address","name":"_executor","type":"address"}],"name":"executeMessageWithTransferRefund","outputs":[{"internalType":"enum IMessageReceiverApp.ExecutionStatus","name":"","type":"uint8"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_msgBus","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isPauser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"messageBus","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"origNFT","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pausers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removePauser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renouncePauser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_dstChid","type":"uint64"},{"internalType":"address","name":"_sender","type":"address"},{"internalType":"bytes","name":"_receiver","type":"bytes"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"sendMsg","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_dstChid","type":"uint64"},{"internalType":"address","name":"_sender","type":"address"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"sendMsg","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_nft","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint64","name":"_dstChid","type":"uint64"},{"internalType":"bytes","name":"_receiver","type":"bytes"}],"name":"sendTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_nft","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint64","name":"_dstChid","type":"uint64"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"sendTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint64","name":"dstChid","type":"uint64"},{"internalType":"address","name":"dstNftBridge","type":"address"}],"name":"setDestBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"dstChid","type":"uint64"},{"internalType":"bytes","name":"dstNftBridge","type":"bytes"}],"name":"setDestBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64[]","name":"dstChid","type":"uint64[]"},{"internalType":"address[]","name":"dstNftBridge","type":"address[]"}],"name":"setDestBridges","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"srcNft","type":"address"},{"internalType":"uint64","name":"dstChid","type":"uint64"},{"internalType":"bytes","name":"dstNft","type":"bytes"}],"name":"setDestNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"srcNft","type":"address"},{"internalType":"uint64","name":"dstChid","type":"uint64"},{"internalType":"address","name":"dstNft","type":"address"}],"name":"setDestNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"srcNft","type":"address"},{"internalType":"uint64[]","name":"dstChid","type":"uint64[]"},{"internalType":"address[]","name":"dstNft","type":"address[]"}],"name":"setDestNFTs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_messageBus","type":"address"}],"name":"setMessageBus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nft","type":"address"}],"name":"setOrigNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"chid","type":"uint64"},{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setTxFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_dstChid","type":"uint64"},{"internalType":"address","name":"_nft","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"totalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162003d5638038062003d56833981016040819052620000349162000195565b6200003f336200007d565b6001805460ff60a01b191690556200005733620000cd565b600180546001600160a01b0319166001600160a01b0392909216919091179055620001c7565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811660009081526002602052604090205460ff16156200013b5760405162461bcd60e51b815260206004820152601960248201527f4163636f756e7420697320616c72656164792070617573657200000000000000604482015260640160405180910390fd5b6001600160a01b038116600081815260026020908152604091829020805460ff1916600117905590519182527f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f8910160405180910390a150565b600060208284031215620001a857600080fd5b81516001600160a01b0381168114620001c057600080fd5b9392505050565b613b7f80620001d76000396000f3fe6080604052600436106102a05760003560e01c80636ef8d66d1161016e5780639e041b9d116100cb578063ed99bf431161007f578063ee91bab811610064578063ee91bab814610760578063f0cb57ce14610773578063f2fde38b1461078657600080fd5b8063ed99bf4314610720578063edea75921461074057600080fd5b8063a1a227fa116100b0578063a1a227fa146106cd578063b2c88775146106ed578063da754f441461070057600080fd5b80639e041b9d1461066c5780639f825f07146106ad57600080fd5b80638da5cb5b1161012257806399d32fc41161010757806399d32fc4146106245780639c1a65bd146106395780639c649fdf1461065957600080fd5b80638da5cb5b146105e657806395b6a1911461060457600080fd5b806380f51c121161015357806380f51c121461058157806382dc1ec4146105b15780638456cb59146105d157600080fd5b80636ef8d66d1461056c5780637cd2bffc1461050757600080fd5b80633f4ba83a1161021c578063583624b7116101d05780635c975abb116101b55780635c975abb1461051a5780635d5b09f2146105395780636b2c0f551461054c57600080fd5b8063583624b7146104e75780635ab7afc61461050757600080fd5b806346fbf68e1161020157806346fbf68e1461046e5780634cc42351146104a7578063547cad12146104c757600080fd5b80633f4ba83a1461043957806343a8c1371461044e57600080fd5b8063151ff4eb116102735780631de13e43116102585780631de13e431461039e57806327cbe705146103cb5780632d5fa47c1461041957600080fd5b8063151ff4eb1461034357806319ab453c1461037e57600080fd5b8063063ce4e5146102a5578063065c38fd146102ce5780630bcb4982146102f05780631140c84e14610303575b600080fd5b6102b86102b3366004612d41565b6107a6565b6040516102c59190612dd7565b60405180910390f35b3480156102da57600080fd5b506102ee6102e9366004612dff565b61088a565b005b6102b86102fe366004612e1c565b610943565b34801561030f57600080fd5b5061033361031e366004612dff565b60066020526000908152604090205460ff1681565b60405190151581526020016102c5565b34801561034f57600080fd5b5061037061035e366004612e90565b60036020526000908152604090205481565b6040519081526020016102c5565b34801561038a57600080fd5b506102ee610399366004612dff565b6109a9565b3480156103aa57600080fd5b506103be6103b9366004612eab565b6109d3565b6040516102c59190612f30565b3480156103d757600080fd5b506104016103e6366004612e90565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016102c5565b34801561042557600080fd5b506102ee610434366004612f88565b610a78565b34801561044557600080fd5b506102ee610be2565b34801561045a57600080fd5b506102ee61046936600461300b565b610c4b565b34801561047a57600080fd5b50610333610489366004612dff565b6001600160a01b031660009081526002602052604090205460ff1690565b3480156104b357600080fd5b506103be6104c2366004612e90565b610d50565b3480156104d357600080fd5b506102ee6104e2366004612dff565b610d69565b3480156104f357600080fd5b506102ee610502366004613077565b610e0e565b6102b86105153660046130ce565b610ee1565b34801561052657600080fd5b50600154600160a01b900460ff16610333565b6102ee610547366004613165565b610f49565b34801561055857600080fd5b506102ee610567366004612dff565b6111ad565b34801561057857600080fd5b506102ee611210565b34801561058d57600080fd5b5061033361059c366004612dff565b60026020526000908152604090205460ff1681565b3480156105bd57600080fd5b506102ee6105cc366004612dff565b611219565b3480156105dd57600080fd5b506102ee611279565b3480156105f257600080fd5b506000546001600160a01b0316610401565b34801561061057600080fd5b506102ee61061f3660046131c5565b6112e0565b34801561063057600080fd5b506102ee6113c1565b34801561064557600080fd5b5061037061065436600461320e565b611478565b6102b861066736600461324d565b6116f1565b34801561067857600080fd5b50610401610687366004612eab565b60056020908152600092835260408084209091529082529020546001600160a01b031681565b3480156106b957600080fd5b506102ee6106c836600461329a565b6117a3565b3480156106d957600080fd5b50600154610401906001600160a01b031681565b6102ee6106fb3660046132c4565b611854565b34801561070c57600080fd5b506102ee61071b366004613315565b611ab6565b34801561072c57600080fd5b506102ee61073b366004612dff565b611b77565b34801561074c57600080fd5b506102ee61075b36600461334c565b611c25565b6102ee61076e36600461339f565b611cd4565b6102ee61078136600461343c565b611e23565b34801561079257600080fd5b506102ee6107a1366004612dff565b611f73565b6001546000906001600160a01b031633146108085760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206973206e6f74206d657373616765206275730000000000000060448201526064015b60405180910390fd5b600154600160a01b900460ff1680610865575067ffffffffffffffff851660009081526007602052604090819020905161084291906134f9565b6040518091039020878760405161085a92919061356f565b604051809103902014155b1561087257506002610880565b61087d84848761204f565b90505b9695505050505050565b3361089d6000546001600160a01b031690565b6001600160a01b0316146108e15760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b6001600160a01b038116600081815260066020908152604091829020805460ff191660019081179091558251938452908301527f9800fb32bf5eb9a3b2e42c910912da10ed1881dc538475101797669146166bf891015b60405180910390a150565b6001546000906001600160a01b031633146109a05760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206973206e6f74206d657373616765206275730000000000000060448201526064016107ff565b95945050505050565b6109b161227e565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6008602090815260009283526040808420909152908252902080546109f7906134bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610a23906134bf565b8015610a705780601f10610a4557610100808354040283529160200191610a70565b820191906000526020600020905b815481529060010190602001808311610a5357829003601f168201915b505050505081565b33610a8b6000546001600160a01b031690565b6001600160a01b031614610acf5760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b828114610b1e5760405162461bcd60e51b815260206004820152600f60248201527f6c656e677468206d69736d61746368000000000000000000000000000000000060448201526064016107ff565b60005b83811015610bda57828282818110610b3b57610b3b61357f565b9050602002016020810190610b509190612dff565b6001600160a01b038716600090815260056020526040812090878785818110610b7b57610b7b61357f565b9050602002016020810190610b909190612e90565b67ffffffffffffffff168152602081019190915260400160002080546001600160a01b0319166001600160a01b039290921691909117905580610bd2816135ab565b915050610b21565b505050505050565b3360009081526002602052604090205460ff16610c415760405162461bcd60e51b815260206004820152601460248201527f43616c6c6572206973206e6f742070617573657200000000000000000000000060448201526064016107ff565b610c496122e0565b565b33610c5e6000546001600160a01b031690565b6001600160a01b031614610ca25760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b60005b83811015610d4957828282818110610cbf57610cbf61357f565b9050602002016020810190610cd49190612dff565b60046000878785818110610cea57610cea61357f565b9050602002016020810190610cff9190612e90565b67ffffffffffffffff168152602081019190915260400160002080546001600160a01b0319166001600160a01b039290921691909117905580610d41816135ab565b915050610ca5565b5050505050565b600760205260009081526040902080546109f7906134bf565b33610d7c6000546001600160a01b031690565b6001600160a01b031614610dc05760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f3f8223bcd8b3b875473e9f9e14e1ad075451a2b5ffd31591655da9a01516bf5e90602001610938565b33610e216000546001600160a01b031690565b6001600160a01b031614610e655760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b6001600160a01b038416600090815260086020908152604080832067ffffffffffffffff871684529091529020610e9d828483613625565b507f1a8a0120788995f98396f44447190686d4b5978184ca4f9d726d541aed6fb7d684848484604051610ed3949392919061370e565b60405180910390a150505050565b6001546000906001600160a01b03163314610f3e5760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206973206e6f74206d657373616765206275730000000000000060448201526064016107ff565b979650505050505050565b600154600160a01b900460ff1615610f965760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016107ff565b6040516331a9108f60e11b8152600481018590526001600160a01b03861690636352211e90602401602060405180830381865afa158015610fdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fff9190613741565b6001600160a01b0316336001600160a01b0316146110515760405162461bcd60e51b815260206004820152600f60248201526e3737ba103a37b5b2b71037bbb732b960891b60448201526064016107ff565b60405163c87b56dd60e01b8152600481018590526000906001600160a01b0387169063c87b56dd90602401600060405180830381865afa158015611099573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110c191908101906137e0565b90506110cd8686612386565b6000806110da888761252c565b915091506111608287604051806080016040528089898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250602080820187905260408083018e90526060909201899052905161114c929101613853565b604051602081830303815290604052612736565b7f161c0f80e624fd7198682c940eb06e3a33589fef44e083931a0a7908ea1a1a5e3389898989898760405161119b97969594939291906138b5565b60405180910390a15050505050505050565b336111c06000546001600160a01b031690565b6001600160a01b0316146112045760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b61120d8161287f565b50565b610c493361287f565b3361122c6000546001600160a01b031690565b6001600160a01b0316146112705760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b61120d81612938565b3360009081526002602052604090205460ff166112d85760405162461bcd60e51b815260206004820152601460248201527f43616c6c6572206973206e6f742070617573657200000000000000000000000060448201526064016107ff565b610c496129f5565b336112f36000546001600160a01b031690565b6001600160a01b0316146113375760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b6001600160a01b03838116600081815260056020908152604080832067ffffffffffffffff88168085529083529281902080546001600160a01b03191695871695861790558051938452908301919091528101919091527fa5a9b84f1b7eb437335ea919a3ff6de6e242e4733d0100a77391106173794871906060015b60405180910390a1505050565b336113d46000546001600160a01b031690565b6001600160a01b0316146114185760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b6040514790339082156108fc029083906000818181858888f19350505050158015611447573d6000803e3d6000fd5b506040518181527f62b10e3ff3d45b5ff546e740b893897facb1680285f989a64ae932d62c5388e190602001610938565b60405163c87b56dd60e01b81526004810182905260009081906001600160a01b0385169063c87b56dd90602401600060405180830381865afa1580156114c2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114ea91908101906137e0565b6001600160a01b038516600090815260086020908152604080832067ffffffffffffffff8a16845290915281208054929350606092611528906134bf565b80601f0160208091040260200160405190810160405280929190818152602001828054611554906134bf565b80156115a15780601f10611576576101008083540402835291602001916115a1565b820191906000526020600020905b81548152906001019060200180831161158457829003601f168201915b505050505090506000815111156115f9576040518060800160405280828152602001828152602001868152602001848152506040516020016115e39190613853565b604051602081830303815290604052915061164e565b6040518060800160405280876001600160a01b03168152602001876001600160a01b031681526020018681526020018481525060405160200161163c9190613918565b60405160208183030381529060405291505b67ffffffffffffffff87166000908152600360205260409081902054600154915163299aee5160e11b815290916001600160a01b031690635335dca290611699908690600401612f30565b602060405180830381865afa1580156116b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116da9190613966565b6116e4919061397f565b93505050505b9392505050565b6001546000906001600160a01b0316331461174e5760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206973206e6f74206d657373616765206275730000000000000060448201526064016107ff565b600154600160a01b900460ff168061178b575067ffffffffffffffff85166000908152600460205260409020546001600160a01b03878116911614155b15611798575060026109a0565b61088084848761204f565b336117b66000546001600160a01b031690565b6001600160a01b0316146117fa5760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b67ffffffffffffffff8216600081815260036020908152604091829020849055815192835282018390527f446a287c2114fa54d0083d97ce8f6f15b2ce29fa1c2df4b5a580d581ea7c4ad391015b60405180910390a15050565b600154600160a01b900460ff16156118a15760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016107ff565b6040516331a9108f60e11b8152600481018490526001600160a01b03851690636352211e90602401602060405180830381865afa1580156118e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190a9190613741565b6001600160a01b0316336001600160a01b03161461195c5760405162461bcd60e51b815260206004820152600f60248201526e3737ba103a37b5b2b71037bbb732b960891b60448201526064016107ff565b60405163c87b56dd60e01b8152600481018490526000906001600160a01b0386169063c87b56dd90602401600060405180830381865afa1580156119a4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119cc91908101906137e0565b90506119d88585612386565b6000806119e58786612a7d565b91509150611a4582866040518060800160405280886001600160a01b03168152602001856001600160a01b031681526020018a815260200187815250604051602001611a319190613918565b604051602081830303815290604052612b6c565b604080513381526001600160a01b03898116602083015281830189905267ffffffffffffffff881660608301528681166080830152831660a082015290517f40143e5b72b2109d658cfa709dec6213f60364dbd08b7253cdaf5f4e0c49561c9181900360c00190a150505050505050565b33611ac96000546001600160a01b031690565b6001600160a01b031614611b0d5760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b67ffffffffffffffff821660008181526004602090815260409182902080546001600160a01b0319166001600160a01b0386169081179091558251938452908301527f3e776334b24c927645043308f89ac1ca734002e5a921ff384a70dcbb88c92cd49101611848565b33611b8a6000546001600160a01b031690565b6001600160a01b031614611bce5760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b6001600160a01b0381166000818152600660209081526040808320805460ff191690558051938452908301919091527f9800fb32bf5eb9a3b2e42c910912da10ed1881dc538475101797669146166bf89101610938565b33611c386000546001600160a01b031690565b6001600160a01b031614611c7c5760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b67ffffffffffffffff83166000908152600760205260409020611ca0828483613625565b507ff00f7a8fa03b713f64d18cad2ad60051000162263e005d5ed22c692f42c4a2eb8383836040516113b493929190613998565b600154600160a01b900460ff1615611d215760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016107ff565b33600080611d2f838b61252c565b91509150611dd4828b60405180608001604052808c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250602080820187905260408083018d90528051601f8c018390048302810183019091528a8152606090920191908b908b9081908401838280828437600092019190915250505091525060405161114c9190602001613853565b7f161c0f80e624fd7198682c940eb06e3a33589fef44e083931a0a7908ea1a1a5e8984888d8c8c87604051611e0f97969594939291906138b5565b60405180910390a150505050505050505050565b600154600160a01b900460ff1615611e705760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016107ff565b33600080611e7e838a612a7d565b91509150611efe828a60405180608001604052808b6001600160a01b03168152602001856001600160a01b031681526020018a815260200189898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050915250604051611a319190602001613918565b604080516001600160a01b038a81168252858116602083015281830189905267ffffffffffffffff8c1660608301528981166080830152831660a082015290517f40143e5b72b2109d658cfa709dec6213f60364dbd08b7253cdaf5f4e0c49561c9181900360c00190a1505050505050505050565b33611f866000546001600160a01b031690565b6001600160a01b031614611fca5760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b6001600160a01b0381166120465760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107ff565b61120d81612c7d565b60008061205e848601866139bc565b6020808201516001600160a01b031660009081526006909152604090205490915060ff161515600103612174576020810151815160408084015190516323b872dd60e01b81523060048201526001600160a01b03928316602482015260448101919091529116906323b872dd90606401600060405180830381600087803b1580156120e857600080fd5b505af19250505080156120f9575060015b61216f573d808015612127576040519150601f19603f3d011682016040523d82523d6000602084013e61212c565b606091505b507f2c4d9008b1f58a23591c25a813b398a54f438d50b85bedea3d6e7302ee08a8108160405161215c9190612f30565b60405180910390a16002925050506116ea565b61220c565b60208101518151604080840151606085015191516333eba6f160e11b81526001600160a01b03909416936367d74de2936121b393909291600401613a9a565b600060405180830381600087803b1580156121cd57600080fd5b505af19250505080156121de575060015b61220c573d808015612127576040519150601f19603f3d011682016040523d82523d6000602084013e61212c565b805160208083015160408085015181516001600160a01b03958616815294909216928401929092528282015267ffffffffffffffff85166060830152517f0aac355db06d21352d6b898d8e0ae1334d55f65b6c4c09e26951166a8eb4dba79181900360800190a1506001949350505050565b6000546001600160a01b0316156122d75760405162461bcd60e51b815260206004820152601160248201527f6f776e657220616c72656164792073657400000000000000000000000000000060448201526064016107ff565b610c4933612c7d565b600154600160a01b900460ff166123395760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016107ff565b6001805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b03821660009081526006602052604090205460ff1615156001036124d6576040516323b872dd60e01b8152336004820152306024820152604481018290526001600160a01b038316906323b872dd90606401600060405180830381600087803b1580156123f957600080fd5b505af115801561240d573d6000803e3d6000fd5b50506040516331a9108f60e11b8152600481018490523092506001600160a01b0385169150636352211e90602401602060405180830381865afa158015612458573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247c9190613741565b6001600160a01b0316146124d25760405162461bcd60e51b815260206004820152601360248201527f7472616e73666572204e4654206661696c65640000000000000000000000000060448201526064016107ff565b5050565b604051630852cd8d60e31b8152600481018290526001600160a01b038316906342966c6890602401600060405180830381600087803b15801561251857600080fd5b505af1158015610bda573d6000803e3d6000fd5b67ffffffffffffffff8116600090815260076020526040902080546060918291612555906134bf565b80601f0160208091040260200160405190810160405280929190818152602001828054612581906134bf565b80156125ce5780601f106125a3576101008083540402835291602001916125ce565b820191906000526020600020905b8154815290600101906020018083116125b157829003601f168201915b5050505050915081516000036126265760405162461bcd60e51b815260206004820152601960248201527f64657374204e465420427269646765206e6f7420666f756e640000000000000060448201526064016107ff565b6001600160a01b038416600090815260086020908152604080832067ffffffffffffffff871684529091529020805461265e906134bf565b80601f016020809104026020016040519081016040528092919081815260200182805461268a906134bf565b80156126d75780601f106126ac576101008083540402835291602001916126d7565b820191906000526020600020905b8154815290600101906020018083116126ba57829003601f168201915b50505050509050805160000361272f5760405162461bcd60e51b815260206004820152601260248201527f64657374204e4654206e6f7420666f756e64000000000000000000000000000060448201526064016107ff565b9250929050565b60015460405163299aee5160e11b81526000916001600160a01b031690635335dca290612767908590600401612f30565b602060405180830381865afa158015612784573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127a89190613966565b67ffffffffffffffff84166000908152600360205260409020549091506127cf908261397f565b3410156128115760405162461bcd60e51b815260206004820152601060248201526f696e73756666696369656e742066656560801b60448201526064016107ff565b600154604051637d7a101d60e01b81526001600160a01b0390911690637d7a101d90839061284790889088908890600401613ac2565b6000604051808303818588803b15801561286057600080fd5b505af1158015612874573d6000803e3d6000fd5b505050505050505050565b6001600160a01b03811660009081526002602052604090205460ff166128e75760405162461bcd60e51b815260206004820152601560248201527f4163636f756e74206973206e6f7420706175736572000000000000000000000060448201526064016107ff565b6001600160a01b038116600081815260026020908152604091829020805460ff1916905590519182527fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e9101610938565b6001600160a01b03811660009081526002602052604090205460ff16156129a15760405162461bcd60e51b815260206004820152601960248201527f4163636f756e7420697320616c7265616479207061757365720000000000000060448201526064016107ff565b6001600160a01b038116600081815260026020908152604091829020805460ff1916600117905590519182527f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f89101610938565b600154600160a01b900460ff1615612a425760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016107ff565b6001805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586123693390565b67ffffffffffffffff81166000908152600460205260408120546001600160a01b03169081612aee5760405162461bcd60e51b815260206004820152601960248201527f64657374204e465420427269646765206e6f7420666f756e640000000000000060448201526064016107ff565b506001600160a01b03808416600090815260056020908152604080832067ffffffffffffffff87168452909152902054168061272f5760405162461bcd60e51b815260206004820152601260248201527f64657374204e4654206e6f7420666f756e64000000000000000000000000000060448201526064016107ff565b60015460405163299aee5160e11b81526000916001600160a01b031690635335dca290612b9d908590600401612f30565b602060405180830381865afa158015612bba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bde9190613966565b67ffffffffffffffff8416600090815260036020526040902054909150612c05908261397f565b341015612c475760405162461bcd60e51b815260206004820152601060248201526f696e73756666696369656e742066656560801b60448201526064016107ff565b600154604051634f9e72ad60e11b81526001600160a01b0390911690639f3ce55a90839061284790889088908890600401613af7565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008083601f840112612cdf57600080fd5b50813567ffffffffffffffff811115612cf757600080fd5b60208301915083602082850101111561272f57600080fd5b803567ffffffffffffffff81168114612d2757600080fd5b919050565b6001600160a01b038116811461120d57600080fd5b60008060008060008060808789031215612d5a57600080fd5b863567ffffffffffffffff80821115612d7257600080fd5b612d7e8a838b01612ccd565b9098509650869150612d9260208a01612d0f565b95506040890135915080821115612da857600080fd5b50612db589828a01612ccd565b9094509250506060870135612dc981612d2c565b809150509295509295509295565b6020810160038310612df957634e487b7160e01b600052602160045260246000fd5b91905290565b600060208284031215612e1157600080fd5b81356116ea81612d2c565b600080600080600060808688031215612e3457600080fd5b8535612e3f81612d2c565b945060208601359350604086013567ffffffffffffffff811115612e6257600080fd5b612e6e88828901612ccd565b9094509250506060860135612e8281612d2c565b809150509295509295909350565b600060208284031215612ea257600080fd5b6116ea82612d0f565b60008060408385031215612ebe57600080fd5b8235612ec981612d2c565b9150612ed760208401612d0f565b90509250929050565b60005b83811015612efb578181015183820152602001612ee3565b50506000910152565b60008151808452612f1c816020860160208601612ee0565b601f01601f19169290920160200192915050565b6020815260006116ea6020830184612f04565b60008083601f840112612f5557600080fd5b50813567ffffffffffffffff811115612f6d57600080fd5b6020830191508360208260051b850101111561272f57600080fd5b600080600080600060608688031215612fa057600080fd5b8535612fab81612d2c565b9450602086013567ffffffffffffffff80821115612fc857600080fd5b612fd489838a01612f43565b90965094506040880135915080821115612fed57600080fd5b50612ffa88828901612f43565b969995985093965092949392505050565b6000806000806040858703121561302157600080fd5b843567ffffffffffffffff8082111561303957600080fd5b61304588838901612f43565b9096509450602087013591508082111561305e57600080fd5b5061306b87828801612f43565b95989497509550505050565b6000806000806060858703121561308d57600080fd5b843561309881612d2c565b93506130a660208601612d0f565b9250604085013567ffffffffffffffff8111156130c257600080fd5b61306b87828801612ccd565b600080600080600080600060c0888a0312156130e957600080fd5b87356130f481612d2c565b9650602088013561310481612d2c565b95506040880135945061311960608901612d0f565b9350608088013567ffffffffffffffff81111561313557600080fd5b6131418a828b01612ccd565b90945092505060a088013561315581612d2c565b8091505092959891949750929550565b60008060008060006080868803121561317d57600080fd5b853561318881612d2c565b94506020860135935061319d60408701612d0f565b9250606086013567ffffffffffffffff8111156131b957600080fd5b612ffa88828901612ccd565b6000806000606084860312156131da57600080fd5b83356131e581612d2c565b92506131f360208501612d0f565b9150604084013561320381612d2c565b809150509250925092565b60008060006060848603121561322357600080fd5b61322c84612d0f565b9250602084013561323c81612d2c565b929592945050506040919091013590565b60008060008060006080868803121561326557600080fd5b853561327081612d2c565b945061327e60208701612d0f565b9350604086013567ffffffffffffffff811115612e6257600080fd5b600080604083850312156132ad57600080fd5b6132b683612d0f565b946020939093013593505050565b600080600080608085870312156132da57600080fd5b84356132e581612d2c565b9350602085013592506132fa60408601612d0f565b9150606085013561330a81612d2c565b939692955090935050565b6000806040838503121561332857600080fd5b61333183612d0f565b9150602083013561334181612d2c565b809150509250929050565b60008060006040848603121561336157600080fd5b61336a84612d0f565b9250602084013567ffffffffffffffff81111561338657600080fd5b61339286828701612ccd565b9497909650939450505050565b600080600080600080600060a0888a0312156133ba57600080fd5b6133c388612d0f565b965060208801356133d381612d2c565b9550604088013567ffffffffffffffff808211156133f057600080fd5b6133fc8b838c01612ccd565b909750955060608a0135945060808a013591508082111561341c57600080fd5b506134298a828b01612ccd565b989b979a50959850939692959293505050565b60008060008060008060a0878903121561345557600080fd5b61345e87612d0f565b9550602087013561346e81612d2c565b9450604087013561347e81612d2c565b935060608701359250608087013567ffffffffffffffff8111156134a157600080fd5b6134ad89828a01612ccd565b979a9699509497509295939492505050565b600181811c908216806134d357607f821691505b6020821081036134f357634e487b7160e01b600052602260045260246000fd5b50919050565b6000808354613507816134bf565b6001828116801561351f576001811461353457613563565b60ff1984168752821515830287019450613563565b8760005260208060002060005b8581101561355a5781548a820152908401908201613541565b50505082870194505b50929695505050505050565b8183823760009101908152919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016135bd576135bd613595565b5060010190565b634e487b7160e01b600052604160045260246000fd5b601f82111561362057600081815260208120601f850160051c810160208610156136015750805b601f850160051c820191505b81811015610bda5782815560010161360d565b505050565b67ffffffffffffffff83111561363d5761363d6135c4565b6136518361364b83546134bf565b836135da565b6000601f841160018114613685576000851561366d5750838201355b600019600387901b1c1916600186901b178355610d49565b600083815260209020601f19861690835b828110156136b65786850135825560209485019460019092019101613696565b50868210156136d35760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b038516815267ffffffffffffffff841660208201526060604082015260006108806060830184866136e5565b60006020828403121561375357600080fd5b81516116ea81612d2c565b6040516080810167ffffffffffffffff81118282101715613781576137816135c4565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156137b0576137b06135c4565b604052919050565b600067ffffffffffffffff8211156137d2576137d26135c4565b50601f01601f191660200190565b6000602082840312156137f257600080fd5b815167ffffffffffffffff81111561380957600080fd5b8201601f8101841361381a57600080fd5b805161382d613828826137b8565b613787565b81815285602083850101111561384257600080fd5b6109a0826020830160208601612ee0565b60208152600082516080602084015261386f60a0840182612f04565b90506020840151601f198085840301604086015261388d8383612f04565b9250604086015160608601526060860151915080858403016080860152506109a08282612f04565b60006001600160a01b03808a16835280891660208401525086604083015267ffffffffffffffff8616606083015260c060808301526138f860c0830185876136e5565b82810360a084015261390a8185612f04565b9a9950505050505050505050565b6020815260006001600160a01b038084511660208401528060208501511660408401525060408301516060830152606083015160808084015261395e60a0840182612f04565b949350505050565b60006020828403121561397857600080fd5b5051919050565b8082018082111561399257613992613595565b92915050565b67ffffffffffffffff841681526040602082015260006109a06040830184866136e5565b600060208083850312156139cf57600080fd5b823567ffffffffffffffff808211156139e757600080fd5b90840190608082870312156139fb57600080fd5b613a0361375e565b8235613a0e81612d2c565b815282840135613a1d81612d2c565b8185015260408381013590820152606083013582811115613a3d57600080fd5b80840193505086601f840112613a5257600080fd5b82359150613a62613828836137b8565b8281528785848601011115613a7657600080fd5b82858501868301376000858483010152806060830152508094505050505092915050565b6001600160a01b03841681528260208201526060604082015260006109a06060830184612f04565b606081526000613ad56060830186612f04565b67ffffffffffffffff8516602084015282810360408401526108808185612f04565b6001600160a01b038416815267ffffffffffffffff831660208201526060604082015260006109a06060830184612f0456fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220b858f5b10153bc66bb5164b900409fd0964426a32294f87e83a5e247222a2a4b64736f6c634300081100330000000000000000000000009bb46d5100d2db4608112026951c9c965b233f4d
Deployed Bytecode
0x6080604052600436106102a05760003560e01c80636ef8d66d1161016e5780639e041b9d116100cb578063ed99bf431161007f578063ee91bab811610064578063ee91bab814610760578063f0cb57ce14610773578063f2fde38b1461078657600080fd5b8063ed99bf4314610720578063edea75921461074057600080fd5b8063a1a227fa116100b0578063a1a227fa146106cd578063b2c88775146106ed578063da754f441461070057600080fd5b80639e041b9d1461066c5780639f825f07146106ad57600080fd5b80638da5cb5b1161012257806399d32fc41161010757806399d32fc4146106245780639c1a65bd146106395780639c649fdf1461065957600080fd5b80638da5cb5b146105e657806395b6a1911461060457600080fd5b806380f51c121161015357806380f51c121461058157806382dc1ec4146105b15780638456cb59146105d157600080fd5b80636ef8d66d1461056c5780637cd2bffc1461050757600080fd5b80633f4ba83a1161021c578063583624b7116101d05780635c975abb116101b55780635c975abb1461051a5780635d5b09f2146105395780636b2c0f551461054c57600080fd5b8063583624b7146104e75780635ab7afc61461050757600080fd5b806346fbf68e1161020157806346fbf68e1461046e5780634cc42351146104a7578063547cad12146104c757600080fd5b80633f4ba83a1461043957806343a8c1371461044e57600080fd5b8063151ff4eb116102735780631de13e43116102585780631de13e431461039e57806327cbe705146103cb5780632d5fa47c1461041957600080fd5b8063151ff4eb1461034357806319ab453c1461037e57600080fd5b8063063ce4e5146102a5578063065c38fd146102ce5780630bcb4982146102f05780631140c84e14610303575b600080fd5b6102b86102b3366004612d41565b6107a6565b6040516102c59190612dd7565b60405180910390f35b3480156102da57600080fd5b506102ee6102e9366004612dff565b61088a565b005b6102b86102fe366004612e1c565b610943565b34801561030f57600080fd5b5061033361031e366004612dff565b60066020526000908152604090205460ff1681565b60405190151581526020016102c5565b34801561034f57600080fd5b5061037061035e366004612e90565b60036020526000908152604090205481565b6040519081526020016102c5565b34801561038a57600080fd5b506102ee610399366004612dff565b6109a9565b3480156103aa57600080fd5b506103be6103b9366004612eab565b6109d3565b6040516102c59190612f30565b3480156103d757600080fd5b506104016103e6366004612e90565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016102c5565b34801561042557600080fd5b506102ee610434366004612f88565b610a78565b34801561044557600080fd5b506102ee610be2565b34801561045a57600080fd5b506102ee61046936600461300b565b610c4b565b34801561047a57600080fd5b50610333610489366004612dff565b6001600160a01b031660009081526002602052604090205460ff1690565b3480156104b357600080fd5b506103be6104c2366004612e90565b610d50565b3480156104d357600080fd5b506102ee6104e2366004612dff565b610d69565b3480156104f357600080fd5b506102ee610502366004613077565b610e0e565b6102b86105153660046130ce565b610ee1565b34801561052657600080fd5b50600154600160a01b900460ff16610333565b6102ee610547366004613165565b610f49565b34801561055857600080fd5b506102ee610567366004612dff565b6111ad565b34801561057857600080fd5b506102ee611210565b34801561058d57600080fd5b5061033361059c366004612dff565b60026020526000908152604090205460ff1681565b3480156105bd57600080fd5b506102ee6105cc366004612dff565b611219565b3480156105dd57600080fd5b506102ee611279565b3480156105f257600080fd5b506000546001600160a01b0316610401565b34801561061057600080fd5b506102ee61061f3660046131c5565b6112e0565b34801561063057600080fd5b506102ee6113c1565b34801561064557600080fd5b5061037061065436600461320e565b611478565b6102b861066736600461324d565b6116f1565b34801561067857600080fd5b50610401610687366004612eab565b60056020908152600092835260408084209091529082529020546001600160a01b031681565b3480156106b957600080fd5b506102ee6106c836600461329a565b6117a3565b3480156106d957600080fd5b50600154610401906001600160a01b031681565b6102ee6106fb3660046132c4565b611854565b34801561070c57600080fd5b506102ee61071b366004613315565b611ab6565b34801561072c57600080fd5b506102ee61073b366004612dff565b611b77565b34801561074c57600080fd5b506102ee61075b36600461334c565b611c25565b6102ee61076e36600461339f565b611cd4565b6102ee61078136600461343c565b611e23565b34801561079257600080fd5b506102ee6107a1366004612dff565b611f73565b6001546000906001600160a01b031633146108085760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206973206e6f74206d657373616765206275730000000000000060448201526064015b60405180910390fd5b600154600160a01b900460ff1680610865575067ffffffffffffffff851660009081526007602052604090819020905161084291906134f9565b6040518091039020878760405161085a92919061356f565b604051809103902014155b1561087257506002610880565b61087d84848761204f565b90505b9695505050505050565b3361089d6000546001600160a01b031690565b6001600160a01b0316146108e15760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b6001600160a01b038116600081815260066020908152604091829020805460ff191660019081179091558251938452908301527f9800fb32bf5eb9a3b2e42c910912da10ed1881dc538475101797669146166bf891015b60405180910390a150565b6001546000906001600160a01b031633146109a05760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206973206e6f74206d657373616765206275730000000000000060448201526064016107ff565b95945050505050565b6109b161227e565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6008602090815260009283526040808420909152908252902080546109f7906134bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610a23906134bf565b8015610a705780601f10610a4557610100808354040283529160200191610a70565b820191906000526020600020905b815481529060010190602001808311610a5357829003601f168201915b505050505081565b33610a8b6000546001600160a01b031690565b6001600160a01b031614610acf5760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b828114610b1e5760405162461bcd60e51b815260206004820152600f60248201527f6c656e677468206d69736d61746368000000000000000000000000000000000060448201526064016107ff565b60005b83811015610bda57828282818110610b3b57610b3b61357f565b9050602002016020810190610b509190612dff565b6001600160a01b038716600090815260056020526040812090878785818110610b7b57610b7b61357f565b9050602002016020810190610b909190612e90565b67ffffffffffffffff168152602081019190915260400160002080546001600160a01b0319166001600160a01b039290921691909117905580610bd2816135ab565b915050610b21565b505050505050565b3360009081526002602052604090205460ff16610c415760405162461bcd60e51b815260206004820152601460248201527f43616c6c6572206973206e6f742070617573657200000000000000000000000060448201526064016107ff565b610c496122e0565b565b33610c5e6000546001600160a01b031690565b6001600160a01b031614610ca25760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b60005b83811015610d4957828282818110610cbf57610cbf61357f565b9050602002016020810190610cd49190612dff565b60046000878785818110610cea57610cea61357f565b9050602002016020810190610cff9190612e90565b67ffffffffffffffff168152602081019190915260400160002080546001600160a01b0319166001600160a01b039290921691909117905580610d41816135ab565b915050610ca5565b5050505050565b600760205260009081526040902080546109f7906134bf565b33610d7c6000546001600160a01b031690565b6001600160a01b031614610dc05760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f3f8223bcd8b3b875473e9f9e14e1ad075451a2b5ffd31591655da9a01516bf5e90602001610938565b33610e216000546001600160a01b031690565b6001600160a01b031614610e655760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b6001600160a01b038416600090815260086020908152604080832067ffffffffffffffff871684529091529020610e9d828483613625565b507f1a8a0120788995f98396f44447190686d4b5978184ca4f9d726d541aed6fb7d684848484604051610ed3949392919061370e565b60405180910390a150505050565b6001546000906001600160a01b03163314610f3e5760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206973206e6f74206d657373616765206275730000000000000060448201526064016107ff565b979650505050505050565b600154600160a01b900460ff1615610f965760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016107ff565b6040516331a9108f60e11b8152600481018590526001600160a01b03861690636352211e90602401602060405180830381865afa158015610fdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fff9190613741565b6001600160a01b0316336001600160a01b0316146110515760405162461bcd60e51b815260206004820152600f60248201526e3737ba103a37b5b2b71037bbb732b960891b60448201526064016107ff565b60405163c87b56dd60e01b8152600481018590526000906001600160a01b0387169063c87b56dd90602401600060405180830381865afa158015611099573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110c191908101906137e0565b90506110cd8686612386565b6000806110da888761252c565b915091506111608287604051806080016040528089898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250602080820187905260408083018e90526060909201899052905161114c929101613853565b604051602081830303815290604052612736565b7f161c0f80e624fd7198682c940eb06e3a33589fef44e083931a0a7908ea1a1a5e3389898989898760405161119b97969594939291906138b5565b60405180910390a15050505050505050565b336111c06000546001600160a01b031690565b6001600160a01b0316146112045760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b61120d8161287f565b50565b610c493361287f565b3361122c6000546001600160a01b031690565b6001600160a01b0316146112705760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b61120d81612938565b3360009081526002602052604090205460ff166112d85760405162461bcd60e51b815260206004820152601460248201527f43616c6c6572206973206e6f742070617573657200000000000000000000000060448201526064016107ff565b610c496129f5565b336112f36000546001600160a01b031690565b6001600160a01b0316146113375760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b6001600160a01b03838116600081815260056020908152604080832067ffffffffffffffff88168085529083529281902080546001600160a01b03191695871695861790558051938452908301919091528101919091527fa5a9b84f1b7eb437335ea919a3ff6de6e242e4733d0100a77391106173794871906060015b60405180910390a1505050565b336113d46000546001600160a01b031690565b6001600160a01b0316146114185760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b6040514790339082156108fc029083906000818181858888f19350505050158015611447573d6000803e3d6000fd5b506040518181527f62b10e3ff3d45b5ff546e740b893897facb1680285f989a64ae932d62c5388e190602001610938565b60405163c87b56dd60e01b81526004810182905260009081906001600160a01b0385169063c87b56dd90602401600060405180830381865afa1580156114c2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114ea91908101906137e0565b6001600160a01b038516600090815260086020908152604080832067ffffffffffffffff8a16845290915281208054929350606092611528906134bf565b80601f0160208091040260200160405190810160405280929190818152602001828054611554906134bf565b80156115a15780601f10611576576101008083540402835291602001916115a1565b820191906000526020600020905b81548152906001019060200180831161158457829003601f168201915b505050505090506000815111156115f9576040518060800160405280828152602001828152602001868152602001848152506040516020016115e39190613853565b604051602081830303815290604052915061164e565b6040518060800160405280876001600160a01b03168152602001876001600160a01b031681526020018681526020018481525060405160200161163c9190613918565b60405160208183030381529060405291505b67ffffffffffffffff87166000908152600360205260409081902054600154915163299aee5160e11b815290916001600160a01b031690635335dca290611699908690600401612f30565b602060405180830381865afa1580156116b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116da9190613966565b6116e4919061397f565b93505050505b9392505050565b6001546000906001600160a01b0316331461174e5760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206973206e6f74206d657373616765206275730000000000000060448201526064016107ff565b600154600160a01b900460ff168061178b575067ffffffffffffffff85166000908152600460205260409020546001600160a01b03878116911614155b15611798575060026109a0565b61088084848761204f565b336117b66000546001600160a01b031690565b6001600160a01b0316146117fa5760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b67ffffffffffffffff8216600081815260036020908152604091829020849055815192835282018390527f446a287c2114fa54d0083d97ce8f6f15b2ce29fa1c2df4b5a580d581ea7c4ad391015b60405180910390a15050565b600154600160a01b900460ff16156118a15760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016107ff565b6040516331a9108f60e11b8152600481018490526001600160a01b03851690636352211e90602401602060405180830381865afa1580156118e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190a9190613741565b6001600160a01b0316336001600160a01b03161461195c5760405162461bcd60e51b815260206004820152600f60248201526e3737ba103a37b5b2b71037bbb732b960891b60448201526064016107ff565b60405163c87b56dd60e01b8152600481018490526000906001600160a01b0386169063c87b56dd90602401600060405180830381865afa1580156119a4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119cc91908101906137e0565b90506119d88585612386565b6000806119e58786612a7d565b91509150611a4582866040518060800160405280886001600160a01b03168152602001856001600160a01b031681526020018a815260200187815250604051602001611a319190613918565b604051602081830303815290604052612b6c565b604080513381526001600160a01b03898116602083015281830189905267ffffffffffffffff881660608301528681166080830152831660a082015290517f40143e5b72b2109d658cfa709dec6213f60364dbd08b7253cdaf5f4e0c49561c9181900360c00190a150505050505050565b33611ac96000546001600160a01b031690565b6001600160a01b031614611b0d5760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b67ffffffffffffffff821660008181526004602090815260409182902080546001600160a01b0319166001600160a01b0386169081179091558251938452908301527f3e776334b24c927645043308f89ac1ca734002e5a921ff384a70dcbb88c92cd49101611848565b33611b8a6000546001600160a01b031690565b6001600160a01b031614611bce5760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b6001600160a01b0381166000818152600660209081526040808320805460ff191690558051938452908301919091527f9800fb32bf5eb9a3b2e42c910912da10ed1881dc538475101797669146166bf89101610938565b33611c386000546001600160a01b031690565b6001600160a01b031614611c7c5760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b67ffffffffffffffff83166000908152600760205260409020611ca0828483613625565b507ff00f7a8fa03b713f64d18cad2ad60051000162263e005d5ed22c692f42c4a2eb8383836040516113b493929190613998565b600154600160a01b900460ff1615611d215760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016107ff565b33600080611d2f838b61252c565b91509150611dd4828b60405180608001604052808c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250602080820187905260408083018d90528051601f8c018390048302810183019091528a8152606090920191908b908b9081908401838280828437600092019190915250505091525060405161114c9190602001613853565b7f161c0f80e624fd7198682c940eb06e3a33589fef44e083931a0a7908ea1a1a5e8984888d8c8c87604051611e0f97969594939291906138b5565b60405180910390a150505050505050505050565b600154600160a01b900460ff1615611e705760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016107ff565b33600080611e7e838a612a7d565b91509150611efe828a60405180608001604052808b6001600160a01b03168152602001856001600160a01b031681526020018a815260200189898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050915250604051611a319190602001613918565b604080516001600160a01b038a81168252858116602083015281830189905267ffffffffffffffff8c1660608301528981166080830152831660a082015290517f40143e5b72b2109d658cfa709dec6213f60364dbd08b7253cdaf5f4e0c49561c9181900360c00190a1505050505050505050565b33611f866000546001600160a01b031690565b6001600160a01b031614611fca5760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b6001600160a01b0381166120465760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107ff565b61120d81612c7d565b60008061205e848601866139bc565b6020808201516001600160a01b031660009081526006909152604090205490915060ff161515600103612174576020810151815160408084015190516323b872dd60e01b81523060048201526001600160a01b03928316602482015260448101919091529116906323b872dd90606401600060405180830381600087803b1580156120e857600080fd5b505af19250505080156120f9575060015b61216f573d808015612127576040519150601f19603f3d011682016040523d82523d6000602084013e61212c565b606091505b507f2c4d9008b1f58a23591c25a813b398a54f438d50b85bedea3d6e7302ee08a8108160405161215c9190612f30565b60405180910390a16002925050506116ea565b61220c565b60208101518151604080840151606085015191516333eba6f160e11b81526001600160a01b03909416936367d74de2936121b393909291600401613a9a565b600060405180830381600087803b1580156121cd57600080fd5b505af19250505080156121de575060015b61220c573d808015612127576040519150601f19603f3d011682016040523d82523d6000602084013e61212c565b805160208083015160408085015181516001600160a01b03958616815294909216928401929092528282015267ffffffffffffffff85166060830152517f0aac355db06d21352d6b898d8e0ae1334d55f65b6c4c09e26951166a8eb4dba79181900360800190a1506001949350505050565b6000546001600160a01b0316156122d75760405162461bcd60e51b815260206004820152601160248201527f6f776e657220616c72656164792073657400000000000000000000000000000060448201526064016107ff565b610c4933612c7d565b600154600160a01b900460ff166123395760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016107ff565b6001805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b03821660009081526006602052604090205460ff1615156001036124d6576040516323b872dd60e01b8152336004820152306024820152604481018290526001600160a01b038316906323b872dd90606401600060405180830381600087803b1580156123f957600080fd5b505af115801561240d573d6000803e3d6000fd5b50506040516331a9108f60e11b8152600481018490523092506001600160a01b0385169150636352211e90602401602060405180830381865afa158015612458573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247c9190613741565b6001600160a01b0316146124d25760405162461bcd60e51b815260206004820152601360248201527f7472616e73666572204e4654206661696c65640000000000000000000000000060448201526064016107ff565b5050565b604051630852cd8d60e31b8152600481018290526001600160a01b038316906342966c6890602401600060405180830381600087803b15801561251857600080fd5b505af1158015610bda573d6000803e3d6000fd5b67ffffffffffffffff8116600090815260076020526040902080546060918291612555906134bf565b80601f0160208091040260200160405190810160405280929190818152602001828054612581906134bf565b80156125ce5780601f106125a3576101008083540402835291602001916125ce565b820191906000526020600020905b8154815290600101906020018083116125b157829003601f168201915b5050505050915081516000036126265760405162461bcd60e51b815260206004820152601960248201527f64657374204e465420427269646765206e6f7420666f756e640000000000000060448201526064016107ff565b6001600160a01b038416600090815260086020908152604080832067ffffffffffffffff871684529091529020805461265e906134bf565b80601f016020809104026020016040519081016040528092919081815260200182805461268a906134bf565b80156126d75780601f106126ac576101008083540402835291602001916126d7565b820191906000526020600020905b8154815290600101906020018083116126ba57829003601f168201915b50505050509050805160000361272f5760405162461bcd60e51b815260206004820152601260248201527f64657374204e4654206e6f7420666f756e64000000000000000000000000000060448201526064016107ff565b9250929050565b60015460405163299aee5160e11b81526000916001600160a01b031690635335dca290612767908590600401612f30565b602060405180830381865afa158015612784573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127a89190613966565b67ffffffffffffffff84166000908152600360205260409020549091506127cf908261397f565b3410156128115760405162461bcd60e51b815260206004820152601060248201526f696e73756666696369656e742066656560801b60448201526064016107ff565b600154604051637d7a101d60e01b81526001600160a01b0390911690637d7a101d90839061284790889088908890600401613ac2565b6000604051808303818588803b15801561286057600080fd5b505af1158015612874573d6000803e3d6000fd5b505050505050505050565b6001600160a01b03811660009081526002602052604090205460ff166128e75760405162461bcd60e51b815260206004820152601560248201527f4163636f756e74206973206e6f7420706175736572000000000000000000000060448201526064016107ff565b6001600160a01b038116600081815260026020908152604091829020805460ff1916905590519182527fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e9101610938565b6001600160a01b03811660009081526002602052604090205460ff16156129a15760405162461bcd60e51b815260206004820152601960248201527f4163636f756e7420697320616c7265616479207061757365720000000000000060448201526064016107ff565b6001600160a01b038116600081815260026020908152604091829020805460ff1916600117905590519182527f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f89101610938565b600154600160a01b900460ff1615612a425760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016107ff565b6001805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586123693390565b67ffffffffffffffff81166000908152600460205260408120546001600160a01b03169081612aee5760405162461bcd60e51b815260206004820152601960248201527f64657374204e465420427269646765206e6f7420666f756e640000000000000060448201526064016107ff565b506001600160a01b03808416600090815260056020908152604080832067ffffffffffffffff87168452909152902054168061272f5760405162461bcd60e51b815260206004820152601260248201527f64657374204e4654206e6f7420666f756e64000000000000000000000000000060448201526064016107ff565b60015460405163299aee5160e11b81526000916001600160a01b031690635335dca290612b9d908590600401612f30565b602060405180830381865afa158015612bba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bde9190613966565b67ffffffffffffffff8416600090815260036020526040902054909150612c05908261397f565b341015612c475760405162461bcd60e51b815260206004820152601060248201526f696e73756666696369656e742066656560801b60448201526064016107ff565b600154604051634f9e72ad60e11b81526001600160a01b0390911690639f3ce55a90839061284790889088908890600401613af7565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008083601f840112612cdf57600080fd5b50813567ffffffffffffffff811115612cf757600080fd5b60208301915083602082850101111561272f57600080fd5b803567ffffffffffffffff81168114612d2757600080fd5b919050565b6001600160a01b038116811461120d57600080fd5b60008060008060008060808789031215612d5a57600080fd5b863567ffffffffffffffff80821115612d7257600080fd5b612d7e8a838b01612ccd565b9098509650869150612d9260208a01612d0f565b95506040890135915080821115612da857600080fd5b50612db589828a01612ccd565b9094509250506060870135612dc981612d2c565b809150509295509295509295565b6020810160038310612df957634e487b7160e01b600052602160045260246000fd5b91905290565b600060208284031215612e1157600080fd5b81356116ea81612d2c565b600080600080600060808688031215612e3457600080fd5b8535612e3f81612d2c565b945060208601359350604086013567ffffffffffffffff811115612e6257600080fd5b612e6e88828901612ccd565b9094509250506060860135612e8281612d2c565b809150509295509295909350565b600060208284031215612ea257600080fd5b6116ea82612d0f565b60008060408385031215612ebe57600080fd5b8235612ec981612d2c565b9150612ed760208401612d0f565b90509250929050565b60005b83811015612efb578181015183820152602001612ee3565b50506000910152565b60008151808452612f1c816020860160208601612ee0565b601f01601f19169290920160200192915050565b6020815260006116ea6020830184612f04565b60008083601f840112612f5557600080fd5b50813567ffffffffffffffff811115612f6d57600080fd5b6020830191508360208260051b850101111561272f57600080fd5b600080600080600060608688031215612fa057600080fd5b8535612fab81612d2c565b9450602086013567ffffffffffffffff80821115612fc857600080fd5b612fd489838a01612f43565b90965094506040880135915080821115612fed57600080fd5b50612ffa88828901612f43565b969995985093965092949392505050565b6000806000806040858703121561302157600080fd5b843567ffffffffffffffff8082111561303957600080fd5b61304588838901612f43565b9096509450602087013591508082111561305e57600080fd5b5061306b87828801612f43565b95989497509550505050565b6000806000806060858703121561308d57600080fd5b843561309881612d2c565b93506130a660208601612d0f565b9250604085013567ffffffffffffffff8111156130c257600080fd5b61306b87828801612ccd565b600080600080600080600060c0888a0312156130e957600080fd5b87356130f481612d2c565b9650602088013561310481612d2c565b95506040880135945061311960608901612d0f565b9350608088013567ffffffffffffffff81111561313557600080fd5b6131418a828b01612ccd565b90945092505060a088013561315581612d2c565b8091505092959891949750929550565b60008060008060006080868803121561317d57600080fd5b853561318881612d2c565b94506020860135935061319d60408701612d0f565b9250606086013567ffffffffffffffff8111156131b957600080fd5b612ffa88828901612ccd565b6000806000606084860312156131da57600080fd5b83356131e581612d2c565b92506131f360208501612d0f565b9150604084013561320381612d2c565b809150509250925092565b60008060006060848603121561322357600080fd5b61322c84612d0f565b9250602084013561323c81612d2c565b929592945050506040919091013590565b60008060008060006080868803121561326557600080fd5b853561327081612d2c565b945061327e60208701612d0f565b9350604086013567ffffffffffffffff811115612e6257600080fd5b600080604083850312156132ad57600080fd5b6132b683612d0f565b946020939093013593505050565b600080600080608085870312156132da57600080fd5b84356132e581612d2c565b9350602085013592506132fa60408601612d0f565b9150606085013561330a81612d2c565b939692955090935050565b6000806040838503121561332857600080fd5b61333183612d0f565b9150602083013561334181612d2c565b809150509250929050565b60008060006040848603121561336157600080fd5b61336a84612d0f565b9250602084013567ffffffffffffffff81111561338657600080fd5b61339286828701612ccd565b9497909650939450505050565b600080600080600080600060a0888a0312156133ba57600080fd5b6133c388612d0f565b965060208801356133d381612d2c565b9550604088013567ffffffffffffffff808211156133f057600080fd5b6133fc8b838c01612ccd565b909750955060608a0135945060808a013591508082111561341c57600080fd5b506134298a828b01612ccd565b989b979a50959850939692959293505050565b60008060008060008060a0878903121561345557600080fd5b61345e87612d0f565b9550602087013561346e81612d2c565b9450604087013561347e81612d2c565b935060608701359250608087013567ffffffffffffffff8111156134a157600080fd5b6134ad89828a01612ccd565b979a9699509497509295939492505050565b600181811c908216806134d357607f821691505b6020821081036134f357634e487b7160e01b600052602260045260246000fd5b50919050565b6000808354613507816134bf565b6001828116801561351f576001811461353457613563565b60ff1984168752821515830287019450613563565b8760005260208060002060005b8581101561355a5781548a820152908401908201613541565b50505082870194505b50929695505050505050565b8183823760009101908152919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016135bd576135bd613595565b5060010190565b634e487b7160e01b600052604160045260246000fd5b601f82111561362057600081815260208120601f850160051c810160208610156136015750805b601f850160051c820191505b81811015610bda5782815560010161360d565b505050565b67ffffffffffffffff83111561363d5761363d6135c4565b6136518361364b83546134bf565b836135da565b6000601f841160018114613685576000851561366d5750838201355b600019600387901b1c1916600186901b178355610d49565b600083815260209020601f19861690835b828110156136b65786850135825560209485019460019092019101613696565b50868210156136d35760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b038516815267ffffffffffffffff841660208201526060604082015260006108806060830184866136e5565b60006020828403121561375357600080fd5b81516116ea81612d2c565b6040516080810167ffffffffffffffff81118282101715613781576137816135c4565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156137b0576137b06135c4565b604052919050565b600067ffffffffffffffff8211156137d2576137d26135c4565b50601f01601f191660200190565b6000602082840312156137f257600080fd5b815167ffffffffffffffff81111561380957600080fd5b8201601f8101841361381a57600080fd5b805161382d613828826137b8565b613787565b81815285602083850101111561384257600080fd5b6109a0826020830160208601612ee0565b60208152600082516080602084015261386f60a0840182612f04565b90506020840151601f198085840301604086015261388d8383612f04565b9250604086015160608601526060860151915080858403016080860152506109a08282612f04565b60006001600160a01b03808a16835280891660208401525086604083015267ffffffffffffffff8616606083015260c060808301526138f860c0830185876136e5565b82810360a084015261390a8185612f04565b9a9950505050505050505050565b6020815260006001600160a01b038084511660208401528060208501511660408401525060408301516060830152606083015160808084015261395e60a0840182612f04565b949350505050565b60006020828403121561397857600080fd5b5051919050565b8082018082111561399257613992613595565b92915050565b67ffffffffffffffff841681526040602082015260006109a06040830184866136e5565b600060208083850312156139cf57600080fd5b823567ffffffffffffffff808211156139e757600080fd5b90840190608082870312156139fb57600080fd5b613a0361375e565b8235613a0e81612d2c565b815282840135613a1d81612d2c565b8185015260408381013590820152606083013582811115613a3d57600080fd5b80840193505086601f840112613a5257600080fd5b82359150613a62613828836137b8565b8281528785848601011115613a7657600080fd5b82858501868301376000858483010152806060830152508094505050505092915050565b6001600160a01b03841681528260208201526060604082015260006109a06060830184612f04565b606081526000613ad56060830186612f04565b67ffffffffffffffff8516602084015282810360408401526108808185612f04565b6001600160a01b038416815267ffffffffffffffff831660208201526060604082015260006109a06060830184612f0456fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220b858f5b10153bc66bb5164b900409fd0964426a32294f87e83a5e247222a2a4b64736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000009bb46d5100d2db4608112026951c9c965b233f4d
-----Decoded View---------------
Arg [0] : _msgBus (address): 0x9Bb46D5100d2Db4608112026951c9C965b233f4D
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000009bb46d5100d2db4608112026951c9c965b233f4d
Deployed Bytecode Sourcemap
875:13521:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8279:399;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13873:127;;;;;;;;;;-1:-1:-1;13873:127:0;;;;;:::i;:::-;;:::i;:::-;;3906:234:2;;;;;;:::i;:::-;;:::i;1487:39:0:-;;;;;;;;;;-1:-1:-1;1487:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3160:14:10;;3153:22;3135:41;;3123:2;3108:18;1487:39:0;2995:187:10;995:43:0;;;;;;;;;;-1:-1:-1;995:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;3522:25:10;;;3510:2;3495:18;995:43:0;3376:177:10;3409:98:0;;;;;;;;;;-1:-1:-1;3409:98:0;;;;;:::i;:::-;;:::i;1644:64::-;;;;;;;;;;-1:-1:-1;1644:64:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1088:44::-;;;;;;;;;;-1:-1:-1;1088:44:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;1088:44:0;;;;;;-1:-1:-1;;;;;4798:55:10;;;4780:74;;4768:2;4753:18;1088:44:0;4634:226:10;12576:338:0;;;;;;;;;;-1:-1:-1;12576:338:0;;;;;:::i;:::-;;:::i;563:64:7:-;;;;;;;;;;;;;:::i;13571:229:0:-;;;;;;;;;;-1:-1:-1;13571:229:0;;;;;:::i;:::-;;:::i;633:102:7:-;;;;;;;;;;-1:-1:-1;633:102:7;;;;;:::i;:::-;-1:-1:-1;;;;;712:16:7;689:4;712:16;;;:7;:16;;;;;;;;;633:102;1595:43:0;;;;;;;;;;-1:-1:-1;1595:43:0;;;;;:::i;:::-;;:::i;242:146:1:-;;;;;;;;;;-1:-1:-1;242:146:1;;;;;:::i;:::-;;:::i;12313:230:0:-;;;;;;;;;;-1:-1:-1;12313:230:0;;;;;:::i;:::-;;:::i;3125:289:2:-;;;;;;:::i;:::-;;:::i;1098:84:8:-;;;;;;;;;;-1:-1:-1;1168:7:8;;-1:-1:-1;;;1168:7:8;;;;1098:84;;5910:610:0;;;;;;:::i;:::-;;:::i;836:95:7:-;;;;;;;;;;-1:-1:-1;836:95:7;;;;;:::i;:::-;;:::i;937:75::-;;;;;;;;;;;;;:::i;200:39::-;;;;;;;;;;-1:-1:-1;200:39:7;;;;;:::i;:::-;;;;;;;;;;;;;;;;741:89;;;;;;;;;;-1:-1:-1;741:89:7;;;;;:::i;:::-;;:::i;497:60::-;;;;;;;;;;;;;:::i;1479:85:6:-;;;;;;;;;;-1:-1:-1;1525:7:6;1551:6;-1:-1:-1;;;;;1551:6:6;1479:85;;12059:221:0;;;;;;;;;;-1:-1:-1;12059:221:0;;;;;:::i;:::-;;:::i;14221:173::-;;;;;;;;;;;;;:::i;3986:659::-;;;;;;;;;;-1:-1:-1;3986:659:0;;;;;:::i;:::-;;:::i;7619:654::-;;;;;;:::i;:::-;;:::i;1243:65::-;;;;;;;;;;-1:-1:-1;1243:65:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1243:65:0;;;12941:135;;;;;;;;;;-1:-1:-1;12941:135:0;;;;;:::i;:::-;;:::i;210:25:1:-;;;;;;;;;;-1:-1:-1;210:25:1;;;;-1:-1:-1;;;;;210:25:1;;;4988:590:0;;;;;;:::i;:::-;;:::i;13126:182::-;;;;;;;;;;-1:-1:-1;13126:182:0;;;;;:::i;:::-;;:::i;14034:128::-;;;;;;;;;;-1:-1:-1;14034:128:0;;;;;:::i;:::-;;:::i;13314:191::-;;;;;;;;;;-1:-1:-1;13314:191:0;;;;;:::i;:::-;;:::i;7106:477::-;;;;;;:::i;:::-;;:::i;6576:457::-;;;;;;:::i;:::-;;:::i;1916:189:6:-;;;;;;;;;;-1:-1:-1;1916:189:6;;;;;:::i;:::-;;:::i;8279:399:0:-;294:10:2;;8476:15:0;;-1:-1:-1;;;;;294:10:2;280;:24;272:62;;;;-1:-1:-1;;;272:62:2;;14462:2:10;272:62:2;;;14444:21:10;14501:2;14481:18;;;14474:30;14540:27;14520:18;;;14513:55;14585:18;;272:62:2;;;;;;;;;1168:7:8;;-1:-1:-1;;;1168:7:8;;;;8507:64:0::1;;;-1:-1:-1::0;8550:20:0::1;::::0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;;8540:31;;::::1;::::0;8550:20;8540:31:::1;:::i;:::-;;;;;;;;8529:6;;8519:17;;;;;;;:::i;:::-;;;;;;;;:52;;8507:64;8503:123;;;-1:-1:-1::0;8594:21:0::1;8587:28;;8503:123;8642:29;8653:8;;8663:7;8642:10;:29::i;:::-;8635:36;;344:1:2;8279:399:0::0;;;;;;;;:::o;13873:127::-;1702:10:6;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:6;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:6;;1683:66;;;;-1:-1:-1;;;1683:66:6;;16447:2:10;1683:66:6;;;16429:21:10;;;16466:18;;;16459:30;-1:-1:-1;;;;;;;;;;;16505:18:10;;;16498:62;16577:18;;1683:66:6;16245:356:10;1683:66:6;-1:-1:-1;;;;;13936:13:0;::::1;;::::0;;;:7:::1;:13;::::0;;;;;;;;:20;;-1:-1:-1;;13936:20:0::1;13952:4;13936:20:::0;;::::1;::::0;;;13971:22;;16774:74:10;;;16864:18;;;16857:50;13971:22:0::1;::::0;16747:18:10;13971:22:0::1;;;;;;;;13873:127:::0;:::o;3906:234:2:-;294:10;;4121:15;;-1:-1:-1;;;;;294:10:2;280;:24;272:62;;;;-1:-1:-1;;;272:62:2;;14462:2:10;272:62:2;;;14444:21:10;14501:2;14481:18;;;14474:30;14540:27;14520:18;;;14513:55;14585:18;;272:62:2;14260:349:10;272:62:2;3906:234;;;;;;;:::o;3409:98:0:-;3459:11;:9;:11::i;:::-;3480:10;:20;;-1:-1:-1;;;;;;3480:20:0;-1:-1:-1;;;;;3480:20:0;;;;;;;;;;3409:98::o;1644:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;12576:338::-;1702:10:6;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:6;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:6;;1683:66;;;;-1:-1:-1;;;1683:66:6;;16447:2:10;1683:66:6;;;16429:21:10;;;16466:18;;;16459:30;-1:-1:-1;;;;;;;;;;;16505:18:10;;;16498:62;16577:18;;1683:66:6;16245:356:10;1683:66:6;12734:31:0;;::::1;12726:59;;;::::0;-1:-1:-1;;;12726:59:0;;17120:2:10;12726:59:0::1;::::0;::::1;17102:21:10::0;17159:2;17139:18;;;17132:30;17198:17;17178:18;;;17171:45;17233:18;;12726:59:0::1;16918:339:10::0;12726:59:0::1;12800:9;12795:113;12815:18:::0;;::::1;12795:113;;;12888:6;;12895:1;12888:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;12854:19:0;::::1;;::::0;;;:11:::1;:19;::::0;;;;;12874:7;;12882:1;12874:10;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;12854:31;;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;12854:31:0;:43;;-1:-1:-1;;;;;;12854:43:0::1;-1:-1:-1::0;;;;;12854:43:0;;;::::1;::::0;;;::::1;::::0;;12835:3;::::1;::::0;::::1;:::i;:::-;;;;12795:113;;;;12576:338:::0;;;;;:::o;563:64:7:-;437:10;689:4;712:16;;;:7;:16;;;;;;;;420:53;;;;-1:-1:-1;;;420:53:7;;17868:2:10;420:53:7;;;17850:21:10;17907:2;17887:18;;;17880:30;17946:22;17926:18;;;17919:50;17986:18;;420:53:7;17666:344:10;420:53:7;610:10:::1;:8;:10::i;:::-;563:64::o:0;13571:229:0:-;1702:10:6;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:6;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:6;;1683:66;;;;-1:-1:-1;;;1683:66:6;;16447:2:10;1683:66:6;;;16429:21:10;;;16466:18;;;16459:30;-1:-1:-1;;;;;;;;;;;16505:18:10;;;16498:62;16577:18;;1683:66:6;16245:356:10;1683:66:6;13689:9:0::1;13684:110;13704:18:::0;;::::1;13684:110;;;13768:12;;13781:1;13768:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;13743:10;:22;13754:7;;13762:1;13754:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;13743:22;;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;13743:22:0;:40;;-1:-1:-1;;;;;;13743:40:0::1;-1:-1:-1::0;;;;;13743:40:0;;;::::1;::::0;;;::::1;::::0;;13724:3;::::1;::::0;::::1;:::i;:::-;;;;13684:110;;;;13571:229:::0;;;;:::o;1595:43::-;;;;;;;;;;;;;;;;:::i;242:146:1:-;1702:10:6;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:6;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:6;;1683:66;;;;-1:-1:-1;;;1683:66:6;;16447:2:10;1683:66:6;;;16429:21:10;;;16466:18;;;16459:30;-1:-1:-1;;;;;;;;;;;16505:18:10;;;16498:62;16577:18;;1683:66:6;16245:356:10;1683:66:6;313:10:1::1;:24:::0;;-1:-1:-1;;;;;;313:24:1::1;-1:-1:-1::0;;;;;313:24:1;::::1;::::0;;::::1;::::0;;;352:29:::1;::::0;4780:74:10;;;352:29:1::1;::::0;4768:2:10;4753:18;352:29:1::1;4634:226:10::0;12313:230:0;1702:10:6;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:6;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:6;;1683:66;;;;-1:-1:-1;;;1683:66:6;;16447:2:10;1683:66:6;;;16429:21:10;;;16466:18;;;16459:30;-1:-1:-1;;;;;;;;;;;16505:18:10;;;16498:62;16577:18;;1683:66:6;16245:356:10;1683:66:6;-1:-1:-1;;;;;12447:20:0;::::1;;::::0;;;:12:::1;:20;::::0;;;;;;;:29:::1;::::0;::::1;::::0;;;;;;;:38:::1;12479:6:::0;;12447:29;:38:::1;:::i;:::-;;12500:36;12512:6;12520:7;12529:6;;12500:36;;;;;;;;;:::i;:::-;;;;;;;;12313:230:::0;;;;:::o;3125:289:2:-;294:10;;3395:15;;-1:-1:-1;;;;;294:10:2;280;:24;272:62;;;;-1:-1:-1;;;272:62:2;;14462:2:10;272:62:2;;;14444:21:10;14501:2;14481:18;;;14474:30;14540:27;14520:18;;;14513:55;14585:18;;272:62:2;14260:349:10;272:62:2;3125:289;;;;;;;;;:::o;5910:610:0:-;1168:7:8;;-1:-1:-1;;;1168:7:8;;;;1411:9;1403:38;;;;-1:-1:-1;;;1403:38:8;;21010:2:10;1403:38:8;;;20992:21:10;21049:2;21029:18;;;21022:30;-1:-1:-1;;;21068:18:10;;;21061:46;21124:18;;1403:38:8;20808:340:10;1403:38:8;6097:23:0::1;::::0;-1:-1:-1;;;6097:23:0;;::::1;::::0;::::1;3522:25:10::0;;;-1:-1:-1;;;;;6097:18:0;::::1;::::0;::::1;::::0;3495::10;;6097:23:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;6083:37:0::1;:10;-1:-1:-1::0;;;;;6083:37:0::1;;6075:65;;;::::0;-1:-1:-1;;;6075:65:0;;21611:2:10;6075:65:0::1;::::0;::::1;21593:21:10::0;21650:2;21630:18;;;21623:30;-1:-1:-1;;;21669:18:10;;;21662:45;21724:18;;6075:65:0::1;21409:339:10::0;6075:65:0::1;6209:24;::::0;-1:-1:-1;;;6209:24:0;;::::1;::::0;::::1;3522:25:10::0;;;6188:18:0::1;::::0;-1:-1:-1;;;;;6209:19:0;::::1;::::0;::::1;::::0;3495:18:10;;6209:24:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;6209:24:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;6188:45;;6243:21;6254:4;6260:3;6243:10;:21::i;:::-;6275:23;6300:20:::0;6324:26:::1;6335:4;6341:8;6324:10;:26::i;:::-;6274:76;;;;6360:80;6367:10;6379:8;6400:38;;;;;;;;6408:9;;6400:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;;6400:38:0;;;-1:-1:-1;6400:38:0::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;6389:50;;::::1;::::0;;::::1;;:::i;:::-;;;;;;;;;;;;;6360:6;:80::i;:::-;6455:58;6461:10;6473:4;6479:3;6484:8;6494:9;;6505:7;6455:58;;;;;;;;;;;;:::i;:::-;;;;;;;;6065:455;;;5910:610:::0;;;;;:::o;836:95:7:-;1702:10:6;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:6;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:6;;1683:66;;;;-1:-1:-1;;;1683:66:6;;16447:2:10;1683:66:6;;;16429:21:10;;;16466:18;;;16459:30;-1:-1:-1;;;;;;;;;;;16505:18:10;;;16498:62;16577:18;;1683:66:6;16245:356:10;1683:66:6;902:22:7::1;916:7;902:13;:22::i;:::-;836:95:::0;:::o;937:75::-;980:25;994:10;980:13;:25::i;741:89::-;1702:10:6;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:6;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:6;;1683:66;;;;-1:-1:-1;;;1683:66:6;;16447:2:10;1683:66:6;;;16429:21:10;;;16466:18;;;16459:30;-1:-1:-1;;;;;;;;;;;16505:18:10;;;16498:62;16577:18;;1683:66:6;16245:356:10;1683:66:6;804:19:7::1;815:7;804:10;:19::i;497:60::-:0;437:10;689:4;712:16;;;:7;:16;;;;;;;;420:53;;;;-1:-1:-1;;;420:53:7;;17868:2:10;420:53:7;;;17850:21:10;17907:2;17887:18;;;17880:30;17946:22;17926:18;;;17919:50;17986:18;;420:53:7;17666:344:10;420:53:7;542:8:::1;:6;:8::i;12059:221:0:-:0;1702:10:6;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:6;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:6;;1683:66;;;;-1:-1:-1;;;1683:66:6;;16447:2:10;1683:66:6;;;16429:21:10;;;16466:18;;;16459:30;-1:-1:-1;;;;;;;;;;;16505:18:10;;;16498:62;16577:18;;1683:66:6;16245:356:10;1683:66:6;-1:-1:-1;;;;;12186:19:0;;::::1;;::::0;;;:11:::1;:19;::::0;;;;;;;:28:::1;::::0;::::1;::::0;;;;;;;;;;:37;;-1:-1:-1;;;;;;12186:37:0::1;::::0;;::::1;::::0;;::::1;::::0;;12238:35;;24992:34:10;;;25042:18;;;25035:59;;;;25110:18;;25103:43;;;;12238:35:0::1;::::0;24919:2:10;24904:18;12238:35:0::1;;;;;;;;12059:221:::0;;;:::o;14221:173::-;1702:10:6;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:6;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:6;;1683:66;;;;-1:-1:-1;;;1683:66:6;;16447:2:10;1683:66:6;;;16429:21:10;;;16466:18;;;16459:30;-1:-1:-1;;;;;;;;;;;16505:18:10;;;16498:62;16577:18;;1683:66:6;16245:356:10;1683:66:6;14318:36:0::1;::::0;14287:21:::1;::::0;14326:10:::1;::::0;14318:36;::::1;;;::::0;14287:21;;14270:14:::1;14318:36:::0;14270:14;14318:36;14287:21;14326:10;14318:36;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;14369:18:0::1;::::0;3522:25:10;;;14369:18:0::1;::::0;3510:2:10;3495:18;14369::0::1;3376:177:10::0;3986:659:0;4141:24;;-1:-1:-1;;;4141:24:0;;;;;3522:25:10;;;4101:7:0;;;;-1:-1:-1;;;;;4141:19:0;;;;;3495:18:10;;4141:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4141:24:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;4256:18:0;;4234:19;4256:18;;;:12;:18;;;;;;;;:28;;;;;;;;;;4234:50;;4120:45;;-1:-1:-1;4175:20:0;;4234:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4314:1;4298:6;:13;:17;4294:266;;;4352:34;;;;;;;;4360:6;4352:34;;;;4368:6;4352:34;;;;4376:3;4352:34;;;;4381:4;4352:34;;;4341:46;;;;;;;;:::i;:::-;;;;;;;;;;;;;4331:56;;4294:266;;;4519:29;;;;;;;;4526:4;-1:-1:-1;;;;;4519:29:0;;;;;4532:4;-1:-1:-1;;;;;4519:29:0;;;;;4538:3;4519:29;;;;4543:4;4519:29;;;4508:41;;;;;;;;:::i;:::-;;;;;;;;;;;;;4498:51;;4294:266;4619:19;;;;;;;:9;:19;;;;;;;;4588:10;;4576:40;;-1:-1:-1;;;4576:40:0;;4619:19;;-1:-1:-1;;;;;4588:10:0;;4576:31;;:40;;4608:7;;4576:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;;;;:::i;:::-;4569:69;;;;;3986:659;;;;;;:::o;7619:654::-;294:10:2;;7809:15:0;;-1:-1:-1;;;;;294:10:2;280;:24;272:62;;;;-1:-1:-1;;;272:62:2;;14462:2:10;272:62:2;;;14444:21:10;14501:2;14481:18;;;14474:30;14540:27;14520:18;;;14513:55;14585:18;;272:62:2;14260:349:10;272:62:2;1168:7:8;;-1:-1:-1;;;1168:7:8;;;;8125:41:0::1;;;-1:-1:-1::0;8147:19:0::1;::::0;::::1;;::::0;;;:10:::1;:19;::::0;;;;;-1:-1:-1;;;;;8137:29:0;;::::1;8147:19:::0;::::1;8137:29;;8125:41;8121:100;;;-1:-1:-1::0;8189:21:0::1;8182:28;;8121:100;8237:29;8248:8;;8258:7;8237:10;:29::i;12941:135::-:0;1702:10:6;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:6;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:6;;1683:66;;;;-1:-1:-1;;;1683:66:6;;16447:2:10;1683:66:6;;;16429:21:10;;;16466:18;;;16459:30;-1:-1:-1;;;;;;;;;;;16505:18:10;;;16498:62;16577:18;;1683:66:6;16245:356:10;1683:66:6;13014:15:0::1;::::0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;;;;:21;;;13050:19;;26244:50:10;;;26310:18;;26303:34;;;13050:19:0::1;::::0;26217:18:10;13050:19:0::1;;;;;;;;12941:135:::0;;:::o;4988:590::-;1168:7:8;;-1:-1:-1;;;1168:7:8;;;;1411:9;1403:38;;;;-1:-1:-1;;;1403:38:8;;21010:2:10;1403:38:8;;;20992:21:10;21049:2;21029:18;;;21022:30;-1:-1:-1;;;21068:18:10;;;21061:46;21124:18;;1403:38:8;20808:340:10;1403:38:8;5168:23:0::1;::::0;-1:-1:-1;;;5168:23:0;;::::1;::::0;::::1;3522:25:10::0;;;-1:-1:-1;;;;;5168:18:0;::::1;::::0;::::1;::::0;3495::10;;5168:23:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;5154:37:0::1;:10;-1:-1:-1::0;;;;;5154:37:0::1;;5146:65;;;::::0;-1:-1:-1;;;5146:65:0;;21611:2:10;5146:65:0::1;::::0;::::1;21593:21:10::0;21650:2;21630:18;;;21623:30;-1:-1:-1;;;21669:18:10;;;21662:45;21724:18;;5146:65:0::1;21409:339:10::0;5146:65:0::1;5280:24;::::0;-1:-1:-1;;;5280:24:0;;::::1;::::0;::::1;3522:25:10::0;;;5259:18:0::1;::::0;-1:-1:-1;;;;;5280:19:0;::::1;::::0;::::1;::::0;3495:18:10;;5280:24:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;5280:24:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;5259:45;;5314:21;5325:4;5331:3;5314:10;:21::i;:::-;5346:18;5366:15:::0;5385:25:::1;5395:4;5401:8;5385:9;:25::i;:::-;5345:65;;;;5420:79;5427:10;5439:8;5460:37;;;;;;;;5467:9;-1:-1:-1::0;;;;;5460:37:0::1;;;;;5478:7;-1:-1:-1::0;;;;;5460:37:0::1;;;;;5487:3;5460:37;;;;5492:4;5460:37;;::::0;5449:49:::1;;;;;;;;:::i;:::-;;;;;;;;;;;;;5420:6;:79::i;:::-;5514:57;::::0;;5519:10:::1;26694:34:10::0;;-1:-1:-1;;;;;26764:15:10;;;26759:2;26744:18;;26737:43;26796:18;;;26789:34;;;26871:18;26859:31;;26854:2;26839:18;;26832:59;26928:15;;;26922:3;26907:19;;26900:44;26981:15;;26975:3;26960:19;;26953:44;5514:57:0;;::::1;::::0;;;;26620:3:10;5514:57:0;;::::1;5136:442;;;4988:590:::0;;;;:::o;13126:182::-;1702:10:6;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:6;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:6;;1683:66;;;;-1:-1:-1;;;1683:66:6;;16447:2:10;1683:66:6;;;16429:21:10;;;16466:18;;;16459:30;-1:-1:-1;;;;;;;;;;;16505:18:10;;;16498:62;16577:18;;1683:66:6;16245:356:10;1683:66:6;13216:19:0::1;::::0;::::1;;::::0;;;:10:::1;:19;::::0;;;;;;;;:34;;-1:-1:-1;;;;;;13216:34:0::1;-1:-1:-1::0;;;;;13216:34:0;::::1;::::0;;::::1;::::0;;;13265:36;;27180:50:10;;;27246:18;;;27239:83;13265:36:0::1;::::0;27153:18:10;13265:36:0::1;27008:320:10::0;14034:128:0;1702:10:6;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:6;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:6;;1683:66;;;;-1:-1:-1;;;1683:66:6;;16447:2:10;1683:66:6;;;16429:21:10;;;16466:18;;;16459:30;-1:-1:-1;;;;;;;;;;;16505:18:10;;;16498:62;16577:18;;1683:66:6;16245:356:10;1683:66:6;-1:-1:-1;;;;;14104:13:0;::::1;;::::0;;;:7:::1;:13;::::0;;;;;;;14097:20;;-1:-1:-1;;14097:20:0::1;::::0;;14132:23;;16774:74:10;;;16864:18;;;16857:50;;;;14132:23:0::1;::::0;16747:18:10;14132:23:0::1;16606:307:10::0;13314:191:0;1702:10:6;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:6;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:6;;1683:66;;;;-1:-1:-1;;;1683:66:6;;16447:2:10;1683:66:6;;;16429:21:10;;;16466:18;;;16459:30;-1:-1:-1;;;;;;;;;;;16505:18:10;;;16498:62;16577:18;;1683:66:6;16245:356:10;1683:66:6;13411:20:0::1;::::0;::::1;;::::0;;;:11:::1;:20;::::0;;;;:35:::1;13434:12:::0;;13411:20;:35:::1;:::i;:::-;;13461:37;13476:7;13485:12;;13461:37;;;;;;;;:::i;7106:477::-:0;1168:7:8;;-1:-1:-1;;;1168:7:8;;;;1411:9;1403:38;;;;-1:-1:-1;;;1403:38:8;;21010:2:10;1403:38:8;;;20992:21:10;21049:2;21029:18;;;21022:30;-1:-1:-1;;;21068:18:10;;;21061:46;21124:18;;1403:38:8;20808:340:10;1403:38:8;7320:10:0::1;7305:12;::::0;7390:26:::1;7320:10:::0;7407:8;7390:10:::1;:26::i;:::-;7340:76;;;;7426:80;7433:10;7445:8;7466:38;;;;;;;;7474:9;;7466:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;;7466:38:0;;;-1:-1:-1;7466:38:0::1;::::0;;::::1;::::0;;;;;;;;;;;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;7499:4;;;;;;7466:38;::::1;7499:4:::0;;;;7466:38;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;;;7466:38:0;;-1:-1:-1;7455:50:0::1;::::0;::::1;::::0;;::::1;;;:::i;7426:80::-;7521:55;7527:7;7536:4;7542:3;7547:8;7557:9;;7568:7;7521:55;;;;;;;;;;;;:::i;:::-;;;;;;;;7295:288;;;7106:477:::0;;;;;;;:::o;6576:457::-;1168:7:8;;-1:-1:-1;;;1168:7:8;;;;1411:9;1403:38;;;;-1:-1:-1;;;1403:38:8;;21010:2:10;1403:38:8;;;20992:21:10;21049:2;21029:18;;;21022:30;-1:-1:-1;;;21068:18:10;;;21061:46;21124:18;;1403:38:8;20808:340:10;1403:38:8;6783:10:0::1;6768:12;::::0;6843:25:::1;6783:10:::0;6859:8;6843:9:::1;:25::i;:::-;6803:65;;;;6878:79;6885:10;6897:8;6918:37;;;;;;;;6925:9;-1:-1:-1::0;;;;;6918:37:0::1;;;;;6936:7;-1:-1:-1::0;;;;;6918:37:0::1;;;;;6945:3;6918:37;;;;6950:4;;6918:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;;6918:37:0;;-1:-1:-1;6907:49:0::1;::::0;::::1;::::0;;::::1;;;:::i;6878:79::-;6972:54;::::0;;-1:-1:-1;;;;;26712:15:10;;;26694:34;;26764:15;;;26759:2;26744:18;;26737:43;26796:18;;;26789:34;;;26871:18;26859:31;;26854:2;26839:18;;26832:59;26928:15;;;26922:3;26907:19;;26900:44;26981:15;;26975:3;26960:19;;26953:44;6972:54:0;;::::1;::::0;;;;26620:3:10;6972:54:0;;::::1;6758:275;;;6576:457:::0;;;;;;:::o;1916:189:6:-;1702:10;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:6;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:6;;1683:66;;;;-1:-1:-1;;;1683:66:6;;16447:2:10;1683:66:6;;;16429:21:10;;;16466:18;;;16459:30;-1:-1:-1;;;;;;;;;;;16505:18:10;;;16498:62;16577:18;;1683:66:6;16245:356:10;1683:66:6;-1:-1:-1;;;;;2004:22:6;::::1;1996:73;;;::::0;-1:-1:-1;;;1996:73:6;;27878:2:10;1996:73:6::1;::::0;::::1;27860:21:10::0;27917:2;27897:18;;;27890:30;27956:34;27936:18;;;27929:62;28027:8;28007:18;;;28000:36;28053:19;;1996:73:6::1;27676:402:10::0;1996:73:6::1;2079:19;2089:8;2079:9;:19::i;9179:1263:0:-:0;9258:15;;9424:32;;;;9436:8;9424:32;:::i;:::-;9628:10;;;;;-1:-1:-1;;;;;9620:19:0;;;;;:7;:19;;;;;;;9401:55;;-1:-1:-1;9620:19:0;;:27;;:19;:27;9616:712;;9672:10;;;;9712:11;;9725:9;;;;;9667:68;;-1:-1:-1;;;9667:68:0;;9705:4;9667:68;;;29649:34:10;-1:-1:-1;;;;;29719:15:10;;;29699:18;;;29692:43;29751:18;;;29744:34;;;;9667:29:0;;;;;29561:18:10;;9667:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9663:315;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9895:22;9906:10;9895:22;;;;;;:::i;:::-;;;;;;;;9942:21;9935:28;;;;;;9663:315;9616:712;;;10017:10;;;;10040:11;;10053:9;;;;;10064:10;;;;10012:63;;-1:-1:-1;;;10012:63:0;;-1:-1:-1;;;;;10012:27:0;;;;;;:63;;10040:11;;10053:9;10012:63;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10008:310;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10351:11;;10364:10;;;;;10376:9;;;;;10342:53;;-1:-1:-1;;;;;30512:15:10;;;30494:34;;30564:15;;;;30544:18;;;30537:43;;;;30596:18;;;30589:34;30671:18;30659:31;;30654:2;30639:18;;30632:59;10342:53:0;;;;;;30420:3:10;10342:53:0;;;-1:-1:-1;10412:23:0;;9179:1263;-1:-1:-1;;;;9179:1263:0:o;1275:128:6:-;1341:1;1323:6;-1:-1:-1;;;;;1323:6:6;:20;1315:50;;;;-1:-1:-1;;;1315:50:6;;30904:2:10;1315:50:6;;;30886:21:10;30943:2;30923:18;;;30916:30;30982:19;30962:18;;;30955:47;31019:18;;1315:50:6;30702:341:10;1315:50:6;1375:21;1385:10;1375:9;:21::i;2110:117:8:-;1168:7;;-1:-1:-1;;;1168:7:8;;;;1669:41;;;;-1:-1:-1;;;1669:41:8;;31250:2:10;1669:41:8;;;31232:21:10;31289:2;31269:18;;;31262:30;31328:22;31308:18;;;31301:50;31368:18;;1669:41:8;31048:344:10;1669:41:8;2168:7:::1;:15:::0;;-1:-1:-1;;;;2168:15:8::1;::::0;;2198:22:::1;719:10:9::0;2207:12:8::1;2198:22;::::0;-1:-1:-1;;;;;4798:55:10;;;4780:74;;4768:2;4753:18;2198:22:8::1;;;;;;;2110:117::o:0;8745:359:0:-;-1:-1:-1;;;;;8815:13:0;;;;;;:7;:13;;;;;;;;:21;;:13;:21;8811:287;;8875:55;;-1:-1:-1;;;8875:55:0;;8899:10;8875:55;;;29649:34:10;8919:4:0;29699:18:10;;;29692:43;29751:18;;;29744:34;;;-1:-1:-1;;;;;8875:23:0;;;;;29561:18:10;;8875:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8952:23:0;;-1:-1:-1;;;8952:23:0;;;;;3522:25:10;;;8987:4:0;;-1:-1:-1;;;;;;8952:18:0;;;-1:-1:-1;8952:18:0;;3495::10;;8952:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;8952:40:0;;8944:72;;;;-1:-1:-1;;;8944:72:0;;31599:2:10;8944:72:0;;;31581:21:10;31638:2;31618:18;;;31611:30;31677:21;31657:18;;;31650:49;31716:18;;8944:72:0;31397:343:10;8944:72:0;8745:359;;:::o;8811:287::-;9067:20;;-1:-1:-1;;;9067:20:0;;;;;3522:25:10;;;-1:-1:-1;;;;;9067:15:0;;;;;3495:18:10;;9067:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10859:372;11028:21;;;;;;;:11;:21;;;;;11016:33;;10957:22;;;;11016:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11067:9;:16;11087:1;11067:21;11059:59;;;;-1:-1:-1;;;11059:59:0;;31947:2:10;11059:59:0;;;31929:21:10;31986:2;31966:18;;;31959:30;32025:27;32005:18;;;31998:55;32070:18;;11059:59:0;31745:349:10;11059:59:0;-1:-1:-1;;;;;11137:18:0;;;;;;:12;:18;;;;;;;;:28;;;;;;;;;;11128:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11183:6;:13;11200:1;11183:18;11175:49;;;;-1:-1:-1;;;11175:49:0;;32301:2:10;11175:49:0;;;32283:21:10;32340:2;32320:18;;;32313:30;32379:20;32359:18;;;32352:48;32417:18;;11175:49:0;32099:342:10;11175:49:0;10859:372;;;;;:::o;11638:355::-;11793:10;;11781:40;;-1:-1:-1;;;11781:40:0;;11767:11;;-1:-1:-1;;;;;11793:10:0;;11781:31;;:40;;11813:7;;11781:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11858:19;;;;;;;:9;:19;;;;;;11767:54;;-1:-1:-1;11852:25:0;;11767:54;11852:25;:::i;:::-;11839:9;:38;;11831:67;;;;-1:-1:-1;;;11831:67:0;;32648:2:10;11831:67:0;;;32630:21:10;32687:2;32667:18;;;32660:30;-1:-1:-1;;;32706:18:10;;;32699:46;32762:18;;11831:67:0;32446:340:10;11831:67:0;11920:10;;11908:78;;-1:-1:-1;;;11908:78:0;;-1:-1:-1;;;;;11920:10:0;;;;11908:35;;11951:3;;11908:78;;11956:10;;11968:8;;11978:7;;11908:78;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11757:236;11638:355;;;:::o;1210:187:7:-;-1:-1:-1;;;;;712:16:7;;689:4;712:16;;;:7;:16;;;;;;;;1268:51;;;;-1:-1:-1;;;1268:51:7;;33470:2:10;1268:51:7;;;33452:21:10;33509:2;33489:18;;;33482:30;33548:23;33528:18;;;33521:51;33589:18;;1268:51:7;33268:345:10;1268:51:7;-1:-1:-1;;;;;1329:16:7;;1348:5;1329:16;;;:7;:16;;;;;;;;;:24;;-1:-1:-1;;1329:24:7;;;1368:22;;4780:74:10;;;1368:22:7;;4753:18:10;1368:22:7;4634:226:10;1018:186:7;-1:-1:-1;;;;;712:16:7;;689:4;712:16;;;:7;:16;;;;;;;;1081:18;1073:56;;;;-1:-1:-1;;;1073:56:7;;33820:2:10;1073:56:7;;;33802:21:10;33859:2;33839:18;;;33832:30;33898:27;33878:18;;;33871:55;33943:18;;1073:56:7;33618:349:10;1073:56:7;-1:-1:-1;;;;;1139:16:7;;;;;;:7;:16;;;;;;;;;:23;;-1:-1:-1;;1139:23:7;1158:4;1139:23;;;1177:20;;4780:74:10;;;1177:20:7;;4753:18:10;1177:20:7;4634:226:10;1863:115:8;1168:7;;-1:-1:-1;;;1168:7:8;;;;1411:9;1403:38;;;;-1:-1:-1;;;1403:38:8;;21010:2:10;1403:38:8;;;20992:21:10;21049:2;21029:18;;;21022:30;-1:-1:-1;;;21068:18:10;;;21061:46;21124:18;;1403:38:8;20808:340:10;1403:38:8;1932:4:::1;1922:14:::0;;-1:-1:-1;;;;1922:14:8::1;-1:-1:-1::0;;;1922:14:8::1;::::0;;1951:20:::1;1958:12;719:10:9::0;;640:96;10518:335:0;10648:20;;;10591:17;10648:20;;;:10;:20;;;;;;-1:-1:-1;;;;;10648:20:0;;;10678:61;;;;-1:-1:-1;;;10678:61:0;;31947:2:10;10678:61:0;;;31929:21:10;31986:2;31966:18;;;31959:30;32025:27;32005:18;;;31998:55;32070:18;;10678:61:0;31745:349:10;10678:61:0;-1:-1:-1;;;;;;10758:17:0;;;;;;;:11;:17;;;;;;;;:27;;;;;;;;;;;;;10795:51;;;;-1:-1:-1;;;10795:51:0;;32301:2:10;10795:51:0;;;32283:21:10;32340:2;32320:18;;;32313:30;32379:20;32359:18;;;32352:48;32417:18;;10795:51:0;32099:342:10;11282:350:0;11432:10;;11420:40;;-1:-1:-1;;;11420:40:0;;11406:11;;-1:-1:-1;;;;;11432:10:0;;11420:31;;:40;;11452:7;;11420:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11497:19;;;;;;;:9;:19;;;;;;11406:54;;-1:-1:-1;11491:25:0;;11406:54;11491:25;:::i;:::-;11478:9;:38;;11470:67;;;;-1:-1:-1;;;11470:67:0;;32648:2:10;11470:67:0;;;32630:21:10;32687:2;32667:18;;;32660:30;-1:-1:-1;;;32706:18:10;;;32699:46;32762:18;;11470:67:0;32446:340:10;11470:67:0;11559:10;;11547:78;;-1:-1:-1;;;11547:78:0;;-1:-1:-1;;;;;11559:10:0;;;;11547:35;;11590:3;;11547:78;;11595:10;;11607:8;;11617:7;;11547:78;;;:::i;2111:169:6:-;2166:16;2185:6;;-1:-1:-1;;;;;2201:17:6;;;-1:-1:-1;;;;;;2201:17:6;;;;;;2233:40;;2185:6;;;;;;;2233:40;;2166:16;2233:40;2156:124;2111:169;:::o;14:347:10:-;65:8;75:6;129:3;122:4;114:6;110:17;106:27;96:55;;147:1;144;137:12;96:55;-1:-1:-1;170:20:10;;213:18;202:30;;199:50;;;245:1;242;235:12;199:50;282:4;274:6;270:17;258:29;;334:3;327:4;318:6;310;306:19;302:30;299:39;296:59;;;351:1;348;341:12;366:171;433:20;;493:18;482:30;;472:41;;462:69;;527:1;524;517:12;462:69;366:171;;;:::o;542:154::-;-1:-1:-1;;;;;621:5:10;617:54;610:5;607:65;597:93;;686:1;683;676:12;701:925;808:6;816;824;832;840;848;901:3;889:9;880:7;876:23;872:33;869:53;;;918:1;915;908:12;869:53;958:9;945:23;987:18;1028:2;1020:6;1017:14;1014:34;;;1044:1;1041;1034:12;1014:34;1083:58;1133:7;1124:6;1113:9;1109:22;1083:58;:::i;:::-;1160:8;;-1:-1:-1;1057:84:10;-1:-1:-1;1057:84:10;;-1:-1:-1;1214:37:10;1247:2;1232:18;;1214:37;:::i;:::-;1204:47;;1304:2;1293:9;1289:18;1276:32;1260:48;;1333:2;1323:8;1320:16;1317:36;;;1349:1;1346;1339:12;1317:36;;1388:60;1440:7;1429:8;1418:9;1414:24;1388:60;:::i;:::-;1467:8;;-1:-1:-1;1362:86:10;-1:-1:-1;;1552:2:10;1537:18;;1524:32;1565:31;1524:32;1565:31;:::i;:::-;1615:5;1605:15;;;701:925;;;;;;;;:::o;1631:348::-;1783:2;1768:18;;1816:1;1805:13;;1795:144;;1861:10;1856:3;1852:20;1849:1;1842:31;1896:4;1893:1;1886:15;1924:4;1921:1;1914:15;1795:144;1948:25;;;1631:348;:::o;1984:247::-;2043:6;2096:2;2084:9;2075:7;2071:23;2067:32;2064:52;;;2112:1;2109;2102:12;2064:52;2151:9;2138:23;2170:31;2195:5;2170:31;:::i;2236:754::-;2333:6;2341;2349;2357;2365;2418:3;2406:9;2397:7;2393:23;2389:33;2386:53;;;2435:1;2432;2425:12;2386:53;2474:9;2461:23;2493:31;2518:5;2493:31;:::i;:::-;2543:5;-1:-1:-1;2595:2:10;2580:18;;2567:32;;-1:-1:-1;2650:2:10;2635:18;;2622:32;2677:18;2666:30;;2663:50;;;2709:1;2706;2699:12;2663:50;2748:58;2798:7;2789:6;2778:9;2774:22;2748:58;:::i;:::-;2825:8;;-1:-1:-1;2722:84:10;-1:-1:-1;;2912:2:10;2897:18;;2884:32;2925:33;2884:32;2925:33;:::i;:::-;2977:7;2967:17;;;2236:754;;;;;;;;:::o;3187:184::-;3245:6;3298:2;3286:9;3277:7;3273:23;3269:32;3266:52;;;3314:1;3311;3304:12;3266:52;3337:28;3355:9;3337:28;:::i;3558:319::-;3625:6;3633;3686:2;3674:9;3665:7;3661:23;3657:32;3654:52;;;3702:1;3699;3692:12;3654:52;3741:9;3728:23;3760:31;3785:5;3760:31;:::i;:::-;3810:5;-1:-1:-1;3834:37:10;3867:2;3852:18;;3834:37;:::i;:::-;3824:47;;3558:319;;;;;:::o;3882:250::-;3967:1;3977:113;3991:6;3988:1;3985:13;3977:113;;;4067:11;;;4061:18;4048:11;;;4041:39;4013:2;4006:10;3977:113;;;-1:-1:-1;;4124:1:10;4106:16;;4099:27;3882:250::o;4137:270::-;4178:3;4216:5;4210:12;4243:6;4238:3;4231:19;4259:76;4328:6;4321:4;4316:3;4312:14;4305:4;4298:5;4294:16;4259:76;:::i;:::-;4389:2;4368:15;-1:-1:-1;;4364:29:10;4355:39;;;;4396:4;4351:50;;4137:270;-1:-1:-1;;4137:270:10:o;4412:217::-;4559:2;4548:9;4541:21;4522:4;4579:44;4619:2;4608:9;4604:18;4596:6;4579:44;:::i;4865:366::-;4927:8;4937:6;4991:3;4984:4;4976:6;4972:17;4968:27;4958:55;;5009:1;5006;4999:12;4958:55;-1:-1:-1;5032:20:10;;5075:18;5064:30;;5061:50;;;5107:1;5104;5097:12;5061:50;5144:4;5136:6;5132:17;5120:29;;5204:3;5197:4;5187:6;5184:1;5180:14;5172:6;5168:27;5164:38;5161:47;5158:67;;;5221:1;5218;5211:12;5236:905;5366:6;5374;5382;5390;5398;5451:2;5439:9;5430:7;5426:23;5422:32;5419:52;;;5467:1;5464;5457:12;5419:52;5506:9;5493:23;5525:31;5550:5;5525:31;:::i;:::-;5575:5;-1:-1:-1;5631:2:10;5616:18;;5603:32;5654:18;5684:14;;;5681:34;;;5711:1;5708;5701:12;5681:34;5750:69;5811:7;5802:6;5791:9;5787:22;5750:69;:::i;:::-;5838:8;;-1:-1:-1;5724:95:10;-1:-1:-1;5926:2:10;5911:18;;5898:32;;-1:-1:-1;5942:16:10;;;5939:36;;;5971:1;5968;5961:12;5939:36;;6010:71;6073:7;6062:8;6051:9;6047:24;6010:71;:::i;:::-;5236:905;;;;-1:-1:-1;5236:905:10;;-1:-1:-1;6100:8:10;;5984:97;5236:905;-1:-1:-1;;;5236:905:10:o;6146:770::-;6267:6;6275;6283;6291;6344:2;6332:9;6323:7;6319:23;6315:32;6312:52;;;6360:1;6357;6350:12;6312:52;6400:9;6387:23;6429:18;6470:2;6462:6;6459:14;6456:34;;;6486:1;6483;6476:12;6456:34;6525:69;6586:7;6577:6;6566:9;6562:22;6525:69;:::i;:::-;6613:8;;-1:-1:-1;6499:95:10;-1:-1:-1;6701:2:10;6686:18;;6673:32;;-1:-1:-1;6717:16:10;;;6714:36;;;6746:1;6743;6736:12;6714:36;;6785:71;6848:7;6837:8;6826:9;6822:24;6785:71;:::i;:::-;6146:770;;;;-1:-1:-1;6875:8:10;-1:-1:-1;;;;6146:770:10:o;6921:616::-;7008:6;7016;7024;7032;7085:2;7073:9;7064:7;7060:23;7056:32;7053:52;;;7101:1;7098;7091:12;7053:52;7140:9;7127:23;7159:31;7184:5;7159:31;:::i;:::-;7209:5;-1:-1:-1;7233:37:10;7266:2;7251:18;;7233:37;:::i;:::-;7223:47;;7321:2;7310:9;7306:18;7293:32;7348:18;7340:6;7337:30;7334:50;;;7380:1;7377;7370:12;7334:50;7419:58;7469:7;7460:6;7449:9;7445:22;7419:58;:::i;7542:969::-;7656:6;7664;7672;7680;7688;7696;7704;7757:3;7745:9;7736:7;7732:23;7728:33;7725:53;;;7774:1;7771;7764:12;7725:53;7813:9;7800:23;7832:31;7857:5;7832:31;:::i;:::-;7882:5;-1:-1:-1;7939:2:10;7924:18;;7911:32;7952:33;7911:32;7952:33;:::i;:::-;8004:7;-1:-1:-1;8058:2:10;8043:18;;8030:32;;-1:-1:-1;8081:37:10;8114:2;8099:18;;8081:37;:::i;:::-;8071:47;;8169:3;8158:9;8154:19;8141:33;8197:18;8189:6;8186:30;8183:50;;;8229:1;8226;8219:12;8183:50;8268:58;8318:7;8309:6;8298:9;8294:22;8268:58;:::i;:::-;8345:8;;-1:-1:-1;8242:84:10;-1:-1:-1;;8432:3:10;8417:19;;8404:33;8446;8404;8446;:::i;:::-;8498:7;8488:17;;;7542:969;;;;;;;;;;:::o;8516:685::-;8612:6;8620;8628;8636;8644;8697:3;8685:9;8676:7;8672:23;8668:33;8665:53;;;8714:1;8711;8704:12;8665:53;8753:9;8740:23;8772:31;8797:5;8772:31;:::i;:::-;8822:5;-1:-1:-1;8874:2:10;8859:18;;8846:32;;-1:-1:-1;8897:37:10;8930:2;8915:18;;8897:37;:::i;:::-;8887:47;;8985:2;8974:9;8970:18;8957:32;9012:18;9004:6;9001:30;8998:50;;;9044:1;9041;9034:12;8998:50;9083:58;9133:7;9124:6;9113:9;9109:22;9083:58;:::i;9206:460::-;9282:6;9290;9298;9351:2;9339:9;9330:7;9326:23;9322:32;9319:52;;;9367:1;9364;9357:12;9319:52;9406:9;9393:23;9425:31;9450:5;9425:31;:::i;:::-;9475:5;-1:-1:-1;9499:37:10;9532:2;9517:18;;9499:37;:::i;:::-;9489:47;;9588:2;9577:9;9573:18;9560:32;9601:33;9626:7;9601:33;:::i;:::-;9653:7;9643:17;;;9206:460;;;;;:::o;9671:387::-;9747:6;9755;9763;9816:2;9804:9;9795:7;9791:23;9787:32;9784:52;;;9832:1;9829;9822:12;9784:52;9855:28;9873:9;9855:28;:::i;:::-;9845:38;;9933:2;9922:9;9918:18;9905:32;9946:31;9971:5;9946:31;:::i;:::-;9671:387;;9996:5;;-1:-1:-1;;;10048:2:10;10033:18;;;;10020:32;;9671:387::o;10063:758::-;10159:6;10167;10175;10183;10191;10244:3;10232:9;10223:7;10219:23;10215:33;10212:53;;;10261:1;10258;10251:12;10212:53;10300:9;10287:23;10319:31;10344:5;10319:31;:::i;:::-;10369:5;-1:-1:-1;10393:37:10;10426:2;10411:18;;10393:37;:::i;:::-;10383:47;;10481:2;10470:9;10466:18;10453:32;10508:18;10500:6;10497:30;10494:50;;;10540:1;10537;10530:12;10826:252;10893:6;10901;10954:2;10942:9;10933:7;10929:23;10925:32;10922:52;;;10970:1;10967;10960:12;10922:52;10993:28;11011:9;10993:28;:::i;:::-;10983:38;11068:2;11053:18;;;;11040:32;;-1:-1:-1;;;10826:252:10:o;11083:529::-;11168:6;11176;11184;11192;11245:3;11233:9;11224:7;11220:23;11216:33;11213:53;;;11262:1;11259;11252:12;11213:53;11301:9;11288:23;11320:31;11345:5;11320:31;:::i;:::-;11370:5;-1:-1:-1;11422:2:10;11407:18;;11394:32;;-1:-1:-1;11445:37:10;11478:2;11463:18;;11445:37;:::i;:::-;11435:47;;11534:2;11523:9;11519:18;11506:32;11547:33;11572:7;11547:33;:::i;:::-;11083:529;;;;-1:-1:-1;11083:529:10;;-1:-1:-1;;11083:529:10:o;11617:319::-;11684:6;11692;11745:2;11733:9;11724:7;11720:23;11716:32;11713:52;;;11761:1;11758;11751:12;11713:52;11784:28;11802:9;11784:28;:::i;:::-;11774:38;;11862:2;11851:9;11847:18;11834:32;11875:31;11900:5;11875:31;:::i;:::-;11925:5;11915:15;;;11617:319;;;;;:::o;11941:481::-;12019:6;12027;12035;12088:2;12076:9;12067:7;12063:23;12059:32;12056:52;;;12104:1;12101;12094:12;12056:52;12127:28;12145:9;12127:28;:::i;:::-;12117:38;;12206:2;12195:9;12191:18;12178:32;12233:18;12225:6;12222:30;12219:50;;;12265:1;12262;12255:12;12219:50;12304:58;12354:7;12345:6;12334:9;12330:22;12304:58;:::i;:::-;11941:481;;12381:8;;-1:-1:-1;12278:84:10;;-1:-1:-1;;;;11941:481:10:o;12427:995::-;12544:6;12552;12560;12568;12576;12584;12592;12645:3;12633:9;12624:7;12620:23;12616:33;12613:53;;;12662:1;12659;12652:12;12613:53;12685:28;12703:9;12685:28;:::i;:::-;12675:38;;12763:2;12752:9;12748:18;12735:32;12776:31;12801:5;12776:31;:::i;:::-;12826:5;-1:-1:-1;12882:2:10;12867:18;;12854:32;12905:18;12935:14;;;12932:34;;;12962:1;12959;12952:12;12932:34;13001:58;13051:7;13042:6;13031:9;13027:22;13001:58;:::i;:::-;13078:8;;-1:-1:-1;12975:84:10;-1:-1:-1;13160:2:10;13145:18;;13132:32;;-1:-1:-1;13217:3:10;13202:19;;13189:33;;-1:-1:-1;13234:16:10;;;13231:36;;;13263:1;13260;13253:12;13231:36;;13302:60;13354:7;13343:8;13332:9;13328:24;13302:60;:::i;:::-;12427:995;;;;-1:-1:-1;12427:995:10;;-1:-1:-1;12427:995:10;;;;13276:86;;-1:-1:-1;;;12427:995:10:o;13427:828::-;13533:6;13541;13549;13557;13565;13573;13626:3;13614:9;13605:7;13601:23;13597:33;13594:53;;;13643:1;13640;13633:12;13594:53;13666:28;13684:9;13666:28;:::i;:::-;13656:38;;13744:2;13733:9;13729:18;13716:32;13757:31;13782:5;13757:31;:::i;:::-;13807:5;-1:-1:-1;13864:2:10;13849:18;;13836:32;13877:33;13836:32;13877:33;:::i;:::-;13929:7;-1:-1:-1;13983:2:10;13968:18;;13955:32;;-1:-1:-1;14038:3:10;14023:19;;14010:33;14066:18;14055:30;;14052:50;;;14098:1;14095;14088:12;14052:50;14137:58;14187:7;14178:6;14167:9;14163:22;14137:58;:::i;:::-;13427:828;;;;-1:-1:-1;13427:828:10;;-1:-1:-1;13427:828:10;;14214:8;;13427:828;-1:-1:-1;;;13427:828:10:o;14614:380::-;14693:1;14689:12;;;;14736;;;14757:61;;14811:4;14803:6;14799:17;14789:27;;14757:61;14864:2;14856:6;14853:14;14833:18;14830:38;14827:161;;14910:10;14905:3;14901:20;14898:1;14891:31;14945:4;14942:1;14935:15;14973:4;14970:1;14963:15;14827:161;;14614:380;;;:::o;15124:840::-;15250:3;15279:1;15312:6;15306:13;15342:36;15368:9;15342:36;:::i;:::-;15397:1;15414:18;;;15441:133;;;;15588:1;15583:356;;;;15407:532;;15441:133;-1:-1:-1;;15474:24:10;;15462:37;;15547:14;;15540:22;15528:35;;15519:45;;;-1:-1:-1;15441:133:10;;15583:356;15614:6;15611:1;15604:17;15644:4;15689:2;15686:1;15676:16;15714:1;15728:165;15742:6;15739:1;15736:13;15728:165;;;15820:14;;15807:11;;;15800:35;15863:16;;;;15757:10;;15728:165;;;15732:3;;;15922:6;15917:3;15913:16;15906:23;;15407:532;-1:-1:-1;15955:3:10;;15124:840;-1:-1:-1;;;;;;15124:840:10:o;15969:271::-;16152:6;16144;16139:3;16126:33;16108:3;16178:16;;16203:13;;;16178:16;15969:271;-1:-1:-1;15969:271:10:o;17262:127::-;17323:10;17318:3;17314:20;17311:1;17304:31;17354:4;17351:1;17344:15;17378:4;17375:1;17368:15;17394:127;17455:10;17450:3;17446:20;17443:1;17436:31;17486:4;17483:1;17476:15;17510:4;17507:1;17500:15;17526:135;17565:3;17586:17;;;17583:43;;17606:18;;:::i;:::-;-1:-1:-1;17653:1:10;17642:13;;17526:135::o;18015:127::-;18076:10;18071:3;18067:20;18064:1;18057:31;18107:4;18104:1;18097:15;18131:4;18128:1;18121:15;18147:544;18248:2;18243:3;18240:11;18237:448;;;18284:1;18309:5;18305:2;18298:17;18354:4;18350:2;18340:19;18424:2;18412:10;18408:19;18405:1;18401:27;18395:4;18391:38;18460:4;18448:10;18445:20;18442:47;;;-1:-1:-1;18483:4:10;18442:47;18538:2;18533:3;18529:12;18526:1;18522:20;18516:4;18512:31;18502:41;;18593:82;18611:2;18604:5;18601:13;18593:82;;;18656:17;;;18637:1;18626:13;18593:82;;18237:448;18147:544;;;:::o;18867:1202::-;18989:18;18984:3;18981:27;18978:53;;;19011:18;;:::i;:::-;19040:93;19129:3;19089:38;19121:4;19115:11;19089:38;:::i;:::-;19083:4;19040:93;:::i;:::-;19159:1;19184:2;19179:3;19176:11;19201:1;19196:615;;;;19855:1;19872:3;19869:93;;;-1:-1:-1;19928:19:10;;;19915:33;19869:93;-1:-1:-1;;18824:1:10;18820:11;;;18816:24;18812:29;18802:40;18848:1;18844:11;;;18799:57;19975:78;;19169:894;;19196:615;15071:1;15064:14;;;15108:4;15095:18;;-1:-1:-1;;19232:17:10;;;19332:9;19354:229;19368:7;19365:1;19362:14;19354:229;;;19457:19;;;19444:33;19429:49;;19564:4;19549:20;;;;19517:1;19505:14;;;;19384:12;19354:229;;;19358:3;19611;19602:7;19599:16;19596:159;;;19735:1;19731:6;19725:3;19719;19716:1;19712:11;19708:21;19704:34;19700:39;19687:9;19682:3;19678:19;19665:33;19661:79;19653:6;19646:95;19596:159;;;19798:1;19792:3;19789:1;19785:11;19781:19;19775:4;19768:33;19169:894;;18867:1202;;;:::o;20074:266::-;20162:6;20157:3;20150:19;20214:6;20207:5;20200:4;20195:3;20191:14;20178:43;-1:-1:-1;20266:1:10;20241:16;;;20259:4;20237:27;;;20230:38;;;;20322:2;20301:15;;;-1:-1:-1;;20297:29:10;20288:39;;;20284:50;;20074:266::o;20345:458::-;-1:-1:-1;;;;;20560:6:10;20556:55;20545:9;20538:74;20660:18;20652:6;20648:31;20643:2;20632:9;20628:18;20621:59;20716:2;20711;20700:9;20696:18;20689:30;20519:4;20736:61;20793:2;20782:9;20778:18;20770:6;20762;20736:61;:::i;21153:251::-;21223:6;21276:2;21264:9;21255:7;21251:23;21247:32;21244:52;;;21292:1;21289;21282:12;21244:52;21324:9;21318:16;21343:31;21368:5;21343:31;:::i;21753:253::-;21825:2;21819:9;21867:4;21855:17;;21902:18;21887:34;;21923:22;;;21884:62;21881:88;;;21949:18;;:::i;:::-;21985:2;21978:22;21753:253;:::o;22011:275::-;22082:2;22076:9;22147:2;22128:13;;-1:-1:-1;;22124:27:10;22112:40;;22182:18;22167:34;;22203:22;;;22164:62;22161:88;;;22229:18;;:::i;:::-;22265:2;22258:22;22011:275;;-1:-1:-1;22011:275:10:o;22291:187::-;22340:4;22373:18;22365:6;22362:30;22359:56;;;22395:18;;:::i;:::-;-1:-1:-1;22461:2:10;22440:15;-1:-1:-1;;22436:29:10;22467:4;22432:40;;22291:187::o;22483:649::-;22563:6;22616:2;22604:9;22595:7;22591:23;22587:32;22584:52;;;22632:1;22629;22622:12;22584:52;22665:9;22659:16;22698:18;22690:6;22687:30;22684:50;;;22730:1;22727;22720:12;22684:50;22753:22;;22806:4;22798:13;;22794:27;-1:-1:-1;22784:55:10;;22835:1;22832;22825:12;22784:55;22864:2;22858:9;22889:49;22905:32;22934:2;22905:32;:::i;:::-;22889:49;:::i;:::-;22961:2;22954:5;22947:17;23001:7;22996:2;22991;22987;22983:11;22979:20;22976:33;22973:53;;;23022:1;23019;23012:12;22973:53;23035:67;23099:2;23094;23087:5;23083:14;23078:2;23074;23070:11;23035:67;:::i;23137:790::-;23312:2;23301:9;23294:21;23275:4;23350:6;23344:13;23393:4;23388:2;23377:9;23373:18;23366:32;23421:51;23467:3;23456:9;23452:19;23438:12;23421:51;:::i;:::-;23407:65;;23521:2;23513:6;23509:15;23503:22;23548:2;23544:7;23615:2;23603:9;23595:6;23591:22;23587:31;23582:2;23571:9;23567:18;23560:59;23642:40;23675:6;23659:14;23642:40;:::i;:::-;23628:54;;23736:2;23728:6;23724:15;23718:22;23713:2;23702:9;23698:18;23691:50;23790:2;23782:6;23778:15;23772:22;23750:44;;23860:2;23848:9;23840:6;23836:22;23832:31;23825:4;23814:9;23810:20;23803:61;;23881:40;23914:6;23898:14;23881:40;:::i;23932:794::-;24208:4;-1:-1:-1;;;;;24318:2:10;24310:6;24306:15;24295:9;24288:34;24370:2;24362:6;24358:15;24353:2;24342:9;24338:18;24331:43;;24410:6;24405:2;24394:9;24390:18;24383:34;24465:18;24457:6;24453:31;24448:2;24437:9;24433:18;24426:59;24522:3;24516;24505:9;24501:19;24494:32;24549:62;24606:3;24595:9;24591:19;24583:6;24575;24549:62;:::i;:::-;24660:9;24652:6;24648:22;24642:3;24631:9;24627:19;24620:51;24688:32;24713:6;24705;24688:32;:::i;:::-;24680:40;23932:794;-1:-1:-1;;;;;;;;;;23932:794:10:o;25157:591::-;25330:2;25319:9;25312:21;25293:4;-1:-1:-1;;;;;25449:2:10;25440:6;25434:13;25430:22;25425:2;25414:9;25410:18;25403:50;25517:2;25511;25503:6;25499:15;25493:22;25489:31;25484:2;25473:9;25469:18;25462:59;;25575:2;25567:6;25563:15;25557:22;25552:2;25541:9;25537:18;25530:50;25627:2;25619:6;25615:15;25609:22;25669:4;25662;25651:9;25647:20;25640:34;25691:51;25737:3;25726:9;25722:19;25708:12;25691:51;:::i;:::-;25683:59;25157:591;-1:-1:-1;;;;25157:591:10:o;25753:184::-;25823:6;25876:2;25864:9;25855:7;25851:23;25847:32;25844:52;;;25892:1;25889;25882:12;25844:52;-1:-1:-1;25915:16:10;;25753:184;-1:-1:-1;25753:184:10:o;25942:125::-;26007:9;;;26028:10;;;26025:36;;;26041:18;;:::i;:::-;25942:125;;;;:::o;27333:338::-;27528:18;27520:6;27516:31;27505:9;27498:50;27584:2;27579;27568:9;27564:18;27557:30;27479:4;27604:61;27661:2;27650:9;27646:18;27638:6;27630;27604:61;:::i;28083:1298::-;28164:6;28195:2;28238;28226:9;28217:7;28213:23;28209:32;28206:52;;;28254:1;28251;28244:12;28206:52;28294:9;28281:23;28323:18;28364:2;28356:6;28353:14;28350:34;;;28380:1;28377;28370:12;28350:34;28403:22;;;;28459:4;28441:16;;;28437:27;28434:47;;;28477:1;28474;28467:12;28434:47;28503:22;;:::i;:::-;28562:2;28549:16;28574:33;28599:7;28574:33;:::i;:::-;28616:22;;28675:11;;;28662:25;28696:33;28662:25;28696:33;:::i;:::-;28745:14;;;28738:31;28822:2;28814:11;;;28801:25;28785:14;;;28778:49;28873:2;28865:11;;28852:25;28889:16;;;28886:36;;;28918:1;28915;28908:12;28886:36;28949:8;28945:2;28941:17;28931:27;;;28996:7;28989:4;28985:2;28981:13;28977:27;28967:55;;29018:1;29015;29008:12;28967:55;29054:2;29041:16;29031:26;;29079:49;29095:32;29124:2;29095:32;:::i;29079:49::-;29151:2;29144:5;29137:17;29191:7;29186:2;29181;29177;29173:11;29169:20;29166:33;29163:53;;;29212:1;29209;29202:12;29163:53;29267:2;29262;29258;29254:11;29249:2;29242:5;29238:14;29225:45;29311:1;29306:2;29301;29294:5;29290:14;29286:23;29279:34;29345:5;29340:2;29333:5;29329:14;29322:29;;29370:5;29360:15;;;;;;28083:1298;;;;:::o;29789:410::-;-1:-1:-1;;;;;29998:6:10;29994:55;29983:9;29976:74;30086:6;30081:2;30070:9;30066:18;30059:34;30129:2;30124;30113:9;30109:18;30102:30;29957:4;30149:44;30189:2;30178:9;30174:18;30166:6;30149:44;:::i;32791:472::-;33011:2;33000:9;32993:21;32974:4;33037:44;33077:2;33066:9;33062:18;33054:6;33037:44;:::i;:::-;33129:18;33121:6;33117:31;33112:2;33101:9;33097:18;33090:59;33197:9;33189:6;33185:22;33180:2;33169:9;33165:18;33158:50;33225:32;33250:6;33242;33225:32;:::i;33972:432::-;-1:-1:-1;;;;;34178:6:10;34174:55;34163:9;34156:74;34278:18;34270:6;34266:31;34261:2;34250:9;34246:18;34239:59;34334:2;34329;34318:9;34314:18;34307:30;34137:4;34354:44;34394:2;34383:9;34379:18;34371:6;34354:44;:::i
Swarm Source
ipfs://b858f5b10153bc66bb5164b900409fd0964426a32294f87e83a5e247222a2a4b
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
BASE | 97.52% | $0.183956 | 780,457.0164 | $143,569.75 | |
BASE | 2.47% | $3,201.51 | 1.1348 | $3,633.16 | |
SCROLL | <0.01% | $3,198.03 | 0.0020494 | $6.55 | |
AVAX | <0.01% | $1 | 3.5452 | $3.55 | |
AVAX | <0.01% | $35.07 | 0.01 | $0.350741 | |
LINEA | <0.01% | $0.982728 | 1.8262 | $1.79 | |
BSC | <0.01% | $0.999504 | 1 | $0.9995 | |
POL | <0.01% | $3,196 | 0.00005 | $0.1598 | |
FTM | <0.01% | $0.700211 | 0.000000000055853 | <$0.000001 |
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.