Source Code
Latest 25 from a total of 1,120 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Execute Settleme... | 24078181 | 5 days ago | IN | 0 ETH | 0.00000982 | ||||
| Authorize Multip... | 24078180 | 5 days ago | IN | 0 ETH | 0.00000262 | ||||
| Deposit | 24078172 | 5 days ago | IN | 0 ETH | 0.00000242 | ||||
| Authorize Multip... | 24078167 | 5 days ago | IN | 0 ETH | 0.00000327 | ||||
| Create Pending S... | 24078166 | 5 days ago | IN | 0 ETH | 0.00000562 | ||||
| Create Pending S... | 24078166 | 5 days ago | IN | 0 ETH | 0.00000718 | ||||
| Create Pending S... | 24078166 | 5 days ago | IN | 0 ETH | 0.00000718 | ||||
| Create Pending S... | 24078166 | 5 days ago | IN | 0 ETH | 0.00000562 | ||||
| Create Pending S... | 24078165 | 5 days ago | IN | 0 ETH | 0.00000578 | ||||
| Create Pending S... | 24078165 | 5 days ago | IN | 0 ETH | 0.00000578 | ||||
| Redeem | 24071280 | 6 days ago | IN | 0 ETH | 0.00000181 | ||||
| Execute Settleme... | 24071012 | 6 days ago | IN | 0 ETH | 0.00000837 | ||||
| Authorize Multip... | 24071008 | 6 days ago | IN | 0 ETH | 0.00000337 | ||||
| Create Pending S... | 24071006 | 6 days ago | IN | 0 ETH | 0.00000744 | ||||
| Create Pending S... | 24071006 | 6 days ago | IN | 0 ETH | 0.00000582 | ||||
| Create Pending S... | 24071006 | 6 days ago | IN | 0 ETH | 0.00000744 | ||||
| Create Pending S... | 24071006 | 6 days ago | IN | 0 ETH | 0.00000744 | ||||
| Create Pending S... | 24071006 | 6 days ago | IN | 0 ETH | 0.00000582 | ||||
| Execute Settleme... | 24056678 | 8 days ago | IN | 0 ETH | 0.00000837 | ||||
| Authorize Multip... | 24056677 | 8 days ago | IN | 0 ETH | 0.00000154 | ||||
| Deposit | 24056669 | 8 days ago | IN | 0 ETH | 0.00000183 | ||||
| Authorize Multip... | 24056665 | 8 days ago | IN | 0 ETH | 0.0000026 | ||||
| Create Pending S... | 24056664 | 8 days ago | IN | 0 ETH | 0.00000629 | ||||
| Create Pending S... | 24056664 | 8 days ago | IN | 0 ETH | 0.00000492 | ||||
| Create Pending S... | 24056664 | 8 days ago | IN | 0 ETH | 0.00000629 |
Latest 9 internal transactions
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Deposit | 22037095 | 290 days ago | 0.11 ETH | ||||
| Deposit | 22037085 | 290 days ago | 0.0126 ETH | ||||
| Deposit | 21831551 | 319 days ago | 0.1 ETH | ||||
| Deposit | 21831531 | 319 days ago | 0.05 ETH | ||||
| Deposit | 21831468 | 319 days ago | 0.001 ETH | ||||
| Deposit | 21796782 | 324 days ago | 1.5 ETH | ||||
| Deposit | 21790160 | 325 days ago | 0.01 ETH | ||||
| Deposit | 21780332 | 326 days ago | 0.001 ETH | ||||
| Deposit | 21771648 | 328 days ago | 0.1 ETH |
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Settlement
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
No with 200 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
// Tells the Solidity compiler to compile only from v0.8.13 to v0.9.0
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "./AccessControl.sol";
import './SharedStructs.sol';
import './SharedStructs.sol';
import './SharedStructs.sol';
struct SettlementStruct {
address debtor;
address creditor;
SharedStructs.TokenStruct[] transactedTokens;
SharedStructs.TokenStruct[] releasedFromDebtorTokens;
SharedStructs.TokenStruct[] releasedFromCreditorTokens;
bool exists;
bool authorized;
}
interface IWETH {
function deposit() external payable;
function transfer(address to, uint256 value) external returns (bool);
function withdraw(uint _amount) external;
}
contract Settlement {
using SafeERC20 for IERC20;
address public owner;
address public executor;
address public WETH_address;
IWETH public weth;
AccessControl accessControl;
event PendingSettlement(uint256 settlementUUID, address debtor, address creditor);
event ExecutedSettlement(uint256 settlementUUID, address debtor, address creditor);
event Deposit(address depositor, address token, uint256 depositedAmount, uint256 currentAmount);
event Redemption(address depositor, address token, uint256 depositedAmount, uint256 currentAmount);
event CustodianSignature(uint settlementUUID);
event Locked(address depositor, address token, uint256 lockedAmount, uint256 currentAmount);
event Unlocked(address depositor, address token, uint256 lockedAmount);
event DeleteSettlement(uint256 settlementUUID);
event ReleaseFunds(address settlementUUID);
event ChangeOwnership(address newOwner);
mapping(address => mapping (address => uint256)) private custodianBalances;
mapping(address => mapping (address => uint256)) private lockedCustodianBalances;
mapping(uint256 => SettlementStruct) private custodianSettlements;
constructor(address AccessControlAddress, address executorAddress, address _wEthAddress){
owner = msg.sender;
checkZeroAddress(executorAddress);
executor = executorAddress;
checkZeroAddress(AccessControlAddress);
accessControl = AccessControl(AccessControlAddress);
WETH_address = _wEthAddress;
weth = IWETH(WETH_address);
//_paused = false;
}
modifier onlyOwner {
require(msg.sender == owner, "Not contract owner");
_;
}
modifier onlyExecutor {
require(msg.sender == executor, "Not contract executor");
_;
}
function checkZeroAddress(address _address) internal pure {
require (_address != address(0), "Invalid address");
}
function deposit(address _tokenAddress, uint256 _amount) public {
accessControl.onlyAllowed(msg.sender);
accessControl.onlyAllowedToken(_tokenAddress);
IERC20 token = IERC20(_tokenAddress);
token.safeTransferFrom(msg.sender, address(this), _amount);
if (accessControl.isBrickAndMortar(msg.sender)){
custodianBalances[msg.sender][_tokenAddress] += _amount;
emit Deposit(msg.sender, _tokenAddress, _amount, custodianBalances[msg.sender][_tokenAddress]);
} else {
lockedCustodianBalances[msg.sender][_tokenAddress] += _amount;
emit Locked(msg.sender, _tokenAddress, _amount, lockedCustodianBalances[msg.sender][_tokenAddress]);
}
}
receive() external payable {
accessControl.onlyAllowed(msg.sender);
require(msg.value > 0, "No ETH sent");
uint msgValue = msg.value;
weth.deposit{value: msg.value}();
if (accessControl.isBrickAndMortar(msg.sender)){
custodianBalances[msg.sender][WETH_address] += msgValue;
emit Deposit(msg.sender, WETH_address, msgValue, custodianBalances[msg.sender][WETH_address]);
} else {
lockedCustodianBalances[msg.sender][WETH_address] += msgValue;
emit Locked(msg.sender, WETH_address, msgValue, lockedCustodianBalances[msg.sender][WETH_address]);
}
}
function createPendingSettlement(uint256 _settlementUUID, address _debtor, address _creditor, SharedStructs.TokenStruct[] memory _transactedTokens,
SharedStructs.TokenStruct[] memory _releasedFromDebtor, SharedStructs.TokenStruct[] memory _releasedFromCreditor) external onlyExecutor /*whenNotPaused*/ {
require(!custodianSettlements[_settlementUUID].exists, "Settlement already exists");
accessControl.validateSettlement(_creditor, _debtor);
SettlementStruct storage newSettlement = custodianSettlements[_settlementUUID];
newSettlement.debtor = _debtor;
newSettlement.creditor = _creditor;
newSettlement.exists = true;
newSettlement.authorized = false;
for (uint256 i = 0; i < _transactedTokens.length; i++) {
require(accessControl.getTokenAllowable(_transactedTokens[i].tokenAddress), "not allowed token");
newSettlement.transactedTokens.push(_transactedTokens[i]);
}
if(_releasedFromDebtor.length > 0){
require(accessControl.isVirtualCustodian(_debtor), "not VC to have funds released");
for (uint256 i = 0; i < _releasedFromDebtor.length; i++) {
require(accessControl.getTokenAllowable(_releasedFromDebtor[i].tokenAddress), "not allowed token");
newSettlement.releasedFromDebtorTokens.push(_releasedFromDebtor[i]);
}
}
if(_releasedFromCreditor.length > 0){
require(accessControl.isVirtualCustodian(_creditor), "not VC to have funds released");
for (uint256 i = 0; i < _releasedFromCreditor.length; i++) {
require(accessControl.getTokenAllowable(_releasedFromCreditor[i].tokenAddress), "not allowed token");
newSettlement.releasedFromCreditorTokens.push(_releasedFromCreditor[i]);
}
}
emit PendingSettlement(_settlementUUID, _debtor, _creditor);
}
function authorizeSettlement(uint256 _settlementUUID) public {
accessControl.onlyAllowed(msg.sender);
require(!custodianSettlements[_settlementUUID].authorized, "settlement already authorized");
require(_mappingObjectExists(_settlementUUID), "Inexistent settlement");
if (accessControl.isBrickAndMortar(msg.sender)) {
require(msg.sender == custodianSettlements[_settlementUUID].debtor, "Address is not the debtor");
_lockFunds(_settlementUUID);
}
else if (accessControl.isVirtualCustodian(custodianSettlements[_settlementUUID].debtor)) {
require(accessControl.isAuditor(msg.sender));
} else {
revert("Invalid custodian category");
}
custodianSettlements[_settlementUUID].authorized = true;
emit CustodianSignature(_settlementUUID);
}
function authorizeMultiple(uint256[] memory _settlementUUIDs) public {
for (uint256 i = 0; i< _settlementUUIDs.length; i++) {
authorizeSettlement(_settlementUUIDs[i]);
}
}
function executeSettlement(uint256[] memory _executedIds) external onlyExecutor {
for (uint256 settlementIndex= 0; settlementIndex < _executedIds.length; settlementIndex++) {
require(_mappingObjectExists(_executedIds[settlementIndex]), "Inexistent settlement");
require(custodianSettlements[_executedIds[settlementIndex]].authorized, "Settlement not signed");
_settle(_executedIds[settlementIndex]);
_freeStorage(_executedIds[settlementIndex]);
}
}
function _mappingObjectExists(uint256 settlementUUID) private view returns (bool){
return custodianSettlements[settlementUUID].exists == true ? true : false;
}
function _settle(uint256 _settlementUUID) private {
SettlementStruct storage settlement = custodianSettlements[_settlementUUID];
for (uint index = 0; index < settlement.transactedTokens.length; index++) {
if(accessControl.isBrickAndMortar(settlement.creditor)) {
//moves from locked debtor to unlocked creditor if creditor is category 1(BRICK)
lockedCustodianBalances[settlement.debtor][settlement.transactedTokens[index].tokenAddress] -= settlement.transactedTokens[index].tokenAmount;
custodianBalances[settlement.creditor][settlement.transactedTokens[index].tokenAddress] += settlement.transactedTokens[index].tokenAmount;
} else if (accessControl.isVirtualCustodian(settlement.creditor)) {
//moves from locked debtor to locked creditor if creditor is category 2(VC)
lockedCustodianBalances[settlement.debtor][settlement.transactedTokens[index].tokenAddress] -= settlement.transactedTokens[index].tokenAmount;
lockedCustodianBalances[settlement.creditor][settlement.transactedTokens[index].tokenAddress] += settlement.transactedTokens[index].tokenAmount;
}
}
if (settlement.releasedFromDebtorTokens.length != 0) _unlockFunds(settlement.debtor, settlement.releasedFromDebtorTokens);
if (settlement.releasedFromCreditorTokens.length != 0) _unlockFunds(settlement.creditor, settlement.releasedFromCreditorTokens);
emit ExecutedSettlement(_settlementUUID, settlement.debtor, settlement.creditor);
}
function _lockFunds(uint256 _settlementUUID) private {
SettlementStruct storage settlement = custodianSettlements[_settlementUUID];
for (uint index = 0; index < settlement.transactedTokens.length; index++) {
//moves from unlocked debtor to locked debtor
custodianBalances[settlement.debtor][settlement.transactedTokens[index].tokenAddress] -= settlement.transactedTokens[index].tokenAmount;
lockedCustodianBalances[settlement.debtor][settlement.transactedTokens[index].tokenAddress] += settlement.transactedTokens[index].tokenAmount;
}
}
function _freeStorage(uint256 key) private {
delete custodianSettlements[key].transactedTokens;
delete custodianSettlements[key].releasedFromDebtorTokens;
delete custodianSettlements[key].releasedFromCreditorTokens;
delete custodianSettlements[key].debtor;
delete custodianSettlements[key].creditor;
custodianSettlements[key].exists = false;
custodianSettlements[key].authorized = false;
}
function redeem(address _tokenAddress, uint256 _amount) public {
accessControl.onlyAllowed(msg.sender);
IERC20 token = IERC20(_tokenAddress);
require(_amount <= custodianBalances[msg.sender][_tokenAddress], "Insuficient funds");
custodianBalances[msg.sender][_tokenAddress] -= _amount;
if(_tokenAddress == WETH_address) {
require(weth.transfer(msg.sender,_amount), "Failed to transfer");
} else {
token.safeTransfer(msg.sender, _amount);
}
emit Redemption(msg.sender, _tokenAddress, _amount, custodianBalances[msg.sender][_tokenAddress]);
}
function getBalancesOfToken(address _custodianAddress, address _tokenAddress) public view returns (uint256 balance, uint256 lockedBalance){
return (custodianBalances[_custodianAddress][_tokenAddress], lockedCustodianBalances[_custodianAddress][_tokenAddress]);
}
function getSettlementData(uint256 _settlementId) public view returns (address debtor, address creditor,
SharedStructs.TokenStruct[] memory transactedTokens, SharedStructs.TokenStruct[] memory releasedFromDebtorTokens,
SharedStructs.TokenStruct[] memory releasedFromCreditorTokens, bool authorized) {
return (custodianSettlements[_settlementId].debtor, custodianSettlements[_settlementId].creditor,
custodianSettlements[_settlementId].transactedTokens, custodianSettlements[_settlementId].releasedFromDebtorTokens,
custodianSettlements[_settlementId].releasedFromCreditorTokens,
custodianSettlements[_settlementId].authorized);
}
function getContractData() public view returns (address executorAddress, address adminAddress){
return (executor, owner);
}
function _unlockFunds(address entity, SharedStructs.TokenStruct[] memory tokens) internal {
for (uint index = 0; index < tokens.length; index++) {
lockedCustodianBalances[entity][tokens[index].tokenAddress] -= tokens[index].tokenAmount;
custodianBalances[entity][tokens[index].tokenAddress] += tokens[index].tokenAmount;
}
}
function deleteSettlement(uint256 _settlementUUID) external onlyOwner {
if (!accessControl.isVirtualCustodian(custodianSettlements[_settlementUUID].debtor)){
//Only non VC users need to move funds
if (custodianSettlements[_settlementUUID].authorized){
SettlementStruct storage settlement = custodianSettlements[_settlementUUID];
for (uint index = 0; index < settlement.transactedTokens.length; index++) {
//moves from locked debtor to unlocked debtor
lockedCustodianBalances[settlement.debtor][settlement.transactedTokens[index].tokenAddress] -= settlement.transactedTokens[index].tokenAmount;
custodianBalances[settlement.debtor][settlement.transactedTokens[index].tokenAddress] += settlement.transactedTokens[index].tokenAmount;
}
}
}
_freeStorage(_settlementUUID);
emit DeleteSettlement(_settlementUUID);
}
function releaseFunds(address custodianAddress, address[] calldata tokenAddresses) external onlyOwner {
require(accessControl.isVirtualCustodian(custodianAddress), "cannot release non VCs");
for(uint index = 0; index < tokenAddresses.length; index++){
uint amount = lockedCustodianBalances[custodianAddress][tokenAddresses[index]];
lockedCustodianBalances[custodianAddress][tokenAddresses[index]] -= amount;
custodianBalances[custodianAddress][tokenAddresses[index]] += amount;
}
emit ReleaseFunds(custodianAddress);
}
function changeOwnership(address _ownerAddress) external onlyOwner {
checkZeroAddress(_ownerAddress);
owner = _ownerAddress;
emit ChangeOwnership(_ownerAddress);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
library Utils {
// Utility Functions
function addressToString(address x) internal pure returns (string memory) {
bytes memory s = new bytes(40);
for (uint256 i = 0; i < 20; i++) {
bytes1 b = bytes1(uint8(uint256(uint160(x)) / (2**(8 * (19 - i)))));
bytes1 hi = bytes1(uint8(b) / 16);
bytes1 lo = bytes1(uint8(b) - 16 * uint8(hi));
s[2 * i] = char(hi);
s[2 * i + 1] = char(lo);
}
return string(s);
}
function char(bytes1 b) internal pure returns (bytes1 c) {
if (uint8(b) < 10) return bytes1(uint8(b) + 0x30);
else return bytes1(uint8(b) + 0x57);
}
function uint2str(uint256 _i)
internal
pure
returns (string memory _uintAsString)
{
if (_i == 0) {
return "0";
}
uint256 j = _i;
uint256 len;
while (j != 0) {
len++;
j /= 10;
}
bytes memory bstr = new bytes(len);
uint256 k = len;
while (_i != 0) {
k = k - 1;
uint8 temp = (48 + uint8(_i - (_i / 10) * 10));
bytes1 b1 = bytes1(temp);
bstr[k] = b1;
_i /= 10;
}
return string(bstr);
}
function append(
string memory a,
address b,
address c
) internal pure returns (string memory) {
return
string(
abi.encodePacked(a, addressToString(b), " ", addressToString(c))
);
}
}// SPDX-License-Identifier: MIT
// Tells the Solidity compiler to compile only from v0.8.13 to v0.9.0
pragma solidity ^0.8.0;
contract SharedStructs {
struct TokenStruct {
address tokenAddress;
uint256 tokenAmount;
}
}// SPDX-License-Identifier: MIT
// Tells the Solidity compiler to compile only from v0.8.13 to v0.9.0
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import './SharedStructs.sol';
import '../libraries/Utils.sol';
contract AccessControl {
address public owner;
address public auditor;
address public settlementContract;
bool public definedContract = false;
mapping(address => bool) private custodianAddresses;
mapping(address => uint8) private custodianCategory; // 1 - Big custodians 2 - Individuals
mapping(address => bool) private allowableTokens;
event CustodianAdded(address custodianAddress, uint8 custodianCategory);
constructor(address _auditorAddress, address _wethAddress){
checkZeroAddress(_auditorAddress);
auditor = _auditorAddress;
allowableTokens[_wethAddress] = true;
owner = msg.sender;
}
function onlyOwner (address sentAddress) private view {
require(sentAddress == owner, "Not contract owner");
return;
}
function checkZeroAddress(address _address) internal pure {
require (_address != address(0), "Invalid address");
}
function onlySettlementAndAuditor(address settlementContractOrAuditorAddress) private view {
require((settlementContractOrAuditorAddress == auditor) || (settlementContractOrAuditorAddress == settlementContract), "No permission to release");
return;
}
function onlySettlement(address settlementContractOrAuditorAddress) private view {
require((settlementContractOrAuditorAddress == settlementContract), "No permission to lock");
return;
}
function onlyAllowed (address sentAddress) external view {
require(custodianAddresses[sentAddress] == true || sentAddress == auditor, "Custodian Not allowed");
return;
}
function onlyAllowedToken(address tokenAddress) external view {
require(allowableTokens[tokenAddress] == true, "Token not allowed");
return;
}
function isAuditor(address auditorAddress) external view returns (bool) {
require(auditor == auditorAddress, "Address is not the auditor");
return true;
}
function setMultipleCustodiansAllowable(address[] calldata newCustodianAddresses, uint8[] calldata custodianCategories) external {
require(newCustodianAddresses.length == custodianCategories.length);
onlyOwner(msg.sender);
for (uint8 i = 0; i< newCustodianAddresses.length; i++){
setCustodianAllowable(newCustodianAddresses[i], custodianCategories[i]);
}
}
function setCustodianAllowable(address custodianAddress, uint8 custodianCategoryValue) public {
onlyOwner(msg.sender);
checkZeroAddress(custodianAddress);
require(custodianAddresses[custodianAddress] == false, "custodian already added");
require(custodianCategoryValue == 1 || custodianCategoryValue == 2, "invalid custodian category");
custodianAddresses[custodianAddress] = true;
custodianCategory[custodianAddress] = custodianCategoryValue;
emit CustodianAdded(custodianAddress, custodianCategoryValue);
}
function getCustodianAllowable(address custodianAddress) external view returns (bool, uint8) {
return (custodianAddresses[custodianAddress], custodianCategory[custodianAddress]);
}
function isVirtualCustodian(address custodianAddress) external view returns (bool) {
return 2 == custodianCategory[custodianAddress];
}
function isBrickAndMortar(address custodianAddress) external view returns (bool){
return 1 == custodianCategory[custodianAddress];
}
function validateSettlement(address creditor, address debtor) external view {
require ((custodianAddresses[creditor] && custodianAddresses[debtor]), "Invalid creditor/debtor");
}
function setTokenAllowable(address tokenAddress) external {
onlyOwner(msg.sender);
allowableTokens[tokenAddress] = true;
}
function removeTokenAllowable(address tokenAddress) external {
onlyOwner(msg.sender);
allowableTokens[tokenAddress] = false;
}
function getTokenAllowable(address tokenAddress) public view returns (bool) {
return allowableTokens[tokenAddress];
}
function changeOwnership(address ownerAddress) external {
onlyOwner(msg.sender);
checkZeroAddress(ownerAddress);
owner = ownerAddress;
}
function addSettlementContractAddress(address settlementAddress) public {
onlyOwner(msg.sender);
require (definedContract == false, "Cannot redefine linked settlement contract");
checkZeroAddress(settlementAddress);
settlementContract = settlementAddress;
definedContract = true;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)
pragma solidity ^0.8.0;
// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
/**
* @dev Wrappers over Solidity's arithmetic operations.
*
* NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
* now has built in overflow checking.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the subtraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator.
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.0;
import "../IERC20.sol";
import "../extensions/draft-IERC20Permit.sol";
import "../../../utils/Address.sol";
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using Address for address;
function safeTransfer(
IERC20 token,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(
IERC20 token,
address spender,
uint256 value
) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
}
function safePermit(
IERC20Permit token,
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) internal {
uint256 nonceBefore = token.nonces(owner);
token.permit(owner, spender, value, deadline, v, r, s);
uint256 nonceAfter = token.nonces(owner);
require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
// Return data is optional
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
*
* Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
* presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
* need to send a transaction, and thus is not required to hold Ether at all.
*/
interface IERC20Permit {
/**
* @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
* given ``owner``'s signed approval.
*
* IMPORTANT: The same issues {IERC20-approve} has related to transaction
* ordering also apply here.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `deadline` must be a timestamp in the future.
* - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
* over the EIP712-formatted function arguments.
* - the signature must use ``owner``'s current nonce (see {nonces}).
*
* For more information on the signature format, see the
* https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
* section].
*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
/**
* @dev Returns the current nonce for `owner`. This value must be
* included whenever a signature is generated for {permit}.
*
* Every successful call to {permit} increases ``owner``'s nonce by one. This
* prevents a signature from being used multiple times.
*/
function nonces(address owner) external view returns (uint256);
/**
* @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
*/
// solhint-disable-next-line func-name-mixedcase
function DOMAIN_SEPARATOR() external view returns (bytes32);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 amount
) external returns (bool);
}{
"remappings": [],
"optimizer": {
"enabled": false,
"runs": 200
},
"evmVersion": "cancun",
"libraries": {},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"AccessControlAddress","type":"address"},{"internalType":"address","name":"executorAddress","type":"address"},{"internalType":"address","name":"_wEthAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"ChangeOwnership","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"settlementUUID","type":"uint256"}],"name":"CustodianSignature","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"settlementUUID","type":"uint256"}],"name":"DeleteSettlement","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"depositedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"currentAmount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"settlementUUID","type":"uint256"},{"indexed":false,"internalType":"address","name":"debtor","type":"address"},{"indexed":false,"internalType":"address","name":"creditor","type":"address"}],"name":"ExecutedSettlement","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"lockedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"currentAmount","type":"uint256"}],"name":"Locked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"settlementUUID","type":"uint256"},{"indexed":false,"internalType":"address","name":"debtor","type":"address"},{"indexed":false,"internalType":"address","name":"creditor","type":"address"}],"name":"PendingSettlement","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"depositedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"currentAmount","type":"uint256"}],"name":"Redemption","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"settlementUUID","type":"address"}],"name":"ReleaseFunds","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"lockedAmount","type":"uint256"}],"name":"Unlocked","type":"event"},{"inputs":[],"name":"WETH_address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_settlementUUIDs","type":"uint256[]"}],"name":"authorizeMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_settlementUUID","type":"uint256"}],"name":"authorizeSettlement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_ownerAddress","type":"address"}],"name":"changeOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_settlementUUID","type":"uint256"},{"internalType":"address","name":"_debtor","type":"address"},{"internalType":"address","name":"_creditor","type":"address"},{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"internalType":"struct SharedStructs.TokenStruct[]","name":"_transactedTokens","type":"tuple[]"},{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"internalType":"struct SharedStructs.TokenStruct[]","name":"_releasedFromDebtor","type":"tuple[]"},{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"internalType":"struct SharedStructs.TokenStruct[]","name":"_releasedFromCreditor","type":"tuple[]"}],"name":"createPendingSettlement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_settlementUUID","type":"uint256"}],"name":"deleteSettlement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_executedIds","type":"uint256[]"}],"name":"executeSettlement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"executor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_custodianAddress","type":"address"},{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"getBalancesOfToken","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"lockedBalance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractData","outputs":[{"internalType":"address","name":"executorAddress","type":"address"},{"internalType":"address","name":"adminAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_settlementId","type":"uint256"}],"name":"getSettlementData","outputs":[{"internalType":"address","name":"debtor","type":"address"},{"internalType":"address","name":"creditor","type":"address"},{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"internalType":"struct SharedStructs.TokenStruct[]","name":"transactedTokens","type":"tuple[]"},{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"internalType":"struct SharedStructs.TokenStruct[]","name":"releasedFromDebtorTokens","type":"tuple[]"},{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"internalType":"struct SharedStructs.TokenStruct[]","name":"releasedFromCreditorTokens","type":"tuple[]"},{"internalType":"bool","name":"authorized","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"redeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"custodianAddress","type":"address"},{"internalType":"address[]","name":"tokenAddresses","type":"address[]"}],"name":"releaseFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
608060405234801561000f575f5ffd5b506040516157a63803806157a683398181016040528101906100319190610286565b335f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061007f826101b760201b60201c565b8160015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506100ce836101b760201b60201c565b8260045f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505061034e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161021c90610330565b60405180910390fd5b50565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6102558261022c565b9050919050565b6102658161024b565b811461026f575f5ffd5b50565b5f815190506102808161025c565b92915050565b5f5f5f6060848603121561029d5761029c610228565b5b5f6102aa86828701610272565b93505060206102bb86828701610272565b92505060406102cc86828701610272565b9150509250925092565b5f82825260208201905092915050565b7f496e76616c6964206164647265737300000000000000000000000000000000005f82015250565b5f61031a600f836102d6565b9150610325826102e6565b602082019050919050565b5f6020820190508181035f8301526103478161030e565b9050919050565b61544b8061035b5f395ff3fe6080604052600436106100f6575f3560e01c80638876f50f11610089578063c34c08e511610058578063c34c08e514610839578063d3438bc514610863578063ee1c113b1461088b578063fc31116a146108cc57610637565b80638876f50f146107925780638da5cb5b146107ba57806397070d36146107e4578063a68b91ab1461080e57610637565b80633fc8cef3116100c55780633fc8cef3146106f057806347e7ef241461071a578063758224fb1461074257806386aa51a41461076a57610637565b806314eeac9a1461063b5780631e9a6950146106785780632af4c31e146106a0578063368f02b1146106c857610637565b366106375760045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166357740457336040518263ffffffff1660e01b815260040161015591906141b7565b5f6040518083038186803b15801561016b575f5ffd5b505afa15801561017d573d5f5f3e3d5ffd5b505050505f34116101c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ba9061422a565b60405180910390fd5b5f34905060035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004015f604051808303818588803b15801561022e575f5ffd5b505af1158015610240573d5f5f3e3d5ffd5b505050505060045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663117790bc336040518263ffffffff1660e01b815260040161029f91906141b7565b602060405180830381865afa1580156102ba573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102de919061428e565b1561048e578060055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461038b91906142ef565b925050819055507fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d73360025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168360055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546040516104819493929190614331565b60405180910390a1610635565b8060065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461053691906142ef565b925050819055507f967ad762aa9070ada8db64577288e214771e89667066ae38e8750cb8a86c54293360025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168360065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205460405161062c9493929190614331565b60405180910390a15b005b5f5ffd5b348015610646575f5ffd5b50610661600480360381019061065c919061439e565b6108f4565b60405161066f9291906143dc565b60405180910390f35b348015610683575f5ffd5b5061069e6004803603810190610699919061442d565b6109f3565b005b3480156106ab575f5ffd5b506106c660048036038101906106c1919061446b565b610de0565b005b3480156106d3575f5ffd5b506106ee60048036038101906106e991906145e6565b610ef0565b005b3480156106fb575f5ffd5b50610704610f32565b6040516107119190614688565b60405180910390f35b348015610725575f5ffd5b50610740600480360381019061073b919061442d565b610f57565b005b34801561074d575f5ffd5b50610768600480360381019061076391906146a1565b6113c3565b005b348015610775575f5ffd5b50610790600480360381019061078b91906145e6565b611858565b005b34801561079d575f5ffd5b506107b860048036038101906107b391906146a1565b611a29565b005b3480156107c5575f5ffd5b506107ce611e59565b6040516107db91906141b7565b60405180910390f35b3480156107ef575f5ffd5b506107f8611e7d565b60405161080591906141b7565b60405180910390f35b348015610819575f5ffd5b50610822611ea2565b6040516108309291906146cc565b60405180910390f35b348015610844575f5ffd5b5061084d611eef565b60405161085a91906141b7565b60405180910390f35b34801561086e575f5ffd5b5061088960048036038101906108849190614804565b611f14565b005b348015610896575f5ffd5b506108b160048036038101906108ac91906146a1565b612855565b6040516108c3969594939291906149e3565b60405180910390f35b3480156108d7575f5ffd5b506108f260048036038101906108ed9190614ab0565b612b53565b005b5f5f60055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205460065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054915091509250929050565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166357740457336040518263ffffffff1660e01b8152600401610a4d91906141b7565b5f6040518083038186803b158015610a63575f5ffd5b505afa158015610a75573d5f5f3e3d5ffd5b505050505f82905060055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054821115610b38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2f90614b57565b60405180910390fd5b8160055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610bbf9190614b75565b9250508190555060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610cfa5760035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401610c76929190614ba8565b6020604051808303815f875af1158015610c92573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cb6919061428e565b610cf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cec90614c19565b60405180910390fd5b610d26565b610d2533838373ffffffffffffffffffffffffffffffffffffffff16612f219092919063ffffffff16565b5b7fa28d80c9910787c0c058ed9b50c577f1389264bf61563fa45529e0771976f56233848460055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054604051610dd39493929190614331565b60405180910390a1505050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6590614c81565b60405180910390fd5b610e7781612fa7565b805f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f244ded7a3b73e60f03281fc183df050e6134d393c50788e980dc090f06e7280981604051610ee591906141b7565b60405180910390a150565b5f5f90505b8151811015610f2e57610f21828281518110610f1457610f13614c9f565b5b60200260200101516113c3565b8080600101915050610ef5565b5050565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166357740457336040518263ffffffff1660e01b8152600401610fb191906141b7565b5f6040518083038186803b158015610fc7575f5ffd5b505afa158015610fd9573d5f5f3e3d5ffd5b5050505060045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e3c09c84836040518263ffffffff1660e01b815260040161103791906141b7565b5f6040518083038186803b15801561104d575f5ffd5b505afa15801561105f573d5f5f3e3d5ffd5b505050505f8290506110943330848473ffffffffffffffffffffffffffffffffffffffff16613018909392919063ffffffff16565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663117790bc336040518263ffffffff1660e01b81526004016110ee91906141b7565b602060405180830381865afa158015611109573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061112d919061428e565b1561127a578160055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546111b991906142ef565b925050819055507fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d733848460055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205460405161126d9493929190614331565b60405180910390a16113be565b8160065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461130191906142ef565b925050819055507f967ad762aa9070ada8db64577288e214771e89667066ae38e8750cb8a86c542933848460065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546040516113b59493929190614331565b60405180910390a15b505050565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166357740457336040518263ffffffff1660e01b815260040161141d91906141b7565b5f6040518083038186803b158015611433575f5ffd5b505afa158015611445573d5f5f3e3d5ffd5b5050505060075f8281526020019081526020015f2060050160019054906101000a900460ff16156114ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a290614d16565b60405180910390fd5b6114b4816130a1565b6114f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ea90614d7e565b60405180910390fd5b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663117790bc336040518263ffffffff1660e01b815260040161154d91906141b7565b602060405180830381865afa158015611568573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061158c919061428e565b1561163f5760075f8281526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611631576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162890614de6565b60405180910390fd5b61163a816130de565b6117f1565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b34de64a60075f8481526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016116cb91906141b7565b602060405180830381865afa1580156116e6573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061170a919061428e565b156117b55760045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166349b90557336040518263ffffffff1660e01b815260040161176991906141b7565b602060405180830381865afa158015611784573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117a8919061428e565b6117b0575f5ffd5b6117f0565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e790614e4e565b60405180910390fd5b5b600160075f8381526020019081526020015f2060050160016101000a81548160ff0219169083151502179055507f1991a56578b115ba1775510b2215b6c9687469414e44dddcb6c730c58ebdbcf38160405161184d9190614e6c565b60405180910390a150565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118de90614ecf565b60405180910390fd5b5f5f90505b8151811015611a255761191882828151811061190b5761190a614c9f565b5b60200260200101516130a1565b611957576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194e90614d7e565b60405180910390fd5b60075f83838151811061196d5761196c614c9f565b5b602002602001015181526020019081526020015f2060050160019054906101000a900460ff166119d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c990614f37565b60405180910390fd5b6119f58282815181106119e8576119e7614c9f565b5b6020026020010151613348565b611a18828281518110611a0b57611a0a614c9f565b5b6020026020010151613bcc565b80806001019150506118ec565b5050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aae90614c81565b60405180910390fd5b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b34de64a60075f8481526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401611b4391906141b7565b602060405180830381865afa158015611b5e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b82919061428e565b611e165760075f8281526020019081526020015f2060050160019054906101000a900460ff1615611e15575f60075f8381526020019081526020015f2090505f5f90505b8160020180549050811015611e1257816002018181548110611beb57611bea614c9f565b5b905f5260205f2090600202016001015460065f845f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f846002018481548110611c7157611c70614c9f565b5b905f5260205f2090600202015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611ce69190614b75565b92505081905550816002018181548110611d0357611d02614c9f565b5b905f5260205f2090600202016001015460055f845f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f846002018481548110611d8957611d88614c9f565b5b905f5260205f2090600202015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611dfe91906142ef565b925050819055508080600101915050611bc6565b50505b5b611e1f81613bcc565b7f85a0912887f1d48a1a010a53af242463a1e9400c658f81fca3d3b7af10f24ea281604051611e4e9190614e6c565b60405180910390a150565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff165f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915091509091565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9a90614ecf565b60405180910390fd5b60075f8781526020019081526020015f206005015f9054906101000a900460ff1615612004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffb90614f9f565b60405180910390fd5b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0481c0685876040518363ffffffff1660e01b81526004016120609291906146cc565b5f6040518083038186803b158015612076575f5ffd5b505afa158015612088573d5f5f3e3d5ffd5b505050505f60075f8881526020019081526020015f20905085815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001816005015f6101000a81548160ff0219169083151502179055505f8160050160016101000a81548160ff0219169083151502179055505f5f90505b84518110156123005760045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663be87cb418683815181106121b9576121b8614c9f565b5b60200260200101515f01516040518263ffffffff1660e01b81526004016121e091906141b7565b602060405180830381865afa1580156121fb573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061221f919061428e565b61225e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225590615007565b60405180910390fd5b8160020185828151811061227557612274614c9f565b5b6020026020010151908060018154018082558091505060019003905f5260205f2090600202015f909190919091505f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015550508080600101915050612160565b505f835111156125895760045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b34de64a876040518263ffffffff1660e01b815260040161236491906141b7565b602060405180830381865afa15801561237f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123a3919061428e565b6123e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d99061506f565b60405180910390fd5b5f5f90505b83518110156125875760045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663be87cb418583815181106124405761243f614c9f565b5b60200260200101515f01516040518263ffffffff1660e01b815260040161246791906141b7565b602060405180830381865afa158015612482573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124a6919061428e565b6124e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124dc90615007565b60405180910390fd5b816003018482815181106124fc576124fb614c9f565b5b6020026020010151908060018154018082558091505060019003905f5260205f2090600202015f909190919091505f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155505080806001019150506123e7565b505b5f825111156128115760045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b34de64a866040518263ffffffff1660e01b81526004016125ec91906141b7565b602060405180830381865afa158015612607573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061262b919061428e565b61266a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126619061506f565b60405180910390fd5b5f5f90505b825181101561280f5760045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663be87cb418483815181106126c8576126c7614c9f565b5b60200260200101515f01516040518263ffffffff1660e01b81526004016126ef91906141b7565b602060405180830381865afa15801561270a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061272e919061428e565b61276d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276490615007565b60405180910390fd5b8160040183828151811061278457612783614c9f565b5b6020026020010151908060018154018082558091505060019003905f5260205f2090600202015f909190919091505f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101555050808060010191505061266f565b505b7f0775a8f8dc3cfb7143fc637edc0e4d6b79a6c77f4bfbe07bd7da26e0cebf76678787876040516128449392919061508d565b60405180910390a150505050505050565b5f5f60608060605f60075f8881526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660075f8981526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660075f8a81526020019081526020015f2060020160075f8b81526020019081526020015f2060030160075f8c81526020019081526020015f2060040160075f8d81526020019081526020015f2060050160019054906101000a900460ff1683805480602002602001604051908101604052809291908181526020015f905b828210156129d0578382905f5260205f2090600202016040518060400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152505081526020019060010190612942565b50505050935082805480602002602001604051908101604052809291908181526020015f905b82821015612a84578382905f5260205f2090600202016040518060400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481525050815260200190600101906129f6565b50505050925081805480602002602001604051908101604052809291908181526020015f905b82821015612b38578382905f5260205f2090600202016040518060400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152505081526020019060010190612aaa565b50505050915095509550955095509550955091939550919395565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd890614c81565b60405180910390fd5b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b34de64a846040518263ffffffff1660e01b8152600401612c3b91906141b7565b602060405180830381865afa158015612c56573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c7a919061428e565b612cb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb09061510c565b60405180910390fd5b5f5f90505b82829050811015612ee4575f60065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f858585818110612d1b57612d1a614c9f565b5b9050602002016020810190612d30919061446b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508060065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f868686818110612dbe57612dbd614c9f565b5b9050602002016020810190612dd3919061446b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612e1a9190614b75565b925050819055508060055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f868686818110612e7357612e72614c9f565b5b9050602002016020810190612e88919061446b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612ecf91906142ef565b92505081905550508080600101915050612cbe565b507ff19116e8c1b7c855a16202b984cfb7e6c6510eff1db4656203f80ea41fbfb21183604051612f1491906141b7565b60405180910390a1505050565b612fa28363a9059cbb60e01b8484604051602401612f40929190614ba8565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613cee565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613015576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300c90615174565b60405180910390fd5b50565b61309b846323b872dd60e01b85858560405160240161303993929190615192565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613cee565b50505050565b5f6001151560075f8481526020019081526020015f206005015f9054906101000a900460ff161515146130d4575f6130d7565b60015b9050919050565b5f60075f8381526020019081526020015f2090505f5f90505b81600201805490508110156133435781600201818154811061311c5761311b614c9f565b5b905f5260205f2090600202016001015460055f845f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8460020184815481106131a2576131a1614c9f565b5b905f5260205f2090600202015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546132179190614b75565b9250508190555081600201818154811061323457613233614c9f565b5b905f5260205f2090600202016001015460065f845f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8460020184815481106132ba576132b9614c9f565b5b905f5260205f2090600202015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461332f91906142ef565b9250508190555080806001019150506130f7565b505050565b5f60075f8381526020019081526020015f2090505f5f90505b81600201805490508110156139685760045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663117790bc836001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016133ed91906141b7565b602060405180830381865afa158015613408573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061342c919061428e565b156136675781600201818154811061344757613446614c9f565b5b905f5260205f2090600202016001015460065f845f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8460020184815481106134cd576134cc614c9f565b5b905f5260205f2090600202015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546135429190614b75565b9250508190555081600201818154811061355f5761355e614c9f565b5b905f5260205f2090600202016001015460055f846001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8460020184815481106135e6576135e5614c9f565b5b905f5260205f2090600202015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461365b91906142ef565b9250508190555061395b565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b34de64a836001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016136e491906141b7565b602060405180830381865afa1580156136ff573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613723919061428e565b1561395a5781600201818154811061373e5761373d614c9f565b5b905f5260205f2090600202016001015460065f845f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8460020184815481106137c4576137c3614c9f565b5b905f5260205f2090600202015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546138399190614b75565b9250508190555081600201818154811061385657613855614c9f565b5b905f5260205f2090600202016001015460065f846001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8460020184815481106138dd576138dc614c9f565b5b905f5260205f2090600202015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461395291906142ef565b925050819055505b5b8080600101915050613361565b505f816003018054905014613a5857613a57815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600301805480602002602001604051908101604052809291908181526020015f905b82821015613a4e578382905f5260205f2090600202016040518060400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481525050815260200190600101906139c0565b50505050613db3565b5b5f816004018054905014613b4857613b47816001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600401805480602002602001604051908101604052809291908181526020015f905b82821015613b3e578382905f5260205f2090600202016040518060400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152505081526020019060010190613ab0565b50505050613db3565b5b7fc4579a0af401cc15699ac55e47fb1f5e2e40f95ab05ca4b77ba13ce6b61a474882825f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051613bc09392919061508d565b60405180910390a15050565b60075f8281526020019081526020015f206002015f613beb9190614114565b60075f8281526020019081526020015f206003015f613c0a9190614114565b60075f8281526020019081526020015f206004015f613c299190614114565b60075f8281526020019081526020015f205f015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560075f8281526020019081526020015f206001015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555f60075f8381526020019081526020015f206005015f6101000a81548160ff0219169083151502179055505f60075f8381526020019081526020015f2060050160016101000a81548160ff02191690831515021790555050565b5f613d4f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613f659092919063ffffffff16565b90505f81511115613dae5780806020019051810190613d6e919061428e565b613dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613da490615237565b60405180910390fd5b5b505050565b5f5f90505b8151811015613f6057818181518110613dd457613dd3614c9f565b5b60200260200101516020015160065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f848481518110613e3157613e30614c9f565b5b60200260200101515f015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254613e839190614b75565b92505081905550818181518110613e9d57613e9c614c9f565b5b60200260200101516020015160055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f848481518110613efa57613ef9614c9f565b5b60200260200101515f015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254613f4c91906142ef565b925050819055508080600101915050613db8565b505050565b6060613f7384845f85613f7c565b90509392505050565b606082471015613fc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fb8906152c5565b60405180910390fd5b613fca8561408c565b614009576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140009061532d565b60405180910390fd5b5f5f8673ffffffffffffffffffffffffffffffffffffffff168587604051614031919061539d565b5f6040518083038185875af1925050503d805f811461406b576040519150601f19603f3d011682016040523d82523d5f602084013e614070565b606091505b50915091506140808282866140ae565b92505050949350505050565b5f5f8273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606083156140be5782905061410d565b5f835111156140d05782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161410491906153f5565b60405180910390fd5b9392505050565b5080545f8255600202905f5260205f20908101906141329190614135565b50565b5b80821115614174575f5f82015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600182015f905550600201614136565b5090565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6141a182614178565b9050919050565b6141b181614197565b82525050565b5f6020820190506141ca5f8301846141a8565b92915050565b5f82825260208201905092915050565b7f4e6f204554482073656e740000000000000000000000000000000000000000005f82015250565b5f614214600b836141d0565b915061421f826141e0565b602082019050919050565b5f6020820190508181035f83015261424181614208565b9050919050565b5f604051905090565b5f5ffd5b5f5ffd5b5f8115159050919050565b61426d81614259565b8114614277575f5ffd5b50565b5f8151905061428881614264565b92915050565b5f602082840312156142a3576142a2614251565b5b5f6142b08482850161427a565b91505092915050565b5f819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6142f9826142b9565b9150614304836142b9565b925082820190508082111561431c5761431b6142c2565b5b92915050565b61432b816142b9565b82525050565b5f6080820190506143445f8301876141a8565b61435160208301866141a8565b61435e6040830185614322565b61436b6060830184614322565b95945050505050565b61437d81614197565b8114614387575f5ffd5b50565b5f8135905061439881614374565b92915050565b5f5f604083850312156143b4576143b3614251565b5b5f6143c18582860161438a565b92505060206143d28582860161438a565b9150509250929050565b5f6040820190506143ef5f830185614322565b6143fc6020830184614322565b9392505050565b61440c816142b9565b8114614416575f5ffd5b50565b5f8135905061442781614403565b92915050565b5f5f6040838503121561444357614442614251565b5b5f6144508582860161438a565b925050602061446185828601614419565b9150509250929050565b5f602082840312156144805761447f614251565b5b5f61448d8482850161438a565b91505092915050565b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6144e08261449a565b810181811067ffffffffffffffff821117156144ff576144fe6144aa565b5b80604052505050565b5f614511614248565b905061451d82826144d7565b919050565b5f67ffffffffffffffff82111561453c5761453b6144aa565b5b602082029050602081019050919050565b5f5ffd5b5f61456361455e84614522565b614508565b905080838252602082019050602084028301858111156145865761458561454d565b5b835b818110156145af578061459b8882614419565b845260208401935050602081019050614588565b5050509392505050565b5f82601f8301126145cd576145cc614496565b5b81356145dd848260208601614551565b91505092915050565b5f602082840312156145fb576145fa614251565b5b5f82013567ffffffffffffffff81111561461857614617614255565b5b614624848285016145b9565b91505092915050565b5f819050919050565b5f61465061464b61464684614178565b61462d565b614178565b9050919050565b5f61466182614636565b9050919050565b5f61467282614657565b9050919050565b61468281614668565b82525050565b5f60208201905061469b5f830184614679565b92915050565b5f602082840312156146b6576146b5614251565b5b5f6146c384828501614419565b91505092915050565b5f6040820190506146df5f8301856141a8565b6146ec60208301846141a8565b9392505050565b5f67ffffffffffffffff82111561470d5761470c6144aa565b5b602082029050602081019050919050565b5f5ffd5b5f604082840312156147375761473661471e565b5b6147416040614508565b90505f6147508482850161438a565b5f83015250602061476384828501614419565b60208301525092915050565b5f61478161477c846146f3565b614508565b905080838252602082019050604084028301858111156147a4576147a361454d565b5b835b818110156147cd57806147b98882614722565b8452602084019350506040810190506147a6565b5050509392505050565b5f82601f8301126147eb576147ea614496565b5b81356147fb84826020860161476f565b91505092915050565b5f5f5f5f5f5f60c0878903121561481e5761481d614251565b5b5f61482b89828a01614419565b965050602061483c89828a0161438a565b955050604061484d89828a0161438a565b945050606087013567ffffffffffffffff81111561486e5761486d614255565b5b61487a89828a016147d7565b935050608087013567ffffffffffffffff81111561489b5761489a614255565b5b6148a789828a016147d7565b92505060a087013567ffffffffffffffff8111156148c8576148c7614255565b5b6148d489828a016147d7565b9150509295509295509295565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61491381614197565b82525050565b614922816142b9565b82525050565b604082015f82015161493c5f85018261490a565b50602082015161494f6020850182614919565b50505050565b5f6149608383614928565b60408301905092915050565b5f602082019050919050565b5f614982826148e1565b61498c81856148eb565b9350614997836148fb565b805f5b838110156149c75781516149ae8882614955565b97506149b98361496c565b92505060018101905061499a565b5085935050505092915050565b6149dd81614259565b82525050565b5f60c0820190506149f65f8301896141a8565b614a0360208301886141a8565b8181036040830152614a158187614978565b90508181036060830152614a298186614978565b90508181036080830152614a3d8185614978565b9050614a4c60a08301846149d4565b979650505050505050565b5f5ffd5b5f5f83601f840112614a7057614a6f614496565b5b8235905067ffffffffffffffff811115614a8d57614a8c614a57565b5b602083019150836020820283011115614aa957614aa861454d565b5b9250929050565b5f5f5f60408486031215614ac757614ac6614251565b5b5f614ad48682870161438a565b935050602084013567ffffffffffffffff811115614af557614af4614255565b5b614b0186828701614a5b565b92509250509250925092565b7f496e737566696369656e742066756e64730000000000000000000000000000005f82015250565b5f614b416011836141d0565b9150614b4c82614b0d565b602082019050919050565b5f6020820190508181035f830152614b6e81614b35565b9050919050565b5f614b7f826142b9565b9150614b8a836142b9565b9250828203905081811115614ba257614ba16142c2565b5b92915050565b5f604082019050614bbb5f8301856141a8565b614bc86020830184614322565b9392505050565b7f4661696c656420746f207472616e7366657200000000000000000000000000005f82015250565b5f614c036012836141d0565b9150614c0e82614bcf565b602082019050919050565b5f6020820190508181035f830152614c3081614bf7565b9050919050565b7f4e6f7420636f6e7472616374206f776e657200000000000000000000000000005f82015250565b5f614c6b6012836141d0565b9150614c7682614c37565b602082019050919050565b5f6020820190508181035f830152614c9881614c5f565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f736574746c656d656e7420616c726561647920617574686f72697a65640000005f82015250565b5f614d00601d836141d0565b9150614d0b82614ccc565b602082019050919050565b5f6020820190508181035f830152614d2d81614cf4565b9050919050565b7f496e6578697374656e7420736574746c656d656e7400000000000000000000005f82015250565b5f614d686015836141d0565b9150614d7382614d34565b602082019050919050565b5f6020820190508181035f830152614d9581614d5c565b9050919050565b7f41646472657373206973206e6f742074686520646562746f72000000000000005f82015250565b5f614dd06019836141d0565b9150614ddb82614d9c565b602082019050919050565b5f6020820190508181035f830152614dfd81614dc4565b9050919050565b7f496e76616c696420637573746f6469616e2063617465676f72790000000000005f82015250565b5f614e38601a836141d0565b9150614e4382614e04565b602082019050919050565b5f6020820190508181035f830152614e6581614e2c565b9050919050565b5f602082019050614e7f5f830184614322565b92915050565b7f4e6f7420636f6e7472616374206578656375746f7200000000000000000000005f82015250565b5f614eb96015836141d0565b9150614ec482614e85565b602082019050919050565b5f6020820190508181035f830152614ee681614ead565b9050919050565b7f536574746c656d656e74206e6f74207369676e656400000000000000000000005f82015250565b5f614f216015836141d0565b9150614f2c82614eed565b602082019050919050565b5f6020820190508181035f830152614f4e81614f15565b9050919050565b7f536574746c656d656e7420616c726561647920657869737473000000000000005f82015250565b5f614f896019836141d0565b9150614f9482614f55565b602082019050919050565b5f6020820190508181035f830152614fb681614f7d565b9050919050565b7f6e6f7420616c6c6f77656420746f6b656e0000000000000000000000000000005f82015250565b5f614ff16011836141d0565b9150614ffc82614fbd565b602082019050919050565b5f6020820190508181035f83015261501e81614fe5565b9050919050565b7f6e6f7420564320746f20686176652066756e64732072656c65617365640000005f82015250565b5f615059601d836141d0565b915061506482615025565b602082019050919050565b5f6020820190508181035f8301526150868161504d565b9050919050565b5f6060820190506150a05f830186614322565b6150ad60208301856141a8565b6150ba60408301846141a8565b949350505050565b7f63616e6e6f742072656c65617365206e6f6e20564373000000000000000000005f82015250565b5f6150f66016836141d0565b9150615101826150c2565b602082019050919050565b5f6020820190508181035f830152615123816150ea565b9050919050565b7f496e76616c6964206164647265737300000000000000000000000000000000005f82015250565b5f61515e600f836141d0565b91506151698261512a565b602082019050919050565b5f6020820190508181035f83015261518b81615152565b9050919050565b5f6060820190506151a55f8301866141a8565b6151b260208301856141a8565b6151bf6040830184614322565b949350505050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e5f8201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b5f615221602a836141d0565b915061522c826151c7565b604082019050919050565b5f6020820190508181035f83015261524e81615215565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f5f8201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b5f6152af6026836141d0565b91506152ba82615255565b604082019050919050565b5f6020820190508181035f8301526152dc816152a3565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000005f82015250565b5f615317601d836141d0565b9150615322826152e3565b602082019050919050565b5f6020820190508181035f8301526153448161530b565b9050919050565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f6153778261534b565b6153818185615355565b935061539181856020860161535f565b80840191505092915050565b5f6153a8828461536d565b915081905092915050565b5f81519050919050565b5f6153c7826153b3565b6153d181856141d0565b93506153e181856020860161535f565b6153ea8161449a565b840191505092915050565b5f6020820190508181035f83015261540d81846153bd565b90509291505056fea26469706673582212209b9c979ab07405ca2f0abad8fa2a3912fe2ee7b7250ac209b19bf4f6cbc13de464736f6c634300081c0033000000000000000000000000bee487d615cbcac897d655f3dfa98e5aa3e09f52000000000000000000000000346ddf548fff2b93b21f6470680d7232c929e870000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Deployed Bytecode
0x6080604052600436106100f6575f3560e01c80638876f50f11610089578063c34c08e511610058578063c34c08e514610839578063d3438bc514610863578063ee1c113b1461088b578063fc31116a146108cc57610637565b80638876f50f146107925780638da5cb5b146107ba57806397070d36146107e4578063a68b91ab1461080e57610637565b80633fc8cef3116100c55780633fc8cef3146106f057806347e7ef241461071a578063758224fb1461074257806386aa51a41461076a57610637565b806314eeac9a1461063b5780631e9a6950146106785780632af4c31e146106a0578063368f02b1146106c857610637565b366106375760045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166357740457336040518263ffffffff1660e01b815260040161015591906141b7565b5f6040518083038186803b15801561016b575f5ffd5b505afa15801561017d573d5f5f3e3d5ffd5b505050505f34116101c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ba9061422a565b60405180910390fd5b5f34905060035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004015f604051808303818588803b15801561022e575f5ffd5b505af1158015610240573d5f5f3e3d5ffd5b505050505060045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663117790bc336040518263ffffffff1660e01b815260040161029f91906141b7565b602060405180830381865afa1580156102ba573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102de919061428e565b1561048e578060055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461038b91906142ef565b925050819055507fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d73360025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168360055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546040516104819493929190614331565b60405180910390a1610635565b8060065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461053691906142ef565b925050819055507f967ad762aa9070ada8db64577288e214771e89667066ae38e8750cb8a86c54293360025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168360065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205460405161062c9493929190614331565b60405180910390a15b005b5f5ffd5b348015610646575f5ffd5b50610661600480360381019061065c919061439e565b6108f4565b60405161066f9291906143dc565b60405180910390f35b348015610683575f5ffd5b5061069e6004803603810190610699919061442d565b6109f3565b005b3480156106ab575f5ffd5b506106c660048036038101906106c1919061446b565b610de0565b005b3480156106d3575f5ffd5b506106ee60048036038101906106e991906145e6565b610ef0565b005b3480156106fb575f5ffd5b50610704610f32565b6040516107119190614688565b60405180910390f35b348015610725575f5ffd5b50610740600480360381019061073b919061442d565b610f57565b005b34801561074d575f5ffd5b50610768600480360381019061076391906146a1565b6113c3565b005b348015610775575f5ffd5b50610790600480360381019061078b91906145e6565b611858565b005b34801561079d575f5ffd5b506107b860048036038101906107b391906146a1565b611a29565b005b3480156107c5575f5ffd5b506107ce611e59565b6040516107db91906141b7565b60405180910390f35b3480156107ef575f5ffd5b506107f8611e7d565b60405161080591906141b7565b60405180910390f35b348015610819575f5ffd5b50610822611ea2565b6040516108309291906146cc565b60405180910390f35b348015610844575f5ffd5b5061084d611eef565b60405161085a91906141b7565b60405180910390f35b34801561086e575f5ffd5b5061088960048036038101906108849190614804565b611f14565b005b348015610896575f5ffd5b506108b160048036038101906108ac91906146a1565b612855565b6040516108c3969594939291906149e3565b60405180910390f35b3480156108d7575f5ffd5b506108f260048036038101906108ed9190614ab0565b612b53565b005b5f5f60055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205460065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054915091509250929050565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166357740457336040518263ffffffff1660e01b8152600401610a4d91906141b7565b5f6040518083038186803b158015610a63575f5ffd5b505afa158015610a75573d5f5f3e3d5ffd5b505050505f82905060055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054821115610b38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2f90614b57565b60405180910390fd5b8160055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610bbf9190614b75565b9250508190555060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610cfa5760035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401610c76929190614ba8565b6020604051808303815f875af1158015610c92573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cb6919061428e565b610cf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cec90614c19565b60405180910390fd5b610d26565b610d2533838373ffffffffffffffffffffffffffffffffffffffff16612f219092919063ffffffff16565b5b7fa28d80c9910787c0c058ed9b50c577f1389264bf61563fa45529e0771976f56233848460055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054604051610dd39493929190614331565b60405180910390a1505050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6590614c81565b60405180910390fd5b610e7781612fa7565b805f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f244ded7a3b73e60f03281fc183df050e6134d393c50788e980dc090f06e7280981604051610ee591906141b7565b60405180910390a150565b5f5f90505b8151811015610f2e57610f21828281518110610f1457610f13614c9f565b5b60200260200101516113c3565b8080600101915050610ef5565b5050565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166357740457336040518263ffffffff1660e01b8152600401610fb191906141b7565b5f6040518083038186803b158015610fc7575f5ffd5b505afa158015610fd9573d5f5f3e3d5ffd5b5050505060045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e3c09c84836040518263ffffffff1660e01b815260040161103791906141b7565b5f6040518083038186803b15801561104d575f5ffd5b505afa15801561105f573d5f5f3e3d5ffd5b505050505f8290506110943330848473ffffffffffffffffffffffffffffffffffffffff16613018909392919063ffffffff16565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663117790bc336040518263ffffffff1660e01b81526004016110ee91906141b7565b602060405180830381865afa158015611109573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061112d919061428e565b1561127a578160055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546111b991906142ef565b925050819055507fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d733848460055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205460405161126d9493929190614331565b60405180910390a16113be565b8160065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461130191906142ef565b925050819055507f967ad762aa9070ada8db64577288e214771e89667066ae38e8750cb8a86c542933848460065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546040516113b59493929190614331565b60405180910390a15b505050565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166357740457336040518263ffffffff1660e01b815260040161141d91906141b7565b5f6040518083038186803b158015611433575f5ffd5b505afa158015611445573d5f5f3e3d5ffd5b5050505060075f8281526020019081526020015f2060050160019054906101000a900460ff16156114ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a290614d16565b60405180910390fd5b6114b4816130a1565b6114f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ea90614d7e565b60405180910390fd5b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663117790bc336040518263ffffffff1660e01b815260040161154d91906141b7565b602060405180830381865afa158015611568573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061158c919061428e565b1561163f5760075f8281526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611631576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162890614de6565b60405180910390fd5b61163a816130de565b6117f1565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b34de64a60075f8481526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016116cb91906141b7565b602060405180830381865afa1580156116e6573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061170a919061428e565b156117b55760045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166349b90557336040518263ffffffff1660e01b815260040161176991906141b7565b602060405180830381865afa158015611784573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117a8919061428e565b6117b0575f5ffd5b6117f0565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e790614e4e565b60405180910390fd5b5b600160075f8381526020019081526020015f2060050160016101000a81548160ff0219169083151502179055507f1991a56578b115ba1775510b2215b6c9687469414e44dddcb6c730c58ebdbcf38160405161184d9190614e6c565b60405180910390a150565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118de90614ecf565b60405180910390fd5b5f5f90505b8151811015611a255761191882828151811061190b5761190a614c9f565b5b60200260200101516130a1565b611957576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194e90614d7e565b60405180910390fd5b60075f83838151811061196d5761196c614c9f565b5b602002602001015181526020019081526020015f2060050160019054906101000a900460ff166119d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c990614f37565b60405180910390fd5b6119f58282815181106119e8576119e7614c9f565b5b6020026020010151613348565b611a18828281518110611a0b57611a0a614c9f565b5b6020026020010151613bcc565b80806001019150506118ec565b5050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aae90614c81565b60405180910390fd5b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b34de64a60075f8481526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401611b4391906141b7565b602060405180830381865afa158015611b5e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b82919061428e565b611e165760075f8281526020019081526020015f2060050160019054906101000a900460ff1615611e15575f60075f8381526020019081526020015f2090505f5f90505b8160020180549050811015611e1257816002018181548110611beb57611bea614c9f565b5b905f5260205f2090600202016001015460065f845f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f846002018481548110611c7157611c70614c9f565b5b905f5260205f2090600202015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611ce69190614b75565b92505081905550816002018181548110611d0357611d02614c9f565b5b905f5260205f2090600202016001015460055f845f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f846002018481548110611d8957611d88614c9f565b5b905f5260205f2090600202015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611dfe91906142ef565b925050819055508080600101915050611bc6565b50505b5b611e1f81613bcc565b7f85a0912887f1d48a1a010a53af242463a1e9400c658f81fca3d3b7af10f24ea281604051611e4e9190614e6c565b60405180910390a150565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff165f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915091509091565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9a90614ecf565b60405180910390fd5b60075f8781526020019081526020015f206005015f9054906101000a900460ff1615612004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffb90614f9f565b60405180910390fd5b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0481c0685876040518363ffffffff1660e01b81526004016120609291906146cc565b5f6040518083038186803b158015612076575f5ffd5b505afa158015612088573d5f5f3e3d5ffd5b505050505f60075f8881526020019081526020015f20905085815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001816005015f6101000a81548160ff0219169083151502179055505f8160050160016101000a81548160ff0219169083151502179055505f5f90505b84518110156123005760045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663be87cb418683815181106121b9576121b8614c9f565b5b60200260200101515f01516040518263ffffffff1660e01b81526004016121e091906141b7565b602060405180830381865afa1580156121fb573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061221f919061428e565b61225e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225590615007565b60405180910390fd5b8160020185828151811061227557612274614c9f565b5b6020026020010151908060018154018082558091505060019003905f5260205f2090600202015f909190919091505f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015550508080600101915050612160565b505f835111156125895760045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b34de64a876040518263ffffffff1660e01b815260040161236491906141b7565b602060405180830381865afa15801561237f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123a3919061428e565b6123e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d99061506f565b60405180910390fd5b5f5f90505b83518110156125875760045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663be87cb418583815181106124405761243f614c9f565b5b60200260200101515f01516040518263ffffffff1660e01b815260040161246791906141b7565b602060405180830381865afa158015612482573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124a6919061428e565b6124e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124dc90615007565b60405180910390fd5b816003018482815181106124fc576124fb614c9f565b5b6020026020010151908060018154018082558091505060019003905f5260205f2090600202015f909190919091505f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155505080806001019150506123e7565b505b5f825111156128115760045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b34de64a866040518263ffffffff1660e01b81526004016125ec91906141b7565b602060405180830381865afa158015612607573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061262b919061428e565b61266a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126619061506f565b60405180910390fd5b5f5f90505b825181101561280f5760045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663be87cb418483815181106126c8576126c7614c9f565b5b60200260200101515f01516040518263ffffffff1660e01b81526004016126ef91906141b7565b602060405180830381865afa15801561270a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061272e919061428e565b61276d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276490615007565b60405180910390fd5b8160040183828151811061278457612783614c9f565b5b6020026020010151908060018154018082558091505060019003905f5260205f2090600202015f909190919091505f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101555050808060010191505061266f565b505b7f0775a8f8dc3cfb7143fc637edc0e4d6b79a6c77f4bfbe07bd7da26e0cebf76678787876040516128449392919061508d565b60405180910390a150505050505050565b5f5f60608060605f60075f8881526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660075f8981526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660075f8a81526020019081526020015f2060020160075f8b81526020019081526020015f2060030160075f8c81526020019081526020015f2060040160075f8d81526020019081526020015f2060050160019054906101000a900460ff1683805480602002602001604051908101604052809291908181526020015f905b828210156129d0578382905f5260205f2090600202016040518060400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152505081526020019060010190612942565b50505050935082805480602002602001604051908101604052809291908181526020015f905b82821015612a84578382905f5260205f2090600202016040518060400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481525050815260200190600101906129f6565b50505050925081805480602002602001604051908101604052809291908181526020015f905b82821015612b38578382905f5260205f2090600202016040518060400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152505081526020019060010190612aaa565b50505050915095509550955095509550955091939550919395565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd890614c81565b60405180910390fd5b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b34de64a846040518263ffffffff1660e01b8152600401612c3b91906141b7565b602060405180830381865afa158015612c56573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c7a919061428e565b612cb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb09061510c565b60405180910390fd5b5f5f90505b82829050811015612ee4575f60065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f858585818110612d1b57612d1a614c9f565b5b9050602002016020810190612d30919061446b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508060065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f868686818110612dbe57612dbd614c9f565b5b9050602002016020810190612dd3919061446b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612e1a9190614b75565b925050819055508060055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f868686818110612e7357612e72614c9f565b5b9050602002016020810190612e88919061446b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612ecf91906142ef565b92505081905550508080600101915050612cbe565b507ff19116e8c1b7c855a16202b984cfb7e6c6510eff1db4656203f80ea41fbfb21183604051612f1491906141b7565b60405180910390a1505050565b612fa28363a9059cbb60e01b8484604051602401612f40929190614ba8565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613cee565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613015576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300c90615174565b60405180910390fd5b50565b61309b846323b872dd60e01b85858560405160240161303993929190615192565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613cee565b50505050565b5f6001151560075f8481526020019081526020015f206005015f9054906101000a900460ff161515146130d4575f6130d7565b60015b9050919050565b5f60075f8381526020019081526020015f2090505f5f90505b81600201805490508110156133435781600201818154811061311c5761311b614c9f565b5b905f5260205f2090600202016001015460055f845f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8460020184815481106131a2576131a1614c9f565b5b905f5260205f2090600202015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546132179190614b75565b9250508190555081600201818154811061323457613233614c9f565b5b905f5260205f2090600202016001015460065f845f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8460020184815481106132ba576132b9614c9f565b5b905f5260205f2090600202015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461332f91906142ef565b9250508190555080806001019150506130f7565b505050565b5f60075f8381526020019081526020015f2090505f5f90505b81600201805490508110156139685760045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663117790bc836001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016133ed91906141b7565b602060405180830381865afa158015613408573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061342c919061428e565b156136675781600201818154811061344757613446614c9f565b5b905f5260205f2090600202016001015460065f845f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8460020184815481106134cd576134cc614c9f565b5b905f5260205f2090600202015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546135429190614b75565b9250508190555081600201818154811061355f5761355e614c9f565b5b905f5260205f2090600202016001015460055f846001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8460020184815481106135e6576135e5614c9f565b5b905f5260205f2090600202015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461365b91906142ef565b9250508190555061395b565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b34de64a836001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016136e491906141b7565b602060405180830381865afa1580156136ff573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613723919061428e565b1561395a5781600201818154811061373e5761373d614c9f565b5b905f5260205f2090600202016001015460065f845f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8460020184815481106137c4576137c3614c9f565b5b905f5260205f2090600202015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546138399190614b75565b9250508190555081600201818154811061385657613855614c9f565b5b905f5260205f2090600202016001015460065f846001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8460020184815481106138dd576138dc614c9f565b5b905f5260205f2090600202015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461395291906142ef565b925050819055505b5b8080600101915050613361565b505f816003018054905014613a5857613a57815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600301805480602002602001604051908101604052809291908181526020015f905b82821015613a4e578382905f5260205f2090600202016040518060400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481525050815260200190600101906139c0565b50505050613db3565b5b5f816004018054905014613b4857613b47816001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600401805480602002602001604051908101604052809291908181526020015f905b82821015613b3e578382905f5260205f2090600202016040518060400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152505081526020019060010190613ab0565b50505050613db3565b5b7fc4579a0af401cc15699ac55e47fb1f5e2e40f95ab05ca4b77ba13ce6b61a474882825f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051613bc09392919061508d565b60405180910390a15050565b60075f8281526020019081526020015f206002015f613beb9190614114565b60075f8281526020019081526020015f206003015f613c0a9190614114565b60075f8281526020019081526020015f206004015f613c299190614114565b60075f8281526020019081526020015f205f015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560075f8281526020019081526020015f206001015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555f60075f8381526020019081526020015f206005015f6101000a81548160ff0219169083151502179055505f60075f8381526020019081526020015f2060050160016101000a81548160ff02191690831515021790555050565b5f613d4f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613f659092919063ffffffff16565b90505f81511115613dae5780806020019051810190613d6e919061428e565b613dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613da490615237565b60405180910390fd5b5b505050565b5f5f90505b8151811015613f6057818181518110613dd457613dd3614c9f565b5b60200260200101516020015160065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f848481518110613e3157613e30614c9f565b5b60200260200101515f015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254613e839190614b75565b92505081905550818181518110613e9d57613e9c614c9f565b5b60200260200101516020015160055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f848481518110613efa57613ef9614c9f565b5b60200260200101515f015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254613f4c91906142ef565b925050819055508080600101915050613db8565b505050565b6060613f7384845f85613f7c565b90509392505050565b606082471015613fc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fb8906152c5565b60405180910390fd5b613fca8561408c565b614009576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140009061532d565b60405180910390fd5b5f5f8673ffffffffffffffffffffffffffffffffffffffff168587604051614031919061539d565b5f6040518083038185875af1925050503d805f811461406b576040519150601f19603f3d011682016040523d82523d5f602084013e614070565b606091505b50915091506140808282866140ae565b92505050949350505050565b5f5f8273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606083156140be5782905061410d565b5f835111156140d05782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161410491906153f5565b60405180910390fd5b9392505050565b5080545f8255600202905f5260205f20908101906141329190614135565b50565b5b80821115614174575f5f82015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600182015f905550600201614136565b5090565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6141a182614178565b9050919050565b6141b181614197565b82525050565b5f6020820190506141ca5f8301846141a8565b92915050565b5f82825260208201905092915050565b7f4e6f204554482073656e740000000000000000000000000000000000000000005f82015250565b5f614214600b836141d0565b915061421f826141e0565b602082019050919050565b5f6020820190508181035f83015261424181614208565b9050919050565b5f604051905090565b5f5ffd5b5f5ffd5b5f8115159050919050565b61426d81614259565b8114614277575f5ffd5b50565b5f8151905061428881614264565b92915050565b5f602082840312156142a3576142a2614251565b5b5f6142b08482850161427a565b91505092915050565b5f819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6142f9826142b9565b9150614304836142b9565b925082820190508082111561431c5761431b6142c2565b5b92915050565b61432b816142b9565b82525050565b5f6080820190506143445f8301876141a8565b61435160208301866141a8565b61435e6040830185614322565b61436b6060830184614322565b95945050505050565b61437d81614197565b8114614387575f5ffd5b50565b5f8135905061439881614374565b92915050565b5f5f604083850312156143b4576143b3614251565b5b5f6143c18582860161438a565b92505060206143d28582860161438a565b9150509250929050565b5f6040820190506143ef5f830185614322565b6143fc6020830184614322565b9392505050565b61440c816142b9565b8114614416575f5ffd5b50565b5f8135905061442781614403565b92915050565b5f5f6040838503121561444357614442614251565b5b5f6144508582860161438a565b925050602061446185828601614419565b9150509250929050565b5f602082840312156144805761447f614251565b5b5f61448d8482850161438a565b91505092915050565b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6144e08261449a565b810181811067ffffffffffffffff821117156144ff576144fe6144aa565b5b80604052505050565b5f614511614248565b905061451d82826144d7565b919050565b5f67ffffffffffffffff82111561453c5761453b6144aa565b5b602082029050602081019050919050565b5f5ffd5b5f61456361455e84614522565b614508565b905080838252602082019050602084028301858111156145865761458561454d565b5b835b818110156145af578061459b8882614419565b845260208401935050602081019050614588565b5050509392505050565b5f82601f8301126145cd576145cc614496565b5b81356145dd848260208601614551565b91505092915050565b5f602082840312156145fb576145fa614251565b5b5f82013567ffffffffffffffff81111561461857614617614255565b5b614624848285016145b9565b91505092915050565b5f819050919050565b5f61465061464b61464684614178565b61462d565b614178565b9050919050565b5f61466182614636565b9050919050565b5f61467282614657565b9050919050565b61468281614668565b82525050565b5f60208201905061469b5f830184614679565b92915050565b5f602082840312156146b6576146b5614251565b5b5f6146c384828501614419565b91505092915050565b5f6040820190506146df5f8301856141a8565b6146ec60208301846141a8565b9392505050565b5f67ffffffffffffffff82111561470d5761470c6144aa565b5b602082029050602081019050919050565b5f5ffd5b5f604082840312156147375761473661471e565b5b6147416040614508565b90505f6147508482850161438a565b5f83015250602061476384828501614419565b60208301525092915050565b5f61478161477c846146f3565b614508565b905080838252602082019050604084028301858111156147a4576147a361454d565b5b835b818110156147cd57806147b98882614722565b8452602084019350506040810190506147a6565b5050509392505050565b5f82601f8301126147eb576147ea614496565b5b81356147fb84826020860161476f565b91505092915050565b5f5f5f5f5f5f60c0878903121561481e5761481d614251565b5b5f61482b89828a01614419565b965050602061483c89828a0161438a565b955050604061484d89828a0161438a565b945050606087013567ffffffffffffffff81111561486e5761486d614255565b5b61487a89828a016147d7565b935050608087013567ffffffffffffffff81111561489b5761489a614255565b5b6148a789828a016147d7565b92505060a087013567ffffffffffffffff8111156148c8576148c7614255565b5b6148d489828a016147d7565b9150509295509295509295565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61491381614197565b82525050565b614922816142b9565b82525050565b604082015f82015161493c5f85018261490a565b50602082015161494f6020850182614919565b50505050565b5f6149608383614928565b60408301905092915050565b5f602082019050919050565b5f614982826148e1565b61498c81856148eb565b9350614997836148fb565b805f5b838110156149c75781516149ae8882614955565b97506149b98361496c565b92505060018101905061499a565b5085935050505092915050565b6149dd81614259565b82525050565b5f60c0820190506149f65f8301896141a8565b614a0360208301886141a8565b8181036040830152614a158187614978565b90508181036060830152614a298186614978565b90508181036080830152614a3d8185614978565b9050614a4c60a08301846149d4565b979650505050505050565b5f5ffd5b5f5f83601f840112614a7057614a6f614496565b5b8235905067ffffffffffffffff811115614a8d57614a8c614a57565b5b602083019150836020820283011115614aa957614aa861454d565b5b9250929050565b5f5f5f60408486031215614ac757614ac6614251565b5b5f614ad48682870161438a565b935050602084013567ffffffffffffffff811115614af557614af4614255565b5b614b0186828701614a5b565b92509250509250925092565b7f496e737566696369656e742066756e64730000000000000000000000000000005f82015250565b5f614b416011836141d0565b9150614b4c82614b0d565b602082019050919050565b5f6020820190508181035f830152614b6e81614b35565b9050919050565b5f614b7f826142b9565b9150614b8a836142b9565b9250828203905081811115614ba257614ba16142c2565b5b92915050565b5f604082019050614bbb5f8301856141a8565b614bc86020830184614322565b9392505050565b7f4661696c656420746f207472616e7366657200000000000000000000000000005f82015250565b5f614c036012836141d0565b9150614c0e82614bcf565b602082019050919050565b5f6020820190508181035f830152614c3081614bf7565b9050919050565b7f4e6f7420636f6e7472616374206f776e657200000000000000000000000000005f82015250565b5f614c6b6012836141d0565b9150614c7682614c37565b602082019050919050565b5f6020820190508181035f830152614c9881614c5f565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f736574746c656d656e7420616c726561647920617574686f72697a65640000005f82015250565b5f614d00601d836141d0565b9150614d0b82614ccc565b602082019050919050565b5f6020820190508181035f830152614d2d81614cf4565b9050919050565b7f496e6578697374656e7420736574746c656d656e7400000000000000000000005f82015250565b5f614d686015836141d0565b9150614d7382614d34565b602082019050919050565b5f6020820190508181035f830152614d9581614d5c565b9050919050565b7f41646472657373206973206e6f742074686520646562746f72000000000000005f82015250565b5f614dd06019836141d0565b9150614ddb82614d9c565b602082019050919050565b5f6020820190508181035f830152614dfd81614dc4565b9050919050565b7f496e76616c696420637573746f6469616e2063617465676f72790000000000005f82015250565b5f614e38601a836141d0565b9150614e4382614e04565b602082019050919050565b5f6020820190508181035f830152614e6581614e2c565b9050919050565b5f602082019050614e7f5f830184614322565b92915050565b7f4e6f7420636f6e7472616374206578656375746f7200000000000000000000005f82015250565b5f614eb96015836141d0565b9150614ec482614e85565b602082019050919050565b5f6020820190508181035f830152614ee681614ead565b9050919050565b7f536574746c656d656e74206e6f74207369676e656400000000000000000000005f82015250565b5f614f216015836141d0565b9150614f2c82614eed565b602082019050919050565b5f6020820190508181035f830152614f4e81614f15565b9050919050565b7f536574746c656d656e7420616c726561647920657869737473000000000000005f82015250565b5f614f896019836141d0565b9150614f9482614f55565b602082019050919050565b5f6020820190508181035f830152614fb681614f7d565b9050919050565b7f6e6f7420616c6c6f77656420746f6b656e0000000000000000000000000000005f82015250565b5f614ff16011836141d0565b9150614ffc82614fbd565b602082019050919050565b5f6020820190508181035f83015261501e81614fe5565b9050919050565b7f6e6f7420564320746f20686176652066756e64732072656c65617365640000005f82015250565b5f615059601d836141d0565b915061506482615025565b602082019050919050565b5f6020820190508181035f8301526150868161504d565b9050919050565b5f6060820190506150a05f830186614322565b6150ad60208301856141a8565b6150ba60408301846141a8565b949350505050565b7f63616e6e6f742072656c65617365206e6f6e20564373000000000000000000005f82015250565b5f6150f66016836141d0565b9150615101826150c2565b602082019050919050565b5f6020820190508181035f830152615123816150ea565b9050919050565b7f496e76616c6964206164647265737300000000000000000000000000000000005f82015250565b5f61515e600f836141d0565b91506151698261512a565b602082019050919050565b5f6020820190508181035f83015261518b81615152565b9050919050565b5f6060820190506151a55f8301866141a8565b6151b260208301856141a8565b6151bf6040830184614322565b949350505050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e5f8201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b5f615221602a836141d0565b915061522c826151c7565b604082019050919050565b5f6020820190508181035f83015261524e81615215565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f5f8201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b5f6152af6026836141d0565b91506152ba82615255565b604082019050919050565b5f6020820190508181035f8301526152dc816152a3565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000005f82015250565b5f615317601d836141d0565b9150615322826152e3565b602082019050919050565b5f6020820190508181035f8301526153448161530b565b9050919050565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f6153778261534b565b6153818185615355565b935061539181856020860161535f565b80840191505092915050565b5f6153a8828461536d565b915081905092915050565b5f81519050919050565b5f6153c7826153b3565b6153d181856141d0565b93506153e181856020860161535f565b6153ea8161449a565b840191505092915050565b5f6020820190508181035f83015261540d81846153bd565b90509291505056fea26469706673582212209b9c979ab07405ca2f0abad8fa2a3912fe2ee7b7250ac209b19bf4f6cbc13de464736f6c634300081c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000bee487d615cbcac897d655f3dfa98e5aa3e09f52000000000000000000000000346ddf548fff2b93b21f6470680d7232c929e870000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
-----Decoded View---------------
Arg [0] : AccessControlAddress (address): 0xBeE487D615CbCAc897D655f3Dfa98e5aA3e09f52
Arg [1] : executorAddress (address): 0x346ddF548fFf2B93b21f6470680d7232C929E870
Arg [2] : _wEthAddress (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000bee487d615cbcac897d655f3dfa98e5aa3e09f52
Arg [1] : 000000000000000000000000346ddf548fff2b93b21f6470680d7232c929e870
Arg [2] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Loading...
Loading
Loading...
Loading
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.