Source Code
Overview
FTM Balance
0 FTM
More Info
ContractCreator:
Multichain Info
N/A
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
0x60a06040 | 8586447 | 730 days ago | IN | Create: MessageBus | 0 FTM | 0.64505999 |
Latest 25 internal transactions (View All)
Parent Txn Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
10163796 | 582 days ago | 0.002 FTM | ||||
10163681 | 582 days ago | 0.002 FTM | ||||
10163500 | 582 days ago | 0.002 FTM | ||||
10162665 | 582 days ago | 0.002 FTM | ||||
10162646 | 582 days ago | 0.002 FTM | ||||
10157517 | 583 days ago | 0.002 FTM | ||||
10157514 | 583 days ago | 0.002 FTM | ||||
10157472 | 583 days ago | 0.002 FTM | ||||
10157286 | 583 days ago | 0.002 FTM | ||||
10157273 | 583 days ago | 0.002 FTM | ||||
10157260 | 583 days ago | 0.002 FTM | ||||
10157256 | 583 days ago | 0.002 FTM | ||||
10157159 | 583 days ago | 0.002 FTM | ||||
10157133 | 583 days ago | 0.002 FTM | ||||
10157092 | 583 days ago | 0.002 FTM | ||||
10157077 | 583 days ago | 0.002 FTM | ||||
10157077 | 583 days ago | 0.002 FTM | ||||
10157070 | 583 days ago | 0.002 FTM | ||||
10157070 | 583 days ago | 0.002 FTM | ||||
10157052 | 583 days ago | 0.002 FTM | ||||
10157052 | 583 days ago | 0.002 FTM | ||||
10156297 | 583 days ago | 0.002 FTM | ||||
10156297 | 583 days ago | 0.002 FTM | ||||
10156294 | 583 days ago | 0.002 FTM | ||||
10156294 | 583 days ago | 0.002 FTM |
Loading...
Loading
Contract Name:
MessageBus
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0-only pragma solidity 0.8.9; import "./MessageBusSender.sol"; import "./MessageBusReceiver.sol"; 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); } }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity 0.8.9; import "../../safeguard/Ownable.sol"; import "../../interfaces/ISigsVerifier.sol"; 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); event MessageWithTransfer( address indexed sender, address receiver, uint256 dstChainId, address bridge, bytes32 srcTransferId, bytes message, uint256 fee ); event FeeBaseUpdated(uint256 feeBase); event FeePerByteUpdated(uint256 feePerByte); constructor(ISigsVerifier _sigsVerifier) { sigsVerifier = _sigsVerifier; } /** * @notice Sends a message to an app on another chain via MessageBus without an associated transfer. * 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 { require(_dstChainId != block.chainid, "Invalid chainId"); uint256 minFee = calcFee(_message); require(msg.value >= minFee, "Insufficient fee"); emit Message(msg.sender, _receiver, _dstChainId, _message, msg.value); } /** * @notice Sends a message associated with a transfer to an app on another chain via MessageBus without an associated transfer. * 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"); } /** * @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); } }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. * * This adds a normal func that setOwner if _owner is address(0). So we can't allow * renounceOwnership. So we can support Proxy based upgradable contract */ abstract contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(msg.sender); } /** * @dev Only to be called by inherit contracts, in their init func called by Proxy * we require _owner == address(0), which is only possible when it's a delegateCall * because constructor sets _owner in contract state. */ function initOwner() internal { require(_owner == address(0), "owner already set"); _setOwner(msg.sender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == msg.sender, "Ownable: caller is not the owner"); _; } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.8.0; 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; }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity 0.8.9; import "../libraries/MsgDataTypes.sol"; import "../interfaces/IMessageReceiverApp.sol"; import "../interfaces/IMessageBus.sol"; import "../../interfaces/IBridge.sol"; import "../../interfaces/IOriginalTokenVault.sol"; import "../../interfaces/IOriginalTokenVaultV2.sol"; import "../../interfaces/IPeggedTokenBridge.sol"; import "../../interfaces/IPeggedTokenBridgeV2.sol"; import "../../safeguard/Ownable.sol"; 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 _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 { // 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), "Message")); 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.RouteInfo calldata _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.RouteInfo calldata _route, bytes calldata _message) private view returns (bytes32) { return keccak256( abi.encodePacked( MsgDataTypes.MsgType.MessageOnly, _route.sender, _route.receiver, _route.srcChainId, _route.srcTxHash, uint64(block.chainid), _message ) ); } function executeMessage(MsgDataTypes.RouteInfo calldata _route, bytes calldata _message) private returns (IMessageReceiverApp.ExecutionStatus) { uint256 gasLeftBeforeExecution = gasleft(); (bool ok, bytes memory res) = address(_route.receiver).call{value: msg.value}( abi.encodeWithSelector( IMessageReceiverApp.executeMessage.selector, _route.sender, _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() } } emit CallReverted(getRevertMsg(_returnData)); } // 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 } // ================= 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; } }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity 0.8.9; library MsgDataTypes { // 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 } struct MsgWithTransferExecutionParams { bytes message; TransferInfo transfer; bytes[] sigs; address[] signers; uint256[] powers; } struct BridgeTransferParams { bytes request; bytes[] sigs; address[] signers; uint256[] powers; } }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.8.0; interface IMessageReceiverApp { enum ExecutionStatus { Fail, // execution failed, finalized Success, // execution succeeded, finalized Retry // execution rejected, can retry later } /** * @notice Called by MessageBus (MessageBusReceiver) if the process is originated from MessageBus (MessageBusSender)'s * sendMessageWithTransfer it is only called when the tokens are checked to be arrived at this contract's address. * @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. * the contract that implements this contract can safely assume that the tokens will arrive before this * function is called. * @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 (MessageBusReceiver) if * 1. executeMessageWithTransfer reverts, or * 2. executeMessageWithTransfer returns ExecutionStatus.Fail * @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. * the contract that implements this contract can safely assume that the tokens will arrive before this * function is called. * @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 (MessageBusReceiver) to process refund of the original transfer from this contract * @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); /** * @notice Called by MessageBus (MessageBusReceiver) * @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); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.8.0; import "../libraries/MsgDataTypes.sol"; interface IMessageBus { function liquidityBridge() external view returns (address); function pegBridge() external view returns (address); function pegBridgeV2() external view returns (address); function pegVault() external view returns (address); function pegVaultV2() external view returns (address); /** * @notice Calculates the required fee for the message. * @param _message Arbitrary message bytes to be decoded by the destination app contract. @ @return The required fee. */ function calcFee(bytes calldata _message) external view returns (uint256); /** * @notice Sends a message to an app on another chain via MessageBus without an associated transfer. * 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; /** * @notice Sends a message associated with a transfer to an app on another chain via MessageBus without an associated transfer. * A fee is charged in the native token. * @param _receiver The address of the destination app contract. * @param _dstChainId The destination chain ID. * @param _srcBridge The bridge contract to send the transfer with. * @param _srcTransferId The transfer ID. * @param _dstChainId The destination chain ID. * @param _message Arbitrary message bytes to be decoded by the destination app contract. */ function sendMessageWithTransfer( address _receiver, uint256 _dstChainId, address _srcBridge, bytes32 _srcTransferId, bytes calldata _message ) external payable; /** * @notice Withdraws message fee in the form of native gas token. * @param _account The address receiving the fee. * @param _cumulativeFee The cumulative fee credited to the account. Tracked by SGN. * @param _sigs The list of signatures sorted by signing addresses in ascending order. A withdrawal must be * signed-off by +2/3 of the sigsVerifier's current signing power to be delivered. * @param _signers The sorted list of signers. * @param _powers The signing powers of the signers. */ function withdrawFee( address _account, uint256 _cumulativeFee, bytes[] calldata _sigs, address[] calldata _signers, uint256[] calldata _powers ) external; /** * @notice Execute a message with a successful transfer. * @param _message Arbitrary message bytes originated from and encoded by the source app contract * @param _transfer The transfer info. * @param _sigs The list of signatures sorted by signing addresses in ascending order. A relay must be signed-off by * +2/3 of the sigsVerifier's current signing power to be delivered. * @param _signers The sorted list of signers. * @param _powers The signing powers of the signers. */ function executeMessageWithTransfer( bytes calldata _message, MsgDataTypes.TransferInfo calldata _transfer, bytes[] calldata _sigs, address[] calldata _signers, uint256[] calldata _powers ) external payable; /** * @notice Execute a message with a refunded transfer. * @param _message Arbitrary message bytes originated from and encoded by the source app contract * @param _transfer The transfer info. * @param _sigs The list of signatures sorted by signing addresses in ascending order. A relay must be signed-off by * +2/3 of the sigsVerifier's current signing power to be delivered. * @param _signers The sorted list of signers. * @param _powers The signing powers of the signers. */ function executeMessageWithTransferRefund( bytes calldata _message, // the same message associated with the original transfer MsgDataTypes.TransferInfo calldata _transfer, bytes[] calldata _sigs, address[] calldata _signers, uint256[] calldata _powers ) external payable; /** * @notice Execute a message not associated with a transfer. * @param _message Arbitrary message bytes originated from and encoded by the source app contract * @param _sigs The list of signatures sorted by signing addresses in ascending order. A relay must be signed-off by * +2/3 of the sigsVerifier's current signing power to be delivered. * @param _signers The sorted list of signers. * @param _powers The signing powers of the signers. */ function executeMessage( bytes calldata _message, MsgDataTypes.RouteInfo calldata _route, bytes[] calldata _sigs, address[] calldata _signers, uint256[] calldata _powers ) external payable; }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.8.0; interface IBridge { function send( address _receiver, address _token, uint256 _amount, uint64 _dstChainId, uint64 _nonce, uint32 _maxSlippage ) external; 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; }
// SPDX-License-Identifier: GPL-3.0-only 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 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); }
// SPDX-License-Identifier: GPL-3.0-only 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 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); }
// SPDX-License-Identifier: GPL-3.0-only 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); }
// SPDX-License-Identifier: GPL-3.0-only 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); }
{ "metadata": { "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 800 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
[{"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":"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":"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":"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":"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
60a06040523480156200001157600080fd5b50604051620039be380380620039be83398101604081905262000034916200011d565b84848484848a6200004533620000b4565b6001600160a01b03908116608052600580546001600160a01b0319908116978316979097179055600680548716958216959095179094556007805486169385169390931790925560088054851691841691909117905560098054909316911617905550620001b1945050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146200011a57600080fd5b50565b60008060008060008060c087890312156200013757600080fd5b8651620001448162000104565b6020880151909650620001578162000104565b60408801519095506200016a8162000104565b60608801519094506200017d8162000104565b6080880151909350620001908162000104565b60a0880151909250620001a38162000104565b809150509295509295509295565b6080516137ea620001d4600039600081816104b201526107f701526137ea6000f3fe6080604052600436106101d85760003560e01c806382980dc411610102578063ccf2683b11610095578063e2c1ed2511610064578063e2c1ed2514610551578063f2fde38b14610571578063f60bbe2a14610591578063f83b0fb9146105a757600080fd5b8063ccf2683b146104a0578063cd2abd66146104d4578063d8257d1714610511578063dfa2dbaf1461053157600080fd5b806395e911a8116100d157806395e911a8146104375780639b05a7751461044d5780639f3ce55a1461046d578063c66a9c5a1461048057600080fd5b806382980dc4146103a157806382efd502146103d95780638da5cb5b146103f957806395b12c271461041757600080fd5b80634586f3311161017a578063588be02b11610149578063588be02b146103215780635b3e5f5014610341578063723d0a9d1461036e5780637b80ab201461038e57600080fd5b80634586f331146102a5578063468a2d04146102c55780635335dca2146102d8578063584e45e11461030b57600080fd5b8063359ef75b116101b6578063359ef75b1461023f5780633f395aff1461025f57806340d0d026146102725780634289fbb31461029257600080fd5b806303cbfe66146101dd57806306c28bd6146101ff5780632ff4c4111461021f575b600080fd5b3480156101e957600080fd5b506101fd6101f8366004612a6b565b6105c7565b005b34801561020b57600080fd5b506101fd61021a366004612a86565b6106c0565b34801561022b57600080fd5b506101fd61023a366004612aeb565b61074c565b34801561024b57600080fd5b506101fd61025a366004612b9f565b6109a5565b6101fd61026d366004612c46565b6109c1565b34801561027e57600080fd5b506101fd61028d366004612d4f565b610cb4565b6101fd6102a0366004612dbb565b610d0c565b3480156102b157600080fd5b506101fd6102c0366004612a86565b610df5565b6101fd6102d3366004612e33565b610e51565b3480156102e457600080fd5b506102f86102f3366004612ef8565b6110cd565b6040519081526020015b60405180910390f35b34801561031757600080fd5b506102f8600a5481565b34801561032d57600080fd5b506101fd61033c366004612a6b565b6110f3565b34801561034d57600080fd5b506102f861035c366004612a6b565b60036020526000908152604090205481565b34801561037a57600080fd5b506101fd610389366004612d4f565b6111e0565b6101fd61039c366004612c46565b61122e565b3480156103ad57600080fd5b506005546103c1906001600160a01b031681565b6040516001600160a01b039091168152602001610302565b3480156103e557600080fd5b506101fd6103f4366004612a6b565b61143d565b34801561040557600080fd5b506000546001600160a01b03166103c1565b34801561042357600080fd5b506008546103c1906001600160a01b031681565b34801561044357600080fd5b506102f860015481565b34801561045957600080fd5b506101fd610468366004612a6b565b61152a565b6101fd61047b366004612f3a565b611617565b34801561048c57600080fd5b506009546103c1906001600160a01b031681565b3480156104ac57600080fd5b506103c17f000000000000000000000000000000000000000000000000000000000000000081565b3480156104e057600080fd5b506105046104ef366004612a86565b60046020526000908152604090205460ff1681565b6040516103029190612fbe565b34801561051d57600080fd5b506007546103c1906001600160a01b031681565b34801561053d57600080fd5b506006546103c1906001600160a01b031681565b34801561055d57600080fd5b506101fd61056c366004612a86565b6116fa565b34801561057d57600080fd5b506101fd61058c366004612a6b565b611786565b34801561059d57600080fd5b506102f860025481565b3480156105b357600080fd5b506101fd6105c2366004612a6b565b611865565b336105da6000546001600160a01b031690565b6001600160a01b0316146106235760405162461bcd60e51b8152602060048201819052602482015260008051602061379583398151915260448201526064015b60405180910390fd5b6001600160a01b03811661066b5760405162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b604482015260640161061a565b600680546001600160a01b0319166001600160a01b0383169081179091556040519081527fd60e9ceb4f54f1bfb1741a4b35fc9d806d7ed48200b523203b92248ea38fa17d906020015b60405180910390a150565b336106d36000546001600160a01b031690565b6001600160a01b0316146107175760405162461bcd60e51b81526020600482018190526024820152600080516020613795833981519152604482015260640161061a565b60018190556040518181527f892dfdc99ecd3bb4f2f2cb118dca02f0bd16640ff156d3c6459d4282e336a5f2906020016106b5565b6000463060405160200161079d92919091825260601b6001600160601b03191660208201527f77697468647261774665650000000000000000000000000000000000000000006034820152603f0190565b60408051808303601f19018152828252805160209182012090830181905260608c901b6001600160601b0319168383015260548084018c9052825180850390910181526074840192839052633416de1160e11b90925292507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163682dbc229161083e918b908b908b908b908b908b90607801613178565b60006040518083038186803b15801561085657600080fd5b505afa15801561086a573d6000803e3d6000fd5b505050506001600160a01b038916600090815260036020526040812054610891908a6131ec565b9050600081116108e35760405162461bcd60e51b815260206004820152601960248201527f4e6f206e657720616d6f756e7420746f20776974686472617700000000000000604482015260640161061a565b6001600160a01b038a166000818152600360205260408082208c90555190919061c35090849084818181858888f193505050503d8060008114610942576040519150601f19603f3d011682016040523d82523d6000602084013e610947565b606091505b50509050806109985760405162461bcd60e51b815260206004820152601660248201527f6661696c656420746f2077697468647261772066656500000000000000000000604482015260640161061a565b5050505050505050505050565b6109ad611952565b6109ba85858585856119b6565b5050505050565b60006109cc88611a6e565b90506000808281526004602081905260409091205460ff16908111156109f4576109f4612f94565b14610a415760405162461bcd60e51b815260206004820152601960248201527f7472616e7366657220616c726561647920657865637574656400000000000000604482015260640161061a565b6000818152600460208181526040808420805460ff1916909317909255815146918101919091526001600160601b03193060601b16918101919091527f4d657373616765576974685472616e73666572000000000000000000000000006054820152606701604051602081830303815290604052805190602001209050600560009054906101000a90046001600160a01b03166001600160a01b031663682dbc2282848e8e8e6101000135604051602001610b00959493929190613203565b6040516020818303038152906040528a8a8a8a8a8a6040518863ffffffff1660e01b8152600401610b379796959493929190613178565b60006040518083038186803b158015610b4f57600080fd5b505afa158015610b63573d6000803e3d6000fd5b50505050600080610b758b8e8e612327565b90506001816002811115610b8b57610b8b612f94565b1415610b9a5760019150610c64565b6002816002811115610bae57610bae612f94565b1415610c2f576000848152600460205260408120805460ff19166001835b02179055507fe49c2c954d381d1448cf824743aeff9da7a1d82078a7c9e5817269cc359bd26c6000858d60c0016020810190610c089190613225565b8e6101000135604051610c1e949392919061325f565b60405180910390a150505050610ca9565b610c3a8b8e8e61248f565b90506001816002811115610c5057610c50612f94565b1415610c5f5760039150610c64565b600291505b60008481526004602081905260409091208054849260ff19909116906001908490811115610c9457610c94612f94565b0217905550610ca484838d6124ca565b505050505b505050505050505050565b610ccd610cc76040830160208401613292565b8361253c565b610d08610cda82806132b3565b60208401610cec6101408601866132fa565b610cfa6101608801886132fa565b61039c6101808a018a6132fa565b5050565b46851415610d4e5760405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a590818da185a5b9259608a1b604482015260640161061a565b6000610d5a83836110cd565b905080341015610d9f5760405162461bcd60e51b815260206004820152601060248201526f496e73756666696369656e742066656560801b604482015260640161061a565b336001600160a01b03167f172762498a59a3bc4fed3f2b63f94f17ea0193cffdc304fe7d3eaf4d342d2f6688888888888834604051610de49796959493929190613344565b60405180910390a250505050505050565b33610e086000546001600160a01b031690565b6001600160a01b031614610e4c5760405162461bcd60e51b81526020600482018190526024820152600080516020613795833981519152604482015260640161061a565b600a55565b6000610e5e888b8b61279b565b90506000808281526004602081905260409091205460ff1690811115610e8657610e86612f94565b14610ed35760405162461bcd60e51b815260206004820152601860248201527f6d65737361676520616c72656164792065786563757465640000000000000000604482015260640161061a565b600081815260046020818152604092839020805460ff1916909217909155815146818301523060601b6001600160601b031916818401527f4d6573736167650000000000000000000000000000000000000000000000000060548201528251603b818303018152605b820184528051920191909120600554607b8301829052609b8084018690528451808503909101815260bb840194859052633416de1160e11b90945290926001600160a01b039091169163682dbc2291610fa3918c908c908c908c908c908c9060bf01613178565b60006040518083038186803b158015610fbb57600080fd5b505afa158015610fcf573d6000803e3d6000fd5b50505050600080610fe18b8e8e61280a565b90506001816002811115610ff757610ff7612f94565b1415611006576001915061108d565b600281600281111561101a5761101a612f94565b1415611088576000848152600460205260408120805460ff191660018302179055507fe49c2c954d381d1448cf824743aeff9da7a1d82078a7c9e5817269cc359bd26c6001858d60400160208101906110739190613225565b8e60600135604051610c1e949392919061325f565b600291505b60008481526004602081905260409091208054849260ff199091169060019084908111156110bd576110bd612f94565b0217905550610ca484838d612869565b6002546000906110dd9083613391565b6001546110ea91906133b0565b90505b92915050565b336111066000546001600160a01b031690565b6001600160a01b03161461114a5760405162461bcd60e51b81526020600482018190526024820152600080516020613795833981519152604482015260640161061a565b6001600160a01b0381166111925760405162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b604482015260640161061a565b600580546001600160a01b0319166001600160a01b0383169081179091556040519081527fbf9977180dc6e6cff25598c8e59150cecd7f8e448e092633d38ab7ee223ae058906020016106b5565b6111f3610cc76040830160208401613292565b610d0861120082806132b3565b602084016112126101408601866132fa565b6112206101608801886132fa565b61026d6101808a018a6132fa565b600061123988611a6e565b90506000808281526004602081905260409091205460ff169081111561126157611261612f94565b146112ae5760405162461bcd60e51b815260206004820152601960248201527f7472616e7366657220616c726561647920657865637574656400000000000000604482015260640161061a565b6000818152600460208181526040808420805460ff1916909317909255815146918101919091526001600160601b03193060601b16918101919091527f4d657373616765576974685472616e73666572526566756e64000000000000006054820152606d01604051602081830303815290604052805190602001209050600560009054906101000a90046001600160a01b03166001600160a01b031663682dbc2282848e8e8e610100013560405160200161136d959493929190613203565b6040516020818303038152906040528a8a8a8a8a8a6040518863ffffffff1660e01b81526004016113a49796959493929190613178565b60006040518083038186803b1580156113bc57600080fd5b505afa1580156113d0573d6000803e3d6000fd5b505050506000806113e28b8e8e6128cd565b905060018160028111156113f8576113f8612f94565b14156114075760019150610c64565b600281600281111561141b5761141b612f94565b1415610c5f576000848152600460205260408120805460ff1916600183610bcc565b336114506000546001600160a01b031690565b6001600160a01b0316146114945760405162461bcd60e51b81526020600482018190526024820152600080516020613795833981519152604482015260640161061a565b6001600160a01b0381166114dc5760405162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b604482015260640161061a565b600880546001600160a01b0319166001600160a01b0383169081179091556040519081527ffb337a6c76476534518d5816caeb86263972470fedccfd047a35eb1825eaa9e8906020016106b5565b3361153d6000546001600160a01b031690565b6001600160a01b0316146115815760405162461bcd60e51b81526020600482018190526024820152600080516020613795833981519152604482015260640161061a565b6001600160a01b0381166115c95760405162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b604482015260640161061a565b600780546001600160a01b0319166001600160a01b0383169081179091556040519081527fa9db0c32d9c6c2f75f3b95047a9e67cc1c010eab792a4e6ca777ce918ad94aad906020016106b5565b468314156116595760405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a590818da185a5b9259608a1b604482015260640161061a565b600061166583836110cd565b9050803410156116aa5760405162461bcd60e51b815260206004820152601060248201526f496e73756666696369656e742066656560801b604482015260640161061a565b336001600160a01b03167fce3972bfffe49d317e1d128047a97a3d86b25c94f6f04409f988ef854d25e0e486868686346040516116eb9594939291906133c8565b60405180910390a25050505050565b3361170d6000546001600160a01b031690565b6001600160a01b0316146117515760405162461bcd60e51b81526020600482018190526024820152600080516020613795833981519152604482015260640161061a565b60028190556040518181527f210d4d5d2d36d571207dac98e383e2441c684684c885fb2d7c54f8d24422074c906020016106b5565b336117996000546001600160a01b031690565b6001600160a01b0316146117dd5760405162461bcd60e51b81526020600482018190526024820152600080516020613795833981519152604482015260640161061a565b6001600160a01b0381166118595760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161061a565b61186281612924565b50565b336118786000546001600160a01b031690565b6001600160a01b0316146118bc5760405162461bcd60e51b81526020600482018190526024820152600080516020613795833981519152604482015260640161061a565b6001600160a01b0381166119045760405162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b604482015260640161061a565b600980546001600160a01b0319166001600160a01b0383169081179091556040519081527f918a691a2a82482a10e11f43d7b627b2ba220dd08f251cb61933c42560f6fcb5906020016106b5565b6000546001600160a01b0316156119ab5760405162461bcd60e51b815260206004820152601160248201527f6f776e657220616c726561647920736574000000000000000000000000000000604482015260640161061a565b6119b433612924565b565b6005546001600160a01b031615611a0f5760405162461bcd60e51b815260206004820152601b60248201527f6c697175696469747942726964676520616c7265616479207365740000000000604482015260640161061a565b600580546001600160a01b03199081166001600160a01b03978816179091556006805482169587169590951790945560078054851693861693909317909255600880548416918516919091179055600980549092169216919091179055565b600080806001611a816020860186613292565b6006811115611a9257611a92612f94565b1415611c2d57611aa86040850160208601612a6b565b611ab86060860160408701612a6b565b611ac86080870160608801612a6b565b6080870135611add60e0890160c08a01613225565b6040516001600160601b0319606096871b8116602083015294861b851660348201529290941b9092166048820152605c8101919091526001600160c01b031960c092831b8116607c8301524690921b909116608482015260e0850135608c82015260ac0160408051808303601f19018152908290528051602090910120600554633c64f04b60e01b8352600483018290529093506001600160a01b031691508190633c64f04b9060240160206040518083038186803b158015611b9f57600080fd5b505afa158015611bb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd79190613403565b1515600114611c285760405162461bcd60e51b815260206004820152601660248201527f6272696467652072656c6179206e6f7420657869737400000000000000000000604482015260640161061a565b6122f2565b6002611c3c6020860186613292565b6006811115611c4d57611c4d612f94565b1415611dba5746611c6460c0860160a08701613225565b611c746060870160408801612a6b565b611c846080880160608901612a6b565b6040516001600160c01b031960c095861b811660208301529390941b90921660288401526001600160601b0319606091821b8116603085015291901b1660448201526080850135605882015260780160408051808303601f19018152908290528051602090910120600554631c13568560e31b8352600483018290529093506001600160a01b03169150819063e09ab4289060240160206040518083038186803b158015611d3157600080fd5b505afa158015611d45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d699190613403565b1515600114611c285760405162461bcd60e51b815260206004820152601960248201527f627269646765207769746864726177206e6f7420657869737400000000000000604482015260640161061a565b6003611dc96020860186613292565b6006811115611dda57611dda612f94565b1480611e0357506004611df06020860186613292565b6006811115611e0157611e01612f94565b145b1561208557611e186060850160408601612a6b565b611e286080860160608701612a6b565b6080860135611e3d6040880160208901612a6b565b611e4d60e0890160c08a01613225565b604051606095861b6001600160601b0319908116602083015294861b851660348201526048810193909352931b909116606882015260c09190911b6001600160c01b031916607c82015260e0850135608482015260a40160408051601f19818403018152919052805160209091012091506003611ecd6020860186613292565b6006811115611ede57611ede612f94565b1415611fb557506006546040516301e6472560e01b8152600481018390526001600160a01b039091169081906301e64725906024015b60206040518083038186803b158015611f2c57600080fd5b505afa158015611f40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f649190613403565b1515600114611c285760405162461bcd60e51b815260206004820152601560248201527f6d696e74207265636f7264206e6f742065786973740000000000000000000000604482015260640161061a565b506007546040516301e6472560e01b8152600481018390526001600160a01b039091169081906301e647259060240160206040518083038186803b158015611ffc57600080fd5b505afa158015612010573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120349190613403565b1515600114611c285760405162461bcd60e51b815260206004820152601960248201527f7769746864726177207265636f7264206e6f7420657869737400000000000000604482015260640161061a565b60056120946020860186613292565b60068111156120a5576120a5612f94565b14806120ce575060066120bb6020860186613292565b60068111156120cc576120cc612f94565b145b156122f25760056120e26020860186613292565b60068111156120f3576120f3612f94565b141561210b57506008546001600160a01b0316612119565b506009546001600160a01b03165b6121296060850160408601612a6b565b6121396080860160608701612a6b565b608086013561214e6040880160208901612a6b565b61215e60e0890160c08a01613225565b604051606095861b6001600160601b0319908116602083015294861b85166034820152604881019390935290841b8316606883015260c01b6001600160c01b031916607c82015260e087013560848201529183901b1660a482015260b80160408051601f198184030181529190528051602090910120915060056121e56020860186613292565b60068111156121f6576121f6612f94565b1415612229576040516301e6472560e01b8152600481018390526001600160a01b038216906301e6472590602401611f14565b6040516301e6472560e01b8152600481018390526001600160a01b038216906301e647259060240160206040518083038186803b15801561226957600080fd5b505afa15801561227d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122a19190613403565b15156001146122f25760405162461bcd60e51b815260206004820152601960248201527f7769746864726177207265636f7264206e6f7420657869737400000000000000604482015260640161061a565b600081836040516020016123089392919061343c565b6040516020818303038152906040528051906020012092505050919050565b6000805a90506000806123406060880160408901612a6b565b6001600160a01b031634631f34afff60e21b61236260408b0160208c01612a6b565b61237260808c0160608d01612a6b565b60808c013561238760e08e0160c08f01613225565b8c8c336040516024016123a09796959493929190613468565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161240b91906134c1565b60006040518083038185875af1925050503d8060008114612448576040519150601f19603f3d011682016040523d82523d6000602084013e61244d565b606091505b50915091508115612476578080602001905181019061246c91906134dd565b9350505050612488565b6124808382612974565b600093505050505b9392505050565b6000805a90506000806124a86060880160408901612a6b565b6001600160a01b031634632d5bd7e360e11b61236260408b0160208c01612a6b565b6124da6060820160408301612a6b565b6001600160a01b03167fa635eb05143f74743822bbd96428928de4c8ee8cc578299749be9425c17bb34d6000858561251860e0870160c08801613225565b86610100013560405161252f9594939291906134fe565b60405180910390a2505050565b600182600681111561255057612550612f94565b14156125f1576005546001600160a01b031663cdd1b25d61257183806132b3565b61257e60208601866132fa565b61258b60408801886132fa565b61259860608a018a6132fa565b6040518963ffffffff1660e01b81526004016125bb98979695949392919061353c565b600060405180830381600087803b1580156125d557600080fd5b505af11580156125e9573d6000803e3d6000fd5b505050505050565b600282600681111561260557612605612f94565b1415612626576005546001600160a01b031663a21a928061257183806132b3565b600382600681111561263a5761263a612f94565b141561265b576006546001600160a01b031663f873430261257183806132b3565b600582600681111561266f5761266f612f94565b1415612731576008546001600160a01b031663f873430261269083806132b3565b61269d60208601866132fa565b6126aa60408801886132fa565b6126b760608a018a6132fa565b6040518963ffffffff1660e01b81526004016126da98979695949392919061353c565b602060405180830381600087803b1580156126f457600080fd5b505af1158015612708573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061272c919061359c565b505050565b600482600681111561274557612745612f94565b1415612766576007546001600160a01b031663a21a928061257183806132b3565b600682600681111561277a5761277a612f94565b1415610d08576009546001600160a01b031663a21a928061269083806132b3565b600060016127ac6020860186612a6b565b6127bc6040870160208801612a6b565b6127cc6060880160408901613225565b87606001354688886040516020016127eb9897969594939291906135b5565b6040516020818303038152906040528051906020012090509392505050565b6000805a90506000806128236040880160208901612a6b565b6001600160a01b031634639c649fdf60e01b61284260208b018b612a6b565b61285260608c0160408d01613225565b8a8a336040516024016123a0959493929190613629565b6128796040820160208301612a6b565b6001600160a01b03167fa635eb05143f74743822bbd96428928de4c8ee8cc578299749be9425c17bb34d600185856128b76060870160408801613225565b866060013560405161252f9594939291906134fe565b6000805a90506000806128e66060880160408901612a6b565b6001600160a01b0316346305e5a4c160e11b61290860808b0160608c01612a6b565b8a608001358a8a336040516024016123a0959493929190613672565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60005a90506000600a544561298991906131ec565b905080841080156129a457506129a060408561369c565b8211155b156129ab57fe5b7fffdd6142bbb721f3400e3908b04b86f60649b2e4d191e3f4c50c32c3e6471d2f6129d5846129f0565b6040516129e291906136be565b60405180910390a150505050565b6060604482511015612a3557505060408051808201909152601d81527f5472616e73616374696f6e2072657665727465642073696c656e746c79000000602082015290565b600482019150818060200190518101906110ed91906136e7565b80356001600160a01b0381168114612a6657600080fd5b919050565b600060208284031215612a7d57600080fd5b6110ea82612a4f565b600060208284031215612a9857600080fd5b5035919050565b60008083601f840112612ab157600080fd5b50813567ffffffffffffffff811115612ac957600080fd5b6020830191508360208260051b8501011115612ae457600080fd5b9250929050565b60008060008060008060008060a0898b031215612b0757600080fd5b612b1089612a4f565b975060208901359650604089013567ffffffffffffffff80821115612b3457600080fd5b612b408c838d01612a9f565b909850965060608b0135915080821115612b5957600080fd5b612b658c838d01612a9f565b909650945060808b0135915080821115612b7e57600080fd5b50612b8b8b828c01612a9f565b999c989b5096995094979396929594505050565b600080600080600060a08688031215612bb757600080fd5b612bc086612a4f565b9450612bce60208701612a4f565b9350612bdc60408701612a4f565b9250612bea60608701612a4f565b9150612bf860808701612a4f565b90509295509295909350565b60008083601f840112612c1657600080fd5b50813567ffffffffffffffff811115612c2e57600080fd5b602083019150836020828501011115612ae457600080fd5b6000806000806000806000806000898b036101a0811215612c6657600080fd5b8a3567ffffffffffffffff80821115612c7e57600080fd5b612c8a8e838f01612c04565b909c509a508a9150610120601f1984011215612ca557600080fd5b60208d0199506101408d0135925080831115612cc057600080fd5b612ccc8e848f01612a9f565b90995097506101608d0135925088915080831115612ce957600080fd5b612cf58e848f01612a9f565b90975095506101808d0135925086915080831115612d1257600080fd5b5050612d208c828d01612a9f565b915080935050809150509295985092959850929598565b600060808284031215612d4957600080fd5b50919050565b60008060408385031215612d6257600080fd5b823567ffffffffffffffff80821115612d7a57600080fd5b612d8686838701612d37565b93506020850135915080821115612d9c57600080fd5b5083016101a08186031215612db057600080fd5b809150509250929050565b60008060008060008060a08789031215612dd457600080fd5b612ddd87612a4f565b955060208701359450612df260408801612a4f565b935060608701359250608087013567ffffffffffffffff811115612e1557600080fd5b612e2189828a01612c04565b979a9699509497509295939492505050565b60008060008060008060008060006101008a8c031215612e5257600080fd5b893567ffffffffffffffff80821115612e6a57600080fd5b612e768d838e01612c04565b909b509950899150612e8b8d60208e01612d37565b985060a08c0135915080821115612ea157600080fd5b612ead8d838e01612a9f565b909850965060c08c0135915080821115612ec657600080fd5b612ed28d838e01612a9f565b909650945060e08c0135915080821115612eeb57600080fd5b50612d208c828d01612a9f565b60008060208385031215612f0b57600080fd5b823567ffffffffffffffff811115612f2257600080fd5b612f2e85828601612c04565b90969095509350505050565b60008060008060608587031215612f5057600080fd5b612f5985612a4f565b935060208501359250604085013567ffffffffffffffff811115612f7c57600080fd5b612f8887828801612c04565b95989497509550505050565b634e487b7160e01b600052602160045260246000fd5b60058110612fba57612fba612f94565b9052565b602081016110ed8284612faa565b60005b83811015612fe7578181015183820152602001612fcf565b83811115612ff6576000848401525b50505050565b60008151808452613014816020860160208601612fcc565b601f01601f19169290920160200192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b81835260006020808501808196508560051b810191508460005b878110156130d55782840389528135601e1988360301811261308c57600080fd5b8701803567ffffffffffffffff8111156130a557600080fd5b8036038913156130b457600080fd5b6130c18682898501613028565b9a87019a955050509084019060010161306b565b5091979650505050505050565b8183526000602080850194508260005b8581101561311e576001600160a01b0361310b83612a4f565b16875295820195908201906001016130f2565b509495945050505050565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561315b57600080fd5b8260051b8083602087013760009401602001938452509192915050565b60808152600061318b608083018a612ffc565b828103602084015261319e81898b613051565b905082810360408401526131b38187896130e2565b905082810360608401526131c8818587613129565b9a9950505050505050505050565b634e487b7160e01b600052601160045260246000fd5b6000828210156131fe576131fe6131d6565b500390565b8581528460208201528284604083013760409201918201526060019392505050565b60006020828403121561323757600080fd5b813567ffffffffffffffff8116811461248857600080fd5b60028110612fba57612fba612f94565b6080810161326d828761324f565b84602083015267ffffffffffffffff8416604083015282606083015295945050505050565b6000602082840312156132a457600080fd5b81356007811061248857600080fd5b6000808335601e198436030181126132ca57600080fd5b83018035915067ffffffffffffffff8211156132e557600080fd5b602001915036819003821315612ae457600080fd5b6000808335601e1984360301811261331157600080fd5b83018035915067ffffffffffffffff82111561332c57600080fd5b6020019150600581901b3603821315612ae457600080fd5b60006001600160a01b03808a16835288602084015280881660408401525085606083015260c0608083015261337d60c083018587613028565b90508260a083015298975050505050505050565b60008160001904831182151516156133ab576133ab6131d6565b500290565b600082198211156133c3576133c36131d6565b500190565b6001600160a01b03861681528460208201526080604082015260006133f1608083018587613028565b90508260608301529695505050505050565b60006020828403121561341557600080fd5b8151801515811461248857600080fd5b6002811061343557613435612f94565b60f81b9052565b6134468185613425565b60609290921b6001600160601b03191660018301526015820152603501919050565b60006001600160a01b03808a168352808916602084015287604084015267ffffffffffffffff8716606084015260c060808401526134aa60c084018688613028565b915080841660a08401525098975050505050505050565b600082516134d3818460208701612fcc565b9190910192915050565b6000602082840312156134ef57600080fd5b81516003811061248857600080fd5b60a0810161350c828861324f565b85602083015261351f6040830186612faa565b67ffffffffffffffff939093166060820152608001529392505050565b608081526000613550608083018a8c613028565b828103602084015261356381898b613051565b905082810360408401526135788187896130e2565b9050828103606084015261358d818587613129565b9b9a5050505050505050505050565b6000602082840312156135ae57600080fd5b5051919050565b6135bf818a613425565b60006bffffffffffffffffffffffff19808a60601b166001840152808960601b166015840152506001600160c01b0319808860c01b166029840152866031840152808660c01b16605184015250828460598401375060009101605901908152979650505050505050565b60006001600160a01b03808816835267ffffffffffffffff871660208401526080604084015261365d608084018688613028565b91508084166060840152509695505050505050565b60006001600160a01b0380881683528660208401526080604084015261365d608084018688613028565b6000826136b957634e487b7160e01b600052601260045260246000fd5b500490565b6020815260006110ea6020830184612ffc565b634e487b7160e01b600052604160045260246000fd5b6000602082840312156136f957600080fd5b815167ffffffffffffffff8082111561371157600080fd5b818401915084601f83011261372557600080fd5b815181811115613737576137376136d1565b604051601f8201601f19908116603f0116810190838211818310171561375f5761375f6136d1565b8160405282815287602084870101111561377857600080fd5b613789836020830160208801612fcc565b97965050505050505056fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212209a1f23077e16f595b6070fef52fab06c8e34241c157a6e4b91d3bcb349cd8e9364736f6c63430008090033000000000000000000000000fa78cba4ebbf8fe28b4fc1468948f16fda2752b3000000000000000000000000fa78cba4ebbf8fe28b4fc1468948f16fda2752b30000000000000000000000006a96506058da59895289c7e9af134f8105a6d940000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106101d85760003560e01c806382980dc411610102578063ccf2683b11610095578063e2c1ed2511610064578063e2c1ed2514610551578063f2fde38b14610571578063f60bbe2a14610591578063f83b0fb9146105a757600080fd5b8063ccf2683b146104a0578063cd2abd66146104d4578063d8257d1714610511578063dfa2dbaf1461053157600080fd5b806395e911a8116100d157806395e911a8146104375780639b05a7751461044d5780639f3ce55a1461046d578063c66a9c5a1461048057600080fd5b806382980dc4146103a157806382efd502146103d95780638da5cb5b146103f957806395b12c271461041757600080fd5b80634586f3311161017a578063588be02b11610149578063588be02b146103215780635b3e5f5014610341578063723d0a9d1461036e5780637b80ab201461038e57600080fd5b80634586f331146102a5578063468a2d04146102c55780635335dca2146102d8578063584e45e11461030b57600080fd5b8063359ef75b116101b6578063359ef75b1461023f5780633f395aff1461025f57806340d0d026146102725780634289fbb31461029257600080fd5b806303cbfe66146101dd57806306c28bd6146101ff5780632ff4c4111461021f575b600080fd5b3480156101e957600080fd5b506101fd6101f8366004612a6b565b6105c7565b005b34801561020b57600080fd5b506101fd61021a366004612a86565b6106c0565b34801561022b57600080fd5b506101fd61023a366004612aeb565b61074c565b34801561024b57600080fd5b506101fd61025a366004612b9f565b6109a5565b6101fd61026d366004612c46565b6109c1565b34801561027e57600080fd5b506101fd61028d366004612d4f565b610cb4565b6101fd6102a0366004612dbb565b610d0c565b3480156102b157600080fd5b506101fd6102c0366004612a86565b610df5565b6101fd6102d3366004612e33565b610e51565b3480156102e457600080fd5b506102f86102f3366004612ef8565b6110cd565b6040519081526020015b60405180910390f35b34801561031757600080fd5b506102f8600a5481565b34801561032d57600080fd5b506101fd61033c366004612a6b565b6110f3565b34801561034d57600080fd5b506102f861035c366004612a6b565b60036020526000908152604090205481565b34801561037a57600080fd5b506101fd610389366004612d4f565b6111e0565b6101fd61039c366004612c46565b61122e565b3480156103ad57600080fd5b506005546103c1906001600160a01b031681565b6040516001600160a01b039091168152602001610302565b3480156103e557600080fd5b506101fd6103f4366004612a6b565b61143d565b34801561040557600080fd5b506000546001600160a01b03166103c1565b34801561042357600080fd5b506008546103c1906001600160a01b031681565b34801561044357600080fd5b506102f860015481565b34801561045957600080fd5b506101fd610468366004612a6b565b61152a565b6101fd61047b366004612f3a565b611617565b34801561048c57600080fd5b506009546103c1906001600160a01b031681565b3480156104ac57600080fd5b506103c17f000000000000000000000000fa78cba4ebbf8fe28b4fc1468948f16fda2752b381565b3480156104e057600080fd5b506105046104ef366004612a86565b60046020526000908152604090205460ff1681565b6040516103029190612fbe565b34801561051d57600080fd5b506007546103c1906001600160a01b031681565b34801561053d57600080fd5b506006546103c1906001600160a01b031681565b34801561055d57600080fd5b506101fd61056c366004612a86565b6116fa565b34801561057d57600080fd5b506101fd61058c366004612a6b565b611786565b34801561059d57600080fd5b506102f860025481565b3480156105b357600080fd5b506101fd6105c2366004612a6b565b611865565b336105da6000546001600160a01b031690565b6001600160a01b0316146106235760405162461bcd60e51b8152602060048201819052602482015260008051602061379583398151915260448201526064015b60405180910390fd5b6001600160a01b03811661066b5760405162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b604482015260640161061a565b600680546001600160a01b0319166001600160a01b0383169081179091556040519081527fd60e9ceb4f54f1bfb1741a4b35fc9d806d7ed48200b523203b92248ea38fa17d906020015b60405180910390a150565b336106d36000546001600160a01b031690565b6001600160a01b0316146107175760405162461bcd60e51b81526020600482018190526024820152600080516020613795833981519152604482015260640161061a565b60018190556040518181527f892dfdc99ecd3bb4f2f2cb118dca02f0bd16640ff156d3c6459d4282e336a5f2906020016106b5565b6000463060405160200161079d92919091825260601b6001600160601b03191660208201527f77697468647261774665650000000000000000000000000000000000000000006034820152603f0190565b60408051808303601f19018152828252805160209182012090830181905260608c901b6001600160601b0319168383015260548084018c9052825180850390910181526074840192839052633416de1160e11b90925292507f000000000000000000000000fa78cba4ebbf8fe28b4fc1468948f16fda2752b36001600160a01b03169163682dbc229161083e918b908b908b908b908b908b90607801613178565b60006040518083038186803b15801561085657600080fd5b505afa15801561086a573d6000803e3d6000fd5b505050506001600160a01b038916600090815260036020526040812054610891908a6131ec565b9050600081116108e35760405162461bcd60e51b815260206004820152601960248201527f4e6f206e657720616d6f756e7420746f20776974686472617700000000000000604482015260640161061a565b6001600160a01b038a166000818152600360205260408082208c90555190919061c35090849084818181858888f193505050503d8060008114610942576040519150601f19603f3d011682016040523d82523d6000602084013e610947565b606091505b50509050806109985760405162461bcd60e51b815260206004820152601660248201527f6661696c656420746f2077697468647261772066656500000000000000000000604482015260640161061a565b5050505050505050505050565b6109ad611952565b6109ba85858585856119b6565b5050505050565b60006109cc88611a6e565b90506000808281526004602081905260409091205460ff16908111156109f4576109f4612f94565b14610a415760405162461bcd60e51b815260206004820152601960248201527f7472616e7366657220616c726561647920657865637574656400000000000000604482015260640161061a565b6000818152600460208181526040808420805460ff1916909317909255815146918101919091526001600160601b03193060601b16918101919091527f4d657373616765576974685472616e73666572000000000000000000000000006054820152606701604051602081830303815290604052805190602001209050600560009054906101000a90046001600160a01b03166001600160a01b031663682dbc2282848e8e8e6101000135604051602001610b00959493929190613203565b6040516020818303038152906040528a8a8a8a8a8a6040518863ffffffff1660e01b8152600401610b379796959493929190613178565b60006040518083038186803b158015610b4f57600080fd5b505afa158015610b63573d6000803e3d6000fd5b50505050600080610b758b8e8e612327565b90506001816002811115610b8b57610b8b612f94565b1415610b9a5760019150610c64565b6002816002811115610bae57610bae612f94565b1415610c2f576000848152600460205260408120805460ff19166001835b02179055507fe49c2c954d381d1448cf824743aeff9da7a1d82078a7c9e5817269cc359bd26c6000858d60c0016020810190610c089190613225565b8e6101000135604051610c1e949392919061325f565b60405180910390a150505050610ca9565b610c3a8b8e8e61248f565b90506001816002811115610c5057610c50612f94565b1415610c5f5760039150610c64565b600291505b60008481526004602081905260409091208054849260ff19909116906001908490811115610c9457610c94612f94565b0217905550610ca484838d6124ca565b505050505b505050505050505050565b610ccd610cc76040830160208401613292565b8361253c565b610d08610cda82806132b3565b60208401610cec6101408601866132fa565b610cfa6101608801886132fa565b61039c6101808a018a6132fa565b5050565b46851415610d4e5760405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a590818da185a5b9259608a1b604482015260640161061a565b6000610d5a83836110cd565b905080341015610d9f5760405162461bcd60e51b815260206004820152601060248201526f496e73756666696369656e742066656560801b604482015260640161061a565b336001600160a01b03167f172762498a59a3bc4fed3f2b63f94f17ea0193cffdc304fe7d3eaf4d342d2f6688888888888834604051610de49796959493929190613344565b60405180910390a250505050505050565b33610e086000546001600160a01b031690565b6001600160a01b031614610e4c5760405162461bcd60e51b81526020600482018190526024820152600080516020613795833981519152604482015260640161061a565b600a55565b6000610e5e888b8b61279b565b90506000808281526004602081905260409091205460ff1690811115610e8657610e86612f94565b14610ed35760405162461bcd60e51b815260206004820152601860248201527f6d65737361676520616c72656164792065786563757465640000000000000000604482015260640161061a565b600081815260046020818152604092839020805460ff1916909217909155815146818301523060601b6001600160601b031916818401527f4d6573736167650000000000000000000000000000000000000000000000000060548201528251603b818303018152605b820184528051920191909120600554607b8301829052609b8084018690528451808503909101815260bb840194859052633416de1160e11b90945290926001600160a01b039091169163682dbc2291610fa3918c908c908c908c908c908c9060bf01613178565b60006040518083038186803b158015610fbb57600080fd5b505afa158015610fcf573d6000803e3d6000fd5b50505050600080610fe18b8e8e61280a565b90506001816002811115610ff757610ff7612f94565b1415611006576001915061108d565b600281600281111561101a5761101a612f94565b1415611088576000848152600460205260408120805460ff191660018302179055507fe49c2c954d381d1448cf824743aeff9da7a1d82078a7c9e5817269cc359bd26c6001858d60400160208101906110739190613225565b8e60600135604051610c1e949392919061325f565b600291505b60008481526004602081905260409091208054849260ff199091169060019084908111156110bd576110bd612f94565b0217905550610ca484838d612869565b6002546000906110dd9083613391565b6001546110ea91906133b0565b90505b92915050565b336111066000546001600160a01b031690565b6001600160a01b03161461114a5760405162461bcd60e51b81526020600482018190526024820152600080516020613795833981519152604482015260640161061a565b6001600160a01b0381166111925760405162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b604482015260640161061a565b600580546001600160a01b0319166001600160a01b0383169081179091556040519081527fbf9977180dc6e6cff25598c8e59150cecd7f8e448e092633d38ab7ee223ae058906020016106b5565b6111f3610cc76040830160208401613292565b610d0861120082806132b3565b602084016112126101408601866132fa565b6112206101608801886132fa565b61026d6101808a018a6132fa565b600061123988611a6e565b90506000808281526004602081905260409091205460ff169081111561126157611261612f94565b146112ae5760405162461bcd60e51b815260206004820152601960248201527f7472616e7366657220616c726561647920657865637574656400000000000000604482015260640161061a565b6000818152600460208181526040808420805460ff1916909317909255815146918101919091526001600160601b03193060601b16918101919091527f4d657373616765576974685472616e73666572526566756e64000000000000006054820152606d01604051602081830303815290604052805190602001209050600560009054906101000a90046001600160a01b03166001600160a01b031663682dbc2282848e8e8e610100013560405160200161136d959493929190613203565b6040516020818303038152906040528a8a8a8a8a8a6040518863ffffffff1660e01b81526004016113a49796959493929190613178565b60006040518083038186803b1580156113bc57600080fd5b505afa1580156113d0573d6000803e3d6000fd5b505050506000806113e28b8e8e6128cd565b905060018160028111156113f8576113f8612f94565b14156114075760019150610c64565b600281600281111561141b5761141b612f94565b1415610c5f576000848152600460205260408120805460ff1916600183610bcc565b336114506000546001600160a01b031690565b6001600160a01b0316146114945760405162461bcd60e51b81526020600482018190526024820152600080516020613795833981519152604482015260640161061a565b6001600160a01b0381166114dc5760405162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b604482015260640161061a565b600880546001600160a01b0319166001600160a01b0383169081179091556040519081527ffb337a6c76476534518d5816caeb86263972470fedccfd047a35eb1825eaa9e8906020016106b5565b3361153d6000546001600160a01b031690565b6001600160a01b0316146115815760405162461bcd60e51b81526020600482018190526024820152600080516020613795833981519152604482015260640161061a565b6001600160a01b0381166115c95760405162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b604482015260640161061a565b600780546001600160a01b0319166001600160a01b0383169081179091556040519081527fa9db0c32d9c6c2f75f3b95047a9e67cc1c010eab792a4e6ca777ce918ad94aad906020016106b5565b468314156116595760405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a590818da185a5b9259608a1b604482015260640161061a565b600061166583836110cd565b9050803410156116aa5760405162461bcd60e51b815260206004820152601060248201526f496e73756666696369656e742066656560801b604482015260640161061a565b336001600160a01b03167fce3972bfffe49d317e1d128047a97a3d86b25c94f6f04409f988ef854d25e0e486868686346040516116eb9594939291906133c8565b60405180910390a25050505050565b3361170d6000546001600160a01b031690565b6001600160a01b0316146117515760405162461bcd60e51b81526020600482018190526024820152600080516020613795833981519152604482015260640161061a565b60028190556040518181527f210d4d5d2d36d571207dac98e383e2441c684684c885fb2d7c54f8d24422074c906020016106b5565b336117996000546001600160a01b031690565b6001600160a01b0316146117dd5760405162461bcd60e51b81526020600482018190526024820152600080516020613795833981519152604482015260640161061a565b6001600160a01b0381166118595760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161061a565b61186281612924565b50565b336118786000546001600160a01b031690565b6001600160a01b0316146118bc5760405162461bcd60e51b81526020600482018190526024820152600080516020613795833981519152604482015260640161061a565b6001600160a01b0381166119045760405162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b604482015260640161061a565b600980546001600160a01b0319166001600160a01b0383169081179091556040519081527f918a691a2a82482a10e11f43d7b627b2ba220dd08f251cb61933c42560f6fcb5906020016106b5565b6000546001600160a01b0316156119ab5760405162461bcd60e51b815260206004820152601160248201527f6f776e657220616c726561647920736574000000000000000000000000000000604482015260640161061a565b6119b433612924565b565b6005546001600160a01b031615611a0f5760405162461bcd60e51b815260206004820152601b60248201527f6c697175696469747942726964676520616c7265616479207365740000000000604482015260640161061a565b600580546001600160a01b03199081166001600160a01b03978816179091556006805482169587169590951790945560078054851693861693909317909255600880548416918516919091179055600980549092169216919091179055565b600080806001611a816020860186613292565b6006811115611a9257611a92612f94565b1415611c2d57611aa86040850160208601612a6b565b611ab86060860160408701612a6b565b611ac86080870160608801612a6b565b6080870135611add60e0890160c08a01613225565b6040516001600160601b0319606096871b8116602083015294861b851660348201529290941b9092166048820152605c8101919091526001600160c01b031960c092831b8116607c8301524690921b909116608482015260e0850135608c82015260ac0160408051808303601f19018152908290528051602090910120600554633c64f04b60e01b8352600483018290529093506001600160a01b031691508190633c64f04b9060240160206040518083038186803b158015611b9f57600080fd5b505afa158015611bb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd79190613403565b1515600114611c285760405162461bcd60e51b815260206004820152601660248201527f6272696467652072656c6179206e6f7420657869737400000000000000000000604482015260640161061a565b6122f2565b6002611c3c6020860186613292565b6006811115611c4d57611c4d612f94565b1415611dba5746611c6460c0860160a08701613225565b611c746060870160408801612a6b565b611c846080880160608901612a6b565b6040516001600160c01b031960c095861b811660208301529390941b90921660288401526001600160601b0319606091821b8116603085015291901b1660448201526080850135605882015260780160408051808303601f19018152908290528051602090910120600554631c13568560e31b8352600483018290529093506001600160a01b03169150819063e09ab4289060240160206040518083038186803b158015611d3157600080fd5b505afa158015611d45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d699190613403565b1515600114611c285760405162461bcd60e51b815260206004820152601960248201527f627269646765207769746864726177206e6f7420657869737400000000000000604482015260640161061a565b6003611dc96020860186613292565b6006811115611dda57611dda612f94565b1480611e0357506004611df06020860186613292565b6006811115611e0157611e01612f94565b145b1561208557611e186060850160408601612a6b565b611e286080860160608701612a6b565b6080860135611e3d6040880160208901612a6b565b611e4d60e0890160c08a01613225565b604051606095861b6001600160601b0319908116602083015294861b851660348201526048810193909352931b909116606882015260c09190911b6001600160c01b031916607c82015260e0850135608482015260a40160408051601f19818403018152919052805160209091012091506003611ecd6020860186613292565b6006811115611ede57611ede612f94565b1415611fb557506006546040516301e6472560e01b8152600481018390526001600160a01b039091169081906301e64725906024015b60206040518083038186803b158015611f2c57600080fd5b505afa158015611f40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f649190613403565b1515600114611c285760405162461bcd60e51b815260206004820152601560248201527f6d696e74207265636f7264206e6f742065786973740000000000000000000000604482015260640161061a565b506007546040516301e6472560e01b8152600481018390526001600160a01b039091169081906301e647259060240160206040518083038186803b158015611ffc57600080fd5b505afa158015612010573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120349190613403565b1515600114611c285760405162461bcd60e51b815260206004820152601960248201527f7769746864726177207265636f7264206e6f7420657869737400000000000000604482015260640161061a565b60056120946020860186613292565b60068111156120a5576120a5612f94565b14806120ce575060066120bb6020860186613292565b60068111156120cc576120cc612f94565b145b156122f25760056120e26020860186613292565b60068111156120f3576120f3612f94565b141561210b57506008546001600160a01b0316612119565b506009546001600160a01b03165b6121296060850160408601612a6b565b6121396080860160608701612a6b565b608086013561214e6040880160208901612a6b565b61215e60e0890160c08a01613225565b604051606095861b6001600160601b0319908116602083015294861b85166034820152604881019390935290841b8316606883015260c01b6001600160c01b031916607c82015260e087013560848201529183901b1660a482015260b80160408051601f198184030181529190528051602090910120915060056121e56020860186613292565b60068111156121f6576121f6612f94565b1415612229576040516301e6472560e01b8152600481018390526001600160a01b038216906301e6472590602401611f14565b6040516301e6472560e01b8152600481018390526001600160a01b038216906301e647259060240160206040518083038186803b15801561226957600080fd5b505afa15801561227d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122a19190613403565b15156001146122f25760405162461bcd60e51b815260206004820152601960248201527f7769746864726177207265636f7264206e6f7420657869737400000000000000604482015260640161061a565b600081836040516020016123089392919061343c565b6040516020818303038152906040528051906020012092505050919050565b6000805a90506000806123406060880160408901612a6b565b6001600160a01b031634631f34afff60e21b61236260408b0160208c01612a6b565b61237260808c0160608d01612a6b565b60808c013561238760e08e0160c08f01613225565b8c8c336040516024016123a09796959493929190613468565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161240b91906134c1565b60006040518083038185875af1925050503d8060008114612448576040519150601f19603f3d011682016040523d82523d6000602084013e61244d565b606091505b50915091508115612476578080602001905181019061246c91906134dd565b9350505050612488565b6124808382612974565b600093505050505b9392505050565b6000805a90506000806124a86060880160408901612a6b565b6001600160a01b031634632d5bd7e360e11b61236260408b0160208c01612a6b565b6124da6060820160408301612a6b565b6001600160a01b03167fa635eb05143f74743822bbd96428928de4c8ee8cc578299749be9425c17bb34d6000858561251860e0870160c08801613225565b86610100013560405161252f9594939291906134fe565b60405180910390a2505050565b600182600681111561255057612550612f94565b14156125f1576005546001600160a01b031663cdd1b25d61257183806132b3565b61257e60208601866132fa565b61258b60408801886132fa565b61259860608a018a6132fa565b6040518963ffffffff1660e01b81526004016125bb98979695949392919061353c565b600060405180830381600087803b1580156125d557600080fd5b505af11580156125e9573d6000803e3d6000fd5b505050505050565b600282600681111561260557612605612f94565b1415612626576005546001600160a01b031663a21a928061257183806132b3565b600382600681111561263a5761263a612f94565b141561265b576006546001600160a01b031663f873430261257183806132b3565b600582600681111561266f5761266f612f94565b1415612731576008546001600160a01b031663f873430261269083806132b3565b61269d60208601866132fa565b6126aa60408801886132fa565b6126b760608a018a6132fa565b6040518963ffffffff1660e01b81526004016126da98979695949392919061353c565b602060405180830381600087803b1580156126f457600080fd5b505af1158015612708573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061272c919061359c565b505050565b600482600681111561274557612745612f94565b1415612766576007546001600160a01b031663a21a928061257183806132b3565b600682600681111561277a5761277a612f94565b1415610d08576009546001600160a01b031663a21a928061269083806132b3565b600060016127ac6020860186612a6b565b6127bc6040870160208801612a6b565b6127cc6060880160408901613225565b87606001354688886040516020016127eb9897969594939291906135b5565b6040516020818303038152906040528051906020012090509392505050565b6000805a90506000806128236040880160208901612a6b565b6001600160a01b031634639c649fdf60e01b61284260208b018b612a6b565b61285260608c0160408d01613225565b8a8a336040516024016123a0959493929190613629565b6128796040820160208301612a6b565b6001600160a01b03167fa635eb05143f74743822bbd96428928de4c8ee8cc578299749be9425c17bb34d600185856128b76060870160408801613225565b866060013560405161252f9594939291906134fe565b6000805a90506000806128e66060880160408901612a6b565b6001600160a01b0316346305e5a4c160e11b61290860808b0160608c01612a6b565b8a608001358a8a336040516024016123a0959493929190613672565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60005a90506000600a544561298991906131ec565b905080841080156129a457506129a060408561369c565b8211155b156129ab57fe5b7fffdd6142bbb721f3400e3908b04b86f60649b2e4d191e3f4c50c32c3e6471d2f6129d5846129f0565b6040516129e291906136be565b60405180910390a150505050565b6060604482511015612a3557505060408051808201909152601d81527f5472616e73616374696f6e2072657665727465642073696c656e746c79000000602082015290565b600482019150818060200190518101906110ed91906136e7565b80356001600160a01b0381168114612a6657600080fd5b919050565b600060208284031215612a7d57600080fd5b6110ea82612a4f565b600060208284031215612a9857600080fd5b5035919050565b60008083601f840112612ab157600080fd5b50813567ffffffffffffffff811115612ac957600080fd5b6020830191508360208260051b8501011115612ae457600080fd5b9250929050565b60008060008060008060008060a0898b031215612b0757600080fd5b612b1089612a4f565b975060208901359650604089013567ffffffffffffffff80821115612b3457600080fd5b612b408c838d01612a9f565b909850965060608b0135915080821115612b5957600080fd5b612b658c838d01612a9f565b909650945060808b0135915080821115612b7e57600080fd5b50612b8b8b828c01612a9f565b999c989b5096995094979396929594505050565b600080600080600060a08688031215612bb757600080fd5b612bc086612a4f565b9450612bce60208701612a4f565b9350612bdc60408701612a4f565b9250612bea60608701612a4f565b9150612bf860808701612a4f565b90509295509295909350565b60008083601f840112612c1657600080fd5b50813567ffffffffffffffff811115612c2e57600080fd5b602083019150836020828501011115612ae457600080fd5b6000806000806000806000806000898b036101a0811215612c6657600080fd5b8a3567ffffffffffffffff80821115612c7e57600080fd5b612c8a8e838f01612c04565b909c509a508a9150610120601f1984011215612ca557600080fd5b60208d0199506101408d0135925080831115612cc057600080fd5b612ccc8e848f01612a9f565b90995097506101608d0135925088915080831115612ce957600080fd5b612cf58e848f01612a9f565b90975095506101808d0135925086915080831115612d1257600080fd5b5050612d208c828d01612a9f565b915080935050809150509295985092959850929598565b600060808284031215612d4957600080fd5b50919050565b60008060408385031215612d6257600080fd5b823567ffffffffffffffff80821115612d7a57600080fd5b612d8686838701612d37565b93506020850135915080821115612d9c57600080fd5b5083016101a08186031215612db057600080fd5b809150509250929050565b60008060008060008060a08789031215612dd457600080fd5b612ddd87612a4f565b955060208701359450612df260408801612a4f565b935060608701359250608087013567ffffffffffffffff811115612e1557600080fd5b612e2189828a01612c04565b979a9699509497509295939492505050565b60008060008060008060008060006101008a8c031215612e5257600080fd5b893567ffffffffffffffff80821115612e6a57600080fd5b612e768d838e01612c04565b909b509950899150612e8b8d60208e01612d37565b985060a08c0135915080821115612ea157600080fd5b612ead8d838e01612a9f565b909850965060c08c0135915080821115612ec657600080fd5b612ed28d838e01612a9f565b909650945060e08c0135915080821115612eeb57600080fd5b50612d208c828d01612a9f565b60008060208385031215612f0b57600080fd5b823567ffffffffffffffff811115612f2257600080fd5b612f2e85828601612c04565b90969095509350505050565b60008060008060608587031215612f5057600080fd5b612f5985612a4f565b935060208501359250604085013567ffffffffffffffff811115612f7c57600080fd5b612f8887828801612c04565b95989497509550505050565b634e487b7160e01b600052602160045260246000fd5b60058110612fba57612fba612f94565b9052565b602081016110ed8284612faa565b60005b83811015612fe7578181015183820152602001612fcf565b83811115612ff6576000848401525b50505050565b60008151808452613014816020860160208601612fcc565b601f01601f19169290920160200192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b81835260006020808501808196508560051b810191508460005b878110156130d55782840389528135601e1988360301811261308c57600080fd5b8701803567ffffffffffffffff8111156130a557600080fd5b8036038913156130b457600080fd5b6130c18682898501613028565b9a87019a955050509084019060010161306b565b5091979650505050505050565b8183526000602080850194508260005b8581101561311e576001600160a01b0361310b83612a4f565b16875295820195908201906001016130f2565b509495945050505050565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561315b57600080fd5b8260051b8083602087013760009401602001938452509192915050565b60808152600061318b608083018a612ffc565b828103602084015261319e81898b613051565b905082810360408401526131b38187896130e2565b905082810360608401526131c8818587613129565b9a9950505050505050505050565b634e487b7160e01b600052601160045260246000fd5b6000828210156131fe576131fe6131d6565b500390565b8581528460208201528284604083013760409201918201526060019392505050565b60006020828403121561323757600080fd5b813567ffffffffffffffff8116811461248857600080fd5b60028110612fba57612fba612f94565b6080810161326d828761324f565b84602083015267ffffffffffffffff8416604083015282606083015295945050505050565b6000602082840312156132a457600080fd5b81356007811061248857600080fd5b6000808335601e198436030181126132ca57600080fd5b83018035915067ffffffffffffffff8211156132e557600080fd5b602001915036819003821315612ae457600080fd5b6000808335601e1984360301811261331157600080fd5b83018035915067ffffffffffffffff82111561332c57600080fd5b6020019150600581901b3603821315612ae457600080fd5b60006001600160a01b03808a16835288602084015280881660408401525085606083015260c0608083015261337d60c083018587613028565b90508260a083015298975050505050505050565b60008160001904831182151516156133ab576133ab6131d6565b500290565b600082198211156133c3576133c36131d6565b500190565b6001600160a01b03861681528460208201526080604082015260006133f1608083018587613028565b90508260608301529695505050505050565b60006020828403121561341557600080fd5b8151801515811461248857600080fd5b6002811061343557613435612f94565b60f81b9052565b6134468185613425565b60609290921b6001600160601b03191660018301526015820152603501919050565b60006001600160a01b03808a168352808916602084015287604084015267ffffffffffffffff8716606084015260c060808401526134aa60c084018688613028565b915080841660a08401525098975050505050505050565b600082516134d3818460208701612fcc565b9190910192915050565b6000602082840312156134ef57600080fd5b81516003811061248857600080fd5b60a0810161350c828861324f565b85602083015261351f6040830186612faa565b67ffffffffffffffff939093166060820152608001529392505050565b608081526000613550608083018a8c613028565b828103602084015261356381898b613051565b905082810360408401526135788187896130e2565b9050828103606084015261358d818587613129565b9b9a5050505050505050505050565b6000602082840312156135ae57600080fd5b5051919050565b6135bf818a613425565b60006bffffffffffffffffffffffff19808a60601b166001840152808960601b166015840152506001600160c01b0319808860c01b166029840152866031840152808660c01b16605184015250828460598401375060009101605901908152979650505050505050565b60006001600160a01b03808816835267ffffffffffffffff871660208401526080604084015261365d608084018688613028565b91508084166060840152509695505050505050565b60006001600160a01b0380881683528660208401526080604084015261365d608084018688613028565b6000826136b957634e487b7160e01b600052601260045260246000fd5b500490565b6020815260006110ea6020830184612ffc565b634e487b7160e01b600052604160045260246000fd5b6000602082840312156136f957600080fd5b815167ffffffffffffffff8082111561371157600080fd5b818401915084601f83011261372557600080fd5b815181811115613737576137376136d1565b604051601f8201601f19908116603f0116810190838211818310171561375f5761375f6136d1565b8160405282815287602084870101111561377857600080fd5b613789836020830160208801612fcc565b97965050505050505056fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212209a1f23077e16f595b6070fef52fab06c8e34241c157a6e4b91d3bcb349cd8e9364736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000fa78cba4ebbf8fe28b4fc1468948f16fda2752b3000000000000000000000000fa78cba4ebbf8fe28b4fc1468948f16fda2752b30000000000000000000000006a96506058da59895289c7e9af134f8105a6d940000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _sigsVerifier (address): 0xFA78cBa4ebbf8fE28B4fC1468948F16Fda2752b3
Arg [1] : _liquidityBridge (address): 0xFA78cBa4ebbf8fE28B4fC1468948F16Fda2752b3
Arg [2] : _pegBridge (address): 0x6a96506058DA59895289c7e9af134f8105A6d940
Arg [3] : _pegVault (address): 0x0000000000000000000000000000000000000000
Arg [4] : _pegBridgeV2 (address): 0x0000000000000000000000000000000000000000
Arg [5] : _pegVaultV2 (address): 0x0000000000000000000000000000000000000000
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000fa78cba4ebbf8fe28b4fc1468948f16fda2752b3
Arg [1] : 000000000000000000000000fa78cba4ebbf8fe28b4fc1468948f16fda2752b3
Arg [2] : 0000000000000000000000006a96506058da59895289c7e9af134f8105a6d940
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
135:1049:9:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22869:187:10;;;;;;;;;;-1:-1:-1;22869:187:10;;;;;:::i;:::-;;:::i;:::-;;4764:122:11;;;;;;;;;;-1:-1:-1;4764:122:11;;;;;:::i;:::-;;:::i;3509:710::-;;;;;;;;;;-1:-1:-1;3509:710:11;;;;;:::i;:::-;;:::i;721:461:9:-;;;;;;;;;;-1:-1:-1;721:461:9;;;;;:::i;:::-;;:::i;3076:2011:10:-;;;;;;:::i;:::-;;:::i;20246:466::-;;;;;;;;;;-1:-1:-1;20246:466:10;;;;;:::i;:::-;;:::i;2231:736:11:-;;;;;;:::i;:::-;;:::i;23649:122:10:-;;;;;;;;;;-1:-1:-1;23649:122:10;;;;;:::i;:::-;;:::i;7837:1562::-;;;;;;:::i;:::-;;:::i;4428:134:11:-;;;;;;;;;;-1:-1:-1;4428:134:11;;;;;:::i;:::-;;:::i;:::-;;;8341:25:13;;;8329:2;8314:18;4428:134:11;;;;;;;;1007:40:10;;;;;;;;;;;;;;;;22652:211;;;;;;;;;;-1:-1:-1;22652:211:10;;;;;:::i;:::-;;:::i;302:48:11:-;;;;;;;;;;-1:-1:-1;302:48:11;;;;;:::i;:::-;;;;;;;;;;;;;;19483:462:10;;;;;;;;;;-1:-1:-1;19483:462:10;;;;;:::i;:::-;;:::i;5615:1731::-;;;;;;:::i;:::-;;:::i;595:30::-;;;;;;;;;;-1:-1:-1;595:30:10;;;;-1:-1:-1;;;;;595:30:10;;;;;;-1:-1:-1;;;;;8541:55:13;;;8523:74;;8511:2;8496:18;595:30:10;8377:226:13;23251:195:10;;;;;;;;;;-1:-1:-1;23251:195:10;;;;;:::i;:::-;;:::i;1479:85:12:-;;;;;;;;;;-1:-1:-1;1525:7:12;1551:6;-1:-1:-1;;;;;1551:6:12;1479:85;;770:26:10;;;;;;;;;;-1:-1:-1;770:26:10;;;;-1:-1:-1;;;;;770:26:10;;;243:22:11;;;;;;;;;;;;;;;;23062:183:10;;;;;;;;;;-1:-1:-1;23062:183:10;;;;;:::i;:::-;;:::i;1260:387:11:-;;;;;;:::i;:::-;;:::i;824:25:10:-;;;;;;;;;;-1:-1:-1;824:25:10;;;;-1:-1:-1;;;;;824:25:10;;;193:43:11;;;;;;;;;;;;;;;523:65:10;;;;;;;;;;-1:-1:-1;523:65:10;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;711:23::-;;;;;;;;;;-1:-1:-1;711:23:10;;;;-1:-1:-1;;;;;711:23:10;;;659:24;;;;;;;;;;-1:-1:-1;659:24:10;;;;-1:-1:-1;;;;;659:24:10;;;4624:134:11;;;;;;;;;;-1:-1:-1;4624:134:11;;;;;:::i;:::-;;:::i;1916:189:12:-;;;;;;;;;;-1:-1:-1;1916:189:12;;;;;:::i;:::-;;:::i;271:25:11:-;;;;;;;;;;;;;;;;23452:191:10;;;;;;;;;;-1:-1:-1;23452:191:10;;;;;:::i;:::-;;:::i;22869:187::-;1702:10:12;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:12;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:12;;1683:66;;;;-1:-1:-1;;;1683:66:12;;10289:2:13;1683:66:12;;;10271:21:13;;;10308:18;;;10301:30;-1:-1:-1;;;;;;;;;;;10347:18:13;;;10340:62;10419:18;;1683:66:12;;;;;;;;;-1:-1:-1;;;;;22941:19:10;::::1;22933:47;;;::::0;-1:-1:-1;;;22933:47:10;;10650:2:13;22933:47:10::1;::::0;::::1;10632:21:13::0;10689:2;10669:18;;;10662:30;-1:-1:-1;;;10708:18:13;;;10701:45;10763:18;;22933:47:10::1;10448:339:13::0;22933:47:10::1;22990:9;:17:::0;;-1:-1:-1;;;;;;22990:17:10::1;-1:-1:-1::0;;;;;22990:17:10;::::1;::::0;;::::1;::::0;;;23022:27:::1;::::0;8523:74:13;;;23022:27:10::1;::::0;8511:2:13;8496:18;23022:27:10::1;;;;;;;;22869:187:::0;:::o;4764:122:11:-;1702:10:12;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:12;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:12;;1683:66;;;;-1:-1:-1;;;1683:66:12;;10289:2:13;1683:66:12;;;10271:21:13;;;10308:18;;;10301:30;-1:-1:-1;;;;;;;;;;;10347:18:13;;;10340:62;10419:18;;1683:66:12;10087:356:13;1683:66:12;4827:7:11::1;:14:::0;;;4856:23:::1;::::0;8341:25:13;;;4856:23:11::1;::::0;8329:2:13;8314:18;4856:23:11::1;8195:177:13::0;3509:710:11;3718:14;3762:13;3785:4;3745:61;;;;;;;;11050:19:13;;;11107:2;11103:15;-1:-1:-1;;;;;;11099:53:13;11094:2;11085:12;;11078:75;11183:13;11178:2;11169:12;;11162:35;11222:2;11213:12;;10792:439;3745:61:11;;;;;;;-1:-1:-1;;3745:61:11;;;;;;3735:72;;3745:61;3735:72;;;;3841:50;;;11421:19:13;;;11478:2;11474:15;;;-1:-1:-1;;;;;;11470:53:13;11456:12;;;11449:75;11540:12;;;;11533:28;;;3841:50:11;;;;;;;;;;11577:12:13;;;3841:50:11;;;;-1:-1:-1;;;3817:101:11;;;3735:72;-1:-1:-1;3817:12:11;-1:-1:-1;;;;;3817:23:11;;;;:101;;3893:5;;;;3900:8;;;;3910:7;;;;3817:101;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;3962:23:11;;3928:14;3962:23;;;:13;:23;;;;;;3945:40;;:14;:40;:::i;:::-;3928:57;;4012:1;4003:6;:10;3995:48;;;;-1:-1:-1;;;3995:48:11;;15720:2:13;3995:48:11;;;15702:21:13;15759:2;15739:18;;;15732:30;15798:27;15778:18;;;15771:55;15843:18;;3995:48:11;15518:349:13;3995:48:11;-1:-1:-1;;;;;4053:23:11;;;;;;:13;:23;;;;;;:40;;;4119:44;4053:23;;;4153:5;;4140:6;;4053:23;4119:44;4053:23;4119:44;4140:6;4053:23;4153:5;4119:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4103:60;;;4181:4;4173:39;;;;-1:-1:-1;;;4173:39:11;;16284:2:13;4173:39:11;;;16266:21:13;16323:2;16303:18;;;16296:30;16362:24;16342:18;;;16335:52;16404:18;;4173:39:11;16082:346:13;4173:39:11;3708:511;;;3509:710;;;;;;;;:::o;721:461:9:-;975:11;:9;:11::i;:::-;1095:80;1108:16;1126:10;1138:9;1149:12;1163:11;1095:12;:80::i;:::-;721:461;;;;;:::o;3076:2011:10:-;3499:17;3519:25;3534:9;3519:14;:25::i;:::-;3499:45;-1:-1:-1;3593:26:10;3562:27;;;;:16;:27;;;;;;;;;;;;:57;;;;;;;:::i;:::-;;3554:95;;;;-1:-1:-1;;;3554:95:10;;16635:2:13;3554:95:10;;;16617:21:13;16674:2;16654:18;;;16647:30;16713:27;16693:18;;;16686:55;16758:18;;3554:95:10;16433:349:13;3554:95:10;3659:27;;;;3689:29;3659:27;;;;;;;;:59;;-1:-1:-1;;3659:59:10;;;;;;;3756:69;;3773:13;3756:69;;;17045:19:13;;;;-1:-1:-1;;;;;;3796:4:10;17102:2:13;17098:15;17094:53;17080:12;;;17073:75;;;;17178:21;17164:12;;;17157:43;17216:12;;3756:69:10;;;;;;;;;;;;3746:80;;;;;;3729:97;;3844:15;;;;;;;;;-1:-1:-1;;;;;3844:15:10;-1:-1:-1;;;;;3836:35:10;;3902:6;3910:9;3921:8;;3931:9;:19;;;3885:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3965:5;;3984:8;;4006:7;;3836:187;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4033:28;4071:39;4113:47;4140:9;4151:8;;4113:26;:47::i;:::-;4071:89;-1:-1:-1;4181:43:10;4174:3;:50;;;;;;;;:::i;:::-;;4170:789;;;4249:29;4240:38;;4170:789;;;4306:41;4299:3;:48;;;;;;;;:::i;:::-;;4295:664;;;4393:26;4363:27;;;:16;:27;;;;;:56;;-1:-1:-1;;4363:56:10;;4393:26;4363:56;;;;;;4438:183;4465:40;4523:9;4550;:20;;;;;;;;;;:::i;:::-;4588:9;:19;;;4438:183;;;;;;;;;:::i;:::-;;;;;;;;4635:7;;;;;;4295:664;4678:55;4713:9;4724:8;;4678:34;:55::i;:::-;4672:61;-1:-1:-1;4758:43:10;4751:3;:50;;;;;;;;:::i;:::-;;4747:202;;;4830:30;4821:39;;4747:202;;;4908:26;4899:35;;4747:202;4968:27;;;;:16;:27;;;;;;;;:36;;4998:6;;-1:-1:-1;;4968:36:10;;;;;;4998:6;;4968:36;;;;;;;:::i;:::-;;;;;;5014:66;5051:9;5062:6;5070:9;5014:36;:66::i;:::-;3325:1762;;;;3076:2011;;;;;;;;;;:::o;20246:466::-;20441:55;20457:21;;;;:19;;;:21;:::i;:::-;20480:15;20441;:55::i;:::-;20506:199;20552:18;:10;;:18;:::i;:::-;20584:19;;;20617:15;;;;20584:10;20617:15;:::i;:::-;20646:18;;;;:10;:18;:::i;:::-;20678:17;;;;:10;:17;:::i;20506:199::-;20246:466;;:::o;2231:736:11:-;2469:13;2454:11;:28;;2446:56;;;;-1:-1:-1;;;2446:56:11;;21300:2:13;2446:56:11;;;21282:21:13;21339:2;21319:18;;;21312:30;-1:-1:-1;;;21358:18:13;;;21351:45;21413:18;;2446:56:11;21098:339:13;2446:56:11;2512:14;2529:17;2537:8;;2529:7;:17::i;:::-;2512:34;;2577:6;2564:9;:19;;2556:48;;;;-1:-1:-1;;;2556:48:11;;21644:2:13;2556:48:11;;;21626:21:13;21683:2;21663:18;;;21656:30;-1:-1:-1;;;21702:18:13;;;21695:46;21758:18;;2556:48:11;21442:340:13;2556:48:11;2876:10;-1:-1:-1;;;;;2856:104:11;;2888:9;2899:11;2912:10;2924:14;2940:8;;2950:9;2856:104;;;;;;;;;;;;:::i;:::-;;;;;;;;2436:531;2231:736;;;;;;:::o;23649:122:10:-;1702:10:12;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:12;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:12;;1683:66;;;;-1:-1:-1;;;1683:66:12;;10289:2:13;1683:66:12;;;10271:21:13;;;10308:18;;;10301:30;-1:-1:-1;;;;;;;;;;;10347:18:13;;;10340:62;10419:18;;1683:66:12;10087:356:13;1683:66:12;23730:25:10::1;:34:::0;23649:122::o;7837:1562::-;8259:17;8279:38;8300:6;8308:8;;8279:20;:38::i;:::-;8259:58;-1:-1:-1;8366:26:10;8335:27;;;;:16;:27;;;;;;;;;;;;:57;;;;;;;:::i;:::-;;8327:94;;;;-1:-1:-1;;;8327:94:10;;22676:2:13;8327:94:10;;;22658:21:13;22715:2;22695:18;;;22688:30;22754:26;22734:18;;;22727:54;22798:18;;8327:94:10;22474:348:13;8327:94:10;8431:27;;;;8461:29;8431:27;;;;;;;;;:59;;-1:-1:-1;;8431:59:10;;;;;;;8528:57;;8545:13;8528:57;;;23085:19:13;8568:4:10;23142:2:13;23138:15;-1:-1:-1;;;;;;23134:53:13;23120:12;;;23113:75;23218:9;23204:12;;;23197:31;8528:57:10;;;;;;;;;23244:12:13;;;8528:57:10;;8518:68;;;;;;;;8604:15;;8632:35;;;23424:19:13;;;23459:12;;;;23452:28;;;8632:35:10;;;;;;;;;;23496:12:13;;;8632:35:10;;;;-1:-1:-1;;;8596:98:10;;;8518:68;;-1:-1:-1;;;;;8604:15:10;;;;8596:35;;:98;;8669:5;;;;8676:8;;;;8686:7;;;;8596:98;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8704:28;8742:39;8784:32;8799:6;8807:8;;8784:14;:32::i;:::-;8742:74;-1:-1:-1;8837:43:10;8830:3;:50;;;;;;;;:::i;:::-;;8826:456;;;8905:29;8896:38;;8826:456;;;8962:41;8955:3;:48;;;;;;;;:::i;:::-;;8951:331;;;9049:26;9019:27;;;:16;:27;;;;;:56;;-1:-1:-1;;9019:56:10;;9049:26;9019:56;;;;;9094:91;9104:32;9138:9;9149:6;:17;;;;;;;;;;:::i;:::-;9168:6;:16;;;9094:91;;;;;;;;;:::i;8951:331::-;9245:26;9236:35;;8951:331;9291:27;;;;:16;:27;;;;;;;;:36;;9321:6;;-1:-1:-1;;9291:36:10;;;;;;9321:6;;9291:36;;;;;;;:::i;:::-;;;;;;9337:55;9366:9;9377:6;9385;9337:28;:55::i;4428:134:11:-;4545:10;;4491:7;;4527:28;;:8;:28;:::i;:::-;4517:7;;:38;;;;:::i;:::-;4510:45;;4428:134;;;;;:::o;22652:211:10:-;1702:10:12;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:12;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:12;;1683:66;;;;-1:-1:-1;;;1683:66:12;;10289:2:13;1683:66:12;;;10271:21:13;;;10308:18;;;10301:30;-1:-1:-1;;;;;;;;;;;10347:18:13;;;10340:62;10419:18;;1683:66:12;10087:356:13;1683:66:12;-1:-1:-1;;;;;22730:19:10;::::1;22722:47;;;::::0;-1:-1:-1;;;22722:47:10;;10650:2:13;22722:47:10::1;::::0;::::1;10632:21:13::0;10689:2;10669:18;;;10662:30;-1:-1:-1;;;10708:18:13;;;10701:45;10763:18;;22722:47:10::1;10448:339:13::0;22722:47:10::1;22779:15;:23:::0;;-1:-1:-1;;;;;;22779:23:10::1;-1:-1:-1::0;;;;;22779:23:10;::::1;::::0;;::::1;::::0;;;22817:39:::1;::::0;8523:74:13;;;22817:39:10::1;::::0;8511:2:13;8496:18;22817:39:10::1;8377:226:13::0;19483:462:10;19680:55;19696:21;;;;:19;;;:21;:::i;19680:55::-;19745:193;19785:18;:10;;:18;:::i;:::-;19817:19;;;19850:15;;;;19817:10;19850:15;:::i;:::-;19879:18;;;;:10;:18;:::i;:::-;19911:17;;;;:10;:17;:::i;5615:1731::-;5987:17;6007:25;6022:9;6007:14;:25::i;:::-;5987:45;-1:-1:-1;6081:26:10;6050:27;;;;:16;:27;;;;;;;;;;;;:57;;;;;;;:::i;:::-;;6042:95;;;;-1:-1:-1;;;6042:95:10;;16635:2:13;6042:95:10;;;16617:21:13;16674:2;16654:18;;;16647:30;16713:27;16693:18;;;16686:55;16758:18;;6042:95:10;16433:349:13;6042:95:10;6147:27;;;;6177:29;6147:27;;;;;;;;:59;;-1:-1:-1;;6147:59:10;;;;;;;6244:75;;6261:13;6244:75;;;24083:19:13;;;;-1:-1:-1;;;;;;6284:4:10;24140:2:13;24136:15;24132:53;24118:12;;;24111:75;;;;24216:27;24202:12;;;24195:49;24260:12;;6244:75:10;;;;;;;;;;;;6234:86;;;;;;6217:103;;6338:15;;;;;;;;;-1:-1:-1;;;;;6338:15:10;-1:-1:-1;;;;;6330:35:10;;6396:6;6404:9;6415:8;;6425:9;:19;;;6379:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6459:5;;6478:8;;6500:7;;6330:187;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6527:28;6565:39;6607:53;6640:9;6651:8;;6607:32;:53::i;:::-;6565:95;-1:-1:-1;6681:43:10;6674:3;:50;;;;;;;;:::i;:::-;;6670:548;;;6749:29;6740:38;;6670:548;;;6806:41;6799:3;:48;;;;;;;;:::i;:::-;;6795:423;;;6893:26;6863:27;;;:16;:27;;;;;:56;;-1:-1:-1;;6863:56:10;;6893:26;6863:56;;23251:195;1702:10:12;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:12;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:12;;1683:66;;;;-1:-1:-1;;;1683:66:12;;10289:2:13;1683:66:12;;;10271:21:13;;;10308:18;;;10301:30;-1:-1:-1;;;;;;;;;;;10347:18:13;;;10340:62;10419:18;;1683:66:12;10087:356:13;1683:66:12;-1:-1:-1;;;;;23325:19:10;::::1;23317:47;;;::::0;-1:-1:-1;;;23317:47:10;;10650:2:13;23317:47:10::1;::::0;::::1;10632:21:13::0;10689:2;10669:18;;;10662:30;-1:-1:-1;;;10708:18:13;;;10701:45;10763:18;;23317:47:10::1;10448:339:13::0;23317:47:10::1;23374:11;:19:::0;;-1:-1:-1;;;;;;23374:19:10::1;-1:-1:-1::0;;;;;23374:19:10;::::1;::::0;;::::1;::::0;;;23408:31:::1;::::0;8523:74:13;;;23408:31:10::1;::::0;8511:2:13;8496:18;23408:31:10::1;8377:226:13::0;23062:183:10;1702:10:12;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:12;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:12;;1683:66;;;;-1:-1:-1;;;1683:66:12;;10289:2:13;1683:66:12;;;10271:21:13;;;10308:18;;;10301:30;-1:-1:-1;;;;;;;;;;;10347:18:13;;;10340:62;10419:18;;1683:66:12;10087:356:13;1683:66:12;-1:-1:-1;;;;;23133:19:10;::::1;23125:47;;;::::0;-1:-1:-1;;;23125:47:10;;10650:2:13;23125:47:10::1;::::0;::::1;10632:21:13::0;10689:2;10669:18;;;10662:30;-1:-1:-1;;;10708:18:13;;;10701:45;10763:18;;23125:47:10::1;10448:339:13::0;23125:47:10::1;23182:8;:16:::0;;-1:-1:-1;;;;;;23182:16:10::1;-1:-1:-1::0;;;;;23182:16:10;::::1;::::0;;::::1;::::0;;;23213:25:::1;::::0;8523:74:13;;;23213:25:10::1;::::0;8511:2:13;8496:18;23213:25:10::1;8377:226:13::0;1260:387:11;1426:13;1411:11;:28;;1403:56;;;;-1:-1:-1;;;1403:56:11;;21300:2:13;1403:56:11;;;21282:21:13;21339:2;21319:18;;;21312:30;-1:-1:-1;;;21358:18:13;;;21351:45;21413:18;;1403:56:11;21098:339:13;1403:56:11;1469:14;1486:17;1494:8;;1486:7;:17::i;:::-;1469:34;;1534:6;1521:9;:19;;1513:48;;;;-1:-1:-1;;;1513:48:11;;21644:2:13;1513:48:11;;;21626:21:13;21683:2;21663:18;;;21656:30;-1:-1:-1;;;21702:18:13;;;21695:46;21758:18;;1513:48:11;21442:340:13;1513:48:11;1584:10;-1:-1:-1;;;;;1576:64:11;;1596:9;1607:11;1620:8;;1630:9;1576:64;;;;;;;;;;:::i;:::-;;;;;;;;1393:254;1260:387;;;;:::o;4624:134::-;1702:10:12;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:12;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:12;;1683:66;;;;-1:-1:-1;;;1683:66:12;;10289:2:13;1683:66:12;;;10271:21:13;;;10308:18;;;10301:30;-1:-1:-1;;;;;;;;;;;10347:18:13;;;10340:62;10419:18;;1683:66:12;10087:356:13;1683:66:12;4690:10:11::1;:17:::0;;;4722:29:::1;::::0;8341:25:13;;;4722:29:11::1;::::0;8329:2:13;8314:18;4722:29:11::1;8195:177:13::0;1916:189:12;1702:10;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:12;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:12;;1683:66;;;;-1:-1:-1;;;1683:66:12;;10289:2:13;1683:66:12;;;10271:21:13;;;10308:18;;;10301:30;-1:-1:-1;;;;;;;;;;;10347:18:13;;;10340:62;10419:18;;1683:66:12;10087:356:13;1683:66:12;-1:-1:-1;;;;;2004:22:12;::::1;1996:73;;;::::0;-1:-1:-1;;;1996:73:12;;24998:2:13;1996:73:12::1;::::0;::::1;24980:21:13::0;25037:2;25017:18;;;25010:30;25076:34;25056:18;;;25049:62;25147:8;25127:18;;;25120:36;25173:19;;1996:73:12::1;24796:402:13::0;1996:73:12::1;2079:19;2089:8;2079:9;:19::i;:::-;1916:189:::0;:::o;23452:191:10:-;1702:10:12;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:12;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:12;;1683:66;;;;-1:-1:-1;;;1683:66:12;;10289:2:13;1683:66:12;;;10271:21:13;;;10308:18;;;10301:30;-1:-1:-1;;;;;;;;;;;10347:18:13;;;10340:62;10419:18;;1683:66:12;10087:356:13;1683:66:12;-1:-1:-1;;;;;23525:19:10;::::1;23517:47;;;::::0;-1:-1:-1;;;23517:47:10;;10650:2:13;23517:47:10::1;::::0;::::1;10632:21:13::0;10689:2;10669:18;;;10662:30;-1:-1:-1;;;10708:18:13;;;10701:45;10763:18;;23517:47:10::1;10448:339:13::0;23517:47:10::1;23574:10;:18:::0;;-1:-1:-1;;;;;;23574:18:10::1;-1:-1:-1::0;;;;;23574:18:10;::::1;::::0;;::::1;::::0;;;23607:29:::1;::::0;8523:74:13;;;23607:29:10::1;::::0;8511:2:13;8496:18;23607:29:10::1;8377:226:13::0;1275:128:12;1341:1;1323:6;-1:-1:-1;;;;;1323:6:12;:20;1315:50;;;;-1:-1:-1;;;1315:50:12;;25405:2:13;1315:50:12;;;25387:21:13;25444:2;25424:18;;;25417:30;25483:19;25463:18;;;25456:47;25520:18;;1315:50:12;25203:341:13;1315:50:12;1375:21;1385:10;1375:9;:21::i;:::-;1275:128::o;2032:447:10:-;2235:15;;-1:-1:-1;;;;;2235:15:10;:29;2227:69;;;;-1:-1:-1;;;2227:69:10;;25751:2:13;2227:69:10;;;25733:21:13;25790:2;25770:18;;;25763:30;25829:29;25809:18;;;25802:57;25876:18;;2227:69:10;25549:351:13;2227:69:10;2306:15;:34;;-1:-1:-1;;;;;;2306:34:10;;;-1:-1:-1;;;;;2306:34:10;;;;;;;2350:9;:22;;;;;;;;;;;;;;2382:8;:20;;;;;;;;;;;;;;2412:11;:26;;;;;;;;;;;;;2448:10;:24;;;;;;;;;;;;;2032:447::o;12908:3500::-;13000:7;;;13094:33;13079:11;;;;:9;:11;:::i;:::-;:48;;;;;;;;:::i;:::-;;13075:3217;;;13221:16;;;;;;;;:::i;:::-;13259:18;;;;;;;;:::i;:::-;13299:15;;;;;;;;:::i;:::-;13336:16;;;;13374:20;;;;;;;;:::i;:::-;13183:309;;-1:-1:-1;;;;;;26268:2:13;26264:15;;;26260:24;;13183:309:10;;;26248:37:13;26319:15;;;26315:24;;26301:12;;;26294:46;26374:15;;;;26370:24;;;26356:12;;;26349:46;26411:12;;;26404:28;;;;-1:-1:-1;;;;;;26555:3:13;26551:16;;;26547:25;;26533:12;;;26526:47;13423:13:10;26608:16:13;;;26604:25;;;26589:13;;;26582:48;13459:15:10;;;;26646:13:13;;;26639:29;26684:13;;13183:309:10;;;;;;-1:-1:-1;;13183:309:10;;;;;;;13156:350;;13183:309;13156:350;;;;13533:15;;-1:-1:-1;;;13570:41:10;;;;;8341:25:13;;;13156:350:10;;-1:-1:-1;;;;;;13533:15:10;;-1:-1:-1;13533:15:10;;13570:29;;8314:18:13;;13570:41:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:49;;13615:4;13570:49;13562:84;;;;-1:-1:-1;;;13562:84:10;;27374:2:13;13562:84:10;;;27356:21:13;27413:2;27393:18;;;27386:30;27452:24;27432:18;;;27425:52;27494:18;;13562:84:10;27172:346:13;13562:84:10;13075:3217;;;13682:36;13667:11;;;;:9;:11;:::i;:::-;:51;;;;;;;;:::i;:::-;;13663:2629;;;13819:13;13855:15;;;;;;;;:::i;:::-;13892:18;;;;;;;;:::i;:::-;13932:15;;;;;;;;:::i;:::-;13774:229;;-1:-1:-1;;;;;;27865:3:13;27861:16;;;27857:25;;13774:229:10;;;27845:38:13;27916:16;;;;27912:25;;;27899:11;;;27892:46;-1:-1:-1;;;;;;28026:2:13;28022:15;;;28018:24;;28004:12;;;27997:46;28077:15;;;28073:24;28059:12;;;28052:46;13969:16:10;;;;28114:12:13;;;28107:28;28151:12;;13774:229:10;;;;;;-1:-1:-1;;13774:229:10;;;;;;;13747:270;;13774:229;13747:270;;;;14044:15;;-1:-1:-1;;;14081:41:10;;;;;8341:25:13;;;13747:270:10;;-1:-1:-1;;;;;;14044:15:10;;-1:-1:-1;14044:15:10;;14081:29;;8314:18:13;;14081:41:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:49;;14126:4;14081:49;14073:87;;;;-1:-1:-1;;;14073:87:10;;28376:2:13;14073:87:10;;;28358:21:13;28415:2;28395:18;;;28388:30;28454:27;28434:18;;;28427:55;28499:18;;14073:87:10;28174:349:13;13663:2629:10;14209:33;14194:11;;;;:9;:11;:::i;:::-;:48;;;;;;;;:::i;:::-;;:104;;;-1:-1:-1;14261:37:10;14246:11;;;;:9;:11;:::i;:::-;:52;;;;;;;;:::i;:::-;;14194:104;14177:2115;;;14401:18;;;;;;;;:::i;:::-;14441:15;;;;;;;;:::i;:::-;14478:16;;;;14516;;;;;;;;:::i;:::-;14554:20;;;;;;;;:::i;:::-;14363:266;;28865:2:13;28861:15;;;-1:-1:-1;;;;;;28857:24:13;;;14363:266:10;;;28845:37:13;28916:15;;;28912:24;;28898:12;;;28891:46;28953:12;;;28946:28;;;;29008:15;;29004:24;;;28990:12;;;28983:46;29067:3;29063:16;;;;-1:-1:-1;;;;;;29059:89:13;29045:12;;;29038:111;14596:15:10;;;;29165:13:13;;;29158:29;29203:13;;14363:266:10;;;-1:-1:-1;;14363:266:10;;;;;;;;;14336:307;;14363:266;14336:307;;;;;-1:-1:-1;14676:33:10;14661:11;;;;:9;:11;:::i;:::-;:48;;;;;;;;:::i;:::-;;14657:466;;;-1:-1:-1;14742:9:10;;14777:50;;-1:-1:-1;;;14777:50:10;;;;;8341:25:13;;;-1:-1:-1;;;;;14742:9:10;;;;;;14777:38;;8314:18:13;;14777:50:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:58;;14831:4;14777:58;14769:92;;;;-1:-1:-1;;;14769:92:10;;29429:2:13;14769:92:10;;;29411:21:13;29468:2;29448:18;;;29441:30;29507:23;29487:18;;;29480:51;29548:18;;14769:92:10;29227:345:13;14657:466:10;-1:-1:-1;14985:8:10;;15019:51;;-1:-1:-1;;;15019:51:10;;;;;8341:25:13;;;-1:-1:-1;;;;;14985:8:10;;;;;;15019:39;;8314:18:13;;15019:51:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;15074:4;15019:59;15011:97;;;;-1:-1:-1;;;15011:97:10;;29779:2:13;15011:97:10;;;29761:21:13;29818:2;29798:18;;;29791:30;29857:27;29837:18;;;29830:55;29902:18;;15011:97:10;29577:349:13;14177:2115:10;15171:35;15156:11;;;;:9;:11;:::i;:::-;:50;;;;;;;;:::i;:::-;;:108;;;-1:-1:-1;15225:39:10;15210:11;;;;:9;:11;:::i;:::-;:54;;;;;;;;:::i;:::-;;15156:108;15139:1153;;;15308:35;15293:11;;;;:9;:11;:::i;:::-;:50;;;;;;;;:::i;:::-;;15289:234;;;-1:-1:-1;15376:11:10;;-1:-1:-1;;;;;15376:11:10;15289:234;;;-1:-1:-1;15498:10:10;;-1:-1:-1;;;;;15498:10:10;15289:234;15614:18;;;;;;;;:::i;:::-;15654:15;;;;;;;;:::i;:::-;15691:16;;;;15729;;;;;;;;:::i;:::-;15767:20;;;;;;;;:::i;:::-;15576:298;;30296:2:13;30292:15;;;-1:-1:-1;;;;;;30288:24:13;;;15576:298:10;;;30276:37:13;30347:15;;;30343:24;;30329:12;;;30322:46;30384:12;;;30377:28;;;;30439:15;;;30435:24;;30421:12;;;30414:46;30498:3;30494:16;-1:-1:-1;;;;;;30490:89:13;30476:12;;;30469:111;15809:15:10;;;;30596:13:13;;;30589:29;30653:15;;;;30649:24;30634:13;;;30627:47;30690:13;;15576:298:10;;;-1:-1:-1;;15576:298:10;;;;;;;;;15549:339;;15576:298;15549:339;;;;;-1:-1:-1;15921:35:10;15906:11;;;;:9;:11;:::i;:::-;:50;;;;;;;;:::i;:::-;;15902:380;;;15984:52;;-1:-1:-1;;;15984:52:10;;;;;8341:25:13;;;-1:-1:-1;;;;;15984:40:10;;;;;8314:18:13;;15984:52:10;8195:177:13;15902:380:10;16176:53;;-1:-1:-1;;;16176:53:10;;;;;8341:25:13;;;-1:-1:-1;;;;;16176:41:10;;;;;8314:18:13;;16176:53:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:61;;16233:4;16176:61;16168:99;;;;-1:-1:-1;;;16168:99:10;;29779:2:13;16168:99:10;;;29761:21:13;29818:2;29798:18;;;29791:30;29857:27;29837:18;;;29830:55;29902:18;;16168:99:10;29577:349:13;16168:99:10;16335:40;16377:10;16389;16318:82;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;16308:93;;;;;;16301:100;;;;12908:3500;;;:::o;10300:878::-;10440:35;10491:30;10524:9;10491:42;-1:-1:-1;10544:7:10;;10581:18;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10573:32:10;10613:9;-1:-1:-1;;;10750:16:10;;;;;;;;:::i;:::-;10784:15;;;;;;;;:::i;:::-;10817:16;;;;10851:20;;;;;;;;:::i;:::-;10889:8;;10915:10;10637:302;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;10637:302:10;;;;;;;;;;;;;;;;;;;;;;;;;;;10573:376;;;;10637:302;10573:376;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10543:406;;;;10963:2;10959:96;;;11000:3;10988:56;;;;;;;;;;;;:::i;:::-;10981:63;;;;;;;10959:96;11064:50;11086:22;11110:3;11064:21;:50::i;:::-;11131:40;11124:47;;;;;10300:878;;;;;;:::o;11184:894::-;11332:35;11383:30;11416:9;11383:42;-1:-1:-1;11436:7:10;;11473:18;;;;;;;;:::i;:::-;-1:-1:-1;;;;;11465:32:10;11505:9;-1:-1:-1;;;11650:16:10;;;;;;;;:::i;9481:419::-;9798:18;;;;;;;;:::i;:::-;-1:-1:-1;;;;;9677:216:10;;9699:40;9753:10;9777:7;9830:20;;;;;;;;:::i;:::-;9864:9;:19;;;9677:216;;;;;;;;;;:::i;:::-;;;;;;;;9481:419;;;:::o;20718:1868::-;20871:33;20866:1;:38;;;;;;;;:::i;:::-;;20862:1718;;;20928:15;;-1:-1:-1;;;;;20928:15:10;20920:30;20968:23;:15;;:23;:::i;:::-;21009:20;;;;:15;:20;:::i;:::-;21047:23;;;;:15;:23;:::i;:::-;21088:22;;;;:15;:22;:::i;:::-;20920:204;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20246:466;;:::o;20862:1718::-;21150:36;21145:1;:41;;;;;;;;:::i;:::-;;21141:1439;;;21210:15;;-1:-1:-1;;;;;21210:15:10;21202:33;21253:23;:15;;:23;:::i;21141:1439::-;21435:33;21430:1;:38;;;;;;;;:::i;:::-;;21426:1154;;;21503:9;;-1:-1:-1;;;;;21503:9:10;21484:34;21536:23;:15;;:23;:::i;21426:1154::-;21718:35;21713:1;:40;;;;;;;;:::i;:::-;;21709:871;;;21790:11;;-1:-1:-1;;;;;21790:11:10;21769:38;21825:23;:15;;:23;:::i;:::-;21866:20;;;;:15;:20;:::i;:::-;21904:23;;;;:15;:23;:::i;:::-;21945:22;;;;:15;:22;:::i;:::-;21769:212;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20246:466;;:::o;21709:871::-;22007:37;22002:1;:42;;;;;;;;:::i;:::-;;21998:582;;;22080:8;;-1:-1:-1;;;;;22080:8:10;22060:38;22116:23;:15;;:23;:::i;21998:582::-;22298:39;22293:1;:44;;;;;;;;:::i;:::-;;22289:291;;;22375:10;;-1:-1:-1;;;;;22375:10:10;22353:42;22413:23;:15;;:23;:::i;16414:541::-;16555:7;16662:32;16716:13;;;;:6;:13;:::i;:::-;16751:15;;;;;;;;:::i;:::-;16788:17;;;;;;;;:::i;:::-;16827:6;:16;;;16872:13;16908:8;;16624:310;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;16597:351;;;;;;16578:370;;16414:541;;;;;:::o;16961:772::-;17083:35;17134:30;17167:9;17134:42;-1:-1:-1;17187:7:10;;17224:15;;;;;;;;:::i;:::-;-1:-1:-1;;;;;17216:29:10;17253:9;-1:-1:-1;;;17378:13:10;;;;:6;:13;:::i;:::-;17409:17;;;;;;;;:::i;:::-;17444:8;;17470:10;17277:217;;;;;;;;;;;;:::i;9906:388::-;10201:15;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10088:199:10;;10110:32;10156:10;10180:7;10230:17;;;;;;;;:::i;:::-;10261:6;:16;;;10088:199;;;;;;;;;;:::i;12084:818::-;12230:35;12281:30;12314:9;12281:42;-1:-1:-1;12334:7:10;;12371:18;;;;;;;;:::i;:::-;-1:-1:-1;;;;;12363:32:10;12403:9;-1:-1:-1;;;12546:15:10;;;;;;;;:::i;:::-;12579:9;:16;;;12613:8;;12639:10;12427:236;;;;;;;;;;;;:::i;2111:169:12:-;2166:16;2185:6;;-1:-1:-1;;;;;2201:17:12;;;-1:-1:-1;;;;;;2201:17:12;;;;;;2233:40;;2185:6;;;;;;;2233:40;;2166:16;2233:40;2156:124;2111:169;:::o;17739:770:10:-;17847:29;17879:9;17847:41;;17898:25;17943;;17926:14;:42;;;;:::i;:::-;17898:70;;18008:17;17982:23;:43;:100;;;;-1:-1:-1;18054:28:10;18080:2;18054:23;:28;:::i;:::-;18029:21;:53;;17982:100;17978:471;;;18416:9;17978:471;18463:39;18476:25;18489:11;18476:12;:25::i;:::-;18463:39;;;;;;:::i;:::-;;;;;;;;17837:672;;17739:770;;:::o;18653:484::-;18723:13;18884:2;18863:11;:18;:23;18859:67;;;-1:-1:-1;;18888:38:10;;;;;;;;;;;;;;;;;;18653:484::o;18859:67::-;19025:4;19012:11;19008:22;18993:37;;19067:11;19056:33;;;;;;;;;;;;:::i;14:196:13:-;82:20;;-1:-1:-1;;;;;131:54:13;;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:13;;406:180;-1:-1:-1;406:180:13: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:13;;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:13;-1:-1:-1;1740:2:13;1725:18;;1712:32;;-1:-1:-1;1756:16:13;;;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:13;-1:-1:-1;2010:3:13;1995:19;;1982:33;;-1:-1:-1;2027:16:13;;;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:13;;-1:-1:-1;970:1264:13;;;;;;2193:8;-1:-1:-1;;;970:1264:13: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:13;;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:13;-1:-1:-1;3603:84:13;;-1:-1:-1;3775:3:13;-1:-1:-1;;3757:16:13;;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:13;-1:-1:-1;4157:3:13;4142:19;;4129:33;;-1:-1:-1;3945:105:13;;-1:-1:-1;4174:16:13;;;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:13;-1:-1:-1;4428:3:13;4413:19;;4400:33;;-1:-1:-1;4216:105:13;;-1:-1:-1;4445:16:13;;;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:13;4657:169;-1:-1:-1;4657:169:13: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:13;;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:13;;-1:-1:-1;5525:695:13;;6179:8;;5525:695;-1:-1:-1;;;5525:695:13: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:13;-1:-1:-1;6724:84:13;;-1:-1:-1;6881:76:13;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:13;-1:-1:-1;7281:3:13;7266:19;;7253:33;;-1:-1:-1;7298:16:13;;;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:13;-1:-1:-1;7552:3:13;7537:19;;7524:33;;-1:-1:-1;7569:16:13;;;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:13;-1:-1:-1;;;;7781:409:13:o;8608:551::-;8696:6;8704;8712;8720;8773:2;8761:9;8752:7;8748:23;8744:32;8741:52;;;8789:1;8786;8779:12;8741:52;8812:29;8831:9;8812:29;:::i;:::-;8802:39;;8888:2;8877:9;8873:18;8860:32;8850:42;;8943:2;8932:9;8928:18;8915:32;8970:18;8962:6;8959:30;8956:50;;;9002:1;8999;8992:12;8956:50;9041:58;9091:7;9082:6;9071:9;9067:22;9041:58;:::i;:::-;8608:551;;;;-1:-1:-1;9118:8:13;-1:-1:-1;;;;8608:551:13:o;9601:127::-;9662:10;9657:3;9653:20;9650:1;9643:31;9693:4;9690:1;9683:15;9717:4;9714:1;9707:15;9733:139;9813:1;9806:5;9803:12;9793:46;;9819:18;;:::i;:::-;9848;;9733:139::o;9877:205::-;10021:2;10006:18;;10033:43;10010:9;10058:6;10033:43;:::i;11600:258::-;11672:1;11682:113;11696:6;11693:1;11690:13;11682:113;;;11772:11;;;11766:18;11753:11;;;11746:39;11718:2;11711:10;11682:113;;;11813:6;11810:1;11807:13;11804:48;;;11848:1;11839:6;11834:3;11830:16;11823:27;11804:48;;11600:258;;;:::o;11863:257::-;11904:3;11942:5;11936:12;11969:6;11964:3;11957:19;11985:63;12041:6;12034:4;12029:3;12025:14;12018:4;12011:5;12007:16;11985:63;:::i;:::-;12102:2;12081:15;-1:-1:-1;;12077:29:13;12068:39;;;;12109:4;12064:50;;11863:257;-1:-1:-1;;11863:257:13:o;12125:266::-;12213:6;12208:3;12201:19;12265:6;12258:5;12251:4;12246:3;12242:14;12229:43;-1:-1:-1;12317:1:13;12292:16;;;12310:4;12288:27;;;12281:38;;;;12373:2;12352:15;;;-1:-1:-1;;12348:29:13;12339:39;;;12335:50;;12125:266::o;12396:1030::-;12503:6;12498:3;12491:19;12473:3;12529:4;12570:2;12565:3;12561:12;12595:11;12622;12615:18;;12672:6;12669:1;12665:14;12658:5;12654:26;12642:38;;12703:5;12726:1;12736:664;12750:6;12747:1;12744:13;12736:664;;;12821:5;12815:4;12811:16;12806:3;12799:29;12880:6;12867:20;12970:2;12966:7;12958:5;12942:14;12938:26;12934:40;12914:18;12910:65;12900:93;;12989:1;12986;12979:12;12900:93;13021:30;;13080:21;;13130:18;13117:32;;13114:52;;;13162:1;13159;13152:12;13114:52;13213:8;13197:14;13193:29;13186:5;13182:41;13179:61;;;13236:1;13233;13226:12;13179:61;13261:59;13315:4;13305:8;13300:2;13291:7;13287:16;13261:59;:::i;:::-;13378:12;;;;13253:67;-1:-1:-1;;;13343:15:13;;;;12772:1;12765:9;12736:664;;;-1:-1:-1;13416:4:13;;12396:1030;-1:-1:-1;;;;;;;12396:1030:13:o;13431:470::-;13531:6;13526:3;13519:19;13501:3;13557:4;13586:2;13581:3;13577:12;13570:19;;13612:5;13635:1;13645:231;13659:6;13656:1;13653:13;13645:231;;;-1:-1:-1;;;;;13724:26:13;13743:6;13724:26;:::i;:::-;13720:75;13708:88;;13816:12;;;;13851:15;;;;13681:1;13674:9;13645:231;;;-1:-1:-1;13892:3:13;;13431:470;-1:-1:-1;;;;;13431:470:13:o;13906:401::-;14006:6;14001:3;13994:19;13976:3;14036:66;14028:6;14025:78;14022:98;;;14116:1;14113;14106:12;14022:98;14152:6;14149:1;14145:14;14204:8;14197:5;14190:4;14185:3;14181:14;14168:45;14281:1;14236:18;;14256:4;14232:29;14270:13;;;-1:-1:-1;14232:29:13;;13906:401;-1:-1:-1;;13906:401:13:o;14312:939::-;14743:3;14732:9;14725:22;14706:4;14770:45;14810:3;14799:9;14795:19;14787:6;14770:45;:::i;:::-;14863:9;14855:6;14851:22;14846:2;14835:9;14831:18;14824:50;14897:68;14958:6;14950;14942;14897:68;:::i;:::-;14883:82;;15013:9;15005:6;15001:22;14996:2;14985:9;14981:18;14974:50;15047:61;15101:6;15093;15085;15047:61;:::i;:::-;15033:75;;15156:9;15148:6;15144:22;15139:2;15128:9;15124:18;15117:50;15184:61;15238:6;15230;15222;15184:61;:::i;:::-;15176:69;14312:939;-1:-1:-1;;;;;;;;;;14312:939:13:o;15256:127::-;15317:10;15312:3;15308:20;15305:1;15298:31;15348:4;15345:1;15338:15;15372:4;15369:1;15362:15;15388:125;15428:4;15456:1;15453;15450:8;15447:34;;;15461:18;;:::i;:::-;-1:-1:-1;15498:9:13;;15388:125::o;17239:495::-;17492:6;17487:3;17480:19;17529:6;17524:2;17519:3;17515:12;17508:28;17580:6;17572;17567:2;17562:3;17558:12;17545:42;17649:2;17606:16;;17641:11;;;17683:18;17725:2;17717:11;;17239:495;-1:-1:-1;;;17239:495:13:o;17739:284::-;17797:6;17850:2;17838:9;17829:7;17825:23;17821:32;17818:52;;;17866:1;17863;17856:12;17818:52;17905:9;17892:23;17955:18;17948:5;17944:30;17937:5;17934:41;17924:69;;17989:1;17986;17979:12;18028:147;18116:1;18109:5;18106:12;18096:46;;18122:18;;:::i;18180:449::-;18405:3;18390:19;;18418:51;18394:9;18451:6;18418:51;:::i;:::-;18505:6;18500:2;18489:9;18485:18;18478:34;18560:18;18552:6;18548:31;18543:2;18532:9;18528:18;18521:59;18616:6;18611:2;18600:9;18596:18;18589:34;18180:449;;;;;;;:::o;18634:272::-;18709:6;18762:2;18750:9;18741:7;18737:23;18733:32;18730:52;;;18778:1;18775;18768:12;18730:52;18817:9;18804:23;18856:1;18849:5;18846:12;18836:40;;18872:1;18869;18862:12;18911:521;18988:4;18994:6;19054:11;19041:25;19148:2;19144:7;19133:8;19117:14;19113:29;19109:43;19089:18;19085:68;19075:96;;19167:1;19164;19157:12;19075:96;19194:33;;19246:20;;;-1:-1:-1;19289:18:13;19278:30;;19275:50;;;19321:1;19318;19311:12;19275:50;19354:4;19342:17;;-1:-1:-1;19385:14:13;19381:27;;;19371:38;;19368:58;;;19422:1;19419;19412:12;19437:556;19541:4;19547:6;19607:11;19594:25;19701:2;19697:7;19686:8;19670:14;19666:29;19662:43;19642:18;19638:68;19628:96;;19720:1;19717;19710:12;19628:96;19747:33;;19799:20;;;-1:-1:-1;19842:18:13;19831:30;;19828:50;;;19874:1;19871;19864:12;19828:50;19907:4;19895:17;;-1:-1:-1;19958:1:13;19954:14;;;19938;19934:35;19924:46;;19921:66;;;19983:1;19980;19973:12;21787:682;22047:4;-1:-1:-1;;;;;22157:2:13;22149:6;22145:15;22134:9;22127:34;22197:6;22192:2;22181:9;22177:18;22170:34;22252:2;22244:6;22240:15;22235:2;22224:9;22220:18;22213:43;;22292:6;22287:2;22276:9;22272:18;22265:34;22336:3;22330;22319:9;22315:19;22308:32;22357:62;22414:3;22403:9;22399:19;22391:6;22383;22357:62;:::i;:::-;22349:70;;22456:6;22450:3;22439:9;22435:19;22428:35;21787:682;;;;;;;;;;:::o;23519:168::-;23559:7;23625:1;23621;23617:6;23613:14;23610:1;23607:21;23602:1;23595:9;23588:17;23584:45;23581:71;;;23632:18;;:::i;:::-;-1:-1:-1;23672:9:13;;23519:168::o;23692:128::-;23732:3;23763:1;23759:6;23756:1;23753:13;23750:39;;;23769:18;;:::i;:::-;-1:-1:-1;23805:9:13;;23692:128::o;24283:508::-;-1:-1:-1;;;;;24528:6:13;24524:55;24513:9;24506:74;24616:6;24611:2;24600:9;24596:18;24589:34;24659:3;24654:2;24643:9;24639:18;24632:31;24487:4;24680:62;24737:3;24726:9;24722:19;24714:6;24706;24680:62;:::i;:::-;24672:70;;24778:6;24773:2;24762:9;24758:18;24751:34;24283:508;;;;;;;;:::o;26890:277::-;26957:6;27010:2;26998:9;26989:7;26985:23;26981:32;26978:52;;;27026:1;27023;27016:12;26978:52;27058:9;27052:16;27111:5;27104:13;27097:21;27090:5;27087:32;27077:60;;27133:1;27130;27123:12;30714:148;30793:1;30786:5;30783:12;30773:46;;30799:18;;:::i;:::-;30844:3;30840:15;30828:28;;30714:148::o;30867:384::-;31061:36;31093:3;31085:6;31061:36;:::i;:::-;31134:2;31130:15;;;;-1:-1:-1;;;;;;31126:53:13;31122:1;31113:11;;31106:74;31205:2;31196:12;;31189:28;31242:2;31233:12;;30867:384;-1:-1:-1;30867:384:13:o;31256:714::-;31514:4;-1:-1:-1;;;;;31624:2:13;31616:6;31612:15;31601:9;31594:34;31676:2;31668:6;31664:15;31659:2;31648:9;31644:18;31637:43;31716:6;31711:2;31700:9;31696:18;31689:34;31771:18;31763:6;31759:31;31754:2;31743:9;31739:18;31732:59;31828:3;31822;31811:9;31807:19;31800:32;31849:62;31906:3;31895:9;31891:19;31883:6;31875;31849:62;:::i;:::-;31841:70;;31960:2;31952:6;31948:15;31942:3;31931:9;31927:19;31920:44;;31256:714;;;;;;;;;;:::o;31975:274::-;32104:3;32142:6;32136:13;32158:53;32204:6;32199:3;32192:4;32184:6;32180:17;32158:53;:::i;:::-;32227:16;;;;;31975:274;-1:-1:-1;;31975:274:13:o;32254:279::-;32343:6;32396:2;32384:9;32375:7;32371:23;32367:32;32364:52;;;32412:1;32409;32402:12;32364:52;32444:9;32438:16;32483:1;32476:5;32473:12;32463:40;;32499:1;32496;32489:12;32538:549;32801:3;32786:19;;32814:51;32790:9;32847:6;32814:51;:::i;:::-;32901:6;32896:2;32885:9;32881:18;32874:34;32917:52;32965:2;32954:9;32950:18;32942:6;32917:52;:::i;:::-;33017:18;33005:31;;;;33000:2;32985:18;;32978:59;33068:3;33053:19;33046:35;32538:549;;-1:-1:-1;;;32538:549:13:o;33092:966::-;33533:3;33522:9;33515:22;33496:4;33560:62;33617:3;33606:9;33602:19;33594:6;33586;33560:62;:::i;:::-;33670:9;33662:6;33658:22;33653:2;33642:9;33638:18;33631:50;33704:68;33765:6;33757;33749;33704:68;:::i;:::-;33690:82;;33820:9;33812:6;33808:22;33803:2;33792:9;33788:18;33781:50;33854:61;33908:6;33900;33892;33854:61;:::i;:::-;33840:75;;33963:9;33955:6;33951:22;33946:2;33935:9;33931:18;33924:50;33991:61;34045:6;34037;34029;33991:61;:::i;:::-;33983:69;33092:966;-1:-1:-1;;;;;;;;;;;33092:966:13:o;34063:184::-;34133:6;34186:2;34174:9;34165:7;34161:23;34157:32;34154:52;;;34202:1;34199;34192:12;34154:52;-1:-1:-1;34225:16:13;;34063:184;-1:-1:-1;34063:184:13:o;34252:900::-;34582:36;34614:3;34606:6;34582:36;:::i;:::-;34564:3;34641:26;34637:31;34718:2;34709:6;34705:2;34701:15;34697:24;34693:1;34688:3;34684:11;34677:45;34773:2;34764:6;34760:2;34756:15;34752:24;34747:2;34742:3;34738:12;34731:46;;-1:-1:-1;;;;;;34914:2:13;34905:6;34900:3;34896:16;34892:25;34887:2;34882:3;34878:12;34871:47;34948:6;34943:2;34938:3;34934:12;34927:28;35007:2;34998:6;34993:3;34989:16;34985:25;34980:2;34975:3;34971:12;34964:47;;35055:6;35047;35042:2;35037:3;35033:12;35020:42;-1:-1:-1;35126:1:13;35085:16;;35103:2;35081:25;35115:13;;;35081:25;34252:900;-1:-1:-1;;;;;;;34252:900:13:o;35157:561::-;35359:4;-1:-1:-1;;;;;35469:2:13;35461:6;35457:15;35446:9;35439:34;35521:18;35513:6;35509:31;35504:2;35493:9;35489:18;35482:59;35577:3;35572:2;35561:9;35557:18;35550:31;35598:62;35655:3;35644:9;35640:19;35632:6;35624;35598:62;:::i;:::-;35590:70;;35708:2;35700:6;35696:15;35691:2;35680:9;35676:18;35669:43;;35157:561;;;;;;;;:::o;35723:538::-;35927:4;-1:-1:-1;;;;;36037:2:13;36029:6;36025:15;36014:9;36007:34;36077:6;36072:2;36061:9;36057:18;36050:34;36120:3;36115:2;36104:9;36100:18;36093:31;36141:62;36198:3;36187:9;36183:19;36175:6;36167;36141:62;:::i;36266:217::-;36306:1;36332;36322:132;;36376:10;36371:3;36367:20;36364:1;36357:31;36411:4;36408:1;36401:15;36439:4;36436:1;36429:15;36322:132;-1:-1:-1;36468:9:13;;36266:217::o;36488:219::-;36637:2;36626:9;36619:21;36600:4;36657:44;36697:2;36686:9;36682:18;36674:6;36657:44;:::i;36712:127::-;36773:10;36768:3;36764:20;36761:1;36754:31;36804:4;36801:1;36794:15;36828:4;36825:1;36818:15;36844:884;36924:6;36977:2;36965:9;36956:7;36952:23;36948:32;36945:52;;;36993:1;36990;36983:12;36945:52;37026:9;37020:16;37055:18;37096:2;37088:6;37085:14;37082:34;;;37112:1;37109;37102:12;37082:34;37150:6;37139:9;37135:22;37125:32;;37195:7;37188:4;37184:2;37180:13;37176:27;37166:55;;37217:1;37214;37207:12;37166:55;37246:2;37240:9;37268:2;37264;37261:10;37258:36;;;37274:18;;:::i;:::-;37349:2;37343:9;37317:2;37403:13;;-1:-1:-1;;37399:22:13;;;37423:2;37395:31;37391:40;37379:53;;;37447:18;;;37467:22;;;37444:46;37441:72;;;37493:18;;:::i;:::-;37533:10;37529:2;37522:22;37568:2;37560:6;37553:18;37608:7;37603:2;37598;37594;37590:11;37586:20;37583:33;37580:53;;;37629:1;37626;37619:12;37580:53;37642:55;37694:2;37689;37681:6;37677:15;37672:2;37668;37664:11;37642:55;:::i;:::-;37716:6;36844:884;-1:-1:-1;;;;;;;36844:884:13:o
Swarm Source
ipfs://9a1f23077e16f595b6070fef52fab06c8e34241c157a6e4b91d3bcb349cd8e93
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.