Contract 0x9bb46d5100d2db4608112026951c9c965b233f4d 20
Contract Overview
Balance:
0 ETH
ETH Value:
$0.00
My Name Tag:
Not Available
Txn Hash | Method |
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0xbd61b85e6356dc2a9fbd167337e1241c6a75629e759c44dfa398e2d64bffcda1 | Transfer Ownersh... | 985857 | 505 days 1 hr ago | Superpower Squad: Deployer | IN | 0x9bb46d5100d2db4608112026951c9c965b233f4d | 0 ETH | 0.00000304 | |
0xea75a5bfc3b6f11a150525bc1d997988a175b7d4fbc7abe897b28d4db8b84ebf | 0x60a06040 | 984408 | 505 days 3 hrs ago | Superpower Squad: Deployer | IN | Create: MessageBus | 0 ETH | 0.00037659 |
[ Download CSV Export ]
Contract Name:
MessageBus
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Nova.Arbiscan.io on 2022-11-10 */ // Sources flattened with hardhat v2.9.0 https://hardhat.org // File contracts/safeguard/Ownable.sol // 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); } } // File contracts/interfaces/ISigsVerifier.sol pragma solidity >=0.8.0; interface ISigsVerifier { /** * @notice Verifies that a message is signed by a quorum among the signers. * @param _msg signed message * @param _sigs list of signatures sorted by signer addresses in ascending order * @param _signers sorted list of current signers * @param _powers powers of current signers */ function verifySigs( bytes memory _msg, bytes[] calldata _sigs, address[] calldata _signers, uint256[] calldata _powers ) external view; } // File contracts/message/messagebus/MessageBusSender.sol pragma solidity 0.8.9; contract MessageBusSender is Ownable { ISigsVerifier public immutable sigsVerifier; uint256 public feeBase; uint256 public feePerByte; mapping(address => uint256) public withdrawnFees; event Message(address indexed sender, address receiver, uint256 dstChainId, bytes message, uint256 fee); // message to non-evm chain with >20 bytes addr event Message2(address indexed sender, bytes receiver, uint256 dstChainId, bytes message, uint256 fee); event MessageWithTransfer( address indexed sender, address receiver, uint256 dstChainId, address bridge, bytes32 srcTransferId, bytes message, uint256 fee ); event FeeWithdrawn(address receiver, uint256 amount); event FeeBaseUpdated(uint256 feeBase); event FeePerByteUpdated(uint256 feePerByte); constructor(ISigsVerifier _sigsVerifier) { sigsVerifier = _sigsVerifier; } /** * @notice Sends 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 { _sendMessage(_dstChainId, _message); emit Message(msg.sender, _receiver, _dstChainId, _message, msg.value); } // Send message to non-evm chain with bytes for receiver address, // otherwise same as above. function sendMessage( bytes calldata _receiver, uint256 _dstChainId, bytes calldata _message ) external payable { _sendMessage(_dstChainId, _message); emit Message2(msg.sender, _receiver, _dstChainId, _message, msg.value); } function _sendMessage(uint256 _dstChainId, bytes calldata _message) private { require(_dstChainId != block.chainid, "Invalid chainId"); uint256 minFee = calcFee(_message); require(msg.value >= minFee, "Insufficient fee"); } /** * @notice Sends a message associated with a transfer to a contract on another chain. * If messages with the same srcTransferId are sent, only one of them will succeed. * 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 { require(_dstChainId != block.chainid, "Invalid chainId"); uint256 minFee = calcFee(_message); require(msg.value >= minFee, "Insufficient fee"); // SGN needs to verify // 1. msg.sender matches sender of the src transfer // 2. dstChainId matches dstChainId of the src transfer // 3. bridge is either liquidity bridge, peg src vault, or peg dst bridge emit MessageWithTransfer(msg.sender, _receiver, _dstChainId, _srcBridge, _srcTransferId, _message, msg.value); } /** * @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 { bytes32 domain = keccak256(abi.encodePacked(block.chainid, address(this), "withdrawFee")); sigsVerifier.verifySigs(abi.encodePacked(domain, _account, _cumulativeFee), _sigs, _signers, _powers); uint256 amount = _cumulativeFee - withdrawnFees[_account]; require(amount > 0, "No new amount to withdraw"); withdrawnFees[_account] = _cumulativeFee; (bool sent, ) = _account.call{value: amount, gas: 50000}(""); require(sent, "failed to withdraw fee"); emit FeeWithdrawn(_account, amount); } /** * @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) public view returns (uint256) { return feeBase + _message.length * feePerByte; } // -------------------- Admin -------------------- function setFeePerByte(uint256 _fee) external onlyOwner { feePerByte = _fee; emit FeePerByteUpdated(feePerByte); } function setFeeBase(uint256 _fee) external onlyOwner { feeBase = _fee; emit FeeBaseUpdated(feeBase); } } // File contracts/message/libraries/MsgDataTypes.sol pragma solidity >=0.8.0; library MsgDataTypes { string constant REVERT_MSG = "MSGBUS::REVERT"; // 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; } } // File contracts/message/interfaces/IMessageReceiverApp.sol 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); } // File contracts/interfaces/IBridge.sol pragma solidity >=0.8.0; interface IBridge { function send( address _receiver, address _token, uint256 _amount, uint64 _dstChainId, uint64 _nonce, uint32 _maxSlippage ) external; function sendNative( address _receiver, uint256 _amount, uint64 _dstChainId, uint64 _nonce, uint32 _maxSlippage ) external payable; function relay( bytes calldata _relayRequest, bytes[] calldata _sigs, address[] calldata _signers, uint256[] calldata _powers ) external; function transfers(bytes32 transferId) external view returns (bool); function withdraws(bytes32 withdrawId) external view returns (bool); function withdraw( bytes calldata _wdmsg, bytes[] calldata _sigs, address[] calldata _signers, uint256[] calldata _powers ) external; /** * @notice Verifies that a message is signed by a quorum among the signers. * @param _msg signed message * @param _sigs list of signatures sorted by signer addresses in ascending order * @param _signers sorted list of current signers * @param _powers powers of current signers */ function verifySigs( bytes memory _msg, bytes[] calldata _sigs, address[] calldata _signers, uint256[] calldata _powers ) external view; } // File contracts/interfaces/IOriginalTokenVault.sol pragma solidity >=0.8.0; interface IOriginalTokenVault { /** * @notice Lock original tokens to trigger mint at a remote chain's PeggedTokenBridge * @param _token local token address * @param _amount locked token amount * @param _mintChainId destination chainId to mint tokens * @param _mintAccount destination account to receive minted tokens * @param _nonce user input to guarantee unique depositId */ function deposit( address _token, uint256 _amount, uint64 _mintChainId, address _mintAccount, uint64 _nonce ) external; /** * @notice Lock native token as original token to trigger mint at a remote chain's PeggedTokenBridge * @param _amount locked token amount * @param _mintChainId destination chainId to mint tokens * @param _mintAccount destination account to receive minted tokens * @param _nonce user input to guarantee unique depositId */ function depositNative( uint256 _amount, uint64 _mintChainId, address _mintAccount, uint64 _nonce ) external payable; /** * @notice Withdraw locked original tokens triggered by a burn at a remote chain's PeggedTokenBridge. * @param _request The serialized Withdraw protobuf. * @param _sigs The list of signatures sorted by signing addresses in ascending order. A relay must be signed-off by * +2/3 of the bridge's current signing power to be delivered. * @param _signers The sorted list of signers. * @param _powers The signing powers of the signers. */ function withdraw( bytes calldata _request, bytes[] calldata _sigs, address[] calldata _signers, uint256[] calldata _powers ) external; function records(bytes32 recordId) external view returns (bool); } // File contracts/interfaces/IOriginalTokenVaultV2.sol pragma solidity >=0.8.0; interface IOriginalTokenVaultV2 { /** * @notice Lock original tokens to trigger mint at a remote chain's PeggedTokenBridge * @param _token local token address * @param _amount locked token amount * @param _mintChainId destination chainId to mint tokens * @param _mintAccount destination account to receive minted tokens * @param _nonce user input to guarantee unique depositId */ function deposit( address _token, uint256 _amount, uint64 _mintChainId, address _mintAccount, uint64 _nonce ) external returns (bytes32); /** * @notice Lock native token as original token to trigger mint at a remote chain's PeggedTokenBridge * @param _amount locked token amount * @param _mintChainId destination chainId to mint tokens * @param _mintAccount destination account to receive minted tokens * @param _nonce user input to guarantee unique depositId */ function depositNative( uint256 _amount, uint64 _mintChainId, address _mintAccount, uint64 _nonce ) external payable returns (bytes32); /** * @notice Withdraw locked original tokens triggered by a burn at a remote chain's PeggedTokenBridge. * @param _request The serialized Withdraw protobuf. * @param _sigs The list of signatures sorted by signing addresses in ascending order. A relay must be signed-off by * +2/3 of the bridge's current signing power to be delivered. * @param _signers The sorted list of signers. * @param _powers The signing powers of the signers. */ function withdraw( bytes calldata _request, bytes[] calldata _sigs, address[] calldata _signers, uint256[] calldata _powers ) external returns (bytes32); function records(bytes32 recordId) external view returns (bool); } // File contracts/interfaces/IPeggedTokenBridge.sol pragma solidity >=0.8.0; interface IPeggedTokenBridge { /** * @notice Burn tokens to trigger withdrawal at a remote chain's OriginalTokenVault * @param _token local token address * @param _amount locked token amount * @param _withdrawAccount account who withdraw original tokens on the remote chain * @param _nonce user input to guarantee unique depositId */ function burn( address _token, uint256 _amount, address _withdrawAccount, uint64 _nonce ) external; /** * @notice Mint tokens triggered by deposit at a remote chain's OriginalTokenVault. * @param _request The serialized Mint protobuf. * @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 mint( bytes calldata _request, bytes[] calldata _sigs, address[] calldata _signers, uint256[] calldata _powers ) external; function records(bytes32 recordId) external view returns (bool); } // File contracts/interfaces/IPeggedTokenBridgeV2.sol pragma solidity >=0.8.0; interface IPeggedTokenBridgeV2 { /** * @notice Burn pegged tokens to trigger a cross-chain withdrawal of the original tokens at a remote chain's * OriginalTokenVault, or mint at another remote chain * @param _token The pegged token address. * @param _amount The amount to burn. * @param _toChainId If zero, withdraw from original vault; otherwise, the remote chain to mint tokens. * @param _toAccount The account to receive tokens on the remote chain * @param _nonce A number to guarantee unique depositId. Can be timestamp in practice. */ function burn( address _token, uint256 _amount, uint64 _toChainId, address _toAccount, uint64 _nonce ) external returns (bytes32); // same with `burn` above, use openzeppelin ERC20Burnable interface function burnFrom( address _token, uint256 _amount, uint64 _toChainId, address _toAccount, uint64 _nonce ) external returns (bytes32); /** * @notice Mint tokens triggered by deposit at a remote chain's OriginalTokenVault. * @param _request The serialized Mint protobuf. * @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 mint( bytes calldata _request, bytes[] calldata _sigs, address[] calldata _signers, uint256[] calldata _powers ) external returns (bytes32); function records(bytes32 recordId) external view returns (bool); } // File contracts/message/messagebus/MessageBusReceiver.sol pragma solidity 0.8.9; contract MessageBusReceiver is Ownable { mapping(bytes32 => MsgDataTypes.TxStatus) public executedMessages; address public liquidityBridge; // liquidity bridge address address public pegBridge; // peg bridge address address public pegVault; // peg original vault address address public pegBridgeV2; // peg bridge address address public pegVaultV2; // peg original vault address // minimum amount of gas needed by this contract before it tries to // deliver a message to the target contract. uint256 public preExecuteMessageGasUsage; event Executed( MsgDataTypes.MsgType msgType, bytes32 msgId, MsgDataTypes.TxStatus status, address indexed receiver, uint64 srcChainId, bytes32 srcTxHash ); event NeedRetry(MsgDataTypes.MsgType msgType, bytes32 msgId, uint64 srcChainId, bytes32 srcTxHash); event CallReverted(string reason); // help debug event LiquidityBridgeUpdated(address liquidityBridge); event PegBridgeUpdated(address pegBridge); event PegVaultUpdated(address pegVault); event PegBridgeV2Updated(address pegBridgeV2); event PegVaultV2Updated(address pegVaultV2); constructor( address _liquidityBridge, address _pegBridge, address _pegVault, address _pegBridgeV2, address _pegVaultV2 ) { liquidityBridge = _liquidityBridge; pegBridge = _pegBridge; pegVault = _pegVault; pegBridgeV2 = _pegBridgeV2; pegVaultV2 = _pegVaultV2; } function initReceiver( address _liquidityBridge, address _pegBridge, address _pegVault, address _pegBridgeV2, address _pegVaultV2 ) internal { require(liquidityBridge == address(0), "liquidityBridge already set"); liquidityBridge = _liquidityBridge; pegBridge = _pegBridge; pegVault = _pegVault; pegBridgeV2 = _pegBridgeV2; pegVaultV2 = _pegVaultV2; } // ============== functions called by executor ============== /** * @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 ) public payable { // For message with token transfer, message Id is computed through transfer info // in order to guarantee that each transfer can only be used once. bytes32 messageId = verifyTransfer(_transfer); require(executedMessages[messageId] == MsgDataTypes.TxStatus.Null, "transfer already executed"); executedMessages[messageId] = MsgDataTypes.TxStatus.Pending; bytes32 domain = keccak256(abi.encodePacked(block.chainid, address(this), "MessageWithTransfer")); IBridge(liquidityBridge).verifySigs( abi.encodePacked(domain, messageId, _message, _transfer.srcTxHash), _sigs, _signers, _powers ); MsgDataTypes.TxStatus status; IMessageReceiverApp.ExecutionStatus est = executeMessageWithTransfer(_transfer, _message); if (est == IMessageReceiverApp.ExecutionStatus.Success) { status = MsgDataTypes.TxStatus.Success; } else if (est == IMessageReceiverApp.ExecutionStatus.Retry) { executedMessages[messageId] = MsgDataTypes.TxStatus.Null; emit NeedRetry( MsgDataTypes.MsgType.MessageWithTransfer, messageId, _transfer.srcChainId, _transfer.srcTxHash ); return; } else { est = executeMessageWithTransferFallback(_transfer, _message); if (est == IMessageReceiverApp.ExecutionStatus.Success) { status = MsgDataTypes.TxStatus.Fallback; } else { status = MsgDataTypes.TxStatus.Fail; } } executedMessages[messageId] = status; emitMessageWithTransferExecutedEvent(messageId, status, _transfer); } /** * @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 ) public payable { // similar to executeMessageWithTransfer bytes32 messageId = verifyTransfer(_transfer); require(executedMessages[messageId] == MsgDataTypes.TxStatus.Null, "transfer already executed"); executedMessages[messageId] = MsgDataTypes.TxStatus.Pending; bytes32 domain = keccak256(abi.encodePacked(block.chainid, address(this), "MessageWithTransferRefund")); IBridge(liquidityBridge).verifySigs( abi.encodePacked(domain, messageId, _message, _transfer.srcTxHash), _sigs, _signers, _powers ); MsgDataTypes.TxStatus status; IMessageReceiverApp.ExecutionStatus est = executeMessageWithTransferRefund(_transfer, _message); if (est == IMessageReceiverApp.ExecutionStatus.Success) { status = MsgDataTypes.TxStatus.Success; } else if (est == IMessageReceiverApp.ExecutionStatus.Retry) { executedMessages[messageId] = MsgDataTypes.TxStatus.Null; emit NeedRetry( MsgDataTypes.MsgType.MessageWithTransfer, messageId, _transfer.srcChainId, _transfer.srcTxHash ); return; } else { status = MsgDataTypes.TxStatus.Fail; } executedMessages[messageId] = status; emitMessageWithTransferExecutedEvent(messageId, status, _transfer); } /** * @notice Execute a message not associated with a transfer. * @param _message Arbitrary message bytes originated from and encoded by the source app contract * @param _route The info about the sender and the receiver. * @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 { MsgDataTypes.Route memory route = getRouteInfo(_route); executeMessage(_message, route, _sigs, _signers, _powers, "Message"); } // execute message from non-evm chain with bytes for sender address, // otherwise same as above. function executeMessage( bytes calldata _message, MsgDataTypes.RouteInfo2 calldata _route, bytes[] calldata _sigs, address[] calldata _signers, uint256[] calldata _powers ) external payable { MsgDataTypes.Route memory route = getRouteInfo(_route); executeMessage(_message, route, _sigs, _signers, _powers, "Message2"); } function executeMessage( bytes calldata _message, MsgDataTypes.Route memory _route, bytes[] calldata _sigs, address[] calldata _signers, uint256[] calldata _powers, string memory domainName ) private { // For message without associated token transfer, message Id is computed through message info, // in order to guarantee that each message can only be applied once bytes32 messageId = computeMessageOnlyId(_route, _message); require(executedMessages[messageId] == MsgDataTypes.TxStatus.Null, "message already executed"); executedMessages[messageId] = MsgDataTypes.TxStatus.Pending; bytes32 domain = keccak256(abi.encodePacked(block.chainid, address(this), domainName)); IBridge(liquidityBridge).verifySigs(abi.encodePacked(domain, messageId), _sigs, _signers, _powers); MsgDataTypes.TxStatus status; IMessageReceiverApp.ExecutionStatus est = executeMessage(_route, _message); if (est == IMessageReceiverApp.ExecutionStatus.Success) { status = MsgDataTypes.TxStatus.Success; } else if (est == IMessageReceiverApp.ExecutionStatus.Retry) { executedMessages[messageId] = MsgDataTypes.TxStatus.Null; emit NeedRetry(MsgDataTypes.MsgType.MessageOnly, messageId, _route.srcChainId, _route.srcTxHash); return; } else { status = MsgDataTypes.TxStatus.Fail; } executedMessages[messageId] = status; emitMessageOnlyExecutedEvent(messageId, status, _route); } // ================= utils (to avoid stack too deep) ================= function emitMessageWithTransferExecutedEvent( bytes32 _messageId, MsgDataTypes.TxStatus _status, MsgDataTypes.TransferInfo calldata _transfer ) private { emit Executed( MsgDataTypes.MsgType.MessageWithTransfer, _messageId, _status, _transfer.receiver, _transfer.srcChainId, _transfer.srcTxHash ); } function emitMessageOnlyExecutedEvent( bytes32 _messageId, MsgDataTypes.TxStatus _status, MsgDataTypes.Route memory _route ) private { emit Executed( MsgDataTypes.MsgType.MessageOnly, _messageId, _status, _route.receiver, _route.srcChainId, _route.srcTxHash ); } function executeMessageWithTransfer(MsgDataTypes.TransferInfo calldata _transfer, bytes calldata _message) private returns (IMessageReceiverApp.ExecutionStatus) { uint256 gasLeftBeforeExecution = gasleft(); (bool ok, bytes memory res) = address(_transfer.receiver).call{value: msg.value}( abi.encodeWithSelector( IMessageReceiverApp.executeMessageWithTransfer.selector, _transfer.sender, _transfer.token, _transfer.amount, _transfer.srcChainId, _message, msg.sender ) ); if (ok) { return abi.decode((res), (IMessageReceiverApp.ExecutionStatus)); } handleExecutionRevert(gasLeftBeforeExecution, res); return IMessageReceiverApp.ExecutionStatus.Fail; } function executeMessageWithTransferFallback(MsgDataTypes.TransferInfo calldata _transfer, bytes calldata _message) private returns (IMessageReceiverApp.ExecutionStatus) { uint256 gasLeftBeforeExecution = gasleft(); (bool ok, bytes memory res) = address(_transfer.receiver).call{value: msg.value}( abi.encodeWithSelector( IMessageReceiverApp.executeMessageWithTransferFallback.selector, _transfer.sender, _transfer.token, _transfer.amount, _transfer.srcChainId, _message, msg.sender ) ); if (ok) { return abi.decode((res), (IMessageReceiverApp.ExecutionStatus)); } handleExecutionRevert(gasLeftBeforeExecution, res); return IMessageReceiverApp.ExecutionStatus.Fail; } function executeMessageWithTransferRefund(MsgDataTypes.TransferInfo calldata _transfer, bytes calldata _message) private returns (IMessageReceiverApp.ExecutionStatus) { uint256 gasLeftBeforeExecution = gasleft(); (bool ok, bytes memory res) = address(_transfer.receiver).call{value: msg.value}( abi.encodeWithSelector( IMessageReceiverApp.executeMessageWithTransferRefund.selector, _transfer.token, _transfer.amount, _message, msg.sender ) ); if (ok) { return abi.decode((res), (IMessageReceiverApp.ExecutionStatus)); } handleExecutionRevert(gasLeftBeforeExecution, res); return IMessageReceiverApp.ExecutionStatus.Fail; } function verifyTransfer(MsgDataTypes.TransferInfo calldata _transfer) private view returns (bytes32) { bytes32 transferId; address bridgeAddr; if (_transfer.t == MsgDataTypes.TransferType.LqRelay) { transferId = keccak256( abi.encodePacked( _transfer.sender, _transfer.receiver, _transfer.token, _transfer.amount, _transfer.srcChainId, uint64(block.chainid), _transfer.refId ) ); bridgeAddr = liquidityBridge; require(IBridge(bridgeAddr).transfers(transferId) == true, "bridge relay not exist"); } else if (_transfer.t == MsgDataTypes.TransferType.LqWithdraw) { transferId = keccak256( abi.encodePacked( uint64(block.chainid), _transfer.wdseq, _transfer.receiver, _transfer.token, _transfer.amount ) ); bridgeAddr = liquidityBridge; require(IBridge(bridgeAddr).withdraws(transferId) == true, "bridge withdraw not exist"); } else if ( _transfer.t == MsgDataTypes.TransferType.PegMint || _transfer.t == MsgDataTypes.TransferType.PegWithdraw ) { transferId = keccak256( abi.encodePacked( _transfer.receiver, _transfer.token, _transfer.amount, _transfer.sender, _transfer.srcChainId, _transfer.refId ) ); if (_transfer.t == MsgDataTypes.TransferType.PegMint) { bridgeAddr = pegBridge; require(IPeggedTokenBridge(bridgeAddr).records(transferId) == true, "mint record not exist"); } else { // _transfer.t == MsgDataTypes.TransferType.PegWithdraw bridgeAddr = pegVault; require(IOriginalTokenVault(bridgeAddr).records(transferId) == true, "withdraw record not exist"); } } else if ( _transfer.t == MsgDataTypes.TransferType.PegV2Mint || _transfer.t == MsgDataTypes.TransferType.PegV2Withdraw ) { if (_transfer.t == MsgDataTypes.TransferType.PegV2Mint) { bridgeAddr = pegBridgeV2; } else { // MsgDataTypes.TransferType.PegV2Withdraw bridgeAddr = pegVaultV2; } transferId = keccak256( abi.encodePacked( _transfer.receiver, _transfer.token, _transfer.amount, _transfer.sender, _transfer.srcChainId, _transfer.refId, bridgeAddr ) ); if (_transfer.t == MsgDataTypes.TransferType.PegV2Mint) { require(IPeggedTokenBridgeV2(bridgeAddr).records(transferId) == true, "mint record not exist"); } else { // MsgDataTypes.TransferType.PegV2Withdraw require(IOriginalTokenVaultV2(bridgeAddr).records(transferId) == true, "withdraw record not exist"); } } return keccak256(abi.encodePacked(MsgDataTypes.MsgType.MessageWithTransfer, bridgeAddr, transferId)); } function computeMessageOnlyId(MsgDataTypes.Route memory _route, bytes calldata _message) private view returns (bytes32) { bytes memory sender = _route.senderBytes; if (sender.length == 0) { sender = abi.encodePacked(_route.sender); } return keccak256( abi.encodePacked( MsgDataTypes.MsgType.MessageOnly, sender, _route.receiver, _route.srcChainId, _route.srcTxHash, uint64(block.chainid), _message ) ); } function executeMessage(MsgDataTypes.Route memory _route, bytes calldata _message) private returns (IMessageReceiverApp.ExecutionStatus) { uint256 gasLeftBeforeExecution = gasleft(); bool ok; bytes memory res; if (_route.senderBytes.length == 0) { (ok, res) = address(_route.receiver).call{value: msg.value}( abi.encodeWithSelector( bytes4(keccak256(bytes("executeMessage(address,uint64,bytes,address)"))), _route.sender, _route.srcChainId, _message, msg.sender ) ); } else { (ok, res) = address(_route.receiver).call{value: msg.value}( abi.encodeWithSelector( bytes4(keccak256(bytes("executeMessage(bytes,uint64,bytes,address)"))), _route.senderBytes, _route.srcChainId, _message, msg.sender ) ); } if (ok) { return abi.decode((res), (IMessageReceiverApp.ExecutionStatus)); } handleExecutionRevert(gasLeftBeforeExecution, res); return IMessageReceiverApp.ExecutionStatus.Fail; } function handleExecutionRevert(uint256 _gasLeftBeforeExecution, bytes memory _returnData) private { uint256 gasLeftAfterExecution = gasleft(); uint256 maxTargetGasLimit = block.gaslimit - preExecuteMessageGasUsage; if (_gasLeftBeforeExecution < maxTargetGasLimit && gasLeftAfterExecution <= _gasLeftBeforeExecution / 64) { // if this happens, the executor must have not provided sufficient gas limit, // then the tx should revert instead of recording a non-retryable failure status // https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-f-gas-to-send-with-call-operations assembly { invalid() } } string memory _msg = getRevertMsg(_returnData); checkNotBeginWithPrefix(MsgDataTypes.REVERT_MSG, _msg); emit CallReverted(_msg); } function checkNotBeginWithPrefix(string memory _prefix, string memory _msg) private pure { bytes memory prefixBytes = bytes(_prefix); bytes memory msgBytes = bytes(_msg); if (msgBytes.length >= prefixBytes.length) { for (uint256 i = 0; i < prefixBytes.length; i++) { if (msgBytes[i] != prefixBytes[i]) { return; // not match, return } } revert(_msg); // match, revert } } // https://ethereum.stackexchange.com/a/83577 // https://github.com/Uniswap/v3-periphery/blob/v1.0.0/contracts/base/Multicall.sol function getRevertMsg(bytes memory _returnData) private pure returns (string memory) { // If the _res length is less than 68, then the transaction failed silently (without a revert message) if (_returnData.length < 68) return "Transaction reverted silently"; assembly { // Slice the sighash. _returnData := add(_returnData, 0x04) } return abi.decode(_returnData, (string)); // All that remains is the revert string } function getRouteInfo(MsgDataTypes.RouteInfo calldata _route) private pure returns (MsgDataTypes.Route memory) { return MsgDataTypes.Route(_route.sender, "", _route.receiver, _route.srcChainId, _route.srcTxHash); } function getRouteInfo(MsgDataTypes.RouteInfo2 calldata _route) private pure returns (MsgDataTypes.Route memory) { return MsgDataTypes.Route(address(0), _route.sender, _route.receiver, _route.srcChainId, _route.srcTxHash); } // ================= helper functions ===================== /** * @notice combine bridge transfer and msg execution calls into a single tx * @dev caller needs to get the required input params from SGN * @param _transferParams params to call bridge transfer * @param _msgParams params to execute message */ function transferAndExecuteMsg( MsgDataTypes.BridgeTransferParams calldata _transferParams, MsgDataTypes.MsgWithTransferExecutionParams calldata _msgParams ) external { _bridgeTransfer(_msgParams.transfer.t, _transferParams); executeMessageWithTransfer( _msgParams.message, _msgParams.transfer, _msgParams.sigs, _msgParams.signers, _msgParams.powers ); } /** * @notice combine bridge refund and msg execution calls into a single tx * @dev caller needs to get the required input params from SGN * @param _transferParams params to call bridge transfer for refund * @param _msgParams params to execute message for refund */ function refundAndExecuteMsg( MsgDataTypes.BridgeTransferParams calldata _transferParams, MsgDataTypes.MsgWithTransferExecutionParams calldata _msgParams ) external { _bridgeTransfer(_msgParams.transfer.t, _transferParams); executeMessageWithTransferRefund( _msgParams.message, _msgParams.transfer, _msgParams.sigs, _msgParams.signers, _msgParams.powers ); } function _bridgeTransfer(MsgDataTypes.TransferType t, MsgDataTypes.BridgeTransferParams calldata _transferParams) private { if (t == MsgDataTypes.TransferType.LqRelay) { IBridge(liquidityBridge).relay( _transferParams.request, _transferParams.sigs, _transferParams.signers, _transferParams.powers ); } else if (t == MsgDataTypes.TransferType.LqWithdraw) { IBridge(liquidityBridge).withdraw( _transferParams.request, _transferParams.sigs, _transferParams.signers, _transferParams.powers ); } else if (t == MsgDataTypes.TransferType.PegMint) { IPeggedTokenBridge(pegBridge).mint( _transferParams.request, _transferParams.sigs, _transferParams.signers, _transferParams.powers ); } else if (t == MsgDataTypes.TransferType.PegV2Mint) { IPeggedTokenBridgeV2(pegBridgeV2).mint( _transferParams.request, _transferParams.sigs, _transferParams.signers, _transferParams.powers ); } else if (t == MsgDataTypes.TransferType.PegWithdraw) { IOriginalTokenVault(pegVault).withdraw( _transferParams.request, _transferParams.sigs, _transferParams.signers, _transferParams.powers ); } else if (t == MsgDataTypes.TransferType.PegV2Withdraw) { IOriginalTokenVaultV2(pegVaultV2).withdraw( _transferParams.request, _transferParams.sigs, _transferParams.signers, _transferParams.powers ); } } // ================= contract config ================= function setLiquidityBridge(address _addr) public onlyOwner { require(_addr != address(0), "invalid address"); liquidityBridge = _addr; emit LiquidityBridgeUpdated(liquidityBridge); } function setPegBridge(address _addr) public onlyOwner { require(_addr != address(0), "invalid address"); pegBridge = _addr; emit PegBridgeUpdated(pegBridge); } function setPegVault(address _addr) public onlyOwner { require(_addr != address(0), "invalid address"); pegVault = _addr; emit PegVaultUpdated(pegVault); } function setPegBridgeV2(address _addr) public onlyOwner { require(_addr != address(0), "invalid address"); pegBridgeV2 = _addr; emit PegBridgeV2Updated(pegBridgeV2); } function setPegVaultV2(address _addr) public onlyOwner { require(_addr != address(0), "invalid address"); pegVaultV2 = _addr; emit PegVaultV2Updated(pegVaultV2); } function setPreExecuteMessageGasUsage(uint256 _usage) public onlyOwner { preExecuteMessageGasUsage = _usage; } } // File contracts/message/messagebus/MessageBus.sol pragma solidity 0.8.9; contract MessageBus is MessageBusSender, MessageBusReceiver { constructor( ISigsVerifier _sigsVerifier, address _liquidityBridge, address _pegBridge, address _pegVault, address _pegBridgeV2, address _pegVaultV2 ) MessageBusSender(_sigsVerifier) MessageBusReceiver(_liquidityBridge, _pegBridge, _pegVault, _pegBridgeV2, _pegVaultV2) {} // this is only to be called by Proxy via delegateCall as initOwner will require _owner is 0. // so calling init on this contract directly will guarantee to fail function init( address _liquidityBridge, address _pegBridge, address _pegVault, address _pegBridgeV2, address _pegVaultV2 ) external { // MUST manually call ownable init and must only call once initOwner(); // we don't need sender init as _sigsVerifier is immutable so already in the deployed code initReceiver(_liquidityBridge, _pegBridge, _pegVault, _pegBridgeV2, _pegVaultV2); } }
[{"inputs":[{"internalType":"contract ISigsVerifier","name":"_sigsVerifier","type":"address"},{"internalType":"address","name":"_liquidityBridge","type":"address"},{"internalType":"address","name":"_pegBridge","type":"address"},{"internalType":"address","name":"_pegVault","type":"address"},{"internalType":"address","name":"_pegBridgeV2","type":"address"},{"internalType":"address","name":"_pegVaultV2","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"CallReverted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum MsgDataTypes.MsgType","name":"msgType","type":"uint8"},{"indexed":false,"internalType":"bytes32","name":"msgId","type":"bytes32"},{"indexed":false,"internalType":"enum MsgDataTypes.TxStatus","name":"status","type":"uint8"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint64","name":"srcChainId","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"srcTxHash","type":"bytes32"}],"name":"Executed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"feeBase","type":"uint256"}],"name":"FeeBaseUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"feePerByte","type":"uint256"}],"name":"FeePerByteUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FeeWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"liquidityBridge","type":"address"}],"name":"LiquidityBridgeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"dstChainId","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"message","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"Message","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"bytes","name":"receiver","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"dstChainId","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"message","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"Message2","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"dstChainId","type":"uint256"},{"indexed":false,"internalType":"address","name":"bridge","type":"address"},{"indexed":false,"internalType":"bytes32","name":"srcTransferId","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"message","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"MessageWithTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum MsgDataTypes.MsgType","name":"msgType","type":"uint8"},{"indexed":false,"internalType":"bytes32","name":"msgId","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"srcChainId","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"srcTxHash","type":"bytes32"}],"name":"NeedRetry","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":"pegBridge","type":"address"}],"name":"PegBridgeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pegBridgeV2","type":"address"}],"name":"PegBridgeV2Updated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pegVault","type":"address"}],"name":"PegVaultUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pegVaultV2","type":"address"}],"name":"PegVaultV2Updated","type":"event"},{"inputs":[{"internalType":"bytes","name":"_message","type":"bytes"}],"name":"calcFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_message","type":"bytes"},{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint64","name":"srcChainId","type":"uint64"},{"internalType":"bytes32","name":"srcTxHash","type":"bytes32"}],"internalType":"struct MsgDataTypes.RouteInfo","name":"_route","type":"tuple"},{"internalType":"bytes[]","name":"_sigs","type":"bytes[]"},{"internalType":"address[]","name":"_signers","type":"address[]"},{"internalType":"uint256[]","name":"_powers","type":"uint256[]"}],"name":"executeMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_message","type":"bytes"},{"components":[{"internalType":"bytes","name":"sender","type":"bytes"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint64","name":"srcChainId","type":"uint64"},{"internalType":"bytes32","name":"srcTxHash","type":"bytes32"}],"internalType":"struct MsgDataTypes.RouteInfo2","name":"_route","type":"tuple"},{"internalType":"bytes[]","name":"_sigs","type":"bytes[]"},{"internalType":"address[]","name":"_signers","type":"address[]"},{"internalType":"uint256[]","name":"_powers","type":"uint256[]"}],"name":"executeMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_message","type":"bytes"},{"components":[{"internalType":"enum MsgDataTypes.TransferType","name":"t","type":"uint8"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint64","name":"wdseq","type":"uint64"},{"internalType":"uint64","name":"srcChainId","type":"uint64"},{"internalType":"bytes32","name":"refId","type":"bytes32"},{"internalType":"bytes32","name":"srcTxHash","type":"bytes32"}],"internalType":"struct MsgDataTypes.TransferInfo","name":"_transfer","type":"tuple"},{"internalType":"bytes[]","name":"_sigs","type":"bytes[]"},{"internalType":"address[]","name":"_signers","type":"address[]"},{"internalType":"uint256[]","name":"_powers","type":"uint256[]"}],"name":"executeMessageWithTransfer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_message","type":"bytes"},{"components":[{"internalType":"enum MsgDataTypes.TransferType","name":"t","type":"uint8"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint64","name":"wdseq","type":"uint64"},{"internalType":"uint64","name":"srcChainId","type":"uint64"},{"internalType":"bytes32","name":"refId","type":"bytes32"},{"internalType":"bytes32","name":"srcTxHash","type":"bytes32"}],"internalType":"struct MsgDataTypes.TransferInfo","name":"_transfer","type":"tuple"},{"internalType":"bytes[]","name":"_sigs","type":"bytes[]"},{"internalType":"address[]","name":"_signers","type":"address[]"},{"internalType":"uint256[]","name":"_powers","type":"uint256[]"}],"name":"executeMessageWithTransferRefund","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"executedMessages","outputs":[{"internalType":"enum MsgDataTypes.TxStatus","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeBase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feePerByte","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_liquidityBridge","type":"address"},{"internalType":"address","name":"_pegBridge","type":"address"},{"internalType":"address","name":"_pegVault","type":"address"},{"internalType":"address","name":"_pegBridgeV2","type":"address"},{"internalType":"address","name":"_pegVaultV2","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liquidityBridge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pegBridge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pegBridgeV2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pegVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pegVaultV2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preExecuteMessageGasUsage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes","name":"request","type":"bytes"},{"internalType":"bytes[]","name":"sigs","type":"bytes[]"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"uint256[]","name":"powers","type":"uint256[]"}],"internalType":"struct MsgDataTypes.BridgeTransferParams","name":"_transferParams","type":"tuple"},{"components":[{"internalType":"bytes","name":"message","type":"bytes"},{"components":[{"internalType":"enum MsgDataTypes.TransferType","name":"t","type":"uint8"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint64","name":"wdseq","type":"uint64"},{"internalType":"uint64","name":"srcChainId","type":"uint64"},{"internalType":"bytes32","name":"refId","type":"bytes32"},{"internalType":"bytes32","name":"srcTxHash","type":"bytes32"}],"internalType":"struct MsgDataTypes.TransferInfo","name":"transfer","type":"tuple"},{"internalType":"bytes[]","name":"sigs","type":"bytes[]"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"uint256[]","name":"powers","type":"uint256[]"}],"internalType":"struct MsgDataTypes.MsgWithTransferExecutionParams","name":"_msgParams","type":"tuple"}],"name":"refundAndExecuteMsg","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_receiver","type":"bytes"},{"internalType":"uint256","name":"_dstChainId","type":"uint256"},{"internalType":"bytes","name":"_message","type":"bytes"}],"name":"sendMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_dstChainId","type":"uint256"},{"internalType":"bytes","name":"_message","type":"bytes"}],"name":"sendMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_dstChainId","type":"uint256"},{"internalType":"address","name":"_srcBridge","type":"address"},{"internalType":"bytes32","name":"_srcTransferId","type":"bytes32"},{"internalType":"bytes","name":"_message","type":"bytes"}],"name":"sendMessageWithTransfer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setFeeBase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setFeePerByte","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setLiquidityBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setPegBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setPegBridgeV2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setPegVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setPegVaultV2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_usage","type":"uint256"}],"name":"setPreExecuteMessageGasUsage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sigsVerifier","outputs":[{"internalType":"contract ISigsVerifier","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes","name":"request","type":"bytes"},{"internalType":"bytes[]","name":"sigs","type":"bytes[]"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"uint256[]","name":"powers","type":"uint256[]"}],"internalType":"struct MsgDataTypes.BridgeTransferParams","name":"_transferParams","type":"tuple"},{"components":[{"internalType":"bytes","name":"message","type":"bytes"},{"components":[{"internalType":"enum MsgDataTypes.TransferType","name":"t","type":"uint8"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint64","name":"wdseq","type":"uint64"},{"internalType":"uint64","name":"srcChainId","type":"uint64"},{"internalType":"bytes32","name":"refId","type":"bytes32"},{"internalType":"bytes32","name":"srcTxHash","type":"bytes32"}],"internalType":"struct MsgDataTypes.TransferInfo","name":"transfer","type":"tuple"},{"internalType":"bytes[]","name":"sigs","type":"bytes[]"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"uint256[]","name":"powers","type":"uint256[]"}],"internalType":"struct MsgDataTypes.MsgWithTransferExecutionParams","name":"_msgParams","type":"tuple"}],"name":"transferAndExecuteMsg","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_cumulativeFee","type":"uint256"},{"internalType":"bytes[]","name":"_sigs","type":"bytes[]"},{"internalType":"address[]","name":"_signers","type":"address[]"},{"internalType":"uint256[]","name":"_powers","type":"uint256[]"}],"name":"withdrawFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"withdrawnFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a06040523480156200001157600080fd5b50604051620041a9380380620041a983398101604081905262000034916200011d565b84848484848a6200004533620000b4565b6001600160a01b03908116608052600580546001600160a01b0319908116978316979097179055600680548716958216959095179094556007805486169385169390931790925560088054851691841691909117905560098054909316911617905550620001b1945050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146200011a57600080fd5b50565b60008060008060008060c087890312156200013757600080fd5b8651620001448162000104565b6020880151909650620001578162000104565b60408801519095506200016a8162000104565b60608801519094506200017d8162000104565b6080880151909350620001908162000104565b60a0880151909250620001a38162000104565b809150509295509295509295565b608051613fd5620001d4600039600081816104eb01526108430152613fd56000f3fe6080604052600436106101fe5760003560e01c806382980dc41161011d578063ccf2683b116100b0578063dfa2dbaf1161007f578063f2fde38b11610064578063f2fde38b146105bd578063f60bbe2a146105dd578063f83b0fb9146105f357600080fd5b8063dfa2dbaf1461057d578063e2c1ed251461059d57600080fd5b8063ccf2683b146104d9578063cd2abd661461050d578063d8257d171461054a578063db2c20c81461056a57600080fd5b806395e911a8116100ec57806395e911a8146104705780639b05a775146104865780639f3ce55a146104a6578063c66a9c5a146104b957600080fd5b806382980dc4146103da57806382efd502146104125780638da5cb5b1461043257806395b12c271461045057600080fd5b8063468a2d04116101955780635b3e5f50116101645780635b3e5f5014610367578063723d0a9d146103945780637b80ab20146103b45780637d7a101d146103c757600080fd5b8063468a2d04146102eb5780635335dca2146102fe578063584e45e114610331578063588be02b1461034757600080fd5b80633f395aff116101d15780633f395aff1461028557806340d0d026146102985780634289fbb3146102b85780634586f331146102cb57600080fd5b806303cbfe661461020357806306c28bd6146102255780632ff4c41114610245578063359ef75b14610265575b600080fd5b34801561020f57600080fd5b5061022361021e366004612fb3565b610613565b005b34801561023157600080fd5b50610223610240366004612fce565b61070c565b34801561025157600080fd5b50610223610260366004613033565b610798565b34801561027157600080fd5b506102236102803660046130e7565b610a33565b61022361029336600461318e565b610a4f565b3480156102a457600080fd5b506102236102b3366004613297565b610d42565b6102236102c6366004613303565b610d9a565b3480156102d757600080fd5b506102236102e6366004612fce565b610e83565b6102236102f936600461337b565b610edf565b34801561030a57600080fd5b5061031e610319366004613440565b610f3f565b6040519081526020015b60405180910390f35b34801561033d57600080fd5b5061031e600a5481565b34801561035357600080fd5b50610223610362366004612fb3565b610f65565b34801561037357600080fd5b5061031e610382366004612fb3565b60036020526000908152604090205481565b3480156103a057600080fd5b506102236103af366004613297565b611052565b6102236103c236600461318e565b6110a0565b6102236103d5366004613482565b6112af565b3480156103e657600080fd5b506005546103fa906001600160a01b031681565b6040516001600160a01b039091168152602001610328565b34801561041e57600080fd5b5061022361042d366004612fb3565b61130c565b34801561043e57600080fd5b506000546001600160a01b03166103fa565b34801561045c57600080fd5b506008546103fa906001600160a01b031681565b34801561047c57600080fd5b5061031e60015481565b34801561049257600080fd5b506102236104a1366004612fb3565b6113f9565b6102236104b43660046134fc565b6114e6565b3480156104c557600080fd5b506009546103fa906001600160a01b031681565b3480156104e557600080fd5b506103fa7f000000000000000000000000000000000000000000000000000000000000000081565b34801561051957600080fd5b5061053d610528366004612fce565b60046020526000908152604090205460ff1681565b6040516103289190613580565b34801561055657600080fd5b506007546103fa906001600160a01b031681565b61022361057836600461358e565b611540565b34801561058957600080fd5b506006546103fa906001600160a01b031681565b3480156105a957600080fd5b506102236105b8366004612fce565b611594565b3480156105c957600080fd5b506102236105d8366004612fb3565b611620565b3480156105e957600080fd5b5061031e60025481565b3480156105ff57600080fd5b5061022361060e366004612fb3565b6116ff565b336106266000546001600160a01b031690565b6001600160a01b03161461066f5760405162461bcd60e51b81526020600482018190526024820152600080516020613f5483398151915260448201526064015b60405180910390fd5b6001600160a01b0381166106b75760405162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b6044820152606401610666565b600680546001600160a01b0319166001600160a01b0383169081179091556040519081527fd60e9ceb4f54f1bfb1741a4b35fc9d806d7ed48200b523203b92248ea38fa17d906020015b60405180910390a150565b3361071f6000546001600160a01b031690565b6001600160a01b0316146107635760405162461bcd60e51b81526020600482018190526024820152600080516020613f548339815191526044820152606401610666565b60018190556040518181527f892dfdc99ecd3bb4f2f2cb118dca02f0bd16640ff156d3c6459d4282e336a5f290602001610701565b600046306040516020016107e992919091825260601b6001600160601b03191660208201527f77697468647261774665650000000000000000000000000000000000000000006034820152603f0190565b60408051808303601f19018152828252805160209182012090830181905260608c901b6001600160601b0319168383015260548084018c9052825180850390910181526074840192839052633416de1160e11b90925292507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163682dbc229161088a918b908b908b908b908b908b906078016137fd565b60006040518083038186803b1580156108a257600080fd5b505afa1580156108b6573d6000803e3d6000fd5b505050506001600160a01b0389166000908152600360205260408120546108dd908a613871565b90506000811161092f5760405162461bcd60e51b815260206004820152601960248201527f4e6f206e657720616d6f756e7420746f207769746864726177000000000000006044820152606401610666565b6001600160a01b038a166000818152600360205260408082208c90555190919061c35090849084818181858888f193505050503d806000811461098e576040519150601f19603f3d011682016040523d82523d6000602084013e610993565b606091505b50509050806109e45760405162461bcd60e51b815260206004820152601660248201527f6661696c656420746f20776974686472617720666565000000000000000000006044820152606401610666565b604080516001600160a01b038d168152602081018490527f78473f3f373f7673597f4f0fa5873cb4d375fea6d4339ad6b56dbd411513cb3f910160405180910390a15050505050505050505050565b610a3b6117ec565b610a488585858585611850565b5050505050565b6000610a5a88611908565b90506000808281526004602081905260409091205460ff1690811115610a8257610a82613556565b14610acf5760405162461bcd60e51b815260206004820152601960248201527f7472616e7366657220616c7265616479206578656375746564000000000000006044820152606401610666565b6000818152600460208181526040808420805460ff1916909317909255815146918101919091526001600160601b03193060601b16918101919091527f4d657373616765576974685472616e73666572000000000000000000000000006054820152606701604051602081830303815290604052805190602001209050600560009054906101000a90046001600160a01b03166001600160a01b031663682dbc2282848e8e8e6101000135604051602001610b8e959493929190613888565b6040516020818303038152906040528a8a8a8a8a8a6040518863ffffffff1660e01b8152600401610bc597969594939291906137fd565b60006040518083038186803b158015610bdd57600080fd5b505afa158015610bf1573d6000803e3d6000fd5b50505050600080610c038b8e8e6121c1565b90506001816002811115610c1957610c19613556565b1415610c285760019150610cf2565b6002816002811115610c3c57610c3c613556565b1415610cbd576000848152600460205260408120805460ff19166001835b02179055507fe49c2c954d381d1448cf824743aeff9da7a1d82078a7c9e5817269cc359bd26c6000858d60c0016020810190610c9691906138aa565b8e6101000135604051610cac94939291906138e4565b60405180910390a150505050610d37565b610cc88b8e8e6122fc565b90506001816002811115610cde57610cde613556565b1415610ced5760039150610cf2565b600291505b60008481526004602081905260409091208054849260ff19909116906001908490811115610d2257610d22613556565b0217905550610d3284838d612337565b505050505b505050505050505050565b610d5b610d556040830160208401613917565b836123a9565b610d96610d688280613938565b60208401610d7a61014086018661397f565b610d8861016088018861397f565b6103c26101808a018a61397f565b5050565b46851415610ddc5760405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a590818da185a5b9259608a1b6044820152606401610666565b6000610de88383610f3f565b905080341015610e2d5760405162461bcd60e51b815260206004820152601060248201526f496e73756666696369656e742066656560801b6044820152606401610666565b336001600160a01b03167f172762498a59a3bc4fed3f2b63f94f17ea0193cffdc304fe7d3eaf4d342d2f6688888888888834604051610e7297969594939291906139c9565b60405180910390a250505050505050565b33610e966000546001600160a01b031690565b6001600160a01b031614610eda5760405162461bcd60e51b81526020600482018190526024820152600080516020613f548339815191526044820152606401610666565b600a55565b6000610eea88612608565b9050610f338a8a838a8a8a8a8a8a6040518060400160405280600781526020017f4d657373616765000000000000000000000000000000000000000000000000008152506126bf565b50505050505050505050565b600254600090610f4f9083613a16565b600154610f5c9190613a35565b90505b92915050565b33610f786000546001600160a01b031690565b6001600160a01b031614610fbc5760405162461bcd60e51b81526020600482018190526024820152600080516020613f548339815191526044820152606401610666565b6001600160a01b0381166110045760405162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b6044820152606401610666565b600580546001600160a01b0319166001600160a01b0383169081179091556040519081527fbf9977180dc6e6cff25598c8e59150cecd7f8e448e092633d38ab7ee223ae05890602001610701565b611065610d556040830160208401613917565b610d966110728280613938565b6020840161108461014086018661397f565b61109261016088018861397f565b6102936101808a018a61397f565b60006110ab88611908565b90506000808281526004602081905260409091205460ff16908111156110d3576110d3613556565b146111205760405162461bcd60e51b815260206004820152601960248201527f7472616e7366657220616c7265616479206578656375746564000000000000006044820152606401610666565b6000818152600460208181526040808420805460ff1916909317909255815146918101919091526001600160601b03193060601b16918101919091527f4d657373616765576974685472616e73666572526566756e64000000000000006054820152606d01604051602081830303815290604052805190602001209050600560009054906101000a90046001600160a01b03166001600160a01b031663682dbc2282848e8e8e61010001356040516020016111df959493929190613888565b6040516020818303038152906040528a8a8a8a8a8a6040518863ffffffff1660e01b815260040161121697969594939291906137fd565b60006040518083038186803b15801561122e57600080fd5b505afa158015611242573d6000803e3d6000fd5b505050506000806112548b8e8e612915565b9050600181600281111561126a5761126a613556565b14156112795760019150610cf2565b600281600281111561128d5761128d613556565b1415610ced576000848152600460205260408120805460ff1916600183610c5a565b6112ba83838361296c565b336001600160a01b03167fe66fbe37d84ca73c589f782ac278844918ea6c56a4917f58707f715588080df28686868686346040516112fd96959493929190613a4d565b60405180910390a25050505050565b3361131f6000546001600160a01b031690565b6001600160a01b0316146113635760405162461bcd60e51b81526020600482018190526024820152600080516020613f548339815191526044820152606401610666565b6001600160a01b0381166113ab5760405162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b6044820152606401610666565b600880546001600160a01b0319166001600160a01b0383169081179091556040519081527ffb337a6c76476534518d5816caeb86263972470fedccfd047a35eb1825eaa9e890602001610701565b3361140c6000546001600160a01b031690565b6001600160a01b0316146114505760405162461bcd60e51b81526020600482018190526024820152600080516020613f548339815191526044820152606401610666565b6001600160a01b0381166114985760405162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b6044820152606401610666565b600780546001600160a01b0319166001600160a01b0383169081179091556040519081527fa9db0c32d9c6c2f75f3b95047a9e67cc1c010eab792a4e6ca777ce918ad94aad90602001610701565b6114f183838361296c565b336001600160a01b03167fce3972bfffe49d317e1d128047a97a3d86b25c94f6f04409f988ef854d25e0e48585858534604051611532959493929190613a8e565b60405180910390a250505050565b600061154b88612a05565b9050610f338a8a838a8a8a8a8a8a6040518060400160405280600881526020017f4d657373616765320000000000000000000000000000000000000000000000008152506126bf565b336115a76000546001600160a01b031690565b6001600160a01b0316146115eb5760405162461bcd60e51b81526020600482018190526024820152600080516020613f548339815191526044820152606401610666565b60028190556040518181527f210d4d5d2d36d571207dac98e383e2441c684684c885fb2d7c54f8d24422074c90602001610701565b336116336000546001600160a01b031690565b6001600160a01b0316146116775760405162461bcd60e51b81526020600482018190526024820152600080516020613f548339815191526044820152606401610666565b6001600160a01b0381166116f35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610666565b6116fc81612a9b565b50565b336117126000546001600160a01b031690565b6001600160a01b0316146117565760405162461bcd60e51b81526020600482018190526024820152600080516020613f548339815191526044820152606401610666565b6001600160a01b03811661179e5760405162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b6044820152606401610666565b600980546001600160a01b0319166001600160a01b0383169081179091556040519081527f918a691a2a82482a10e11f43d7b627b2ba220dd08f251cb61933c42560f6fcb590602001610701565b6000546001600160a01b0316156118455760405162461bcd60e51b815260206004820152601160248201527f6f776e657220616c7265616479207365740000000000000000000000000000006044820152606401610666565b61184e33612a9b565b565b6005546001600160a01b0316156118a95760405162461bcd60e51b815260206004820152601b60248201527f6c697175696469747942726964676520616c72656164792073657400000000006044820152606401610666565b600580546001600160a01b03199081166001600160a01b03978816179091556006805482169587169590951790945560078054851693861693909317909255600880548416918516919091179055600980549092169216919091179055565b60008080600161191b6020860186613917565b600681111561192c5761192c613556565b1415611ac7576119426040850160208601612fb3565b6119526060860160408701612fb3565b6119626080870160608801612fb3565b608087013561197760e0890160c08a016138aa565b6040516001600160601b0319606096871b8116602083015294861b851660348201529290941b9092166048820152605c8101919091526001600160c01b031960c092831b8116607c8301524690921b909116608482015260e0850135608c82015260ac0160408051808303601f19018152908290528051602090910120600554633c64f04b60e01b8352600483018290529093506001600160a01b031691508190633c64f04b9060240160206040518083038186803b158015611a3957600080fd5b505afa158015611a4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a719190613ac9565b1515600114611ac25760405162461bcd60e51b815260206004820152601660248201527f6272696467652072656c6179206e6f74206578697374000000000000000000006044820152606401610666565b61218c565b6002611ad66020860186613917565b6006811115611ae757611ae7613556565b1415611c545746611afe60c0860160a087016138aa565b611b0e6060870160408801612fb3565b611b1e6080880160608901612fb3565b6040516001600160c01b031960c095861b811660208301529390941b90921660288401526001600160601b0319606091821b8116603085015291901b1660448201526080850135605882015260780160408051808303601f19018152908290528051602090910120600554631c13568560e31b8352600483018290529093506001600160a01b03169150819063e09ab4289060240160206040518083038186803b158015611bcb57600080fd5b505afa158015611bdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c039190613ac9565b1515600114611ac25760405162461bcd60e51b815260206004820152601960248201527f627269646765207769746864726177206e6f74206578697374000000000000006044820152606401610666565b6003611c636020860186613917565b6006811115611c7457611c74613556565b1480611c9d57506004611c8a6020860186613917565b6006811115611c9b57611c9b613556565b145b15611f1f57611cb26060850160408601612fb3565b611cc26080860160608701612fb3565b6080860135611cd76040880160208901612fb3565b611ce760e0890160c08a016138aa565b604051606095861b6001600160601b0319908116602083015294861b851660348201526048810193909352931b909116606882015260c09190911b6001600160c01b031916607c82015260e0850135608482015260a40160408051601f19818403018152919052805160209091012091506003611d676020860186613917565b6006811115611d7857611d78613556565b1415611e4f57506006546040516301e6472560e01b8152600481018390526001600160a01b039091169081906301e64725906024015b60206040518083038186803b158015611dc657600080fd5b505afa158015611dda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfe9190613ac9565b1515600114611ac25760405162461bcd60e51b815260206004820152601560248201527f6d696e74207265636f7264206e6f7420657869737400000000000000000000006044820152606401610666565b506007546040516301e6472560e01b8152600481018390526001600160a01b039091169081906301e647259060240160206040518083038186803b158015611e9657600080fd5b505afa158015611eaa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ece9190613ac9565b1515600114611ac25760405162461bcd60e51b815260206004820152601960248201527f7769746864726177207265636f7264206e6f74206578697374000000000000006044820152606401610666565b6005611f2e6020860186613917565b6006811115611f3f57611f3f613556565b1480611f6857506006611f556020860186613917565b6006811115611f6657611f66613556565b145b1561218c576005611f7c6020860186613917565b6006811115611f8d57611f8d613556565b1415611fa557506008546001600160a01b0316611fb3565b506009546001600160a01b03165b611fc36060850160408601612fb3565b611fd36080860160608701612fb3565b6080860135611fe86040880160208901612fb3565b611ff860e0890160c08a016138aa565b604051606095861b6001600160601b0319908116602083015294861b85166034820152604881019390935290841b8316606883015260c01b6001600160c01b031916607c82015260e087013560848201529183901b1660a482015260b80160408051601f1981840301815291905280516020909101209150600561207f6020860186613917565b600681111561209057612090613556565b14156120c3576040516301e6472560e01b8152600481018390526001600160a01b038216906301e6472590602401611dae565b6040516301e6472560e01b8152600481018390526001600160a01b038216906301e647259060240160206040518083038186803b15801561210357600080fd5b505afa158015612117573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061213b9190613ac9565b151560011461218c5760405162461bcd60e51b815260206004820152601960248201527f7769746864726177207265636f7264206e6f74206578697374000000000000006044820152606401610666565b600081836040516020016121a293929190613b02565b6040516020818303038152906040528051906020012092505050919050565b6000805a90506000806121da6060880160408901612fb3565b6001600160a01b031634631f34afff60e21b6121fc60408b0160208c01612fb3565b61220c60808c0160608d01612fb3565b60808c013561222160e08e0160c08f016138aa565b8c8c3360405160240161223a9796959493929190613b2e565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516122789190613b87565b60006040518083038185875af1925050503d80600081146122b5576040519150601f19603f3d011682016040523d82523d6000602084013e6122ba565b606091505b509150915081156122e357808060200190518101906122d99190613ba3565b93505050506122f5565b6122ed8382612aeb565b600093505050505b9392505050565b6000805a90506000806123156060880160408901612fb3565b6001600160a01b031634632d5bd7e360e11b6121fc60408b0160208c01612fb3565b6123476060820160408301612fb3565b6001600160a01b03167fa635eb05143f74743822bbd96428928de4c8ee8cc578299749be9425c17bb34d6000858561238560e0870160c088016138aa565b86610100013560405161239c959493929190613bc4565b60405180910390a2505050565b60018260068111156123bd576123bd613556565b141561245e576005546001600160a01b031663cdd1b25d6123de8380613938565b6123eb602086018661397f565b6123f8604088018861397f565b61240560608a018a61397f565b6040518963ffffffff1660e01b8152600401612428989796959493929190613c02565b600060405180830381600087803b15801561244257600080fd5b505af1158015612456573d6000803e3d6000fd5b505050505050565b600282600681111561247257612472613556565b1415612493576005546001600160a01b031663a21a92806123de8380613938565b60038260068111156124a7576124a7613556565b14156124c8576006546001600160a01b031663f87343026123de8380613938565b60058260068111156124dc576124dc613556565b141561259e576008546001600160a01b031663f87343026124fd8380613938565b61250a602086018661397f565b612517604088018861397f565b61252460608a018a61397f565b6040518963ffffffff1660e01b8152600401612547989796959493929190613c02565b602060405180830381600087803b15801561256157600080fd5b505af1158015612575573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125999190613c62565b505050565b60048260068111156125b2576125b2613556565b14156125d3576007546001600160a01b031663a21a92806123de8380613938565b60068260068111156125e7576125e7613556565b1415610d96576009546001600160a01b031663a21a92806124fd8380613938565b6040805160a081018252600080825260606020830181905292820181905291810182905260808101919091526040805160a081019091528061264d6020850185612fb3565b6001600160a01b031681526020016040518060200160405280600081525081526020018360200160208101906126839190612fb3565b6001600160a01b031681526020016126a160608501604086016138aa565b67ffffffffffffffff16815260200183606001358152509050919050565b60006126cc898c8c612bac565b90506000808281526004602081905260409091205460ff16908111156126f4576126f4613556565b146127415760405162461bcd60e51b815260206004820152601860248201527f6d65737361676520616c726561647920657865637574656400000000000000006044820152606401610666565b6000818152600460208181526040808420805460ff191690931790925590516127709146913091879101613c7b565b60408051601f1981840301815282825280516020918201206005549184018190528383018690528251808503840181526060850193849052633416de1160e11b90935293506001600160a01b03169163682dbc22916127dd918d908d908d908d908d908d906064016137fd565b60006040518083038186803b1580156127f557600080fd5b505afa158015612809573d6000803e3d6000fd5b5050505060008061281b8c8f8f612c3e565b9050600181600281111561283157612831613556565b141561284057600191506128c5565b600281600281111561285457612854613556565b14156128c05760008481526004602052604090819020805460ff1916905560608d015160808e015191517fe49c2c954d381d1448cf824743aeff9da7a1d82078a7c9e5817269cc359bd26c926128af926001928992906138e4565b60405180910390a150505050610f33565b600291505b60008481526004602081905260409091208054849260ff199091169060019084908111156128f5576128f5613556565b021790555061290584838e612e20565b5050505050505050505050505050565b6000805a905060008061292e6060880160408901612fb3565b6001600160a01b0316346305e5a4c160e11b61295060808b0160608c01612fb3565b8a608001358a8a3360405160240161223a959493929190613cba565b468314156129ae5760405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a590818da185a5b9259608a1b6044820152606401610666565b60006129ba8383610f3f565b9050803410156129ff5760405162461bcd60e51b815260206004820152601060248201526f496e73756666696369656e742066656560801b6044820152606401610666565b50505050565b6040805160a081018252600080825260606020830181905292820181905291810182905260808101919091526040805160a081019091526000815260208101612a4e8480613938565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252506020908101906126839060408601908601612fb3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60005a90506000600a5445612b009190613871565b90508084108015612b1b5750612b17604085613cf9565b8211155b15612b2257fe5b6000612b2d84612e6e565b9050612b6e6040518060400160405280600e81526020017f4d53474255533a3a52455645525400000000000000000000000000000000000081525082612ecd565b7fffdd6142bbb721f3400e3908b04b86f60649b2e4d191e3f4c50c32c3e6471d2f81604051612b9d9190613d1b565b60405180910390a15050505050565b6020830151805160009190612bf2578451604051612be0919060200160609190911b6001600160601b031916815260140190565b60405160208183030381529060405290505b600181866040015187606001518860800151468989604051602001612c1e989796959493929190613d2e565b604051602081830303815290604052805190602001209150509392505050565b6000805a90506000606086602001515160001415612d2f5786604001516001600160a01b0316346040518060600160405280602c8152602001613f74602c91398051602090910120895160608b0151604051612ca49291908c908c903390602401613daf565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612ce29190613b87565b60006040518083038185875af1925050503d8060008114612d1f576040519150601f19603f3d011682016040523d82523d6000602084013e612d24565b606091505b509092509050612e06565b86604001516001600160a01b0316346040518060600160405280602a8152602001613f2a602a91398051906020012089602001518a606001518a8a33604051602401612d7f959493929190613de3565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612dbd9190613b87565b60006040518083038185875af1925050503d8060008114612dfa576040519150601f19603f3d011682016040523d82523d6000602084013e612dff565b606091505b5090925090505b81156122e357808060200190518101906122d99190613ba3565b80604001516001600160a01b03167fa635eb05143f74743822bbd96428928de4c8ee8cc578299749be9425c17bb34d600185858560600151866080015160405161239c959493929190613bc4565b6060604482511015612eb357505060408051808201909152601d81527f5472616e73616374696f6e2072657665727465642073696c656e746c79000000602082015290565b60048201915081806020019051810190610f5f9190613e4b565b8151815183918391106129ff5760005b8251811015612f7c57828181518110612ef857612ef8613ef8565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916828281518110612f3757612f37613ef8565b01602001517fff000000000000000000000000000000000000000000000000000000000000001614612f6a575050505050565b80612f7481613f0e565b915050612edd565b508260405162461bcd60e51b81526004016106669190613d1b565b80356001600160a01b0381168114612fae57600080fd5b919050565b600060208284031215612fc557600080fd5b610f5c82612f97565b600060208284031215612fe057600080fd5b5035919050565b60008083601f840112612ff957600080fd5b50813567ffffffffffffffff81111561301157600080fd5b6020830191508360208260051b850101111561302c57600080fd5b9250929050565b60008060008060008060008060a0898b03121561304f57600080fd5b61305889612f97565b975060208901359650604089013567ffffffffffffffff8082111561307c57600080fd5b6130888c838d01612fe7565b909850965060608b01359150808211156130a157600080fd5b6130ad8c838d01612fe7565b909650945060808b01359150808211156130c657600080fd5b506130d38b828c01612fe7565b999c989b5096995094979396929594505050565b600080600080600060a086880312156130ff57600080fd5b61310886612f97565b945061311660208701612f97565b935061312460408701612f97565b925061313260608701612f97565b915061314060808701612f97565b90509295509295909350565b60008083601f84011261315e57600080fd5b50813567ffffffffffffffff81111561317657600080fd5b60208301915083602082850101111561302c57600080fd5b6000806000806000806000806000898b036101a08112156131ae57600080fd5b8a3567ffffffffffffffff808211156131c657600080fd5b6131d28e838f0161314c565b909c509a508a9150610120601f19840112156131ed57600080fd5b60208d0199506101408d013592508083111561320857600080fd5b6132148e848f01612fe7565b90995097506101608d013592508891508083111561323157600080fd5b61323d8e848f01612fe7565b90975095506101808d013592508691508083111561325a57600080fd5b50506132688c828d01612fe7565b915080935050809150509295985092959850929598565b60006080828403121561329157600080fd5b50919050565b600080604083850312156132aa57600080fd5b823567ffffffffffffffff808211156132c257600080fd5b6132ce8683870161327f565b935060208501359150808211156132e457600080fd5b5083016101a081860312156132f857600080fd5b809150509250929050565b60008060008060008060a0878903121561331c57600080fd5b61332587612f97565b95506020870135945061333a60408801612f97565b935060608701359250608087013567ffffffffffffffff81111561335d57600080fd5b61336989828a0161314c565b979a9699509497509295939492505050565b60008060008060008060008060006101008a8c03121561339a57600080fd5b893567ffffffffffffffff808211156133b257600080fd5b6133be8d838e0161314c565b909b5099508991506133d38d60208e0161327f565b985060a08c01359150808211156133e957600080fd5b6133f58d838e01612fe7565b909850965060c08c013591508082111561340e57600080fd5b61341a8d838e01612fe7565b909650945060e08c013591508082111561343357600080fd5b506132688c828d01612fe7565b6000806020838503121561345357600080fd5b823567ffffffffffffffff81111561346a57600080fd5b6134768582860161314c565b90969095509350505050565b60008060008060006060868803121561349a57600080fd5b853567ffffffffffffffff808211156134b257600080fd5b6134be89838a0161314c565b90975095506020880135945060408801359150808211156134de57600080fd5b506134eb8882890161314c565b969995985093965092949392505050565b6000806000806060858703121561351257600080fd5b61351b85612f97565b935060208501359250604085013567ffffffffffffffff81111561353e57600080fd5b61354a8782880161314c565b95989497509550505050565b634e487b7160e01b600052602160045260246000fd5b6005811061357c5761357c613556565b9052565b60208101610f5f828461356c565b600080600080600080600080600060a08a8c0312156135ac57600080fd5b893567ffffffffffffffff808211156135c457600080fd5b6135d08d838e0161314c565b909b50995060208c01359150808211156135e957600080fd5b6135f58d838e0161327f565b985060408c013591508082111561360b57600080fd5b6136178d838e01612fe7565b909850965060608c013591508082111561363057600080fd5b61363c8d838e01612fe7565b909650945060808c013591508082111561343357600080fd5b60005b83811015613670578181015183820152602001613658565b838111156129ff5750506000910152565b60008151808452613699816020860160208601613655565b601f01601f19169290920160200192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b81835260006020808501808196508560051b810191508460005b8781101561375a5782840389528135601e1988360301811261371157600080fd5b8701803567ffffffffffffffff81111561372a57600080fd5b80360389131561373957600080fd5b61374686828985016136ad565b9a87019a95505050908401906001016136f0565b5091979650505050505050565b8183526000602080850194508260005b858110156137a3576001600160a01b0361379083612f97565b1687529582019590820190600101613777565b509495945050505050565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156137e057600080fd5b8260051b8083602087013760009401602001938452509192915050565b608081526000613810608083018a613681565b828103602084015261382381898b6136d6565b90508281036040840152613838818789613767565b9050828103606084015261384d8185876137ae565b9a9950505050505050505050565b634e487b7160e01b600052601160045260246000fd5b6000828210156138835761388361385b565b500390565b8581528460208201528284604083013760409201918201526060019392505050565b6000602082840312156138bc57600080fd5b813567ffffffffffffffff811681146122f557600080fd5b6002811061357c5761357c613556565b608081016138f282876138d4565b84602083015267ffffffffffffffff8416604083015282606083015295945050505050565b60006020828403121561392957600080fd5b8135600781106122f557600080fd5b6000808335601e1984360301811261394f57600080fd5b83018035915067ffffffffffffffff82111561396a57600080fd5b60200191503681900382131561302c57600080fd5b6000808335601e1984360301811261399657600080fd5b83018035915067ffffffffffffffff8211156139b157600080fd5b6020019150600581901b360382131561302c57600080fd5b60006001600160a01b03808a16835288602084015280881660408401525085606083015260c06080830152613a0260c0830185876136ad565b90508260a083015298975050505050505050565b6000816000190483118215151615613a3057613a3061385b565b500290565b60008219821115613a4857613a4861385b565b500190565b608081526000613a6160808301888a6136ad565b8660208401528281036040840152613a7a8186886136ad565b915050826060830152979650505050505050565b6001600160a01b0386168152846020820152608060408201526000613ab76080830185876136ad565b90508260608301529695505050505050565b600060208284031215613adb57600080fd5b815180151581146122f557600080fd5b60028110613afb57613afb613556565b60f81b9052565b613b0c8185613aeb565b60609290921b6001600160601b03191660018301526015820152603501919050565b60006001600160a01b03808a168352808916602084015287604084015267ffffffffffffffff8716606084015260c06080840152613b7060c0840186886136ad565b915080841660a08401525098975050505050505050565b60008251613b99818460208701613655565b9190910192915050565b600060208284031215613bb557600080fd5b8151600381106122f557600080fd5b60a08101613bd282886138d4565b856020830152613be5604083018661356c565b67ffffffffffffffff939093166060820152608001529392505050565b608081526000613c16608083018a8c6136ad565b8281036020840152613c2981898b6136d6565b90508281036040840152613c3e818789613767565b90508281036060840152613c538185876137ae565b9b9a5050505050505050505050565b600060208284031215613c7457600080fd5b5051919050565b8381526bffffffffffffffffffffffff198360601b16602082015260008251613cab816034850160208701613655565b91909101603401949350505050565b60006001600160a01b03808816835286602084015260806040840152613ce46080840186886136ad565b91508084166060840152509695505050505050565b600082613d1657634e487b7160e01b600052601260045260246000fd5b500490565b602081526000610f5c6020830184613681565b613d38818a613aeb565b60008851613d4d816001850160208d01613655565b80830190506bffffffffffffffffffffffff198960601b1660018201526001600160c01b0319808960c01b16601583015287601d830152808760c01b16603d830152508385604583013760009301604501928352509098975050505050505050565b60006001600160a01b03808816835267ffffffffffffffff8716602084015260806040840152613ce46080840186886136ad565b608081526000613df66080830188613681565b67ffffffffffffffff871660208401528281036040840152613e198186886136ad565b9150506001600160a01b03831660608301529695505050505050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215613e5d57600080fd5b815167ffffffffffffffff80821115613e7557600080fd5b818401915084601f830112613e8957600080fd5b815181811115613e9b57613e9b613e35565b604051601f8201601f19908116603f01168101908382118183101715613ec357613ec3613e35565b81604052828152876020848701011115613edc57600080fd5b613eed836020830160208801613655565b979650505050505050565b634e487b7160e01b600052603260045260246000fd5b6000600019821415613f2257613f2261385b565b506001019056fe657865637574654d6573736167652862797465732c75696e7436342c62797465732c61646472657373294f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572657865637574654d65737361676528616464726573732c75696e7436342c62797465732c6164647265737329a264697066735822122030a31e979f9f1c54dbfdc533ca32347c1afe60a5658938efede5b8e9e8dc79a064736f6c63430008090033000000000000000000000000b3833ecd19d4ff964fa7bc3f8ac070ad5e360e56000000000000000000000000b3833ecd19d4ff964fa7bc3f8ac070ad5e360e560000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106101fe5760003560e01c806382980dc41161011d578063ccf2683b116100b0578063dfa2dbaf1161007f578063f2fde38b11610064578063f2fde38b146105bd578063f60bbe2a146105dd578063f83b0fb9146105f357600080fd5b8063dfa2dbaf1461057d578063e2c1ed251461059d57600080fd5b8063ccf2683b146104d9578063cd2abd661461050d578063d8257d171461054a578063db2c20c81461056a57600080fd5b806395e911a8116100ec57806395e911a8146104705780639b05a775146104865780639f3ce55a146104a6578063c66a9c5a146104b957600080fd5b806382980dc4146103da57806382efd502146104125780638da5cb5b1461043257806395b12c271461045057600080fd5b8063468a2d04116101955780635b3e5f50116101645780635b3e5f5014610367578063723d0a9d146103945780637b80ab20146103b45780637d7a101d146103c757600080fd5b8063468a2d04146102eb5780635335dca2146102fe578063584e45e114610331578063588be02b1461034757600080fd5b80633f395aff116101d15780633f395aff1461028557806340d0d026146102985780634289fbb3146102b85780634586f331146102cb57600080fd5b806303cbfe661461020357806306c28bd6146102255780632ff4c41114610245578063359ef75b14610265575b600080fd5b34801561020f57600080fd5b5061022361021e366004612fb3565b610613565b005b34801561023157600080fd5b50610223610240366004612fce565b61070c565b34801561025157600080fd5b50610223610260366004613033565b610798565b34801561027157600080fd5b506102236102803660046130e7565b610a33565b61022361029336600461318e565b610a4f565b3480156102a457600080fd5b506102236102b3366004613297565b610d42565b6102236102c6366004613303565b610d9a565b3480156102d757600080fd5b506102236102e6366004612fce565b610e83565b6102236102f936600461337b565b610edf565b34801561030a57600080fd5b5061031e610319366004613440565b610f3f565b6040519081526020015b60405180910390f35b34801561033d57600080fd5b5061031e600a5481565b34801561035357600080fd5b50610223610362366004612fb3565b610f65565b34801561037357600080fd5b5061031e610382366004612fb3565b60036020526000908152604090205481565b3480156103a057600080fd5b506102236103af366004613297565b611052565b6102236103c236600461318e565b6110a0565b6102236103d5366004613482565b6112af565b3480156103e657600080fd5b506005546103fa906001600160a01b031681565b6040516001600160a01b039091168152602001610328565b34801561041e57600080fd5b5061022361042d366004612fb3565b61130c565b34801561043e57600080fd5b506000546001600160a01b03166103fa565b34801561045c57600080fd5b506008546103fa906001600160a01b031681565b34801561047c57600080fd5b5061031e60015481565b34801561049257600080fd5b506102236104a1366004612fb3565b6113f9565b6102236104b43660046134fc565b6114e6565b3480156104c557600080fd5b506009546103fa906001600160a01b031681565b3480156104e557600080fd5b506103fa7f000000000000000000000000b3833ecd19d4ff964fa7bc3f8ac070ad5e360e5681565b34801561051957600080fd5b5061053d610528366004612fce565b60046020526000908152604090205460ff1681565b6040516103289190613580565b34801561055657600080fd5b506007546103fa906001600160a01b031681565b61022361057836600461358e565b611540565b34801561058957600080fd5b506006546103fa906001600160a01b031681565b3480156105a957600080fd5b506102236105b8366004612fce565b611594565b3480156105c957600080fd5b506102236105d8366004612fb3565b611620565b3480156105e957600080fd5b5061031e60025481565b3480156105ff57600080fd5b5061022361060e366004612fb3565b6116ff565b336106266000546001600160a01b031690565b6001600160a01b03161461066f5760405162461bcd60e51b81526020600482018190526024820152600080516020613f5483398151915260448201526064015b60405180910390fd5b6001600160a01b0381166106b75760405162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b6044820152606401610666565b600680546001600160a01b0319166001600160a01b0383169081179091556040519081527fd60e9ceb4f54f1bfb1741a4b35fc9d806d7ed48200b523203b92248ea38fa17d906020015b60405180910390a150565b3361071f6000546001600160a01b031690565b6001600160a01b0316146107635760405162461bcd60e51b81526020600482018190526024820152600080516020613f548339815191526044820152606401610666565b60018190556040518181527f892dfdc99ecd3bb4f2f2cb118dca02f0bd16640ff156d3c6459d4282e336a5f290602001610701565b600046306040516020016107e992919091825260601b6001600160601b03191660208201527f77697468647261774665650000000000000000000000000000000000000000006034820152603f0190565b60408051808303601f19018152828252805160209182012090830181905260608c901b6001600160601b0319168383015260548084018c9052825180850390910181526074840192839052633416de1160e11b90925292507f000000000000000000000000b3833ecd19d4ff964fa7bc3f8ac070ad5e360e566001600160a01b03169163682dbc229161088a918b908b908b908b908b908b906078016137fd565b60006040518083038186803b1580156108a257600080fd5b505afa1580156108b6573d6000803e3d6000fd5b505050506001600160a01b0389166000908152600360205260408120546108dd908a613871565b90506000811161092f5760405162461bcd60e51b815260206004820152601960248201527f4e6f206e657720616d6f756e7420746f207769746864726177000000000000006044820152606401610666565b6001600160a01b038a166000818152600360205260408082208c90555190919061c35090849084818181858888f193505050503d806000811461098e576040519150601f19603f3d011682016040523d82523d6000602084013e610993565b606091505b50509050806109e45760405162461bcd60e51b815260206004820152601660248201527f6661696c656420746f20776974686472617720666565000000000000000000006044820152606401610666565b604080516001600160a01b038d168152602081018490527f78473f3f373f7673597f4f0fa5873cb4d375fea6d4339ad6b56dbd411513cb3f910160405180910390a15050505050505050505050565b610a3b6117ec565b610a488585858585611850565b5050505050565b6000610a5a88611908565b90506000808281526004602081905260409091205460ff1690811115610a8257610a82613556565b14610acf5760405162461bcd60e51b815260206004820152601960248201527f7472616e7366657220616c7265616479206578656375746564000000000000006044820152606401610666565b6000818152600460208181526040808420805460ff1916909317909255815146918101919091526001600160601b03193060601b16918101919091527f4d657373616765576974685472616e73666572000000000000000000000000006054820152606701604051602081830303815290604052805190602001209050600560009054906101000a90046001600160a01b03166001600160a01b031663682dbc2282848e8e8e6101000135604051602001610b8e959493929190613888565b6040516020818303038152906040528a8a8a8a8a8a6040518863ffffffff1660e01b8152600401610bc597969594939291906137fd565b60006040518083038186803b158015610bdd57600080fd5b505afa158015610bf1573d6000803e3d6000fd5b50505050600080610c038b8e8e6121c1565b90506001816002811115610c1957610c19613556565b1415610c285760019150610cf2565b6002816002811115610c3c57610c3c613556565b1415610cbd576000848152600460205260408120805460ff19166001835b02179055507fe49c2c954d381d1448cf824743aeff9da7a1d82078a7c9e5817269cc359bd26c6000858d60c0016020810190610c9691906138aa565b8e6101000135604051610cac94939291906138e4565b60405180910390a150505050610d37565b610cc88b8e8e6122fc565b90506001816002811115610cde57610cde613556565b1415610ced5760039150610cf2565b600291505b60008481526004602081905260409091208054849260ff19909116906001908490811115610d2257610d22613556565b0217905550610d3284838d612337565b505050505b505050505050505050565b610d5b610d556040830160208401613917565b836123a9565b610d96610d688280613938565b60208401610d7a61014086018661397f565b610d8861016088018861397f565b6103c26101808a018a61397f565b5050565b46851415610ddc5760405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a590818da185a5b9259608a1b6044820152606401610666565b6000610de88383610f3f565b905080341015610e2d5760405162461bcd60e51b815260206004820152601060248201526f496e73756666696369656e742066656560801b6044820152606401610666565b336001600160a01b03167f172762498a59a3bc4fed3f2b63f94f17ea0193cffdc304fe7d3eaf4d342d2f6688888888888834604051610e7297969594939291906139c9565b60405180910390a250505050505050565b33610e966000546001600160a01b031690565b6001600160a01b031614610eda5760405162461bcd60e51b81526020600482018190526024820152600080516020613f548339815191526044820152606401610666565b600a55565b6000610eea88612608565b9050610f338a8a838a8a8a8a8a8a6040518060400160405280600781526020017f4d657373616765000000000000000000000000000000000000000000000000008152506126bf565b50505050505050505050565b600254600090610f4f9083613a16565b600154610f5c9190613a35565b90505b92915050565b33610f786000546001600160a01b031690565b6001600160a01b031614610fbc5760405162461bcd60e51b81526020600482018190526024820152600080516020613f548339815191526044820152606401610666565b6001600160a01b0381166110045760405162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b6044820152606401610666565b600580546001600160a01b0319166001600160a01b0383169081179091556040519081527fbf9977180dc6e6cff25598c8e59150cecd7f8e448e092633d38ab7ee223ae05890602001610701565b611065610d556040830160208401613917565b610d966110728280613938565b6020840161108461014086018661397f565b61109261016088018861397f565b6102936101808a018a61397f565b60006110ab88611908565b90506000808281526004602081905260409091205460ff16908111156110d3576110d3613556565b146111205760405162461bcd60e51b815260206004820152601960248201527f7472616e7366657220616c7265616479206578656375746564000000000000006044820152606401610666565b6000818152600460208181526040808420805460ff1916909317909255815146918101919091526001600160601b03193060601b16918101919091527f4d657373616765576974685472616e73666572526566756e64000000000000006054820152606d01604051602081830303815290604052805190602001209050600560009054906101000a90046001600160a01b03166001600160a01b031663682dbc2282848e8e8e61010001356040516020016111df959493929190613888565b6040516020818303038152906040528a8a8a8a8a8a6040518863ffffffff1660e01b815260040161121697969594939291906137fd565b60006040518083038186803b15801561122e57600080fd5b505afa158015611242573d6000803e3d6000fd5b505050506000806112548b8e8e612915565b9050600181600281111561126a5761126a613556565b14156112795760019150610cf2565b600281600281111561128d5761128d613556565b1415610ced576000848152600460205260408120805460ff1916600183610c5a565b6112ba83838361296c565b336001600160a01b03167fe66fbe37d84ca73c589f782ac278844918ea6c56a4917f58707f715588080df28686868686346040516112fd96959493929190613a4d565b60405180910390a25050505050565b3361131f6000546001600160a01b031690565b6001600160a01b0316146113635760405162461bcd60e51b81526020600482018190526024820152600080516020613f548339815191526044820152606401610666565b6001600160a01b0381166113ab5760405162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b6044820152606401610666565b600880546001600160a01b0319166001600160a01b0383169081179091556040519081527ffb337a6c76476534518d5816caeb86263972470fedccfd047a35eb1825eaa9e890602001610701565b3361140c6000546001600160a01b031690565b6001600160a01b0316146114505760405162461bcd60e51b81526020600482018190526024820152600080516020613f548339815191526044820152606401610666565b6001600160a01b0381166114985760405162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b6044820152606401610666565b600780546001600160a01b0319166001600160a01b0383169081179091556040519081527fa9db0c32d9c6c2f75f3b95047a9e67cc1c010eab792a4e6ca777ce918ad94aad90602001610701565b6114f183838361296c565b336001600160a01b03167fce3972bfffe49d317e1d128047a97a3d86b25c94f6f04409f988ef854d25e0e48585858534604051611532959493929190613a8e565b60405180910390a250505050565b600061154b88612a05565b9050610f338a8a838a8a8a8a8a8a6040518060400160405280600881526020017f4d657373616765320000000000000000000000000000000000000000000000008152506126bf565b336115a76000546001600160a01b031690565b6001600160a01b0316146115eb5760405162461bcd60e51b81526020600482018190526024820152600080516020613f548339815191526044820152606401610666565b60028190556040518181527f210d4d5d2d36d571207dac98e383e2441c684684c885fb2d7c54f8d24422074c90602001610701565b336116336000546001600160a01b031690565b6001600160a01b0316146116775760405162461bcd60e51b81526020600482018190526024820152600080516020613f548339815191526044820152606401610666565b6001600160a01b0381166116f35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610666565b6116fc81612a9b565b50565b336117126000546001600160a01b031690565b6001600160a01b0316146117565760405162461bcd60e51b81526020600482018190526024820152600080516020613f548339815191526044820152606401610666565b6001600160a01b03811661179e5760405162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b6044820152606401610666565b600980546001600160a01b0319166001600160a01b0383169081179091556040519081527f918a691a2a82482a10e11f43d7b627b2ba220dd08f251cb61933c42560f6fcb590602001610701565b6000546001600160a01b0316156118455760405162461bcd60e51b815260206004820152601160248201527f6f776e657220616c7265616479207365740000000000000000000000000000006044820152606401610666565b61184e33612a9b565b565b6005546001600160a01b0316156118a95760405162461bcd60e51b815260206004820152601b60248201527f6c697175696469747942726964676520616c72656164792073657400000000006044820152606401610666565b600580546001600160a01b03199081166001600160a01b03978816179091556006805482169587169590951790945560078054851693861693909317909255600880548416918516919091179055600980549092169216919091179055565b60008080600161191b6020860186613917565b600681111561192c5761192c613556565b1415611ac7576119426040850160208601612fb3565b6119526060860160408701612fb3565b6119626080870160608801612fb3565b608087013561197760e0890160c08a016138aa565b6040516001600160601b0319606096871b8116602083015294861b851660348201529290941b9092166048820152605c8101919091526001600160c01b031960c092831b8116607c8301524690921b909116608482015260e0850135608c82015260ac0160408051808303601f19018152908290528051602090910120600554633c64f04b60e01b8352600483018290529093506001600160a01b031691508190633c64f04b9060240160206040518083038186803b158015611a3957600080fd5b505afa158015611a4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a719190613ac9565b1515600114611ac25760405162461bcd60e51b815260206004820152601660248201527f6272696467652072656c6179206e6f74206578697374000000000000000000006044820152606401610666565b61218c565b6002611ad66020860186613917565b6006811115611ae757611ae7613556565b1415611c545746611afe60c0860160a087016138aa565b611b0e6060870160408801612fb3565b611b1e6080880160608901612fb3565b6040516001600160c01b031960c095861b811660208301529390941b90921660288401526001600160601b0319606091821b8116603085015291901b1660448201526080850135605882015260780160408051808303601f19018152908290528051602090910120600554631c13568560e31b8352600483018290529093506001600160a01b03169150819063e09ab4289060240160206040518083038186803b158015611bcb57600080fd5b505afa158015611bdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c039190613ac9565b1515600114611ac25760405162461bcd60e51b815260206004820152601960248201527f627269646765207769746864726177206e6f74206578697374000000000000006044820152606401610666565b6003611c636020860186613917565b6006811115611c7457611c74613556565b1480611c9d57506004611c8a6020860186613917565b6006811115611c9b57611c9b613556565b145b15611f1f57611cb26060850160408601612fb3565b611cc26080860160608701612fb3565b6080860135611cd76040880160208901612fb3565b611ce760e0890160c08a016138aa565b604051606095861b6001600160601b0319908116602083015294861b851660348201526048810193909352931b909116606882015260c09190911b6001600160c01b031916607c82015260e0850135608482015260a40160408051601f19818403018152919052805160209091012091506003611d676020860186613917565b6006811115611d7857611d78613556565b1415611e4f57506006546040516301e6472560e01b8152600481018390526001600160a01b039091169081906301e64725906024015b60206040518083038186803b158015611dc657600080fd5b505afa158015611dda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfe9190613ac9565b1515600114611ac25760405162461bcd60e51b815260206004820152601560248201527f6d696e74207265636f7264206e6f7420657869737400000000000000000000006044820152606401610666565b506007546040516301e6472560e01b8152600481018390526001600160a01b039091169081906301e647259060240160206040518083038186803b158015611e9657600080fd5b505afa158015611eaa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ece9190613ac9565b1515600114611ac25760405162461bcd60e51b815260206004820152601960248201527f7769746864726177207265636f7264206e6f74206578697374000000000000006044820152606401610666565b6005611f2e6020860186613917565b6006811115611f3f57611f3f613556565b1480611f6857506006611f556020860186613917565b6006811115611f6657611f66613556565b145b1561218c576005611f7c6020860186613917565b6006811115611f8d57611f8d613556565b1415611fa557506008546001600160a01b0316611fb3565b506009546001600160a01b03165b611fc36060850160408601612fb3565b611fd36080860160608701612fb3565b6080860135611fe86040880160208901612fb3565b611ff860e0890160c08a016138aa565b604051606095861b6001600160601b0319908116602083015294861b85166034820152604881019390935290841b8316606883015260c01b6001600160c01b031916607c82015260e087013560848201529183901b1660a482015260b80160408051601f1981840301815291905280516020909101209150600561207f6020860186613917565b600681111561209057612090613556565b14156120c3576040516301e6472560e01b8152600481018390526001600160a01b038216906301e6472590602401611dae565b6040516301e6472560e01b8152600481018390526001600160a01b038216906301e647259060240160206040518083038186803b15801561210357600080fd5b505afa158015612117573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061213b9190613ac9565b151560011461218c5760405162461bcd60e51b815260206004820152601960248201527f7769746864726177207265636f7264206e6f74206578697374000000000000006044820152606401610666565b600081836040516020016121a293929190613b02565b6040516020818303038152906040528051906020012092505050919050565b6000805a90506000806121da6060880160408901612fb3565b6001600160a01b031634631f34afff60e21b6121fc60408b0160208c01612fb3565b61220c60808c0160608d01612fb3565b60808c013561222160e08e0160c08f016138aa565b8c8c3360405160240161223a9796959493929190613b2e565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516122789190613b87565b60006040518083038185875af1925050503d80600081146122b5576040519150601f19603f3d011682016040523d82523d6000602084013e6122ba565b606091505b509150915081156122e357808060200190518101906122d99190613ba3565b93505050506122f5565b6122ed8382612aeb565b600093505050505b9392505050565b6000805a90506000806123156060880160408901612fb3565b6001600160a01b031634632d5bd7e360e11b6121fc60408b0160208c01612fb3565b6123476060820160408301612fb3565b6001600160a01b03167fa635eb05143f74743822bbd96428928de4c8ee8cc578299749be9425c17bb34d6000858561238560e0870160c088016138aa565b86610100013560405161239c959493929190613bc4565b60405180910390a2505050565b60018260068111156123bd576123bd613556565b141561245e576005546001600160a01b031663cdd1b25d6123de8380613938565b6123eb602086018661397f565b6123f8604088018861397f565b61240560608a018a61397f565b6040518963ffffffff1660e01b8152600401612428989796959493929190613c02565b600060405180830381600087803b15801561244257600080fd5b505af1158015612456573d6000803e3d6000fd5b505050505050565b600282600681111561247257612472613556565b1415612493576005546001600160a01b031663a21a92806123de8380613938565b60038260068111156124a7576124a7613556565b14156124c8576006546001600160a01b031663f87343026123de8380613938565b60058260068111156124dc576124dc613556565b141561259e576008546001600160a01b031663f87343026124fd8380613938565b61250a602086018661397f565b612517604088018861397f565b61252460608a018a61397f565b6040518963ffffffff1660e01b8152600401612547989796959493929190613c02565b602060405180830381600087803b15801561256157600080fd5b505af1158015612575573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125999190613c62565b505050565b60048260068111156125b2576125b2613556565b14156125d3576007546001600160a01b031663a21a92806123de8380613938565b60068260068111156125e7576125e7613556565b1415610d96576009546001600160a01b031663a21a92806124fd8380613938565b6040805160a081018252600080825260606020830181905292820181905291810182905260808101919091526040805160a081019091528061264d6020850185612fb3565b6001600160a01b031681526020016040518060200160405280600081525081526020018360200160208101906126839190612fb3565b6001600160a01b031681526020016126a160608501604086016138aa565b67ffffffffffffffff16815260200183606001358152509050919050565b60006126cc898c8c612bac565b90506000808281526004602081905260409091205460ff16908111156126f4576126f4613556565b146127415760405162461bcd60e51b815260206004820152601860248201527f6d65737361676520616c726561647920657865637574656400000000000000006044820152606401610666565b6000818152600460208181526040808420805460ff191690931790925590516127709146913091879101613c7b565b60408051601f1981840301815282825280516020918201206005549184018190528383018690528251808503840181526060850193849052633416de1160e11b90935293506001600160a01b03169163682dbc22916127dd918d908d908d908d908d908d906064016137fd565b60006040518083038186803b1580156127f557600080fd5b505afa158015612809573d6000803e3d6000fd5b5050505060008061281b8c8f8f612c3e565b9050600181600281111561283157612831613556565b141561284057600191506128c5565b600281600281111561285457612854613556565b14156128c05760008481526004602052604090819020805460ff1916905560608d015160808e015191517fe49c2c954d381d1448cf824743aeff9da7a1d82078a7c9e5817269cc359bd26c926128af926001928992906138e4565b60405180910390a150505050610f33565b600291505b60008481526004602081905260409091208054849260ff199091169060019084908111156128f5576128f5613556565b021790555061290584838e612e20565b5050505050505050505050505050565b6000805a905060008061292e6060880160408901612fb3565b6001600160a01b0316346305e5a4c160e11b61295060808b0160608c01612fb3565b8a608001358a8a3360405160240161223a959493929190613cba565b468314156129ae5760405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a590818da185a5b9259608a1b6044820152606401610666565b60006129ba8383610f3f565b9050803410156129ff5760405162461bcd60e51b815260206004820152601060248201526f496e73756666696369656e742066656560801b6044820152606401610666565b50505050565b6040805160a081018252600080825260606020830181905292820181905291810182905260808101919091526040805160a081019091526000815260208101612a4e8480613938565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252506020908101906126839060408601908601612fb3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60005a90506000600a5445612b009190613871565b90508084108015612b1b5750612b17604085613cf9565b8211155b15612b2257fe5b6000612b2d84612e6e565b9050612b6e6040518060400160405280600e81526020017f4d53474255533a3a52455645525400000000000000000000000000000000000081525082612ecd565b7fffdd6142bbb721f3400e3908b04b86f60649b2e4d191e3f4c50c32c3e6471d2f81604051612b9d9190613d1b565b60405180910390a15050505050565b6020830151805160009190612bf2578451604051612be0919060200160609190911b6001600160601b031916815260140190565b60405160208183030381529060405290505b600181866040015187606001518860800151468989604051602001612c1e989796959493929190613d2e565b604051602081830303815290604052805190602001209150509392505050565b6000805a90506000606086602001515160001415612d2f5786604001516001600160a01b0316346040518060600160405280602c8152602001613f74602c91398051602090910120895160608b0151604051612ca49291908c908c903390602401613daf565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612ce29190613b87565b60006040518083038185875af1925050503d8060008114612d1f576040519150601f19603f3d011682016040523d82523d6000602084013e612d24565b606091505b509092509050612e06565b86604001516001600160a01b0316346040518060600160405280602a8152602001613f2a602a91398051906020012089602001518a606001518a8a33604051602401612d7f959493929190613de3565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612dbd9190613b87565b60006040518083038185875af1925050503d8060008114612dfa576040519150601f19603f3d011682016040523d82523d6000602084013e612dff565b606091505b5090925090505b81156122e357808060200190518101906122d99190613ba3565b80604001516001600160a01b03167fa635eb05143f74743822bbd96428928de4c8ee8cc578299749be9425c17bb34d600185858560600151866080015160405161239c959493929190613bc4565b6060604482511015612eb357505060408051808201909152601d81527f5472616e73616374696f6e2072657665727465642073696c656e746c79000000602082015290565b60048201915081806020019051810190610f5f9190613e4b565b8151815183918391106129ff5760005b8251811015612f7c57828181518110612ef857612ef8613ef8565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916828281518110612f3757612f37613ef8565b01602001517fff000000000000000000000000000000000000000000000000000000000000001614612f6a575050505050565b80612f7481613f0e565b915050612edd565b508260405162461bcd60e51b81526004016106669190613d1b565b80356001600160a01b0381168114612fae57600080fd5b919050565b600060208284031215612fc557600080fd5b610f5c82612f97565b600060208284031215612fe057600080fd5b5035919050565b60008083601f840112612ff957600080fd5b50813567ffffffffffffffff81111561301157600080fd5b6020830191508360208260051b850101111561302c57600080fd5b9250929050565b60008060008060008060008060a0898b03121561304f57600080fd5b61305889612f97565b975060208901359650604089013567ffffffffffffffff8082111561307c57600080fd5b6130888c838d01612fe7565b909850965060608b01359150808211156130a157600080fd5b6130ad8c838d01612fe7565b909650945060808b01359150808211156130c657600080fd5b506130d38b828c01612fe7565b999c989b5096995094979396929594505050565b600080600080600060a086880312156130ff57600080fd5b61310886612f97565b945061311660208701612f97565b935061312460408701612f97565b925061313260608701612f97565b915061314060808701612f97565b90509295509295909350565b60008083601f84011261315e57600080fd5b50813567ffffffffffffffff81111561317657600080fd5b60208301915083602082850101111561302c57600080fd5b6000806000806000806000806000898b036101a08112156131ae57600080fd5b8a3567ffffffffffffffff808211156131c657600080fd5b6131d28e838f0161314c565b909c509a508a9150610120601f19840112156131ed57600080fd5b60208d0199506101408d013592508083111561320857600080fd5b6132148e848f01612fe7565b90995097506101608d013592508891508083111561323157600080fd5b61323d8e848f01612fe7565b90975095506101808d013592508691508083111561325a57600080fd5b50506132688c828d01612fe7565b915080935050809150509295985092959850929598565b60006080828403121561329157600080fd5b50919050565b600080604083850312156132aa57600080fd5b823567ffffffffffffffff808211156132c257600080fd5b6132ce8683870161327f565b935060208501359150808211156132e457600080fd5b5083016101a081860312156132f857600080fd5b809150509250929050565b60008060008060008060a0878903121561331c57600080fd5b61332587612f97565b95506020870135945061333a60408801612f97565b935060608701359250608087013567ffffffffffffffff81111561335d57600080fd5b61336989828a0161314c565b979a9699509497509295939492505050565b60008060008060008060008060006101008a8c03121561339a57600080fd5b893567ffffffffffffffff808211156133b257600080fd5b6133be8d838e0161314c565b909b5099508991506133d38d60208e0161327f565b985060a08c01359150808211156133e957600080fd5b6133f58d838e01612fe7565b909850965060c08c013591508082111561340e57600080fd5b61341a8d838e01612fe7565b909650945060e08c013591508082111561343357600080fd5b506132688c828d01612fe7565b6000806020838503121561345357600080fd5b823567ffffffffffffffff81111561346a57600080fd5b6134768582860161314c565b90969095509350505050565b60008060008060006060868803121561349a57600080fd5b853567ffffffffffffffff808211156134b257600080fd5b6134be89838a0161314c565b90975095506020880135945060408801359150808211156134de57600080fd5b506134eb8882890161314c565b969995985093965092949392505050565b6000806000806060858703121561351257600080fd5b61351b85612f97565b935060208501359250604085013567ffffffffffffffff81111561353e57600080fd5b61354a8782880161314c565b95989497509550505050565b634e487b7160e01b600052602160045260246000fd5b6005811061357c5761357c613556565b9052565b60208101610f5f828461356c565b600080600080600080600080600060a08a8c0312156135ac57600080fd5b893567ffffffffffffffff808211156135c457600080fd5b6135d08d838e0161314c565b909b50995060208c01359150808211156135e957600080fd5b6135f58d838e0161327f565b985060408c013591508082111561360b57600080fd5b6136178d838e01612fe7565b909850965060608c013591508082111561363057600080fd5b61363c8d838e01612fe7565b909650945060808c013591508082111561343357600080fd5b60005b83811015613670578181015183820152602001613658565b838111156129ff5750506000910152565b60008151808452613699816020860160208601613655565b601f01601f19169290920160200192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b81835260006020808501808196508560051b810191508460005b8781101561375a5782840389528135601e1988360301811261371157600080fd5b8701803567ffffffffffffffff81111561372a57600080fd5b80360389131561373957600080fd5b61374686828985016136ad565b9a87019a95505050908401906001016136f0565b5091979650505050505050565b8183526000602080850194508260005b858110156137a3576001600160a01b0361379083612f97565b1687529582019590820190600101613777565b509495945050505050565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156137e057600080fd5b8260051b8083602087013760009401602001938452509192915050565b608081526000613810608083018a613681565b828103602084015261382381898b6136d6565b90508281036040840152613838818789613767565b9050828103606084015261384d8185876137ae565b9a9950505050505050505050565b634e487b7160e01b600052601160045260246000fd5b6000828210156138835761388361385b565b500390565b8581528460208201528284604083013760409201918201526060019392505050565b6000602082840312156138bc57600080fd5b813567ffffffffffffffff811681146122f557600080fd5b6002811061357c5761357c613556565b608081016138f282876138d4565b84602083015267ffffffffffffffff8416604083015282606083015295945050505050565b60006020828403121561392957600080fd5b8135600781106122f557600080fd5b6000808335601e1984360301811261394f57600080fd5b83018035915067ffffffffffffffff82111561396a57600080fd5b60200191503681900382131561302c57600080fd5b6000808335601e1984360301811261399657600080fd5b83018035915067ffffffffffffffff8211156139b157600080fd5b6020019150600581901b360382131561302c57600080fd5b60006001600160a01b03808a16835288602084015280881660408401525085606083015260c06080830152613a0260c0830185876136ad565b90508260a083015298975050505050505050565b6000816000190483118215151615613a3057613a3061385b565b500290565b60008219821115613a4857613a4861385b565b500190565b608081526000613a6160808301888a6136ad565b8660208401528281036040840152613a7a8186886136ad565b915050826060830152979650505050505050565b6001600160a01b0386168152846020820152608060408201526000613ab76080830185876136ad565b90508260608301529695505050505050565b600060208284031215613adb57600080fd5b815180151581146122f557600080fd5b60028110613afb57613afb613556565b60f81b9052565b613b0c8185613aeb565b60609290921b6001600160601b03191660018301526015820152603501919050565b60006001600160a01b03808a168352808916602084015287604084015267ffffffffffffffff8716606084015260c06080840152613b7060c0840186886136ad565b915080841660a08401525098975050505050505050565b60008251613b99818460208701613655565b9190910192915050565b600060208284031215613bb557600080fd5b8151600381106122f557600080fd5b60a08101613bd282886138d4565b856020830152613be5604083018661356c565b67ffffffffffffffff939093166060820152608001529392505050565b608081526000613c16608083018a8c6136ad565b8281036020840152613c2981898b6136d6565b90508281036040840152613c3e818789613767565b90508281036060840152613c538185876137ae565b9b9a5050505050505050505050565b600060208284031215613c7457600080fd5b5051919050565b8381526bffffffffffffffffffffffff198360601b16602082015260008251613cab816034850160208701613655565b91909101603401949350505050565b60006001600160a01b03808816835286602084015260806040840152613ce46080840186886136ad565b91508084166060840152509695505050505050565b600082613d1657634e487b7160e01b600052601260045260246000fd5b500490565b602081526000610f5c6020830184613681565b613d38818a613aeb565b60008851613d4d816001850160208d01613655565b80830190506bffffffffffffffffffffffff198960601b1660018201526001600160c01b0319808960c01b16601583015287601d830152808760c01b16603d830152508385604583013760009301604501928352509098975050505050505050565b60006001600160a01b03808816835267ffffffffffffffff8716602084015260806040840152613ce46080840186886136ad565b608081526000613df66080830188613681565b67ffffffffffffffff871660208401528281036040840152613e198186886136ad565b9150506001600160a01b03831660608301529695505050505050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215613e5d57600080fd5b815167ffffffffffffffff80821115613e7557600080fd5b818401915084601f830112613e8957600080fd5b815181811115613e9b57613e9b613e35565b604051601f8201601f19908116603f01168101908382118183101715613ec357613ec3613e35565b81604052828152876020848701011115613edc57600080fd5b613eed836020830160208801613655565b979650505050505050565b634e487b7160e01b600052603260045260246000fd5b6000600019821415613f2257613f2261385b565b506001019056fe657865637574654d6573736167652862797465732c75696e7436342c62797465732c61646472657373294f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572657865637574654d65737361676528616464726573732c75696e7436342c62797465732c6164647265737329a264697066735822122030a31e979f9f1c54dbfdc533ca32347c1afe60a5658938efede5b8e9e8dc79a064736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b3833ecd19d4ff964fa7bc3f8ac070ad5e360e56000000000000000000000000b3833ecd19d4ff964fa7bc3f8ac070ad5e360e560000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _sigsVerifier (address): 0xb3833Ecd19D4Ff964fA7bc3f8aC070ad5e360E56
Arg [1] : _liquidityBridge (address): 0xb3833Ecd19D4Ff964fA7bc3f8aC070ad5e360E56
Arg [2] : _pegBridge (address): 0x0000000000000000000000000000000000000000
Arg [3] : _pegVault (address): 0x0000000000000000000000000000000000000000
Arg [4] : _pegBridgeV2 (address): 0x0000000000000000000000000000000000000000
Arg [5] : _pegVaultV2 (address): 0x0000000000000000000000000000000000000000
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000b3833ecd19d4ff964fa7bc3f8ac070ad5e360e56
Arg [1] : 000000000000000000000000b3833ecd19d4ff964fa7bc3f8ac070ad5e360e56
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed ByteCode Sourcemap
51104:1076:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50080:191;;;;;;;;;;-1:-1:-1;50080:191:0;;;;;:::i;:::-;;:::i;:::-;;8984:125;;;;;;;;;;-1:-1:-1;8984:125:0;;;;;:::i;:::-;;:::i;7651:770::-;;;;;;;;;;-1:-1:-1;7651:770:0;;;;;:::i;:::-;;:::i;51705:472::-;;;;;;;;;;-1:-1:-1;51705:472:0;;;;;:::i;:::-;;:::i;27039:2054::-;;;;;;:::i;:::-;;:::i;47387:478::-;;;;;;;;;;-1:-1:-1;47387:478:0;;;;;:::i;:::-;;:::i;6347:751::-;;;;;;:::i;:::-;;:::i;50884:124::-;;;;;;;;;;-1:-1:-1;50884:124:0;;;;;:::i;:::-;;:::i;31967:391::-;;;;;;:::i;:::-;;:::i;8637:136::-;;;;;;;;;;-1:-1:-1;8637:136:0;;;;;:::i;:::-;;:::i;:::-;;;8341:25:1;;;8329:2;8314:18;8637:136:0;;;;;;;;24911:40;;;;;;;;;;;;;;;;49857:215;;;;;;;;;;-1:-1:-1;49857:215:0;;;;;:::i;:::-;;:::i;3338:48::-;;;;;;;;;;-1:-1:-1;3338:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;46604:474;;;;;;;;;;-1:-1:-1;46604:474:0;;;;;:::i;:::-;;:::i;29632:1768::-;;;;;;:::i;:::-;;:::i;5162:279::-;;;;;;:::i;:::-;;:::i;24491:30::-;;;;;;;;;;-1:-1:-1;24491:30:0;;;;-1:-1:-1;;;;;24491:30:0;;;;;;-1:-1:-1;;;;;9331:55:1;;;9313:74;;9301:2;9286:18;24491:30:0;9167:226:1;50474:199:0;;;;;;;;;;-1:-1:-1;50474:199:0;;;;;:::i;:::-;;:::i;1630:87::-;;;;;;;;;;-1:-1:-1;1676:7:0;1703:6;-1:-1:-1;;;;;1703:6:0;1630:87;;24669:26;;;;;;;;;;-1:-1:-1;24669:26:0;;;;-1:-1:-1;;;;;24669:26:0;;;3277:22;;;;;;;;;;;;;;;;50279:187;;;;;;;;;;-1:-1:-1;50279:187:0;;;;;:::i;:::-;;:::i;4779:271::-;;;;;;:::i;:::-;;:::i;24724:25::-;;;;;;;;;;-1:-1:-1;24724:25:0;;;;-1:-1:-1;;;;;24724:25:0;;;3225:43;;;;;;;;;;;;;;;24417:65;;;;;;;;;;-1:-1:-1;24417:65:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;24609:23::-;;;;;;;;;;-1:-1:-1;24609:23:0;;;;-1:-1:-1;;;;;24609:23:0;;;32473:393;;;;;;:::i;:::-;;:::i;24556:24::-;;;;;;;;;;-1:-1:-1;24556:24:0;;;;-1:-1:-1;;;;;24556:24:0;;;8839:137;;;;;;;;;;-1:-1:-1;8839:137:0;;;;;:::i;:::-;;:::i;2083:192::-;;;;;;;;;;-1:-1:-1;2083:192:0;;;;;:::i;:::-;;:::i;3306:25::-;;;;;;;;;;;;;;;;50681:195;;;;;;;;;;-1:-1:-1;50681:195:0;;;;;:::i;:::-;;:::i;50080:191::-;1861:10;1850:7;1676;1703:6;-1:-1:-1;;;;;1703:6:0;;1630:87;1850:7;-1:-1:-1;;;;;1850:21:0;;1842:66;;;;-1:-1:-1;;;1842:66:0;;12742:2:1;1842:66:0;;;12724:21:1;;;12761:18;;;12754:30;-1:-1:-1;;;;;;;;;;;12800:18:1;;;12793:62;12872:18;;1842:66:0;;;;;;;;;-1:-1:-1;;;;;50153:19:0;::::1;50145:47;;;::::0;-1:-1:-1;;;50145:47:0;;13103:2:1;50145:47:0::1;::::0;::::1;13085:21:1::0;13142:2;13122:18;;;13115:30;-1:-1:-1;;;13161:18:1;;;13154:45;13216:18;;50145:47:0::1;12901:339:1::0;50145:47:0::1;50203:9;:17:::0;;-1:-1:-1;;;;;;50203:17:0::1;-1:-1:-1::0;;;;;50203:17:0;::::1;::::0;;::::1;::::0;;;50236:27:::1;::::0;9313:74:1;;;50236:27:0::1;::::0;9301:2:1;9286:18;50236:27:0::1;;;;;;;;50080:191:::0;:::o;8984:125::-;1861:10;1850:7;1676;1703:6;-1:-1:-1;;;;;1703:6:0;;1630:87;1850:7;-1:-1:-1;;;;;1850:21:0;;1842:66;;;;-1:-1:-1;;;1842:66:0;;12742:2:1;1842:66:0;;;12724:21:1;;;12761:18;;;12754:30;-1:-1:-1;;;;;;;;;;;12800:18:1;;;12793:62;12872:18;;1842:66:0;12540:356:1;1842:66:0;9048:7:::1;:14:::0;;;9078:23:::1;::::0;8341:25:1;;;9078:23:0::1;::::0;8329:2:1;8314:18;9078:23:0::1;8195:177:1::0;7651:770:0;7867:14;7911:13;7934:4;7894:61;;;;;;;;13503:19:1;;;13560:2;13556:15;-1:-1:-1;;;;;;13552:53:1;13547:2;13538:12;;13531:75;13636:13;13631:2;13622:12;;13615:35;13675:2;13666:12;;13245:439;7894:61:0;;;;;;;-1:-1:-1;;7894:61:0;;;;;;7884:72;;7894:61;7884:72;;;;7991:50;;;13874:19:1;;;13931:2;13927:15;;;-1:-1:-1;;;;;;13923:53:1;13909:12;;;13902:75;13993:12;;;;13986:28;;;7991:50:0;;;;;;;;;;14030:12:1;;;7991:50:0;;;;-1:-1:-1;;;7967:101:0;;;7884:72;-1:-1:-1;7967:12:0;-1:-1:-1;;;;;7967:23:0;;;;:101;;8043:5;;;;8050:8;;;;8060:7;;;;7967:101;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;8113:23:0;;8079:14;8113:23;;;:13;:23;;;;;;8096:40;;:14;:40;:::i;:::-;8079:57;;8164:1;8155:6;:10;8147:48;;;;-1:-1:-1;;;8147:48:0;;18173:2:1;8147:48:0;;;18155:21:1;18212:2;18192:18;;;18185:30;18251:27;18231:18;;;18224:55;18296:18;;8147:48:0;17971:349:1;8147:48:0;-1:-1:-1;;;;;8206:23:0;;;;;;:13;:23;;;;;;:40;;;8273:44;8206:23;;;8307:5;;8294:6;;8206:23;8273:44;8206:23;8273:44;8294:6;8206:23;8307:5;8273:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8257:60;;;8336:4;8328:39;;;;-1:-1:-1;;;8328:39:0;;18737:2:1;8328:39:0;;;18719:21:1;18776:2;18756:18;;;18749:30;18815:24;18795:18;;;18788:52;18857:18;;8328:39:0;18535:346:1;8328:39:0;8383:30;;;-1:-1:-1;;;;;19078:55:1;;19060:74;;19165:2;19150:18;;19143:34;;;8383:30:0;;19033:18:1;8383:30:0;;;;;;;7856:565;;;7651:770;;;;;;;;:::o;51705:472::-;51967:11;:9;:11::i;:::-;52089:80;52102:16;52120:10;52132:9;52143:12;52157:11;52089:12;:80::i;:::-;51705:472;;;;;:::o;27039:2054::-;27471:17;27491:25;27506:9;27491:14;:25::i;:::-;27471:45;-1:-1:-1;27566:26:0;27535:27;;;;:16;:27;;;;;;;;;;;;:57;;;;;;;:::i;:::-;;27527:95;;;;-1:-1:-1;;;27527:95:0;;19390:2:1;27527:95:0;;;19372:21:1;19429:2;19409:18;;;19402:30;19468:27;19448:18;;;19441:55;19513:18;;27527:95:0;19188:349:1;27527:95:0;27633:27;;;;27663:29;27633:27;;;;;;;;:59;;-1:-1:-1;;27633:59:0;;;;;;;27732:69;;27749:13;27732:69;;;19800:19:1;;;;-1:-1:-1;;;;;;27772:4:0;19857:2:1;19853:15;19849:53;19835:12;;;19828:75;;;;19933:21;19919:12;;;19912:43;19971:12;;27732:69:0;;;;;;;;;;;;27722:80;;;;;;27705:97;;27821:15;;;;;;;;;-1:-1:-1;;;;;27821:15:0;-1:-1:-1;;;;;27813:35:0;;27880:6;27888:9;27899:8;;27909:9;:19;;;27863:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27944:5;;27964:8;;27987:7;;27813:192;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28016:28;28055:39;28097:47;28124:9;28135:8;;28097:26;:47::i;:::-;28055:89;-1:-1:-1;28166:43:0;28159:3;:50;;;;;;;;:::i;:::-;;28155:807;;;28235:29;28226:38;;28155:807;;;28293:41;28286:3;:48;;;;;;;;:::i;:::-;;28282:680;;;28381:26;28351:27;;;:16;:27;;;;;:56;;-1:-1:-1;;28351:56:0;;28381:26;28351:56;;;;;;28427:188;28455:40;28514:9;28542;:20;;;;;;;;;;:::i;:::-;28581:9;:19;;;28427:188;;;;;;;;;:::i;:::-;;;;;;;;28630:7;;;;;;28282:680;28675:55;28710:9;28721:8;;28675:34;:55::i;:::-;28669:61;-1:-1:-1;28756:43:0;28749:3;:50;;;;;;;;:::i;:::-;;28745:206;;;28829:30;28820:39;;28745:206;;;28909:26;28900:35;;28745:206;28972:27;;;;:16;:27;;;;;;;;:36;;29002:6;;-1:-1:-1;;28972:36:0;;;;;;29002:6;;28972:36;;;;;;;:::i;:::-;;;;;;29019:66;29056:9;29067:6;29075:9;29019:36;:66::i;:::-;27294:1799;;;;27039:2054;;;;;;;;;;:::o;47387:478::-;47586:55;47602:21;;;;:19;;;:21;:::i;:::-;47625:15;47586;:55::i;:::-;47652:205;47699:18;:10;;:18;:::i;:::-;47732:19;;;47766:15;;;;47732:10;47766:15;:::i;:::-;47796:18;;;;:10;:18;:::i;:::-;47829:17;;;;:10;:17;:::i;47652:205::-;47387:478;;:::o;6347:751::-;6592:13;6577:11;:28;;6569:56;;;;-1:-1:-1;;;6569:56:0;;24037:2:1;6569:56:0;;;24019:21:1;24076:2;24056:18;;;24049:30;-1:-1:-1;;;24095:18:1;;;24088:45;24150:18;;6569:56:0;23835:339:1;6569:56:0;6636:14;6653:17;6661:8;;6653:7;:17::i;:::-;6636:34;;6702:6;6689:9;:19;;6681:48;;;;-1:-1:-1;;;6681:48:0;;24381:2:1;6681:48:0;;;24363:21:1;24420:2;24400:18;;;24393:30;-1:-1:-1;;;24439:18:1;;;24432:46;24495:18;;6681:48:0;24179:340:1;6681:48:0;7006:10;-1:-1:-1;;;;;6986:104:0;;7018:9;7029:11;7042:10;7054:14;7070:8;;7080:9;6986:104;;;;;;;;;;;;:::i;:::-;;;;;;;;6558:540;6347:751;;;;;;:::o;50884:124::-;1861:10;1850:7;1676;1703:6;-1:-1:-1;;;;;1703:6:0;;1630:87;1850:7;-1:-1:-1;;;;;1850:21:0;;1842:66;;;;-1:-1:-1;;;1842:66:0;;12742:2:1;1842:66:0;;;12724:21:1;;;12761:18;;;12754:30;-1:-1:-1;;;;;;;;;;;12800:18:1;;;12793:62;12872:18;;1842:66:0;12540:356:1;1842:66:0;50966:25:::1;:34:::0;50884:124::o;31967:391::-;32217:31;32251:20;32264:6;32251:12;:20::i;:::-;32217:54;;32282:68;32297:8;;32307:5;32314;;32321:8;;32331:7;;32282:68;;;;;;;;;;;;;;;;;:14;:68::i;:::-;32206:152;31967:391;;;;;;;;;:::o;8637:136::-;8755:10;;8700:7;;8737:28;;:8;:28;:::i;:::-;8727:7;;:38;;;;:::i;:::-;8720:45;;8637:136;;;;;:::o;49857:215::-;1861:10;1850:7;1676;1703:6;-1:-1:-1;;;;;1703:6:0;;1630:87;1850:7;-1:-1:-1;;;;;1850:21:0;;1842:66;;;;-1:-1:-1;;;1842:66:0;;12742:2:1;1842:66:0;;;12724:21:1;;;12761:18;;;12754:30;-1:-1:-1;;;;;;;;;;;12800:18:1;;;12793:62;12872:18;;1842:66:0;12540:356:1;1842:66:0;-1:-1:-1;;;;;49936:19:0;::::1;49928:47;;;::::0;-1:-1:-1;;;49928:47:0;;13103:2:1;49928:47:0::1;::::0;::::1;13085:21:1::0;13142:2;13122:18;;;13115:30;-1:-1:-1;;;13161:18:1;;;13154:45;13216:18;;49928:47:0::1;12901:339:1::0;49928:47:0::1;49986:15;:23:::0;;-1:-1:-1;;;;;;49986:23:0::1;-1:-1:-1::0;;;;;49986:23:0;::::1;::::0;;::::1;::::0;;;50025:39:::1;::::0;9313:74:1;;;50025:39:0::1;::::0;9301:2:1;9286:18;50025:39:0::1;9167:226:1::0;46604:474:0;46805:55;46821:21;;;;:19;;;:21;:::i;46805:55::-;46871:199;46912:18;:10;;:18;:::i;:::-;46945:19;;;46979:15;;;;46945:10;46979:15;:::i;:::-;47009:18;;;;:10;:18;:::i;:::-;47042:17;;;;:10;:17;:::i;29632:1768::-;30012:17;30032:25;30047:9;30032:14;:25::i;:::-;30012:45;-1:-1:-1;30107:26:0;30076:27;;;;:16;:27;;;;;;;;;;;;:57;;;;;;;:::i;:::-;;30068:95;;;;-1:-1:-1;;;30068:95:0;;19390:2:1;30068:95:0;;;19372:21:1;19429:2;19409:18;;;19402:30;19468:27;19448:18;;;19441:55;19513:18;;30068:95:0;19188:349:1;30068:95:0;30174:27;;;;30204:29;30174:27;;;;;;;;:59;;-1:-1:-1;;30174:59:0;;;;;;;30273:75;;30290:13;30273:75;;;25775:19:1;;;;-1:-1:-1;;;;;;30313:4:0;25832:2:1;25828:15;25824:53;25810:12;;;25803:75;;;;25908:27;25894:12;;;25887:49;25952:12;;30273:75:0;;;;;;;;;;;;30263:86;;;;;;30246:103;;30368:15;;;;;;;;;-1:-1:-1;;;;;30368:15:0;-1:-1:-1;;;;;30360:35:0;;30427:6;30435:9;30446:8;;30456:9;:19;;;30410:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;30491:5;;30511:8;;30534:7;;30360:192;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30563:28;30602:39;30644:53;30677:9;30688:8;;30644:32;:53::i;:::-;30602:95;-1:-1:-1;30719:43:0;30712:3;:50;;;;;;;;:::i;:::-;;30708:561;;;30788:29;30779:38;;30708:561;;;30846:41;30839:3;:48;;;;;;;;:::i;:::-;;30835:434;;;30934:26;30904:27;;;:16;:27;;;;;:56;;-1:-1:-1;;30904:56:0;;30934:26;30904:56;;5162:279;5317:35;5330:11;5343:8;;5317:12;:35::i;:::-;5377:10;-1:-1:-1;;;;;5368:65:0;;5389:9;;5400:11;5413:8;;5423:9;5368:65;;;;;;;;;;;:::i;:::-;;;;;;;;5162:279;;;;;:::o;50474:199::-;1861:10;1850:7;1676;1703:6;-1:-1:-1;;;;;1703:6:0;;1630:87;1850:7;-1:-1:-1;;;;;1850:21:0;;1842:66;;;;-1:-1:-1;;;1842:66:0;;12742:2:1;1842:66:0;;;12724:21:1;;;12761:18;;;12754:30;-1:-1:-1;;;;;;;;;;;12800:18:1;;;12793:62;12872:18;;1842:66:0;12540:356:1;1842:66:0;-1:-1:-1;;;;;50549:19:0;::::1;50541:47;;;::::0;-1:-1:-1;;;50541:47:0;;13103:2:1;50541:47:0::1;::::0;::::1;13085:21:1::0;13142:2;13122:18;;;13115:30;-1:-1:-1;;;13161:18:1;;;13154:45;13216:18;;50541:47:0::1;12901:339:1::0;50541:47:0::1;50599:11;:19:::0;;-1:-1:-1;;;;;;50599:19:0::1;-1:-1:-1::0;;;;;50599:19:0;::::1;::::0;;::::1;::::0;;;50634:31:::1;::::0;9313:74:1;;;50634:31:0::1;::::0;9301:2:1;9286:18;50634:31:0::1;9167:226:1::0;50279:187:0;1861:10;1850:7;1676;1703:6;-1:-1:-1;;;;;1703:6:0;;1630:87;1850:7;-1:-1:-1;;;;;1850:21:0;;1842:66;;;;-1:-1:-1;;;1842:66:0;;12742:2:1;1842:66:0;;;12724:21:1;;;12761:18;;;12754:30;-1:-1:-1;;;;;;;;;;;12800:18:1;;;12793:62;12872:18;;1842:66:0;12540:356:1;1842:66:0;-1:-1:-1;;;;;50351:19:0;::::1;50343:47;;;::::0;-1:-1:-1;;;50343:47:0;;13103:2:1;50343:47:0::1;::::0;::::1;13085:21:1::0;13142:2;13122:18;;;13115:30;-1:-1:-1;;;13161:18:1;;;13154:45;13216:18;;50343:47:0::1;12901:339:1::0;50343:47:0::1;50401:8;:16:::0;;-1:-1:-1;;;;;;50401:16:0::1;-1:-1:-1::0;;;;;50401:16:0;::::1;::::0;;::::1;::::0;;;50433:25:::1;::::0;9313:74:1;;;50433:25:0::1;::::0;9301:2:1;9286:18;50433:25:0::1;9167:226:1::0;4779:271:0;4927:35;4940:11;4953:8;;4927:12;:35::i;:::-;4986:10;-1:-1:-1;;;;;4978:64:0;;4998:9;5009:11;5022:8;;5032:9;4978:64;;;;;;;;;;:::i;:::-;;;;;;;;4779:271;;;;:::o;32473:393::-;32724:31;32758:20;32771:6;32758:12;:20::i;:::-;32724:54;;32789:69;32804:8;;32814:5;32821;;32828:8;;32838:7;;32789:69;;;;;;;;;;;;;;;;;:14;:69::i;8839:137::-;1861:10;1850:7;1676;1703:6;-1:-1:-1;;;;;1703:6:0;;1630:87;1850:7;-1:-1:-1;;;;;1850:21:0;;1842:66;;;;-1:-1:-1;;;1842:66:0;;12742:2:1;1842:66:0;;;12724:21:1;;;12761:18;;;12754:30;-1:-1:-1;;;;;;;;;;;12800:18:1;;;12793:62;12872:18;;1842:66:0;12540:356:1;1842:66:0;8906:10:::1;:17:::0;;;8939:29:::1;::::0;8341:25:1;;;8939:29:0::1;::::0;8329:2:1;8314:18;8939:29:0::1;8195:177:1::0;2083:192:0;1861:10;1850:7;1676;1703:6;-1:-1:-1;;;;;1703:6:0;;1630:87;1850:7;-1:-1:-1;;;;;1850:21:0;;1842:66;;;;-1:-1:-1;;;1842:66:0;;12742:2:1;1842:66:0;;;12724:21:1;;;12761:18;;;12754:30;-1:-1:-1;;;;;;;;;;;12800:18:1;;;12793:62;12872:18;;1842:66:0;12540:356:1;1842:66:0;-1:-1:-1;;;;;2172:22:0;::::1;2164:73;;;::::0;-1:-1:-1;;;2164:73:0;;27270:2:1;2164:73:0::1;::::0;::::1;27252:21:1::0;27309:2;27289:18;;;27282:30;27348:34;27328:18;;;27321:62;27419:8;27399:18;;;27392:36;27445:19;;2164:73:0::1;27068:402:1::0;2164:73:0::1;2248:19;2258:8;2248:9;:19::i;:::-;2083:192:::0;:::o;50681:195::-;1861:10;1850:7;1676;1703:6;-1:-1:-1;;;;;1703:6:0;;1630:87;1850:7;-1:-1:-1;;;;;1850:21:0;;1842:66;;;;-1:-1:-1;;;1842:66:0;;12742:2:1;1842:66:0;;;12724:21:1;;;12761:18;;;12754:30;-1:-1:-1;;;;;;;;;;;12800:18:1;;;12793:62;12872:18;;1842:66:0;12540:356:1;1842:66:0;-1:-1:-1;;;;;50755:19:0;::::1;50747:47;;;::::0;-1:-1:-1;;;50747:47:0;;13103:2:1;50747:47:0::1;::::0;::::1;13085:21:1::0;13142:2;13122:18;;;13115:30;-1:-1:-1;;;13161:18:1;;;13154:45;13216:18;;50747:47:0::1;12901:339:1::0;50747:47:0::1;50805:10;:18:::0;;-1:-1:-1;;;;;;50805:18:0::1;-1:-1:-1::0;;;;;50805:18:0;::::1;::::0;;::::1;::::0;;;50839:29:::1;::::0;9313:74:1;;;50839:29:0::1;::::0;9301:2:1;9286:18;50839:29:0::1;9167:226:1::0;1418:131:0;1485:1;1467:6;-1:-1:-1;;;;;1467:6:0;:20;1459:50;;;;-1:-1:-1;;;1459:50:0;;27677:2:1;1459:50:0;;;27659:21:1;27716:2;27696:18;;;27689:30;27755:19;27735:18;;;27728:47;27792:18;;1459:50:0;27475:341:1;1459:50:0;1520:21;1530:10;1520:9;:21::i;:::-;1418:131::o;25969:460::-;26179:15;;-1:-1:-1;;;;;26179:15:0;:29;26171:69;;;;-1:-1:-1;;;26171:69:0;;28023:2:1;26171:69:0;;;28005:21:1;28062:2;28042:18;;;28035:30;28101:29;28081:18;;;28074:57;28148:18;;26171:69:0;27821:351:1;26171:69:0;26251:15;:34;;-1:-1:-1;;;;;;26251:34:0;;;-1:-1:-1;;;;;26251:34:0;;;;;;;26296:9;:22;;;;;;;;;;;;;;26329:8;:20;;;;;;;;;;;;;;26360:11;:26;;;;;;;;;;;;;26397:10;:24;;;;;;;;;;;;;25969:460::o;38089:3578::-;38181:7;;;38278:33;38263:11;;;;:9;:11;:::i;:::-;:48;;;;;;;;:::i;:::-;;38259:3290;;;38408:16;;;;;;;;:::i;:::-;38447:18;;;;;;;;:::i;:::-;38488:15;;;;;;;;:::i;:::-;38526:16;;;;38565:20;;;;;;;;:::i;:::-;38369:317;;-1:-1:-1;;;;;;28540:2:1;28536:15;;;28532:24;;38369:317:0;;;28520:37:1;28591:15;;;28587:24;;28573:12;;;28566:46;28646:15;;;;28642:24;;;28628:12;;;28621:46;28683:12;;;28676:28;;;;-1:-1:-1;;;;;;28827:3:1;28823:16;;;28819:25;;28805:12;;;28798:47;38615:13:0;28880:16:1;;;28876:25;;;28861:13;;;28854:48;38652:15:0;;;;28918:13:1;;;28911:29;28956:13;;38369:317:0;;;;;;-1:-1:-1;;38369:317:0;;;;;;;38341:360;;38369:317;38341:360;;;;38729:15;;-1:-1:-1;;;38767:41:0;;;;;8341:25:1;;;38341:360:0;;-1:-1:-1;;;;;;38729:15:0;;-1:-1:-1;38729:15:0;;38767:29;;8314:18:1;;38767:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:49;;38812:4;38767:49;38759:84;;;;-1:-1:-1;;;38759:84:0;;29646:2:1;38759:84:0;;;29628:21:1;29685:2;29665:18;;;29658:30;29724:24;29704:18;;;29697:52;29766:18;;38759:84:0;29444:346:1;38759:84:0;38259:3290;;;38880:36;38865:11;;;;:9;:11;:::i;:::-;:51;;;;;;;;:::i;:::-;;38861:2688;;;39020:13;39057:15;;;;;;;;:::i;:::-;39095:18;;;;;;;;:::i;:::-;39136:15;;;;;;;;:::i;:::-;38974:235;;-1:-1:-1;;;;;;30137:3:1;30133:16;;;30129:25;;38974:235:0;;;30117:38:1;30188:16;;;;30184:25;;;30171:11;;;30164:46;-1:-1:-1;;;;;;30298:2:1;30294:15;;;30290:24;;30276:12;;;30269:46;30349:15;;;30345:24;30331:12;;;30324:46;39174:16:0;;;;30386:12:1;;;30379:28;30423:12;;38974:235:0;;;;;;-1:-1:-1;;38974:235:0;;;;;;;38946:278;;38974:235;38946:278;;;;39252:15;;-1:-1:-1;;;39290:41:0;;;;;8341:25:1;;;38946:278:0;;-1:-1:-1;;;;;;39252:15:0;;-1:-1:-1;39252:15:0;;39290:29;;8314:18:1;;39290:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:49;;39335:4;39290:49;39282:87;;;;-1:-1:-1;;;39282:87:0;;30648:2:1;39282:87:0;;;30630:21:1;30687:2;30667:18;;;30660:30;30726:27;30706:18;;;30699:55;30771:18;;39282:87:0;30446:349:1;38861:2688:0;39420:33;39405:11;;;;:9;:11;:::i;:::-;:48;;;;;;;;:::i;:::-;;:104;;;-1:-1:-1;39472:37:0;39457:11;;;;:9;:11;:::i;:::-;:52;;;;;;;;:::i;:::-;;39405:104;39387:2162;;;39616:18;;;;;;;;:::i;:::-;39657:15;;;;;;;;:::i;:::-;39695:16;;;;39734;;;;;;;;:::i;:::-;39773:20;;;;;;;;:::i;:::-;39577:273;;31137:2:1;31133:15;;;-1:-1:-1;;;;;;31129:24:1;;;39577:273:0;;;31117:37:1;31188:15;;;31184:24;;31170:12;;;31163:46;31225:12;;;31218:28;;;;31280:15;;31276:24;;;31262:12;;;31255:46;31339:3;31335:16;;;;-1:-1:-1;;;;;;31331:89:1;31317:12;;;31310:111;39816:15:0;;;;31437:13:1;;;31430:29;31475:13;;39577:273:0;;;-1:-1:-1;;39577:273:0;;;;;;;;;39549:316;;39577:273;39549:316;;;;;-1:-1:-1;39899:33:0;39884:11;;;;:9;:11;:::i;:::-;:48;;;;;;;;:::i;:::-;;39880:473;;;-1:-1:-1;39966:9:0;;40002:50;;-1:-1:-1;;;40002:50:0;;;;;8341:25:1;;;-1:-1:-1;;;;;39966:9:0;;;;;;40002:38;;8314:18:1;;40002:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:58;;40056:4;40002:58;39994:92;;;;-1:-1:-1;;;39994:92:0;;31701:2:1;39994:92:0;;;31683:21:1;31740:2;31720:18;;;31713:30;31779:23;31759:18;;;31752:51;31820:18;;39994:92:0;31499:345:1;39880:473:0;-1:-1:-1;40213:8:0;;40248:51;;-1:-1:-1;;;40248:51:0;;;;;8341:25:1;;;-1:-1:-1;;;;;40213:8:0;;;;;;40248:39;;8314:18:1;;40248:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;40303:4;40248:59;40240:97;;;;-1:-1:-1;;;40240:97:0;;32051:2:1;40240:97:0;;;32033:21:1;32090:2;32070:18;;;32063:30;32129:27;32109:18;;;32102:55;32174:18;;40240:97:0;31849:349:1;39387:2162:0;40403:35;40388:11;;;;:9;:11;:::i;:::-;:50;;;;;;;;:::i;:::-;;:108;;;-1:-1:-1;40457:39:0;40442:11;;;;:9;:11;:::i;:::-;:54;;;;;;;;:::i;:::-;;40388:108;40370:1179;;;40542:35;40527:11;;;;:9;:11;:::i;:::-;:50;;;;;;;;:::i;:::-;;40523:239;;;-1:-1:-1;40611:11:0;;-1:-1:-1;;;;;40611:11:0;40523:239;;;-1:-1:-1;40736:10:0;;-1:-1:-1;;;;;40736:10:0;40523:239;40856:18;;;;;;;;:::i;:::-;40897:15;;;;;;;;:::i;:::-;40935:16;;;;40974;;;;;;;;:::i;:::-;41013:20;;;;;;;;:::i;:::-;40817:306;;32568:2:1;32564:15;;;-1:-1:-1;;;;;;32560:24:1;;;40817:306:0;;;32548:37:1;32619:15;;;32615:24;;32601:12;;;32594:46;32656:12;;;32649:28;;;;32711:15;;;32707:24;;32693:12;;;32686:46;32770:3;32766:16;-1:-1:-1;;;;;;32762:89:1;32748:12;;;32741:111;41056:15:0;;;;32868:13:1;;;32861:29;32925:15;;;;32921:24;32906:13;;;32899:47;32962:13;;40817:306:0;;;-1:-1:-1;;40817:306:0;;;;;;;;;40789:349;;40817:306;40789:349;;;;;-1:-1:-1;41172:35:0;41157:11;;;;:9;:11;:::i;:::-;:50;;;;;;;;:::i;:::-;;41153:385;;;41236:52;;-1:-1:-1;;;41236:52:0;;;;;8341:25:1;;;-1:-1:-1;;;;;41236:40:0;;;;;8314:18:1;;41236:52:0;8195:177:1;41153:385:0;41431:53;;-1:-1:-1;;;41431:53:0;;;;;8341:25:1;;;-1:-1:-1;;;;;41431:41:0;;;;;8314:18:1;;41431:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:61;;41488:4;41431:61;41423:99;;;;-1:-1:-1;;;41423:99:0;;32051:2:1;41423:99:0;;;32033:21:1;32090:2;32070:18;;;32063:30;32129:27;32109:18;;;32102:55;32174:18;;41423:99:0;31849:349:1;41423:99:0;41593:40;41635:10;41647;41576:82;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41566:93;;;;;;41559:100;;;;38089:3578;;;:::o;35414:899::-;35556:35;35609:30;35642:9;35609:42;-1:-1:-1;35663:7:0;;35700:18;;;;;;;;:::i;:::-;-1:-1:-1;;;;;35692:32:0;35732:9;-1:-1:-1;;;35872:16:0;;;;;;;;:::i;:::-;35907:15;;;;;;;;:::i;:::-;35941:16;;;;35976:20;;;;;;;;:::i;:::-;36015:8;;36042:10;35757:310;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;35757:310:0;;;;;;;;;;;;;;-1:-1:-1;;;;;35757:310:0;-1:-1:-1;;;;;;35757:310:0;;;;;;;;;;35692:386;;;;35757:310;35692:386;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35662:416;;;;36093:2;36089:98;;;36131:3;36119:56;;;;;;;;;;;;:::i;:::-;36112:63;;;;;;;36089:98;36197:50;36219:22;36243:3;36197:21;:50::i;:::-;36265:40;36258:47;;;;;35414:899;;;;;;:::o;36321:915::-;36471:35;36524:30;36557:9;36524:42;-1:-1:-1;36578:7:0;;36615:18;;;;;;;;:::i;:::-;-1:-1:-1;;;;;36607:32:0;36647:9;-1:-1:-1;;;36795:16:0;;;;;;;;:::i;34571:432::-;34897:18;;;;;;;;:::i;:::-;-1:-1:-1;;;;;34772:223:0;;34795:40;34850:10;34875:7;34930:20;;;;;;;;:::i;:::-;34965:9;:19;;;34772:223;;;;;;;;;;:::i;:::-;;;;;;;;34571:432;;;:::o;47873:1914::-;48029:33;48024:1;:38;;;;;;;;:::i;:::-;;48020:1760;;;48087:15;;-1:-1:-1;;;;;48087:15:0;48079:30;48128:23;:15;;:23;:::i;:::-;48170:20;;;;:15;:20;:::i;:::-;48209:23;;;;:15;:23;:::i;:::-;48251:22;;;;:15;:22;:::i;:::-;48079:209;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47387:478;;:::o;48020:1760::-;48315:36;48310:1;:41;;;;;;;;:::i;:::-;;48306:1474;;;48376:15;;-1:-1:-1;;;;;48376:15:0;48368:33;48420:23;:15;;:23;:::i;48306:1474::-;48607:33;48602:1;:38;;;;;;;;:::i;:::-;;48598:1182;;;48676:9;;-1:-1:-1;;;;;48676:9:0;48657:34;48710:23;:15;;:23;:::i;48598:1182::-;48897:35;48892:1;:40;;;;;;;;:::i;:::-;;48888:892;;;48970:11;;-1:-1:-1;;;;;48970:11:0;48949:38;49006:23;:15;;:23;:::i;:::-;49048:20;;;;:15;:20;:::i;:::-;49087:23;;;;:15;:23;:::i;:::-;49129:22;;;;:15;:22;:::i;:::-;48949:217;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;47387:478;;:::o;48888:892::-;49193:37;49188:1;:42;;;;;;;;:::i;:::-;;49184:596;;;49267:8;;-1:-1:-1;;;;;49267:8:0;49247:38;49304:23;:15;;:23;:::i;49184:596::-;49491:39;49486:1;:44;;;;;;;;:::i;:::-;;49482:298;;;49569:10;;-1:-1:-1;;;;;49569:10:0;49547:42;49608:23;:15;;:23;:::i;45775:228::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45904:91:0;;;;;;;;;;45923:13;;;;:6;:13;:::i;:::-;-1:-1:-1;;;;;45904:91:0;;;;;;;;;;;;;;;;;;;;;45942:6;:15;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;45904:91:0;;;;;45959:17;;;;;;;;:::i;:::-;45904:91;;;;;;45978:6;:16;;;45904:91;;;45897:98;;45775:228;;;:::o;32874:1611::-;33325:17;33345:38;33366:6;33374:8;;33345:20;:38::i;:::-;33325:58;-1:-1:-1;33433:26:0;33402:27;;;;:16;:27;;;;;;;;;;;;:57;;;;;;;:::i;:::-;;33394:94;;;;-1:-1:-1;;;33394:94:0;;36771:2:1;33394:94:0;;;36753:21:1;36810:2;36790:18;;;36783:30;36849:26;36829:18;;;36822:54;36893:18;;33394:94:0;36569:348:1;33394:94:0;33499:27;;;;33529:29;33499:27;;;;;;;;:59;;-1:-1:-1;;33499:59:0;;;;;;;33598:58;;;;33615:13;;33638:4;;33645:10;;33598:58;;:::i;:::-;;;;-1:-1:-1;;33598:58:0;;;;;;;;;33588:69;;33598:58;33588:69;;;;33676:15;;33704:35;;;37544:19:1;;;37579:12;;;37572:28;;;33704:35:0;;;;;;;;;37616:12:1;;;33704:35:0;;;;-1:-1:-1;;;33668:98:0;;;33588:69;-1:-1:-1;;;;;;33676:15:0;;33668:35;;:98;;33741:5;;;;33748:8;;;;33758:7;;;;33668:98;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33777:28;33816:39;33858:32;33873:6;33881:8;;33858:14;:32::i;:::-;33816:74;-1:-1:-1;33912:43:0;33905:3;:50;;;;;;;;:::i;:::-;;33901:464;;;33981:29;33972:38;;33901:464;;;34039:41;34032:3;:48;;;;;;;;:::i;:::-;;34028:337;;;34127:26;34097:27;;;:16;:27;;;;;;;:56;;-1:-1:-1;;34097:56:0;;;34228:17;;;;34247:16;;;;34173:91;;;;;;34097:56;;:27;;34247:16;34173:91;:::i;:::-;;;;;;;;34279:7;;;;;;34028:337;34327:26;34318:35;;34028:337;34375:27;;;;:16;:27;;;;;;;;:36;;34405:6;;-1:-1:-1;;34375:36:0;;;;;;34405:6;;34375:36;;;;;;;:::i;:::-;;;;;;34422:55;34451:9;34462:6;34470;34422:28;:55::i;:::-;33133:1352;;;;32874:1611;;;;;;;;;;:::o;37244:837::-;37392:35;37445:30;37478:9;37445:42;-1:-1:-1;37499:7:0;;37536:18;;;;;;;;:::i;:::-;-1:-1:-1;;;;;37528:32:0;37568:9;-1:-1:-1;;;37714:15:0;;;;;;;;:::i;:::-;37748:9;:16;;;37783:8;;37810:10;37593:242;;;;;;;;;;;;:::i;5449:255::-;5559:13;5544:11;:28;;5536:56;;;;-1:-1:-1;;;5536:56:0;;24037:2:1;5536:56:0;;;24019:21:1;24076:2;24056:18;;;24049:30;-1:-1:-1;;;24095:18:1;;;24088:45;24150:18;;5536:56:0;23835:339:1;5536:56:0;5603:14;5620:17;5628:8;;5620:7;:17::i;:::-;5603:34;;5669:6;5656:9;:19;;5648:48;;;;-1:-1:-1;;;5648:48:0;;24381:2:1;5648:48:0;;;24363:21:1;24420:2;24400:18;;;24393:30;-1:-1:-1;;;24439:18:1;;;24432:46;24495:18;;5648:48:0;24179:340:1;5648:48:0;5525:179;5449:255;;;:::o;46011:237::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46141:99:0;;;;;;;;;-1:-1:-1;46141:99:0;;;;;46172:13;:6;;:13;:::i;:::-;46141:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46141:99:0;;;-1:-1:-1;46141:99:0;;;;;46187:15;;;;;;;;;:::i;2283:173::-;2339:16;2358:6;;-1:-1:-1;;;;;2375:17:0;;;-1:-1:-1;;;;;;2375:17:0;;;;;;2408:40;;2358:6;;;;;;;2408:40;;2339:16;2408:40;2328:128;2283:173;:::o;43728:883::-;43837:29;43869:9;43837:41;;43889:25;43934;;43917:14;:42;;;;:::i;:::-;43889:70;;44000:17;43974:23;:43;:100;;;;-1:-1:-1;44046:28:0;44072:2;44046:23;:28;:::i;:::-;44021:21;:53;;43974:100;43970:478;;;44413:9;43970:478;44458:18;44479:25;44492:11;44479:12;:25::i;:::-;44458:46;;44515:54;44539:23;;;;;;;;;;;;;;;;;44564:4;44515:23;:54::i;:::-;44585:18;44598:4;44585:18;;;;;;:::i;:::-;;;;;;;;43826:785;;;43728:883;;:::o;41675:697::-;41860:18;;;;41893:13;;41813:7;;41860:18;41889:91;;41954:13;;41937:31;;;;41954:13;41937:31;;38777:2:1;38773:15;;;;-1:-1:-1;;;;;;38769:53:1;38757:66;;38848:2;38839:12;;38628:229;41937:31:0;;;;;;;;;;;;;41928:40;;41889:91;42077:32;42132:6;42161;:15;;;42199:6;:17;;;42239:6;:16;;;42285:13;42322:8;;42038:311;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42010:354;;;;;;41990:374;;;41675:697;;;;;:::o;42380:1340::-;42498:35;42551:30;42584:9;42551:42;;42604:7;42622:16;42653:6;:18;;;:25;42682:1;42653:30;42649:837;;;42720:6;:15;;;-1:-1:-1;;;;;42712:29:0;42749:9;42840:53;;;;;;;;;;;;;;;;;42830:64;;;;;;;42918:13;;42954:17;;;;42778:276;;;;42918:13;42954:17;42994:8;;;;43025:10;;42778:276;;;:::i;:::-;;;;-1:-1:-1;;42778:276:0;;;;;;;;;;;;;;-1:-1:-1;;;;;42778:276:0;-1:-1:-1;;;;;;42778:276:0;;;;;;;;;;42712:357;;;;42778:276;42712:357;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42700:369:0;;-1:-1:-1;42700:369:0;-1:-1:-1;42649:837:0;;;43122:6;:15;;;-1:-1:-1;;;;;43114:29:0;43151:9;43242:51;;;;;;;;;;;;;;;;;43232:62;;;;;;43318:6;:18;;;43359:6;:17;;;43399:8;;43430:10;43180:279;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;43180:279:0;;;;;;;;;;;;;;-1:-1:-1;;;;;43180:279:0;-1:-1:-1;;;;;;43180:279:0;;;;;;;;;;43114:360;;;;43180:279;43114:360;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43102:372:0;;-1:-1:-1;43102:372:0;-1:-1:-1;42649:837:0;43500:2;43496:98;;;43538:3;43526:56;;;;;;;;;;;;:::i;35011:395::-;35309:6;:15;;;-1:-1:-1;;;;;35192:206:0;;35215:32;35262:10;35287:7;35339:6;:17;;;35371:6;:16;;;35192:206;;;;;;;;;;:::i;45275:492::-;45345:13;45508:2;45487:11;:18;:23;45483:67;;;-1:-1:-1;;45512:38:0;;;;;;;;;;;;;;;;;;45275:492::o;45483:67::-;45652:4;45639:11;45635:22;45620:37;;45696:11;45685:33;;;;;;;;;;;;:::i;44619:508::-;44842:18;;44823:15;;44752:7;;44801:4;;44823:37;44819:301;;44882:9;44877:188;44901:11;:18;44897:1;:22;44877:188;;;44964:11;44976:1;44964:14;;;;;;;;:::i;:::-;;;;;;;;;44949:29;;;:8;44958:1;44949:11;;;;;;;;:::i;:::-;;;;;;;:29;44945:105;;45003:7;;;44619:508;;:::o;44945:105::-;44921:3;;;;:::i;:::-;;;;44877:188;;;;45086:4;45079:12;;-1:-1:-1;;;45079:12:0;;;;;;;;:::i;14:196:1:-;82:20;;-1:-1:-1;;;;;131:54:1;;121:65;;111:93;;200:1;197;190:12;111:93;14:196;;;:::o;215:186::-;274:6;327:2;315:9;306:7;302:23;298:32;295:52;;;343:1;340;333:12;295:52;366:29;385:9;366:29;:::i;406:180::-;465:6;518:2;506:9;497:7;493:23;489:32;486:52;;;534:1;531;524:12;486:52;-1:-1:-1;557:23:1;;406:180;-1:-1:-1;406:180:1:o;591:374::-;661:8;671:6;725:3;718:4;710:6;706:17;702:27;692:55;;743:1;740;733:12;692:55;-1:-1:-1;766:20:1;;809:18;798:30;;795:50;;;841:1;838;831:12;795:50;878:4;870:6;866:17;854:29;;938:3;931:4;921:6;918:1;914:14;906:6;902:27;898:38;895:47;892:67;;;955:1;952;945:12;892:67;591:374;;;;;:::o;970:1264::-;1157:6;1165;1173;1181;1189;1197;1205;1213;1266:3;1254:9;1245:7;1241:23;1237:33;1234:53;;;1283:1;1280;1273:12;1234:53;1306:29;1325:9;1306:29;:::i;:::-;1296:39;;1382:2;1371:9;1367:18;1354:32;1344:42;;1437:2;1426:9;1422:18;1409:32;1460:18;1501:2;1493:6;1490:14;1487:34;;;1517:1;1514;1507:12;1487:34;1556:77;1625:7;1616:6;1605:9;1601:22;1556:77;:::i;:::-;1652:8;;-1:-1:-1;1530:103:1;-1:-1:-1;1740:2:1;1725:18;;1712:32;;-1:-1:-1;1756:16:1;;;1753:36;;;1785:1;1782;1775:12;1753:36;1824:79;1895:7;1884:8;1873:9;1869:24;1824:79;:::i;:::-;1922:8;;-1:-1:-1;1798:105:1;-1:-1:-1;2010:3:1;1995:19;;1982:33;;-1:-1:-1;2027:16:1;;;2024:36;;;2056:1;2053;2046:12;2024:36;;2095:79;2166:7;2155:8;2144:9;2140:24;2095:79;:::i;:::-;970:1264;;;;-1:-1:-1;970:1264:1;;-1:-1:-1;970:1264:1;;;;;;2193:8;-1:-1:-1;;;970:1264:1:o;2239:484::-;2334:6;2342;2350;2358;2366;2419:3;2407:9;2398:7;2394:23;2390:33;2387:53;;;2436:1;2433;2426:12;2387:53;2459:29;2478:9;2459:29;:::i;:::-;2449:39;;2507:38;2541:2;2530:9;2526:18;2507:38;:::i;:::-;2497:48;;2564:38;2598:2;2587:9;2583:18;2564:38;:::i;:::-;2554:48;;2621:38;2655:2;2644:9;2640:18;2621:38;:::i;:::-;2611:48;;2678:39;2712:3;2701:9;2697:19;2678:39;:::i;:::-;2668:49;;2239:484;;;;;;;;:::o;2728:347::-;2779:8;2789:6;2843:3;2836:4;2828:6;2824:17;2820:27;2810:55;;2861:1;2858;2851:12;2810:55;-1:-1:-1;2884:20:1;;2927:18;2916:30;;2913:50;;;2959:1;2956;2949:12;2913:50;2996:4;2988:6;2984:17;2972:29;;3048:3;3041:4;3032:6;3024;3020:19;3016:30;3013:39;3010:59;;;3065:1;3062;3055:12;3080:1572;3309:6;3317;3325;3333;3341;3349;3357;3365;3373;3417:9;3408:7;3404:23;3447:3;3443:2;3439:12;3436:32;;;3464:1;3461;3454:12;3436:32;3504:9;3491:23;3533:18;3574:2;3566:6;3563:14;3560:34;;;3590:1;3587;3580:12;3560:34;3629:58;3679:7;3670:6;3659:9;3655:22;3629:58;:::i;:::-;3706:8;;-1:-1:-1;3603:84:1;-1:-1:-1;3603:84:1;;-1:-1:-1;3775:3:1;-1:-1:-1;;3757:16:1;;3753:26;3750:46;;;3792:1;3789;3782:12;3750:46;3830:2;3819:9;3815:18;3805:28;;3886:3;3875:9;3871:19;3858:33;3842:49;;3916:2;3906:8;3903:16;3900:36;;;3932:1;3929;3922:12;3900:36;3971:79;4042:7;4031:8;4020:9;4016:24;3971:79;:::i;:::-;3945:105;;-1:-1:-1;3945:105:1;-1:-1:-1;4157:3:1;4142:19;;4129:33;;-1:-1:-1;3945:105:1;;-1:-1:-1;4174:16:1;;;4171:36;;;4203:1;4200;4193:12;4171:36;4242:79;4313:7;4302:8;4291:9;4287:24;4242:79;:::i;:::-;4216:105;;-1:-1:-1;4216:105:1;-1:-1:-1;4428:3:1;4413:19;;4400:33;;-1:-1:-1;4216:105:1;;-1:-1:-1;4445:16:1;;;4442:36;;;4474:1;4471;4464:12;4442:36;;;4513:79;4584:7;4573:8;4562:9;4558:24;4513:79;:::i;:::-;4487:105;;4611:8;4601:18;;;4638:8;4628:18;;;3080:1572;;;;;;;;;;;:::o;4657:169::-;4730:5;4775:3;4766:6;4761:3;4757:16;4753:26;4750:46;;;4792:1;4789;4782:12;4750:46;-1:-1:-1;4814:6:1;4657:169;-1:-1:-1;4657:169:1:o;4831:689::-;4987:6;4995;5048:2;5036:9;5027:7;5023:23;5019:32;5016:52;;;5064:1;5061;5054:12;5016:52;5104:9;5091:23;5133:18;5174:2;5166:6;5163:14;5160:34;;;5190:1;5187;5180:12;5160:34;5213:80;5285:7;5276:6;5265:9;5261:22;5213:80;:::i;:::-;5203:90;;5346:2;5335:9;5331:18;5318:32;5302:48;;5375:2;5365:8;5362:16;5359:36;;;5391:1;5388;5381:12;5359:36;-1:-1:-1;5414:24:1;;5472:3;5454:16;;;5450:26;5447:46;;;5489:1;5486;5479:12;5447:46;5512:2;5502:12;;;4831:689;;;;;:::o;5525:695::-;5631:6;5639;5647;5655;5663;5671;5724:3;5712:9;5703:7;5699:23;5695:33;5692:53;;;5741:1;5738;5731:12;5692:53;5764:29;5783:9;5764:29;:::i;:::-;5754:39;;5840:2;5829:9;5825:18;5812:32;5802:42;;5863:38;5897:2;5886:9;5882:18;5863:38;:::i;:::-;5853:48;;5948:2;5937:9;5933:18;5920:32;5910:42;;6003:3;5992:9;5988:19;5975:33;6031:18;6023:6;6020:30;6017:50;;;6063:1;6060;6053:12;6017:50;6102:58;6152:7;6143:6;6132:9;6128:22;6102:58;:::i;:::-;5525:695;;;;-1:-1:-1;5525:695:1;;-1:-1:-1;5525:695:1;;6179:8;;5525:695;-1:-1:-1;;;5525:695:1:o;6225:1551::-;6451:6;6459;6467;6475;6483;6491;6499;6507;6515;6568:3;6556:9;6547:7;6543:23;6539:33;6536:53;;;6585:1;6582;6575:12;6536:53;6625:9;6612:23;6654:18;6695:2;6687:6;6684:14;6681:34;;;6711:1;6708;6701:12;6681:34;6750:58;6800:7;6791:6;6780:9;6776:22;6750:58;:::i;:::-;6827:8;;-1:-1:-1;6724:84:1;-1:-1:-1;6724:84:1;;-1:-1:-1;6881:76:1;6949:7;6944:2;6929:18;;6881:76;:::i;:::-;6871:86;;7010:3;6999:9;6995:19;6982:33;6966:49;;7040:2;7030:8;7027:16;7024:36;;;7056:1;7053;7046:12;7024:36;7095:79;7166:7;7155:8;7144:9;7140:24;7095:79;:::i;:::-;7193:8;;-1:-1:-1;7069:105:1;-1:-1:-1;7281:3:1;7266:19;;7253:33;;-1:-1:-1;7298:16:1;;;7295:36;;;7327:1;7324;7317:12;7295:36;7366:79;7437:7;7426:8;7415:9;7411:24;7366:79;:::i;:::-;7464:8;;-1:-1:-1;7340:105:1;-1:-1:-1;7552:3:1;7537:19;;7524:33;;-1:-1:-1;7569:16:1;;;7566:36;;;7598:1;7595;7588:12;7566:36;;7637:79;7708:7;7697:8;7686:9;7682:24;7637:79;:::i;7781:409::-;7851:6;7859;7912:2;7900:9;7891:7;7887:23;7883:32;7880:52;;;7928:1;7925;7918:12;7880:52;7968:9;7955:23;8001:18;7993:6;7990:30;7987:50;;;8033:1;8030;8023:12;7987:50;8072:58;8122:7;8113:6;8102:9;8098:22;8072:58;:::i;:::-;8149:8;;8046:84;;-1:-1:-1;7781:409:1;-1:-1:-1;;;;7781:409:1:o;8377:785::-;8476:6;8484;8492;8500;8508;8561:2;8549:9;8540:7;8536:23;8532:32;8529:52;;;8577:1;8574;8567:12;8529:52;8617:9;8604:23;8646:18;8687:2;8679:6;8676:14;8673:34;;;8703:1;8700;8693:12;8673:34;8742:58;8792:7;8783:6;8772:9;8768:22;8742:58;:::i;:::-;8819:8;;-1:-1:-1;8716:84:1;-1:-1:-1;8901:2:1;8886:18;;8873:32;;-1:-1:-1;8958:2:1;8943:18;;8930:32;;-1:-1:-1;8974:16:1;;;8971:36;;;9003:1;9000;8993:12;8971:36;;9042:60;9094:7;9083:8;9072:9;9068:24;9042:60;:::i;:::-;8377:785;;;;-1:-1:-1;8377:785:1;;-1:-1:-1;9121:8:1;;9016:86;8377:785;-1:-1:-1;;;8377:785:1:o;9398:551::-;9486:6;9494;9502;9510;9563:2;9551:9;9542:7;9538:23;9534:32;9531:52;;;9579:1;9576;9569:12;9531:52;9602:29;9621:9;9602:29;:::i;:::-;9592:39;;9678:2;9667:9;9663:18;9650:32;9640:42;;9733:2;9722:9;9718:18;9705:32;9760:18;9752:6;9749:30;9746:50;;;9792:1;9789;9782:12;9746:50;9831:58;9881:7;9872:6;9861:9;9857:22;9831:58;:::i;:::-;9398:551;;;;-1:-1:-1;9908:8:1;-1:-1:-1;;;;9398:551:1:o;10391:127::-;10452:10;10447:3;10443:20;10440:1;10433:31;10483:4;10480:1;10473:15;10507:4;10504:1;10497:15;10523:139;10603:1;10596:5;10593:12;10583:46;;10609:18;;:::i;:::-;10638;;10523:139::o;10667:205::-;10811:2;10796:18;;10823:43;10800:9;10848:6;10823:43;:::i;10877:1658::-;11104:6;11112;11120;11128;11136;11144;11152;11160;11168;11221:3;11209:9;11200:7;11196:23;11192:33;11189:53;;;11238:1;11235;11228:12;11189:53;11278:9;11265:23;11307:18;11348:2;11340:6;11337:14;11334:34;;;11364:1;11361;11354:12;11334:34;11403:58;11453:7;11444:6;11433:9;11429:22;11403:58;:::i;:::-;11480:8;;-1:-1:-1;11377:84:1;-1:-1:-1;11568:2:1;11553:18;;11540:32;;-1:-1:-1;11584:16:1;;;11581:36;;;11613:1;11610;11603:12;11581:36;11636:82;11710:7;11699:8;11688:9;11684:24;11636:82;:::i;:::-;11626:92;;11771:2;11760:9;11756:18;11743:32;11727:48;;11800:2;11790:8;11787:16;11784:36;;;11816:1;11813;11806:12;11784:36;11855:79;11926:7;11915:8;11904:9;11900:24;11855:79;:::i;:::-;11953:8;;-1:-1:-1;11829:105:1;-1:-1:-1;12041:2:1;12026:18;;12013:32;;-1:-1:-1;12057:16:1;;;12054:36;;;12086:1;12083;12076:12;12054:36;12125:79;12196:7;12185:8;12174:9;12170:24;12125:79;:::i;:::-;12223:8;;-1:-1:-1;12099:105:1;-1:-1:-1;12311:3:1;12296:19;;12283:33;;-1:-1:-1;12328:16:1;;;12325:36;;;12357:1;12354;12347:12;14053:258;14125:1;14135:113;14149:6;14146:1;14143:13;14135:113;;;14225:11;;;14219:18;14206:11;;;14199:39;14171:2;14164:10;14135:113;;;14266:6;14263:1;14260:13;14257:48;;;-1:-1:-1;;14301:1:1;14283:16;;14276:27;14053:258::o;14316:257::-;14357:3;14395:5;14389:12;14422:6;14417:3;14410:19;14438:63;14494:6;14487:4;14482:3;14478:14;14471:4;14464:5;14460:16;14438:63;:::i;:::-;14555:2;14534:15;-1:-1:-1;;14530:29:1;14521:39;;;;14562:4;14517:50;;14316:257;-1:-1:-1;;14316:257:1:o;14578:266::-;14666:6;14661:3;14654:19;14718:6;14711:5;14704:4;14699:3;14695:14;14682:43;-1:-1:-1;14770:1:1;14745:16;;;14763:4;14741:27;;;14734:38;;;;14826:2;14805:15;;;-1:-1:-1;;14801:29:1;14792:39;;;14788:50;;14578:266::o;14849:1030::-;14956:6;14951:3;14944:19;14926:3;14982:4;15023:2;15018:3;15014:12;15048:11;15075;15068:18;;15125:6;15122:1;15118:14;15111:5;15107:26;15095:38;;15156:5;15179:1;15189:664;15203:6;15200:1;15197:13;15189:664;;;15274:5;15268:4;15264:16;15259:3;15252:29;15333:6;15320:20;15423:2;15419:7;15411:5;15395:14;15391:26;15387:40;15367:18;15363:65;15353:93;;15442:1;15439;15432:12;15353:93;15474:30;;15533:21;;15583:18;15570:32;;15567:52;;;15615:1;15612;15605:12;15567:52;15666:8;15650:14;15646:29;15639:5;15635:41;15632:61;;;15689:1;15686;15679:12;15632:61;15714:59;15768:4;15758:8;15753:2;15744:7;15740:16;15714:59;:::i;:::-;15831:12;;;;15706:67;-1:-1:-1;;;15796:15:1;;;;15225:1;15218:9;15189:664;;;-1:-1:-1;15869:4:1;;14849:1030;-1:-1:-1;;;;;;;14849:1030:1:o;15884:470::-;15984:6;15979:3;15972:19;15954:3;16010:4;16039:2;16034:3;16030:12;16023:19;;16065:5;16088:1;16098:231;16112:6;16109:1;16106:13;16098:231;;;-1:-1:-1;;;;;16177:26:1;16196:6;16177:26;:::i;:::-;16173:75;16161:88;;16269:12;;;;16304:15;;;;16134:1;16127:9;16098:231;;;-1:-1:-1;16345:3:1;;15884:470;-1:-1:-1;;;;;15884:470:1:o;16359:401::-;16459:6;16454:3;16447:19;16429:3;16489:66;16481:6;16478:78;16475:98;;;16569:1;16566;16559:12;16475:98;16605:6;16602:1;16598:14;16657:8;16650:5;16643:4;16638:3;16634:14;16621:45;16734:1;16689:18;;16709:4;16685:29;16723:13;;;-1:-1:-1;16685:29:1;;16359:401;-1:-1:-1;;16359:401:1:o;16765:939::-;17196:3;17185:9;17178:22;17159:4;17223:45;17263:3;17252:9;17248:19;17240:6;17223:45;:::i;:::-;17316:9;17308:6;17304:22;17299:2;17288:9;17284:18;17277:50;17350:68;17411:6;17403;17395;17350:68;:::i;:::-;17336:82;;17466:9;17458:6;17454:22;17449:2;17438:9;17434:18;17427:50;17500:61;17554:6;17546;17538;17500:61;:::i;:::-;17486:75;;17609:9;17601:6;17597:22;17592:2;17581:9;17577:18;17570:50;17637:61;17691:6;17683;17675;17637:61;:::i;:::-;17629:69;16765:939;-1:-1:-1;;;;;;;;;;16765:939:1:o;17709:127::-;17770:10;17765:3;17761:20;17758:1;17751:31;17801:4;17798:1;17791:15;17825:4;17822:1;17815:15;17841:125;17881:4;17909:1;17906;17903:8;17900:34;;;17914:18;;:::i;:::-;-1:-1:-1;17951:9:1;;17841:125::o;19994:495::-;20247:6;20242:3;20235:19;20284:6;20279:2;20274:3;20270:12;20263:28;20335:6;20327;20322:2;20317:3;20313:12;20300:42;20404:2;20361:16;;20396:11;;;20438:18;20480:2;20472:11;;19994:495;-1:-1:-1;;;19994:495:1:o;20494:284::-;20552:6;20605:2;20593:9;20584:7;20580:23;20576:32;20573:52;;;20621:1;20618;20611:12;20573:52;20660:9;20647:23;20710:18;20703:5;20699:30;20692:5;20689:41;20679:69;;20744:1;20741;20734:12;20783:138;20862:1;20855:5;20852:12;20842:46;;20868:18;;:::i;20926:440::-;21151:3;21136:19;;21164:42;21140:9;21188:6;21164:42;:::i;:::-;21242:6;21237:2;21226:9;21222:18;21215:34;21297:18;21289:6;21285:31;21280:2;21269:9;21265:18;21258:59;21353:6;21348:2;21337:9;21333:18;21326:34;20926:440;;;;;;;:::o;21371:272::-;21446:6;21499:2;21487:9;21478:7;21474:23;21470:32;21467:52;;;21515:1;21512;21505:12;21467:52;21554:9;21541:23;21593:1;21586:5;21583:12;21573:40;;21609:1;21606;21599:12;21648:521;21725:4;21731:6;21791:11;21778:25;21885:2;21881:7;21870:8;21854:14;21850:29;21846:43;21826:18;21822:68;21812:96;;21904:1;21901;21894:12;21812:96;21931:33;;21983:20;;;-1:-1:-1;22026:18:1;22015:30;;22012:50;;;22058:1;22055;22048:12;22012:50;22091:4;22079:17;;-1:-1:-1;22122:14:1;22118:27;;;22108:38;;22105:58;;;22159:1;22156;22149:12;22174:556;22278:4;22284:6;22344:11;22331:25;22438:2;22434:7;22423:8;22407:14;22403:29;22399:43;22379:18;22375:68;22365:96;;22457:1;22454;22447:12;22365:96;22484:33;;22536:20;;;-1:-1:-1;22579:18:1;22568:30;;22565:50;;;22611:1;22608;22601:12;22565:50;22644:4;22632:17;;-1:-1:-1;22695:1:1;22691:14;;;22675;22671:35;22661:46;;22658:66;;;22720:1;22717;22710:12;24524:682;24784:4;-1:-1:-1;;;;;24894:2:1;24886:6;24882:15;24871:9;24864:34;24934:6;24929:2;24918:9;24914:18;24907:34;24989:2;24981:6;24977:15;24972:2;24961:9;24957:18;24950:43;;25029:6;25024:2;25013:9;25009:18;25002:34;25073:3;25067;25056:9;25052:19;25045:32;25094:62;25151:3;25140:9;25136:19;25128:6;25120;25094:62;:::i;:::-;25086:70;;25193:6;25187:3;25176:9;25172:19;25165:35;24524:682;;;;;;;;;;:::o;25211:168::-;25251:7;25317:1;25313;25309:6;25305:14;25302:1;25299:21;25294:1;25287:9;25280:17;25276:45;25273:71;;;25324:18;;:::i;:::-;-1:-1:-1;25364:9:1;;25211:168::o;25384:128::-;25424:3;25455:1;25451:6;25448:1;25445:13;25442:39;;;25461:18;;:::i;:::-;-1:-1:-1;25497:9:1;;25384:128::o;25975:575::-;26244:3;26233:9;26226:22;26207:4;26271:62;26328:3;26317:9;26313:19;26305:6;26297;26271:62;:::i;:::-;26369:6;26364:2;26353:9;26349:18;26342:34;26424:9;26416:6;26412:22;26407:2;26396:9;26392:18;26385:50;26452:49;26494:6;26486;26478;26452:49;:::i;:::-;26444:57;;;26537:6;26532:2;26521:9;26517:18;26510:34;25975:575;;;;;;;;;:::o;26555:508::-;-1:-1:-1;;;;;26800:6:1;26796:55;26785:9;26778:74;26888:6;26883:2;26872:9;26868:18;26861:34;26931:3;26926:2;26915:9;26911:18;26904:31;26759:4;26952:62;27009:3;26998:9;26994:19;26986:6;26978;26952:62;:::i;:::-;26944:70;;27050:6;27045:2;27034:9;27030:18;27023:34;26555:508;;;;;;;;:::o;29162:277::-;29229:6;29282:2;29270:9;29261:7;29257:23;29253:32;29250:52;;;29298:1;29295;29288:12;29250:52;29330:9;29324:16;29383:5;29376:13;29369:21;29362:5;29359:32;29349:60;;29405:1;29402;29395:12;32986:175;33092:1;33085:5;33082:12;33072:46;;33098:18;;:::i;:::-;33143:3;33139:15;33127:28;;32986:175::o;33166:411::-;33360:63;33419:3;33411:6;33360:63;:::i;:::-;33460:2;33456:15;;;;-1:-1:-1;;;;;;33452:53:1;33448:1;33439:11;;33432:74;33531:2;33522:12;;33515:28;33568:2;33559:12;;33166:411;-1:-1:-1;33166:411:1:o;33582:714::-;33840:4;-1:-1:-1;;;;;33950:2:1;33942:6;33938:15;33927:9;33920:34;34002:2;33994:6;33990:15;33985:2;33974:9;33970:18;33963:43;34042:6;34037:2;34026:9;34022:18;34015:34;34097:18;34089:6;34085:31;34080:2;34069:9;34065:18;34058:59;34154:3;34148;34137:9;34133:19;34126:32;34175:62;34232:3;34221:9;34217:19;34209:6;34201;34175:62;:::i;:::-;34167:70;;34286:2;34278:6;34274:15;34268:3;34257:9;34253:19;34246:44;;33582:714;;;;;;;;;;:::o;34301:274::-;34430:3;34468:6;34462:13;34484:53;34530:6;34525:3;34518:4;34510:6;34506:17;34484:53;:::i;:::-;34553:16;;;;;34301:274;-1:-1:-1;;34301:274:1:o;34580:279::-;34669:6;34722:2;34710:9;34701:7;34697:23;34693:32;34690:52;;;34738:1;34735;34728:12;34690:52;34770:9;34764:16;34809:1;34802:5;34799:12;34789:40;;34825:1;34822;34815:12;34864:540;35127:3;35112:19;;35140:42;35116:9;35164:6;35140:42;:::i;:::-;35218:6;35213:2;35202:9;35198:18;35191:34;35234:52;35282:2;35271:9;35267:18;35259:6;35234:52;:::i;:::-;35334:18;35322:31;;;;35317:2;35302:18;;35295:59;35385:3;35370:19;35363:35;34864:540;;-1:-1:-1;;;34864:540:1:o;35409:966::-;35850:3;35839:9;35832:22;35813:4;35877:62;35934:3;35923:9;35919:19;35911:6;35903;35877:62;:::i;:::-;35987:9;35979:6;35975:22;35970:2;35959:9;35955:18;35948:50;36021:68;36082:6;36074;36066;36021:68;:::i;:::-;36007:82;;36137:9;36129:6;36125:22;36120:2;36109:9;36105:18;36098:50;36171:61;36225:6;36217;36209;36171:61;:::i;:::-;36157:75;;36280:9;36272:6;36268:22;36263:2;36252:9;36248:18;36241:50;36308:61;36362:6;36354;36346;36308:61;:::i;:::-;36300:69;35409:966;-1:-1:-1;;;;;;;;;;;35409:966:1:o;36380:184::-;36450:6;36503:2;36491:9;36482:7;36478:23;36474:32;36471:52;;;36519:1;36516;36509:12;36471:52;-1:-1:-1;36542:16:1;;36380:184;-1:-1:-1;36380:184:1:o;36922:460::-;37139:6;37134:3;37127:19;37201:26;37197:31;37188:6;37184:2;37180:15;37176:53;37171:2;37166:3;37162:12;37155:75;37109:3;37259:6;37253:13;37275:60;37328:6;37323:2;37318:3;37314:12;37309:2;37301:6;37297:15;37275:60;:::i;:::-;37355:16;;;;37373:2;37351:25;;36922:460;-1:-1:-1;;;;36922:460:1:o;37639:538::-;37843:4;-1:-1:-1;;;;;37953:2:1;37945:6;37941:15;37930:9;37923:34;37993:6;37988:2;37977:9;37973:18;37966:34;38036:3;38031:2;38020:9;38016:18;38009:31;38057:62;38114:3;38103:9;38099:19;38091:6;38083;38057:62;:::i;:::-;38049:70;;38167:2;38159:6;38155:15;38150:2;38139:9;38135:18;38128:43;;37639:538;;;;;;;;:::o;38182:217::-;38222:1;38248;38238:132;;38292:10;38287:3;38283:20;38280:1;38273:31;38327:4;38324:1;38317:15;38355:4;38352:1;38345:15;38238:132;-1:-1:-1;38384:9:1;;38182:217::o;38404:219::-;38553:2;38542:9;38535:21;38516:4;38573:44;38613:2;38602:9;38598:18;38590:6;38573:44;:::i;38862:1004::-;39210:63;39269:3;39261:6;39210:63;:::i;:::-;39192:3;39302:6;39296:13;39318:61;39372:6;39368:1;39363:3;39359:11;39352:4;39344:6;39340:17;39318:61;:::i;:::-;39407:6;39402:3;39398:16;39388:26;;39467;39463:31;39454:6;39450:2;39446:15;39442:53;39438:1;39434:2;39430:10;39423:73;-1:-1:-1;;;;;;39632:2:1;39623:6;39618:3;39614:16;39610:25;39605:2;39601;39597:11;39590:46;39665:6;39660:2;39656;39652:11;39645:27;39723:2;39714:6;39709:3;39705:16;39701:25;39696:2;39692;39688:11;39681:46;;39770:6;39762;39757:2;39753;39749:11;39736:41;39840:1;39800:15;;39817:2;39796:24;39829:13;;;-1:-1:-1;39796:24:1;;38862:1004;-1:-1:-1;;;;;;;;38862:1004:1:o;39871:561::-;40073:4;-1:-1:-1;;;;;40183:2:1;40175:6;40171:15;40160:9;40153:34;40235:18;40227:6;40223:31;40218:2;40207:9;40203:18;40196:59;40291:3;40286:2;40275:9;40271:18;40264:31;40312:62;40369:3;40358:9;40354:19;40346:6;40338;40312:62;:::i;40437:620::-;40694:3;40683:9;40676:22;40657:4;40721:45;40761:3;40750:9;40746:19;40738:6;40721:45;:::i;:::-;40814:18;40806:6;40802:31;40797:2;40786:9;40782:18;40775:59;40882:9;40874:6;40870:22;40865:2;40854:9;40850:18;40843:50;40910:49;40952:6;40944;40936;40910:49;:::i;:::-;40902:57;;;-1:-1:-1;;;;;40999:6:1;40995:55;40990:2;40979:9;40975:18;40968:83;40437:620;;;;;;;;:::o;41062:127::-;41123:10;41118:3;41114:20;41111:1;41104:31;41154:4;41151:1;41144:15;41178:4;41175:1;41168:15;41194:884;41274:6;41327:2;41315:9;41306:7;41302:23;41298:32;41295:52;;;41343:1;41340;41333:12;41295:52;41376:9;41370:16;41405:18;41446:2;41438:6;41435:14;41432:34;;;41462:1;41459;41452:12;41432:34;41500:6;41489:9;41485:22;41475:32;;41545:7;41538:4;41534:2;41530:13;41526:27;41516:55;;41567:1;41564;41557:12;41516:55;41596:2;41590:9;41618:2;41614;41611:10;41608:36;;;41624:18;;:::i;:::-;41699:2;41693:9;41667:2;41753:13;;-1:-1:-1;;41749:22:1;;;41773:2;41745:31;41741:40;41729:53;;;41797:18;;;41817:22;;;41794:46;41791:72;;;41843:18;;:::i;:::-;41883:10;41879:2;41872:22;41918:2;41910:6;41903:18;41958:7;41953:2;41948;41944;41940:11;41936:20;41933:33;41930:53;;;41979:1;41976;41969:12;41930:53;41992:55;42044:2;42039;42031:6;42027:15;42022:2;42018;42014:11;41992:55;:::i;:::-;42066:6;41194:884;-1:-1:-1;;;;;;;41194:884:1:o;42083:127::-;42144:10;42139:3;42135:20;42132:1;42125:31;42175:4;42172:1;42165:15;42199:4;42196:1;42189:15;42215:135;42254:3;-1:-1:-1;;42275:17:1;;42272:43;;;42295:18;;:::i;:::-;-1:-1:-1;42342:1:1;42331:13;;42215:135::o
Metadata Hash
30a31e979f9f1c54dbfdc533ca32347c1afe60a5658938efede5b8e9e8dc79a0
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.