Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 26 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Cashout | 8896703 | 2278 days ago | IN | 0 ETH | 0.00028869 | ||||
| Cashout | 8894179 | 2278 days ago | IN | 0 ETH | 0.00019263 | ||||
| Cashout | 8884819 | 2280 days ago | IN | 0 ETH | 0.00010592 | ||||
| Cashout | 8884819 | 2280 days ago | IN | 0 ETH | 0.00010587 | ||||
| Cashout | 8882842 | 2280 days ago | IN | 0 ETH | 0.0004818 | ||||
| Cashout | 8882832 | 2280 days ago | IN | 0 ETH | 0.00048138 | ||||
| Cashout | 8882832 | 2280 days ago | IN | 0 ETH | 0.00048138 | ||||
| Open Escrow | 8882697 | 2280 days ago | IN | 0 ETH | 0.0001622 | ||||
| Cashout | 8882598 | 2280 days ago | IN | 0 ETH | 0.00029126 | ||||
| Open Escrow | 8882447 | 2280 days ago | IN | 0 ETH | 0.00006812 | ||||
| Open Escrow | 8882447 | 2280 days ago | IN | 0 ETH | 0.00006812 | ||||
| Open Escrow | 8882440 | 2280 days ago | IN | 0 ETH | 0.00006812 | ||||
| Open Escrow | 8879585 | 2280 days ago | IN | 0 ETH | 0.00003892 | ||||
| Cashout | 8879537 | 2280 days ago | IN | 0 ETH | 0.0001155 | ||||
| Open Escrow | 8879522 | 2280 days ago | IN | 0 ETH | 0.00006475 | ||||
| Open Escrow | 8879474 | 2280 days ago | IN | 0 ETH | 0.00004217 | ||||
| Cashout | 8879408 | 2280 days ago | IN | 0 ETH | 0.00018912 | ||||
| Cashout | 8879309 | 2280 days ago | IN | 0 ETH | 0.00015777 | ||||
| Cashout | 8879299 | 2280 days ago | IN | 0 ETH | 0.00028875 | ||||
| Open Escrow | 8879299 | 2280 days ago | IN | 0 ETH | 0.00009732 | ||||
| Open Escrow | 8879296 | 2280 days ago | IN | 0 ETH | 0.00006488 | ||||
| Open Escrow | 8879285 | 2280 days ago | IN | 0 ETH | 0.00007785 | ||||
| Cashout | 8879206 | 2280 days ago | IN | 0 ETH | 0.00011535 | ||||
| Open Escrow | 8879187 | 2280 days ago | IN | 0 ETH | 0.00006488 | ||||
| Open Escrow | 8878307 | 2281 days ago | IN | 0 ETH | 0.0001622 |
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| - | 8872665 | 2282 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
EscrowLibrary
Compiler Version
v0.5.12+commit.7709ece9
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2019-11-04
*/
// File: openzeppelin-solidity/contracts/math/SafeMath.sol
pragma solidity ^0.5.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @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) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @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) {
require(b <= a, "SafeMath: subtraction overflow");
uint256 c = a - b;
return c;
}
/**
* @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) {
// 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-solidity/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts 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) internal pure returns (uint256) {
// Solidity only automatically asserts when dividing by 0
require(b > 0, "SafeMath: division by zero");
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts 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) {
require(b != 0, "SafeMath: modulo by zero");
return a % b;
}
}
// File: contracts/IEscrow.sol
pragma solidity ^0.5.0;
interface IEscrow {
function balance() external returns (uint);
function send(address payable addr, uint amt) external returns (bool);
}
// File: openzeppelin-solidity/contracts/cryptography/ECDSA.sol
pragma solidity ^0.5.0;
/**
* @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
*
* These functions can be used to verify that a message was signed by the holder
* of the private keys of a given address.
*/
library ECDSA {
/**
* @dev Returns the address that signed a hashed message (`hash`) with
* `signature`. This address can then be used for verification purposes.
*
* The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
* this function rejects them by requiring the `s` value to be in the lower
* half order, and the `v` value to be either 27 or 28.
*
* (.note) This call _does not revert_ if the signature is invalid, or
* if the signer is otherwise unable to be retrieved. In those scenarios,
* the zero address is returned.
*
* (.warning) `hash` _must_ be the result of a hash operation for the
* verification to be secure: it is possible to craft signatures that
* recover to arbitrary addresses for non-hashed data. A safe way to ensure
* this is by receiving a hash of the original message (which may otherwise)
* be too long), and then calling `toEthSignedMessageHash` on it.
*/
function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
// Check the signature length
if (signature.length != 65) {
return (address(0));
}
// Divide the signature in r, s and v variables
bytes32 r;
bytes32 s;
uint8 v;
// ecrecover takes the signature parameters, and the only way to get them
// currently is to use assembly.
// solhint-disable-next-line no-inline-assembly
assembly {
r := mload(add(signature, 0x20))
s := mload(add(signature, 0x40))
v := byte(0, mload(add(signature, 0x60)))
}
// EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
// unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
// the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most
// signatures from current libraries generate a unique signature with an s-value in the lower half order.
//
// If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
// with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
// vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
// these malleable signatures as well.
if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
return address(0);
}
if (v != 27 && v != 28) {
return address(0);
}
// If the signature is valid (and not malleable), return the signer address
return ecrecover(hash, v, r, s);
}
/**
* @dev Returns an Ethereum Signed Message, created from a `hash`. This
* replicates the behavior of the
* [`eth_sign`](https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign)
* JSON-RPC method.
*
* See `recover`.
*/
function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
// 32 is the length in bytes of hash,
// enforced by the type signature above
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
}
}
// File: contracts/EscrowLibrary.sol
pragma solidity ^0.5.0;
/**
* Central contract containing the business logic for interacting with and
* managing the state of Arwen unidirectional payment channels
* @dev Escrows contracts are created and linked to this library from the
* EscrowFactory contract
*/
contract EscrowLibrary {
using SafeMath for uint;
string constant SIGNATURE_PREFIX = '\x19Ethereum Signed Message:\n';
uint constant FORCE_REFUND_TIME = 2 days;
/**
* Escrow State Machine
* @param None Preliminary state of an escrow before it has been created.
* @param Unfunded Initial state of the escrow once created. The escrow can only
* transition to the Open state once it has been funded with required escrow
* amount and openEscrow method is called.
* @param Open From this state the escrow can transition to Closed state
* via the cashout or refund methods or it can transition to PuzzlePosted state
* via the postPuzzle method.
* @param PuzzlePosted From this state the escrow can only transition to
* closed via the solve or puzzleRefund methods
* @param Closed The final sink state of the escrow
*/
enum EscrowState {
None,
Unfunded,
Open,
PuzzlePosted,
Closed
}
/**
* Unique ID for each different type of signed message in the protocol
*/
enum MessageTypeId {
None,
Cashout,
Puzzle,
Refund
}
/**
* Possible reasons the escrow can become closed
*/
enum EscrowCloseReason {
Refund,
PuzzleRefund,
PuzzleSolve,
Cashout,
ForceRefund
}
event EscrowOpened(address indexed escrow);
event EscrowFunded(address indexed escrow, uint amountFunded);
event PuzzlePosted(address indexed escrow, bytes32 puzzleSighash);
event Preimage(address indexed escrow, bytes32 preimage, bytes32 puzzleSighash);
event EscrowClosed(address indexed escrow, EscrowCloseReason reason, bytes32 closingSighash);
event FundsTransferred(address indexed escrow, address reserveAddress);
struct EscrowParams {
// The amount expected to be funded by the escrower to open the payment channel
uint escrowAmount;
// Expiration time of the escrow when it can refunded by the escrower
uint escrowTimelock;
// Escrower's pub keys
address payable escrowerReserve;
address escrowerTrade;
address escrowerRefund;
// Payee's pub keys
address payable payeeReserve;
address payeeTrade;
// Current state of the escrow
EscrowState escrowState;
// Internal payee/escrower balances within the payment channel
uint escrowerBalance;
uint payeeBalance;
}
/**
* Represents a trade in the payment channel that can be executed
* on-chain by the payee by revealing a hash preimage
*/
struct PuzzleParams {
// The amount of coins in this trade
uint tradeAmount;
// A hash output or "puzzle" which can be "solved" by revealing the preimage
bytes32 puzzle;
// The expiration time of the puzzle when the trade can be refunded by the escrower
uint puzzleTimelock;
// The signature hash of the `postPuzzle` message
bytes32 puzzleSighash;
}
// The EscrowFactory contract that deployed this library
address public escrowFactory;
// Mapping of escrow address to EscrowParams
mapping(address => EscrowParams) public escrows;
// Mapping of escrow address to PuzzleParams
// Only a single puzzle can be posted for a given escrow
mapping(address => PuzzleParams) public puzzles;
constructor() public {
escrowFactory = msg.sender;
}
modifier onlyFactory() {
require(msg.sender == escrowFactory, "Can only be called by escrow factory");
_;
}
/**
* Add a new escrow that is controlled by the library
* @dev Only callable by the factory which should have already deployed the
* escrow at the provided address
*/
function newEscrow(
address escrow,
uint escrowAmount,
uint timelock,
address payable escrowerReserve,
address escrowerTrade,
address escrowerRefund,
address payable payeeReserve,
address payeeTrade
)
public
onlyFactory
{
require(escrows[escrow].escrowState == EscrowState.None, "Escrow already exists");
require(escrowAmount > 0, "Escrow amount too low");
uint escrowerStartingBalance = 0;
uint payeeStartingBalance = 0;
escrows[escrow] = EscrowParams(
escrowAmount,
timelock,
escrowerReserve,
escrowerTrade,
escrowerRefund,
payeeReserve,
payeeTrade,
EscrowState.Unfunded,
escrowerStartingBalance,
payeeStartingBalance
);
}
/**
* Emits an event with the current balance of the escrow
* @dev Can be used by the EthEscrow contract's payable fallback to
* automatically emit an event when an escrow is funded
*/
function checkFunded(address escrowAddress) public {
EscrowParams storage escrowParams = escrows[escrowAddress];
require(msg.sender == escrowAddress, "Only callable by the Escrow contract");
require(escrowParams.escrowState == EscrowState.Unfunded, "Escrow must be in state Unfunded");
emit EscrowFunded(escrowAddress, IEscrow(escrowAddress).balance());
}
/**
* Moves the escrow to the open state if it has been funded
* @dev Will send back any additional collateral above the `escrowAmount`
* back to the escrower before opening
*/
function openEscrow(address escrowAddress) public {
EscrowParams storage escrowParams = escrows[escrowAddress];
require(escrowParams.escrowState == EscrowState.Unfunded, "Escrow must be in state Unfunded");
IEscrow escrow = IEscrow(escrowAddress);
uint escrowAmount = escrowParams.escrowAmount;
uint escrowBalance = escrow.balance();
// Check the escrow is funded for at least escrowAmount
require(escrowBalance >= escrowAmount, "Escrow not funded");
escrowParams.escrowState = EscrowState.Open;
emit EscrowOpened(escrowAddress);
// If over-funded return any excess funds back to the escrower
if(escrowBalance > escrowAmount) {
escrow.send(escrowParams.escrowerReserve, escrowBalance.sub(escrowAmount));
}
}
/**
* Cashout the escrow with the final balances after trading
* @dev Must be signed by both the escrower and payee trade keys
* @dev Must be in Open state
* @param amountTraded The total amount traded to the payee
*/
function cashout(
address escrowAddress,
uint amountTraded,
bytes memory eSig,
bytes memory pSig
)
public
{
EscrowParams storage escrowParams = escrows[escrowAddress];
require(escrowParams.escrowState == EscrowState.Open, "Escrow must be in state Open");
// Length of the actual message: 20 + 1 + 32
string memory messageLength = '53';
bytes32 sighash = keccak256(abi.encodePacked(
SIGNATURE_PREFIX,
messageLength,
escrowAddress,
uint8(MessageTypeId.Cashout),
amountTraded
));
// Check signatures
require(verify(sighash, eSig) == escrowParams.escrowerTrade, "Invalid escrower cashout sig");
require(verify(sighash, pSig) == escrowParams.payeeTrade, "Invalid payee cashout sig");
escrowParams.payeeBalance = amountTraded;
escrowParams.escrowerBalance = escrowParams.escrowAmount.sub(amountTraded);
escrowParams.escrowState = EscrowState.Closed;
if(escrowParams.escrowerBalance > 0) sendEscrower(escrowAddress, escrowParams);
if(escrowParams.payeeBalance > 0) sendPayee(escrowAddress, escrowParams);
emit EscrowClosed(escrowAddress, EscrowCloseReason.Cashout, sighash);
}
/**
* Allows the escrower to refund the escrow after the escrow expires
* @dev This is a signed refund because it allows the refunder to
* specify the amount traded in the escrow. This is useful for the escrower to
* benevolently close the escrow with the final balances despite the other
* party being offline
* @dev Must be signed by the escrower refund key
* @dev Must be in Open state
* @param amountTraded The total amount traded to the payee
*/
function refund(address escrowAddress, uint amountTraded, bytes memory eSig) public {
EscrowParams storage escrowParams = escrows[escrowAddress];
require(escrowParams.escrowState == EscrowState.Open, "Escrow must be in state Open");
require(now >= escrowParams.escrowTimelock, "Escrow timelock not reached");
// Length of the actual message: 20 + 1 + 32
string memory messageLength = '53';
bytes32 sighash = keccak256(abi.encodePacked(
SIGNATURE_PREFIX,
messageLength,
escrowAddress,
uint8(MessageTypeId.Refund),
amountTraded
));
// Check signature
require(verify(sighash, eSig) == escrowParams.escrowerRefund, "Invalid escrower sig");
escrowParams.payeeBalance = amountTraded;
escrowParams.escrowerBalance = escrowParams.escrowAmount.sub(amountTraded);
escrowParams.escrowState = EscrowState.Closed;
if(escrowParams.escrowerBalance > 0) sendEscrower(escrowAddress, escrowParams);
if(escrowParams.payeeBalance > 0) sendPayee(escrowAddress, escrowParams);
emit EscrowClosed(escrowAddress, EscrowCloseReason.Refund, sighash);
}
/**
* Allows anyone to refund the escrow back to the escrower without a
* signature after escrowTimelock + FORCE_REFUND_TIME
* @dev This method can be used in the event the escrower's keys are lost
* or if the escrower remains offline for an extended period of time
*/
function forceRefund(address escrowAddress) public {
EscrowParams storage escrowParams = escrows[escrowAddress];
require(escrowParams.escrowState == EscrowState.Open, "Escrow must be in state Open");
require(now >= escrowParams.escrowTimelock + FORCE_REFUND_TIME, "Escrow force refund timelock not reached");
escrowParams.escrowerBalance = IEscrow(escrowAddress).balance();
escrowParams.escrowState = EscrowState.Closed;
if(escrowParams.escrowerBalance > 0) sendEscrower(escrowAddress, escrowParams);
// Use 0x0 as the closing sighash because there is no signature required
emit EscrowClosed(escrowAddress, EscrowCloseReason.ForceRefund, 0x0);
}
/**
* Post a hash puzzle unlocks lastest trade in the escrow
* @dev Must be signed by both the escrower and payee trade keys
* @dev Must be in Open state
* @param prevAmountTraded The total amount traded to the payee in the
* payment channel before the last trade
* @param tradeAmount The last trade amount
* @param puzzle A hash puzzle where the solution (preimage) releases the
* `tradeAmount` to the payee
* @param puzzleTimelock The time at which the `tradeAmount` can be
* refunded back to the escrower if the puzzle solution is not posted
*/
function postPuzzle(
address escrowAddress,
uint prevAmountTraded,
uint tradeAmount,
bytes32 puzzle,
uint puzzleTimelock,
bytes memory eSig,
bytes memory pSig
)
public
{
EscrowParams storage escrowParams = escrows[escrowAddress];
require(escrowParams.escrowState == EscrowState.Open, "Escrow must be in state Open");
// Length of the actual message: 20 + 1 + 32 + 32 + 32 + 32
string memory messageLength = '149';
bytes32 sighash = keccak256(abi.encodePacked(
SIGNATURE_PREFIX,
messageLength,
escrowAddress,
uint8(MessageTypeId.Puzzle),
prevAmountTraded,
tradeAmount,
puzzle,
puzzleTimelock
));
require(verify(sighash, eSig) == escrowParams.escrowerTrade, "Invalid escrower sig");
require(verify(sighash, pSig) == escrowParams.payeeTrade, "Invalid payee sig");
puzzles[escrowAddress] = PuzzleParams(
tradeAmount,
puzzle,
puzzleTimelock,
sighash
);
escrowParams.escrowState = EscrowState.PuzzlePosted;
escrowParams.payeeBalance = prevAmountTraded;
escrowParams.escrowerBalance = escrowParams.escrowAmount.sub(prevAmountTraded).sub(tradeAmount);
emit PuzzlePosted(escrowAddress, sighash);
}
/**
* Payee solves the hash puzzle redeeming the last trade amount of funds in the escrow
* @dev Must be in PuzzlePosted state
* @param preimage The preimage x such that H(x) == puzzle
*/
function solvePuzzle(address escrowAddress, bytes32 preimage) public {
EscrowParams storage escrowParams = escrows[escrowAddress];
require(escrowParams.escrowState == EscrowState.PuzzlePosted, "Escrow must be in state PuzzlePosted");
PuzzleParams memory puzzleParams = puzzles[escrowAddress];
bytes32 h = sha256(abi.encodePacked(preimage));
require(h == puzzleParams.puzzle, "Invalid preimage");
emit Preimage(escrowAddress, preimage, puzzleParams.puzzleSighash);
escrowParams.payeeBalance = escrowParams.payeeBalance.add(puzzleParams.tradeAmount);
escrowParams.escrowState = EscrowState.Closed;
emit EscrowClosed(escrowAddress, EscrowCloseReason.PuzzleSolve, puzzleParams.puzzleSighash);
}
/**
* Escrower refunds the last trade amount after `puzzleTimelock` has been reached
* @dev Must be in PuzzlePosted state
*/
function refundPuzzle(address escrowAddress) public {
EscrowParams storage escrowParams = escrows[escrowAddress];
require(escrowParams.escrowState == EscrowState.PuzzlePosted, "Escrow must be in state PuzzlePosted");
PuzzleParams memory puzzleParams = puzzles[escrowAddress];
require(now >= puzzleParams.puzzleTimelock, "Puzzle timelock not reached");
escrowParams.escrowerBalance = escrowParams.escrowerBalance.add(puzzleParams.tradeAmount);
escrowParams.escrowState = EscrowState.Closed;
emit EscrowClosed(escrowAddress, EscrowCloseReason.PuzzleRefund, puzzleParams.puzzleSighash);
}
function withdraw(address escrowAddress, bool escrower) public {
EscrowParams storage escrowParams = escrows[escrowAddress];
require(escrowParams.escrowState == EscrowState.Closed, "Withdraw attempted before escrow is closed");
if(escrower) {
require(escrowParams.escrowerBalance > 0, "escrower balance is 0");
sendEscrower(escrowAddress, escrowParams);
} else {
require(escrowParams.payeeBalance > 0, "payee balance is 0");
sendPayee(escrowAddress, escrowParams);
}
}
function sendEscrower(address escrowAddress, EscrowParams storage escrowParams) internal {
IEscrow escrow = IEscrow(escrowAddress);
uint amountToSend = escrowParams.escrowerBalance;
escrowParams.escrowerBalance = 0;
require(escrow.send(escrowParams.escrowerReserve, amountToSend), "escrower send failure");
emit FundsTransferred(escrowAddress, escrowParams.escrowerReserve);
}
function sendPayee(address escrowAddress, EscrowParams storage escrowParams) internal {
IEscrow escrow = IEscrow(escrowAddress);
uint amountToSend = escrowParams.payeeBalance;
escrowParams.payeeBalance = 0;
require(escrow.send(escrowParams.payeeReserve, amountToSend), "payee send failure");
emit FundsTransferred(escrowAddress, escrowParams.payeeReserve);
}
/**
* Verify a EC signature (v,r,s) on a message digest h
* @return retAddr The recovered address from the signature or 0 if signature is invalid
*/
function verify(bytes32 sighash, bytes memory sig) internal pure returns(address retAddr) {
retAddr = ECDSA.recover(sighash, sig);
}
}
// File: contracts/Escrow.sol
pragma solidity ^0.5.0;
/**
* Thin wrapper around a ETH/ERC20 payment channel deposit that is controlled
* by a library contract for the purpose of trading with atomic swaps using the
* Arwen protocol.
* @dev Abstract contract with `balance` and `send` methods that must be implemented
* for either ETH or ERC20 tokens in derived contracts. The `send` method should only
* callable by the library contract that controls this escrow
*/
contract Escrow is IEscrow {
address public escrowLibrary;
modifier onlyLibrary() {
require(msg.sender == escrowLibrary, "Only callable by library contract");
_;
}
constructor(address _escrowLibrary) internal {
escrowLibrary = _escrowLibrary;
}
}
/**
* Escrow Contract backed by ETH
*/
contract EthEscrow is Escrow {
constructor(address escrowLibrary) public Escrow(escrowLibrary) { }
/**
* Payable fallback method that allows the escrow to be funded and triggers
* a `checkFunded` call on the library contract to emit an event when the
* escrow becomes fully funded
*/
function () external payable {
EscrowLibrary(escrowLibrary).checkFunded(address(this));
}
function send(address payable addr, uint amt) public onlyLibrary returns (bool) {
return addr.send(amt);
}
function balance() public returns (uint) {
return address(this).balance;
}
}
// File: openzeppelin-solidity/contracts/ownership/Ownable.sol
pragma solidity ^0.5.0;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be aplied to your functions to restrict their use to
* the owner.
*/
contract Ownable {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor () internal {
_owner = msg.sender;
emit OwnershipTransferred(address(0), _owner);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(isOwner(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Returns true if the caller is the current owner.
*/
function isOwner() public view returns (bool) {
return msg.sender == _owner;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* > Note: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public onlyOwner {
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
*/
function _transferOwnership(address newOwner) internal {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
// File: contracts/EscrowFactory.sol
pragma solidity ^0.5.0;
/**
* Creates an EscrowLibrary contract and allows for creating new escrows linked
* to that library
* @dev The factory contract can be self-destructed by the owner to prevent
* new escrows from being created without affecting the library and the ability
* to close already existing escrows
*/
contract EscrowFactory is Ownable {
EscrowLibrary public escrowLibrary;
mapping(bytes32 => bool) internal escrowsCreated;
constructor () public {
escrowLibrary = new EscrowLibrary();
}
event EscrowCreated(
bytes32 indexed escrowParams,
address escrowAddress
);
function createEthEscrow(
uint escrowAmount,
uint timelock,
address payable escrowerReserve,
address escrowerTrade,
address escrowerRefund,
address payable payeeReserve,
address payeeTrade
)
public
{
bytes32 escrowParamsHash = keccak256(abi.encodePacked(
address(this),
escrowAmount,
timelock,
escrowerReserve,
escrowerTrade,
escrowerRefund,
payeeReserve,
payeeTrade
));
require(! escrowsCreated[escrowParamsHash], "escrow already exists");
EthEscrow escrow = new EthEscrow(
address(escrowLibrary)
);
escrowLibrary.newEscrow(
address(escrow),
escrowAmount,
timelock,
escrowerReserve,
escrowerTrade,
escrowerRefund,
payeeReserve,
payeeTrade
);
escrowsCreated[escrowParamsHash] = true;
emit EscrowCreated(escrowParamsHash, address(escrow));
}
function selfDestruct() public onlyOwner {
selfdestruct(msg.sender);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"escrow","type":"address"},{"indexed":false,"internalType":"enum EscrowLibrary.EscrowCloseReason","name":"reason","type":"uint8"},{"indexed":false,"internalType":"bytes32","name":"closingSighash","type":"bytes32"}],"name":"EscrowClosed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"escrow","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountFunded","type":"uint256"}],"name":"EscrowFunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"escrow","type":"address"}],"name":"EscrowOpened","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"escrow","type":"address"},{"indexed":false,"internalType":"address","name":"reserveAddress","type":"address"}],"name":"FundsTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"escrow","type":"address"},{"indexed":false,"internalType":"bytes32","name":"preimage","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"puzzleSighash","type":"bytes32"}],"name":"Preimage","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"escrow","type":"address"},{"indexed":false,"internalType":"bytes32","name":"puzzleSighash","type":"bytes32"}],"name":"PuzzlePosted","type":"event"},{"constant":false,"inputs":[{"internalType":"address","name":"escrowAddress","type":"address"},{"internalType":"uint256","name":"amountTraded","type":"uint256"},{"internalType":"bytes","name":"eSig","type":"bytes"},{"internalType":"bytes","name":"pSig","type":"bytes"}],"name":"cashout","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"escrowAddress","type":"address"}],"name":"checkFunded","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"escrowFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"escrows","outputs":[{"internalType":"uint256","name":"escrowAmount","type":"uint256"},{"internalType":"uint256","name":"escrowTimelock","type":"uint256"},{"internalType":"address payable","name":"escrowerReserve","type":"address"},{"internalType":"address","name":"escrowerTrade","type":"address"},{"internalType":"address","name":"escrowerRefund","type":"address"},{"internalType":"address payable","name":"payeeReserve","type":"address"},{"internalType":"address","name":"payeeTrade","type":"address"},{"internalType":"enum EscrowLibrary.EscrowState","name":"escrowState","type":"uint8"},{"internalType":"uint256","name":"escrowerBalance","type":"uint256"},{"internalType":"uint256","name":"payeeBalance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"escrowAddress","type":"address"}],"name":"forceRefund","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"escrow","type":"address"},{"internalType":"uint256","name":"escrowAmount","type":"uint256"},{"internalType":"uint256","name":"timelock","type":"uint256"},{"internalType":"address payable","name":"escrowerReserve","type":"address"},{"internalType":"address","name":"escrowerTrade","type":"address"},{"internalType":"address","name":"escrowerRefund","type":"address"},{"internalType":"address payable","name":"payeeReserve","type":"address"},{"internalType":"address","name":"payeeTrade","type":"address"}],"name":"newEscrow","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"escrowAddress","type":"address"}],"name":"openEscrow","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"escrowAddress","type":"address"},{"internalType":"uint256","name":"prevAmountTraded","type":"uint256"},{"internalType":"uint256","name":"tradeAmount","type":"uint256"},{"internalType":"bytes32","name":"puzzle","type":"bytes32"},{"internalType":"uint256","name":"puzzleTimelock","type":"uint256"},{"internalType":"bytes","name":"eSig","type":"bytes"},{"internalType":"bytes","name":"pSig","type":"bytes"}],"name":"postPuzzle","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"puzzles","outputs":[{"internalType":"uint256","name":"tradeAmount","type":"uint256"},{"internalType":"bytes32","name":"puzzle","type":"bytes32"},{"internalType":"uint256","name":"puzzleTimelock","type":"uint256"},{"internalType":"bytes32","name":"puzzleSighash","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"escrowAddress","type":"address"},{"internalType":"uint256","name":"amountTraded","type":"uint256"},{"internalType":"bytes","name":"eSig","type":"bytes"}],"name":"refund","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"escrowAddress","type":"address"}],"name":"refundPuzzle","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"escrowAddress","type":"address"},{"internalType":"bytes32","name":"preimage","type":"bytes32"}],"name":"solvePuzzle","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"escrowAddress","type":"address"},{"internalType":"bool","name":"escrower","type":"bool"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061362d806100606000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c80639771b7de1161008c578063bdd1daaa11610066578063bdd1daaa14610756578063c4de5dce146107a0578063d4b64dad1461091c578063f2aecf4614610960576100cf565b80639771b7de14610534578063a34e7d2a14610578578063a37eec6214610671576100cf565b8063054848b6146100d45780633fb6c74e14610141578063477230b2146101855780635437e4011461030657806357c1766d14610356578063701554591461039a575b600080fd5b610116600480360360208110156100ea57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109ae565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b6101836004803603602081101561015757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109de565b005b6101c76004803603602081101561019b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c56565b604051808b81526020018a81526020018973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018460048111156102dd57fe5b60ff1681526020018381526020018281526020019a505050505050505050505060405180910390f35b6103546004803603604081101561031c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050610d57565b005b6103986004803603602081101561036c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f32565b005b610532600480360360e08110156103b057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019064010000000081111561041557600080fd5b82018360208201111561042757600080fd5b8035906020019184600183028401116401000000008311171561044957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156104ac57600080fd5b8201836020820111156104be57600080fd5b803590602001918460018302840111640100000000831117156104e057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061116a565b005b6105766004803603602081101561054a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116d7565b005b61066f600480360361010081101561058f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a34565b005b6107546004803603606081101561068757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156106ce57600080fd5b8201836020820111156106e057600080fd5b8035906020019184600183028401116401000000008311171561070257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611ef8565b005b61075e61239e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61091a600480360360808110156107b657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156107fd57600080fd5b82018360208201111561080f57600080fd5b8035906020019184600183028401116401000000008311171561083157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561089457600080fd5b8201836020820111156108a657600080fd5b803590602001918460018302840111640100000000831117156108c857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506123c3565b005b61095e6004803603602081101561093257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128bf565b005b6109ac6004803603604081101561097657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612b2f565b005b60026020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060026004811115610a2e57fe5b8160060160149054906101000a900460ff166004811115610a4b57fe5b14610abe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f457363726f77206d75737420626520696e207374617465204f70656e0000000081525060200191505060405180910390fd5b6202a300816001015401421015610b20576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806135a76028913960400191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610b6857600080fd5b505af1158015610b7c573d6000803e3d6000fd5b505050506040513d6020811015610b9257600080fd5b8101908080519060200190929190505050816007018190555060048160060160146101000a81548160ff02191690836004811115610bcc57fe5b0217905550600081600701541115610be957610be88282612ebb565b5b8173ffffffffffffffffffffffffffffffffffffffff167faaeadc493bde97bcc1d65fc982df495dff306008f03bf6b8401117ab8e028f2d6004600060405180836004811115610c3557fe5b60ff1681526020018260001b81526020019250505060405180910390a25050565b60016020528060005260406000206000915090508060000154908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060060160149054906101000a900460ff1690806007015490806008015490508a565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600480811115610da657fe5b8160060160149054906101000a900460ff166004811115610dc357fe5b14610e19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806135cf602a913960400191505060405180910390fd5b8115610ea8576000816007015411610e99576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f657363726f7765722062616c616e63652069732030000000000000000000000081525060200191505060405180910390fd5b610ea38382612ebb565b610f2d565b6000816008015411610f22576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f70617965652062616c616e63652069732030000000000000000000000000000081525060200191505060405180910390fd5b610f2c83826130cf565b5b505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ff9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061353b6024913960400191505060405180910390fd5b6001600481111561100657fe5b8160060160149054906101000a900460ff16600481111561102357fe5b14611096576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f457363726f77206d75737420626520696e20737461746520556e66756e64656481525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff167f511c3b325f63024e6754176648b89f4bab878b1712366d9bf3729c501dcbad798373ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561111657600080fd5b505af115801561112a573d6000803e3d6000fd5b505050506040513d602081101561114057600080fd5b81019080805190602001909291905050506040518082815260200191505060405180910390a25050565b6000600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600260048111156111ba57fe5b8160060160149054906101000a900460ff1660048111156111d757fe5b1461124a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f457363726f77206d75737420626520696e207374617465204f70656e0000000081525060200191505060405180910390fd5b60606040518060400160405280600381526020017f3134390000000000000000000000000000000000000000000000000000000000815250905060006040518060400160405280601a81526020017f19457468657265756d205369676e6564204d6573736167653a0a000000000000815250828b600260038111156112cb57fe5b8c8c8c8c6040516020018089805190602001908083835b6020831061130557805182526020820191506020810190506020830392506112e2565b6001836020036101000a03801982511681845116808217855250505050505090500188805190602001908083835b602083106113565780518252602082019150602081019050602083039250611333565b6001836020036101000a0380198251168184511680821785525050505050509050018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018660ff1660ff1660f81b8152600101858152602001848152602001838152602001828152602001985050505050505050506040516020818303038152906040528051906020012090508260030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661143b82876132e3565b73ffffffffffffffffffffffffffffffffffffffff16146114c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f496e76616c696420657363726f7765722073696700000000000000000000000081525060200191505060405180910390fd5b8260060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661150982866132e3565b73ffffffffffffffffffffffffffffffffffffffff1614611592576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f496e76616c69642070617965652073696700000000000000000000000000000081525060200191505060405180910390fd5b604051806080016040528089815260200188815260200187815260200182815250600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010155604082015181600201556060820151816003015590505060038360060160146101000a81548160ff0219169083600481111561163e57fe5b0217905550888360080181905550611675886116678b86600001546132f790919063ffffffff16565b6132f790919063ffffffff16565b83600701819055508973ffffffffffffffffffffffffffffffffffffffff167fba17d7bcab79df89a9c2ce06d6ae417e98df55f0768715b7cee8e00a41cc6f0c826040518082815260200191505060405180910390a250505050505050505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506001600481111561172757fe5b8160060160149054906101000a900460ff16600481111561174457fe5b146117b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f457363726f77206d75737420626520696e20737461746520556e66756e64656481525060200191505060405180910390fd5b600082905060008260000154905060008273ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561180f57600080fd5b505af1158015611823573d6000803e3d6000fd5b505050506040513d602081101561183957600080fd5b81019080805190602001909291905050509050818110156118c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f457363726f77206e6f742066756e64656400000000000000000000000000000081525060200191505060405180910390fd5b60028460060160146101000a81548160ff021916908360048111156118e357fe5b02179055508473ffffffffffffffffffffffffffffffffffffffff167fa6ad72bd1facaeefbc0081332e37b7f9e50ab106dac569b8913e2e5cdee2bb7060405160405180910390a281811115611a2d578273ffffffffffffffffffffffffffffffffffffffff1663d0679d348560020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661198785856132f790919063ffffffff16565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156119f057600080fd5b505af1158015611a04573d6000803e3d6000fd5b505050506040513d6020811015611a1a57600080fd5b8101908080519060200190929190505050505b5050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ad9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806135836024913960400191505060405180910390fd5b60006004811115611ae657fe5b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060060160149054906101000a900460ff166004811115611b4157fe5b14611bb4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f457363726f7720616c726561647920657869737473000000000000000000000081525060200191505060405180910390fd5b60008711611c2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f457363726f7720616d6f756e7420746f6f206c6f77000000000000000000000081525060200191505060405180910390fd5b600080905060008090506040518061014001604052808a81526020018981526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200160016004811115611ce557fe5b815260200183815260200182815250600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a08201518160050160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c08201518160060160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060e08201518160060160146101000a81548160ff02191690836004811115611ece57fe5b02179055506101008201518160070155610120820151816008015590505050505050505050505050565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060026004811115611f4857fe5b8160060160149054906101000a900460ff166004811115611f6557fe5b14611fd8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f457363726f77206d75737420626520696e207374617465204f70656e0000000081525060200191505060405180910390fd5b8060010154421015612052576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f457363726f772074696d656c6f636b206e6f742072656163686564000000000081525060200191505060405180910390fd5b60606040518060400160405280600281526020017f3533000000000000000000000000000000000000000000000000000000000000815250905060006040518060400160405280601a81526020017f19457468657265756d205369676e6564204d6573736167653a0a00000000000081525082876003808111156120d257fe5b886040516020018086805190602001908083835b6020831061210957805182526020820191506020810190506020830392506120e6565b6001836020036101000a03801982511681845116808217855250505050505090500185805190602001908083835b6020831061215a5780518252602082019150602081019050602083039250612137565b6001836020036101000a0380198251168184511680821785525050505050509050018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018360ff1660ff1660f81b8152600101828152602001955050505050506040516020818303038152906040528051906020012090508260040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661222a82866132e3565b73ffffffffffffffffffffffffffffffffffffffff16146122b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f496e76616c696420657363726f7765722073696700000000000000000000000081525060200191505060405180910390fd5b8483600801819055506122d38584600001546132f790919063ffffffff16565b836007018190555060048360060160146101000a81548160ff021916908360048111156122fc57fe5b0217905550600083600701541115612319576123188684612ebb565b5b6000836008015411156123315761233086846130cf565b5b8573ffffffffffffffffffffffffffffffffffffffff167faaeadc493bde97bcc1d65fc982df495dff306008f03bf6b8401117ab8e028f2d6000836040518083600481111561237c57fe5b60ff1681526020018281526020019250505060405180910390a2505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506002600481111561241357fe5b8160060160149054906101000a900460ff16600481111561243057fe5b146124a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f457363726f77206d75737420626520696e207374617465204f70656e0000000081525060200191505060405180910390fd5b60606040518060400160405280600281526020017f3533000000000000000000000000000000000000000000000000000000000000815250905060006040518060400160405280601a81526020017f19457468657265756d205369676e6564204d6573736167653a0a00000000000081525082886001600381111561252457fe5b896040516020018086805190602001908083835b6020831061255b5780518252602082019150602081019050602083039250612538565b6001836020036101000a03801982511681845116808217855250505050505090500185805190602001908083835b602083106125ac5780518252602082019150602081019050602083039250612589565b6001836020036101000a0380198251168184511680821785525050505050509050018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018360ff1660ff1660f81b8152600101828152602001955050505050506040516020818303038152906040528051906020012090508260030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661267c82876132e3565b73ffffffffffffffffffffffffffffffffffffffff1614612705576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c696420657363726f77657220636173686f7574207369670000000081525060200191505060405180910390fd5b8260060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661274a82866132e3565b73ffffffffffffffffffffffffffffffffffffffff16146127d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f496e76616c696420706179656520636173686f7574207369670000000000000081525060200191505060405180910390fd5b8583600801819055506127f38684600001546132f790919063ffffffff16565b836007018190555060048360060160146101000a81548160ff0219169083600481111561281c57fe5b0217905550600083600701541115612839576128388784612ebb565b5b6000836008015411156128515761285087846130cf565b5b8673ffffffffffffffffffffffffffffffffffffffff167faaeadc493bde97bcc1d65fc982df495dff306008f03bf6b8401117ab8e028f2d6003836040518083600481111561289c57fe5b60ff1681526020018281526020019250505060405180910390a250505050505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506003600481111561290f57fe5b8160060160149054906101000a900460ff16600481111561292c57fe5b14612982576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061355f6024913960400191505060405180910390fd5b61298a61350c565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090508060400151421015612a78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f50757a7a6c652074696d656c6f636b206e6f742072656163686564000000000081525060200191505060405180910390fd5b612a938160000151836007015461338090919063ffffffff16565b826007018190555060048260060160146101000a81548160ff02191690836004811115612abc57fe5b02179055508273ffffffffffffffffffffffffffffffffffffffff167faaeadc493bde97bcc1d65fc982df495dff306008f03bf6b8401117ab8e028f2d6001836060015160405180836004811115612b1057fe5b60ff1681526020018281526020019250505060405180910390a2505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060036004811115612b7f57fe5b8160060160149054906101000a900460ff166004811115612b9c57fe5b14612bf2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061355f6024913960400191505060405180910390fd5b612bfa61350c565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090506000600284604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b60208310612cc55780518252602082019150602081019050602083039250612ca2565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa158015612d07573d6000803e3d6000fd5b5050506040513d6020811015612d1c57600080fd5b8101908080519060200190929190505050905081602001518114612da8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f496e76616c696420707265696d6167650000000000000000000000000000000081525060200191505060405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff167f206fdb7f1bb710f91aa27c794fd6a39e4ff1377d3b4b0bb49687a4c079bbd758858460600151604051808381526020018281526020019250505060405180910390a2612e1d8260000151846008015461338090919063ffffffff16565b836008018190555060048360060160146101000a81548160ff02191690836004811115612e4657fe5b02179055508473ffffffffffffffffffffffffffffffffffffffff167faaeadc493bde97bcc1d65fc982df495dff306008f03bf6b8401117ab8e028f2d6002846060015160405180836004811115612e9a57fe5b60ff1681526020018281526020019250505060405180910390a25050505050565b6000829050600082600701549050600083600701819055508173ffffffffffffffffffffffffffffffffffffffff1663d0679d348460020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612f7e57600080fd5b505af1158015612f92573d6000803e3d6000fd5b505050506040513d6020811015612fa857600080fd5b810190808051906020019092919050505061302b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f657363726f7765722073656e64206661696c757265000000000000000000000081525060200191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff167f39e3a9984488025e3a162a593e8e94e7f8eab80cd7e70d23c46c8e1e8101c7398460020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a250505050565b6000829050600082600801549050600083600801819055508173ffffffffffffffffffffffffffffffffffffffff1663d0679d348460050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561319257600080fd5b505af11580156131a6573d6000803e3d6000fd5b505050506040513d60208110156131bc57600080fd5b810190808051906020019092919050505061323f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f70617965652073656e64206661696c757265000000000000000000000000000081525060200191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff167f39e3a9984488025e3a162a593e8e94e7f8eab80cd7e70d23c46c8e1e8101c7398460050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a250505050565b60006132ef8383613408565b905092915050565b60008282111561336f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b600082840390508091505092915050565b6000808284019050838110156133fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000604182511461341c5760009050613506565b60008060006020850151925060408501519150606085015160001a90507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c11156134705760009350505050613506565b601b8160ff16141580156134885750601c8160ff1614155b156134995760009350505050613506565b60018682858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156134f6573d6000803e3d6000fd5b5050506020604051035193505050505b92915050565b604051806080016040528060008152602001600080191681526020016000815260200160008019168152509056fe4f6e6c792063616c6c61626c652062792074686520457363726f7720636f6e7472616374457363726f77206d75737420626520696e2073746174652050757a7a6c65506f7374656443616e206f6e6c792062652063616c6c656420627920657363726f7720666163746f7279457363726f7720666f72636520726566756e642074696d656c6f636b206e6f742072656163686564576974686472617720617474656d70746564206265666f726520657363726f7720697320636c6f736564a265627a7a7231582033e4fc478925a8af1a370ee7970dac21d70ba854a069a9f3c2712f1aea79009c64736f6c634300050c0032
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c80639771b7de1161008c578063bdd1daaa11610066578063bdd1daaa14610756578063c4de5dce146107a0578063d4b64dad1461091c578063f2aecf4614610960576100cf565b80639771b7de14610534578063a34e7d2a14610578578063a37eec6214610671576100cf565b8063054848b6146100d45780633fb6c74e14610141578063477230b2146101855780635437e4011461030657806357c1766d14610356578063701554591461039a575b600080fd5b610116600480360360208110156100ea57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109ae565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b6101836004803603602081101561015757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109de565b005b6101c76004803603602081101561019b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c56565b604051808b81526020018a81526020018973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018460048111156102dd57fe5b60ff1681526020018381526020018281526020019a505050505050505050505060405180910390f35b6103546004803603604081101561031c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050610d57565b005b6103986004803603602081101561036c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f32565b005b610532600480360360e08110156103b057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019064010000000081111561041557600080fd5b82018360208201111561042757600080fd5b8035906020019184600183028401116401000000008311171561044957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156104ac57600080fd5b8201836020820111156104be57600080fd5b803590602001918460018302840111640100000000831117156104e057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061116a565b005b6105766004803603602081101561054a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116d7565b005b61066f600480360361010081101561058f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a34565b005b6107546004803603606081101561068757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156106ce57600080fd5b8201836020820111156106e057600080fd5b8035906020019184600183028401116401000000008311171561070257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611ef8565b005b61075e61239e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61091a600480360360808110156107b657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156107fd57600080fd5b82018360208201111561080f57600080fd5b8035906020019184600183028401116401000000008311171561083157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561089457600080fd5b8201836020820111156108a657600080fd5b803590602001918460018302840111640100000000831117156108c857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506123c3565b005b61095e6004803603602081101561093257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128bf565b005b6109ac6004803603604081101561097657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612b2f565b005b60026020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060026004811115610a2e57fe5b8160060160149054906101000a900460ff166004811115610a4b57fe5b14610abe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f457363726f77206d75737420626520696e207374617465204f70656e0000000081525060200191505060405180910390fd5b6202a300816001015401421015610b20576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806135a76028913960400191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610b6857600080fd5b505af1158015610b7c573d6000803e3d6000fd5b505050506040513d6020811015610b9257600080fd5b8101908080519060200190929190505050816007018190555060048160060160146101000a81548160ff02191690836004811115610bcc57fe5b0217905550600081600701541115610be957610be88282612ebb565b5b8173ffffffffffffffffffffffffffffffffffffffff167faaeadc493bde97bcc1d65fc982df495dff306008f03bf6b8401117ab8e028f2d6004600060405180836004811115610c3557fe5b60ff1681526020018260001b81526020019250505060405180910390a25050565b60016020528060005260406000206000915090508060000154908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060060160149054906101000a900460ff1690806007015490806008015490508a565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600480811115610da657fe5b8160060160149054906101000a900460ff166004811115610dc357fe5b14610e19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806135cf602a913960400191505060405180910390fd5b8115610ea8576000816007015411610e99576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f657363726f7765722062616c616e63652069732030000000000000000000000081525060200191505060405180910390fd5b610ea38382612ebb565b610f2d565b6000816008015411610f22576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f70617965652062616c616e63652069732030000000000000000000000000000081525060200191505060405180910390fd5b610f2c83826130cf565b5b505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ff9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061353b6024913960400191505060405180910390fd5b6001600481111561100657fe5b8160060160149054906101000a900460ff16600481111561102357fe5b14611096576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f457363726f77206d75737420626520696e20737461746520556e66756e64656481525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff167f511c3b325f63024e6754176648b89f4bab878b1712366d9bf3729c501dcbad798373ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561111657600080fd5b505af115801561112a573d6000803e3d6000fd5b505050506040513d602081101561114057600080fd5b81019080805190602001909291905050506040518082815260200191505060405180910390a25050565b6000600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600260048111156111ba57fe5b8160060160149054906101000a900460ff1660048111156111d757fe5b1461124a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f457363726f77206d75737420626520696e207374617465204f70656e0000000081525060200191505060405180910390fd5b60606040518060400160405280600381526020017f3134390000000000000000000000000000000000000000000000000000000000815250905060006040518060400160405280601a81526020017f19457468657265756d205369676e6564204d6573736167653a0a000000000000815250828b600260038111156112cb57fe5b8c8c8c8c6040516020018089805190602001908083835b6020831061130557805182526020820191506020810190506020830392506112e2565b6001836020036101000a03801982511681845116808217855250505050505090500188805190602001908083835b602083106113565780518252602082019150602081019050602083039250611333565b6001836020036101000a0380198251168184511680821785525050505050509050018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018660ff1660ff1660f81b8152600101858152602001848152602001838152602001828152602001985050505050505050506040516020818303038152906040528051906020012090508260030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661143b82876132e3565b73ffffffffffffffffffffffffffffffffffffffff16146114c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f496e76616c696420657363726f7765722073696700000000000000000000000081525060200191505060405180910390fd5b8260060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661150982866132e3565b73ffffffffffffffffffffffffffffffffffffffff1614611592576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f496e76616c69642070617965652073696700000000000000000000000000000081525060200191505060405180910390fd5b604051806080016040528089815260200188815260200187815260200182815250600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010155604082015181600201556060820151816003015590505060038360060160146101000a81548160ff0219169083600481111561163e57fe5b0217905550888360080181905550611675886116678b86600001546132f790919063ffffffff16565b6132f790919063ffffffff16565b83600701819055508973ffffffffffffffffffffffffffffffffffffffff167fba17d7bcab79df89a9c2ce06d6ae417e98df55f0768715b7cee8e00a41cc6f0c826040518082815260200191505060405180910390a250505050505050505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506001600481111561172757fe5b8160060160149054906101000a900460ff16600481111561174457fe5b146117b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f457363726f77206d75737420626520696e20737461746520556e66756e64656481525060200191505060405180910390fd5b600082905060008260000154905060008273ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561180f57600080fd5b505af1158015611823573d6000803e3d6000fd5b505050506040513d602081101561183957600080fd5b81019080805190602001909291905050509050818110156118c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f457363726f77206e6f742066756e64656400000000000000000000000000000081525060200191505060405180910390fd5b60028460060160146101000a81548160ff021916908360048111156118e357fe5b02179055508473ffffffffffffffffffffffffffffffffffffffff167fa6ad72bd1facaeefbc0081332e37b7f9e50ab106dac569b8913e2e5cdee2bb7060405160405180910390a281811115611a2d578273ffffffffffffffffffffffffffffffffffffffff1663d0679d348560020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661198785856132f790919063ffffffff16565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156119f057600080fd5b505af1158015611a04573d6000803e3d6000fd5b505050506040513d6020811015611a1a57600080fd5b8101908080519060200190929190505050505b5050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ad9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806135836024913960400191505060405180910390fd5b60006004811115611ae657fe5b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060060160149054906101000a900460ff166004811115611b4157fe5b14611bb4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f457363726f7720616c726561647920657869737473000000000000000000000081525060200191505060405180910390fd5b60008711611c2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f457363726f7720616d6f756e7420746f6f206c6f77000000000000000000000081525060200191505060405180910390fd5b600080905060008090506040518061014001604052808a81526020018981526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200160016004811115611ce557fe5b815260200183815260200182815250600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a08201518160050160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c08201518160060160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060e08201518160060160146101000a81548160ff02191690836004811115611ece57fe5b02179055506101008201518160070155610120820151816008015590505050505050505050505050565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060026004811115611f4857fe5b8160060160149054906101000a900460ff166004811115611f6557fe5b14611fd8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f457363726f77206d75737420626520696e207374617465204f70656e0000000081525060200191505060405180910390fd5b8060010154421015612052576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f457363726f772074696d656c6f636b206e6f742072656163686564000000000081525060200191505060405180910390fd5b60606040518060400160405280600281526020017f3533000000000000000000000000000000000000000000000000000000000000815250905060006040518060400160405280601a81526020017f19457468657265756d205369676e6564204d6573736167653a0a00000000000081525082876003808111156120d257fe5b886040516020018086805190602001908083835b6020831061210957805182526020820191506020810190506020830392506120e6565b6001836020036101000a03801982511681845116808217855250505050505090500185805190602001908083835b6020831061215a5780518252602082019150602081019050602083039250612137565b6001836020036101000a0380198251168184511680821785525050505050509050018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018360ff1660ff1660f81b8152600101828152602001955050505050506040516020818303038152906040528051906020012090508260040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661222a82866132e3565b73ffffffffffffffffffffffffffffffffffffffff16146122b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f496e76616c696420657363726f7765722073696700000000000000000000000081525060200191505060405180910390fd5b8483600801819055506122d38584600001546132f790919063ffffffff16565b836007018190555060048360060160146101000a81548160ff021916908360048111156122fc57fe5b0217905550600083600701541115612319576123188684612ebb565b5b6000836008015411156123315761233086846130cf565b5b8573ffffffffffffffffffffffffffffffffffffffff167faaeadc493bde97bcc1d65fc982df495dff306008f03bf6b8401117ab8e028f2d6000836040518083600481111561237c57fe5b60ff1681526020018281526020019250505060405180910390a2505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506002600481111561241357fe5b8160060160149054906101000a900460ff16600481111561243057fe5b146124a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f457363726f77206d75737420626520696e207374617465204f70656e0000000081525060200191505060405180910390fd5b60606040518060400160405280600281526020017f3533000000000000000000000000000000000000000000000000000000000000815250905060006040518060400160405280601a81526020017f19457468657265756d205369676e6564204d6573736167653a0a00000000000081525082886001600381111561252457fe5b896040516020018086805190602001908083835b6020831061255b5780518252602082019150602081019050602083039250612538565b6001836020036101000a03801982511681845116808217855250505050505090500185805190602001908083835b602083106125ac5780518252602082019150602081019050602083039250612589565b6001836020036101000a0380198251168184511680821785525050505050509050018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018360ff1660ff1660f81b8152600101828152602001955050505050506040516020818303038152906040528051906020012090508260030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661267c82876132e3565b73ffffffffffffffffffffffffffffffffffffffff1614612705576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c696420657363726f77657220636173686f7574207369670000000081525060200191505060405180910390fd5b8260060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661274a82866132e3565b73ffffffffffffffffffffffffffffffffffffffff16146127d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f496e76616c696420706179656520636173686f7574207369670000000000000081525060200191505060405180910390fd5b8583600801819055506127f38684600001546132f790919063ffffffff16565b836007018190555060048360060160146101000a81548160ff0219169083600481111561281c57fe5b0217905550600083600701541115612839576128388784612ebb565b5b6000836008015411156128515761285087846130cf565b5b8673ffffffffffffffffffffffffffffffffffffffff167faaeadc493bde97bcc1d65fc982df495dff306008f03bf6b8401117ab8e028f2d6003836040518083600481111561289c57fe5b60ff1681526020018281526020019250505060405180910390a250505050505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506003600481111561290f57fe5b8160060160149054906101000a900460ff16600481111561292c57fe5b14612982576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061355f6024913960400191505060405180910390fd5b61298a61350c565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090508060400151421015612a78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f50757a7a6c652074696d656c6f636b206e6f742072656163686564000000000081525060200191505060405180910390fd5b612a938160000151836007015461338090919063ffffffff16565b826007018190555060048260060160146101000a81548160ff02191690836004811115612abc57fe5b02179055508273ffffffffffffffffffffffffffffffffffffffff167faaeadc493bde97bcc1d65fc982df495dff306008f03bf6b8401117ab8e028f2d6001836060015160405180836004811115612b1057fe5b60ff1681526020018281526020019250505060405180910390a2505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060036004811115612b7f57fe5b8160060160149054906101000a900460ff166004811115612b9c57fe5b14612bf2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061355f6024913960400191505060405180910390fd5b612bfa61350c565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090506000600284604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b60208310612cc55780518252602082019150602081019050602083039250612ca2565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa158015612d07573d6000803e3d6000fd5b5050506040513d6020811015612d1c57600080fd5b8101908080519060200190929190505050905081602001518114612da8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f496e76616c696420707265696d6167650000000000000000000000000000000081525060200191505060405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff167f206fdb7f1bb710f91aa27c794fd6a39e4ff1377d3b4b0bb49687a4c079bbd758858460600151604051808381526020018281526020019250505060405180910390a2612e1d8260000151846008015461338090919063ffffffff16565b836008018190555060048360060160146101000a81548160ff02191690836004811115612e4657fe5b02179055508473ffffffffffffffffffffffffffffffffffffffff167faaeadc493bde97bcc1d65fc982df495dff306008f03bf6b8401117ab8e028f2d6002846060015160405180836004811115612e9a57fe5b60ff1681526020018281526020019250505060405180910390a25050505050565b6000829050600082600701549050600083600701819055508173ffffffffffffffffffffffffffffffffffffffff1663d0679d348460020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612f7e57600080fd5b505af1158015612f92573d6000803e3d6000fd5b505050506040513d6020811015612fa857600080fd5b810190808051906020019092919050505061302b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f657363726f7765722073656e64206661696c757265000000000000000000000081525060200191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff167f39e3a9984488025e3a162a593e8e94e7f8eab80cd7e70d23c46c8e1e8101c7398460020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a250505050565b6000829050600082600801549050600083600801819055508173ffffffffffffffffffffffffffffffffffffffff1663d0679d348460050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561319257600080fd5b505af11580156131a6573d6000803e3d6000fd5b505050506040513d60208110156131bc57600080fd5b810190808051906020019092919050505061323f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f70617965652073656e64206661696c757265000000000000000000000000000081525060200191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff167f39e3a9984488025e3a162a593e8e94e7f8eab80cd7e70d23c46c8e1e8101c7398460050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a250505050565b60006132ef8383613408565b905092915050565b60008282111561336f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b600082840390508091505092915050565b6000808284019050838110156133fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000604182511461341c5760009050613506565b60008060006020850151925060408501519150606085015160001a90507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c11156134705760009350505050613506565b601b8160ff16141580156134885750601c8160ff1614155b156134995760009350505050613506565b60018682858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156134f6573d6000803e3d6000fd5b5050506020604051035193505050505b92915050565b604051806080016040528060008152602001600080191681526020016000815260200160008019168152509056fe4f6e6c792063616c6c61626c652062792074686520457363726f7720636f6e7472616374457363726f77206d75737420626520696e2073746174652050757a7a6c65506f7374656443616e206f6e6c792062652063616c6c656420627920657363726f7720666163746f7279457363726f7720666f72636520726566756e642074696d656c6f636b206e6f742072656163686564576974686472617720617474656d70746564206265666f726520657363726f7720697320636c6f736564a265627a7a7231582033e4fc478925a8af1a370ee7970dac21d70ba854a069a9f3c2712f1aea79009c64736f6c634300050c0032
Deployed Bytecode Sourcemap
8040:16609:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8040:16609:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11535:47;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11535:47:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18248:728;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18248:728:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;11367:47;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11367:47:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22891:574;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22891:574:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;13131:400;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13131:400:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;19593:1467;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;19593:1467:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;19593:1467:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;19593:1467:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;19593:1467:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;19593:1467:0;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;19593:1467:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;19593:1467:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;19593:1467:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;19593:1467:0;;;;;;;;;;;;;;;:::i;:::-;;13741:848;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13741:848:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;11996:917;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;11996:917:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16693:1248;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16693:1248:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;16693:1248:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;16693:1248:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;16693:1248:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;16693:1248:0;;;;;;;;;;;;;;;:::i;:::-;;11280:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;14845:1339;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;14845:1339:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;14845:1339:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;14845:1339:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;14845:1339:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;14845:1339:0;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;14845:1339:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;14845:1339:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;14845:1339:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;14845:1339:0;;;;;;;;;;;;;;;:::i;:::-;;22216:667;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22216:667:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;21281:782;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21281:782:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;11535:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18248:728::-;18310:33;18346:7;:22;18354:13;18346:22;;;;;;;;;;;;;;;18310:58;;18415:16;18387:44;;;;;;;;:12;:24;;;;;;;;;;;;:44;;;;;;;;;18379:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8212:6;18490:12;:27;;;:47;18483:3;:54;;18475:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18634:13;18626:30;;;:32;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18626:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18626:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18626:32:0;;;;;;;;;;;;;;;;18595:12;:28;;:63;;;;18696:18;18669:12;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;18761:1;18730:12;:28;;;:32;18727:78;;;18764:41;18777:13;18792:12;18764;:41::i;:::-;18727:78;18918:13;18905:63;;;18933:29;18964:3;18905:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18248:728;;:::o;11367:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22891:574::-;22965:33;23001:7;:22;23009:13;23001:22;;;;;;;;;;;;;;;22965:58;;23072:18;23044:46;;;;;;;;:12;:24;;;;;;;;;;;;:46;;;;;;;;;23036:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23153:8;23150:308;;;23217:1;23186:12;:28;;;:32;23178:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23259:41;23272:13;23287:12;23259;:41::i;:::-;23150:308;;;23369:1;23341:12;:25;;;:29;23333:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23408:38;23418:13;23433:12;23408:9;:38::i;:::-;23150:308;22891:574;;;:::o;13131:400::-;13193:33;13229:7;:22;13237:13;13229:22;;;;;;;;;;;;;;;13193:58;;13286:13;13272:27;;:10;:27;;;13264:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13387:20;13359:48;;;;;;;;:12;:24;;;;;;;;;;;;:48;;;;;;;;;13351:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13475:13;13462:61;;;13498:13;13490:30;;;:32;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13490:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13490:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13490:32:0;;;;;;;;;;;;;;;;13462:61;;;;;;;;;;;;;;;;;;13131:400;;:::o;19593:1467::-;19854:33;19890:7;:22;19898:13;19890:22;;;;;;;;;;;;;;;19854:58;;19959:16;19931:44;;;;;;;;:12;:24;;;;;;;;;;;;:44;;;;;;;;;19923:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20090:27;:35;;;;;;;;;;;;;;;;;;;20136:15;20195:16;;;;;;;;;;;;;;;;;20226:13;20254;20288:20;20282:27;;;;;;;;20324:16;20355:11;20381:6;20402:14;20164:263;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;20164:263:0;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;20164:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;20164:263:0;;;20154:274;;;;;;20136:292;;20474:12;:26;;;;;;;;;;;;20449:51;;:21;20456:7;20465:4;20449:6;:21::i;:::-;:51;;;20441:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20569:12;:23;;;;;;;;;;;;20544:48;;:21;20551:7;20560:4;20544:6;:21::i;:::-;:48;;;20536:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20652:121;;;;;;;;20679:11;20652:121;;;;20705:6;20652:121;;;;20726:14;20652:121;;;;20755:7;20652:121;;;20627:7;:22;20635:13;20627:22;;;;;;;;;;;;;;;:146;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20813:24;20786:12;:24;;;:51;;;;;;;;;;;;;;;;;;;;;;;;20876:16;20848:12;:25;;:44;;;;20934:64;20986:11;20934:47;20964:16;20934:12;:25;;;:29;;:47;;;;:::i;:::-;:51;;:64;;;;:::i;:::-;20903:12;:28;;:95;;;;21029:13;21016:36;;;21044:7;21016:36;;;;;;;;;;;;;;;;;;19593:1467;;;;;;;;;;:::o;13741:848::-;13802:33;13838:7;:22;13846:13;13838:22;;;;;;;;;;;;;;;13802:58;;13907:20;13879:48;;;;;;;;:12;:24;;;;;;;;;;;;:48;;;;;;;;;13871:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13985:14;14010:13;13985:39;;14035:17;14055:12;:25;;;14035:45;;14091:18;14112:6;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14112:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14112:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;14112:16:0;;;;;;;;;;;;;;;;14091:37;;14231:12;14214:13;:29;;14206:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14305:16;14278:12;:24;;;:43;;;;;;;;;;;;;;;;;;;;;;;;14350:13;14337:27;;;;;;;;;;;;14468:12;14452:13;:28;14449:133;;;14496:6;:11;;;14508:12;:28;;;;;;;;;;;;14538:31;14556:12;14538:13;:17;;:31;;;;:::i;:::-;14496:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14496:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14496:74:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;14496:74:0;;;;;;;;;;;;;;;;;14449:133;13741:848;;;;;:::o;11996:917::-;11721:13;;;;;;;;;;;11707:27;;:10;:27;;;11699:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12366:16;12335:47;;;;;;;;:7;:15;12343:6;12335:15;;;;;;;;;;;;;;;:27;;;;;;;;;;;;:47;;;;;;;;;12327:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12442:1;12427:12;:16;12419:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12482:28;12513:1;12482:32;;12525:25;12553:1;12525:29;;12585:320;;;;;;;;12612:12;12585:320;;;;12639:8;12585:320;;;;12662:15;12585:320;;;;;;12692:13;12585:320;;;;;;12720:14;12585:320;;;;;;12749:12;12585:320;;;;;;12776:10;12585:320;;;;;;12801:20;12585:320;;;;;;;;;;;;12836:23;12585:320;;;;12874:20;12585:320;;;12567:7;:15;12575:6;12567:15;;;;;;;;;;;;;;;:338;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11786:1;;11996:917;;;;;;;;:::o;16693:1248::-;16788:33;16824:7;:22;16832:13;16824:22;;;;;;;;;;;;;;;16788:58;;16893:16;16865:44;;;;;;;;:12;:24;;;;;;;;;;;;:44;;;;;;;;;16857:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16968:12;:27;;;16961:3;:34;;16953:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17102:27;:34;;;;;;;;;;;;;;;;;;;17147:15;17206:16;;;;;;;;;;;;;;;;;17237:13;17265;17299:20;17293:27;;;;;;;;17335:12;17175:183;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;17175:183:0;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;17175:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;17175:183:0;;;17165:194;;;;;;17147:212;;17433:12;:27;;;;;;;;;;;;17408:52;;:21;17415:7;17424:4;17408:6;:21::i;:::-;:52;;;17400:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17526:12;17498;:25;;:40;;;;17580:43;17610:12;17580;:25;;;:29;;:43;;;;:::i;:::-;17549:12;:28;;:74;;;;17661:18;17634:12;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;17726:1;17695:12;:28;;;:32;17692:78;;;17729:41;17742:13;17757:12;17729;:41::i;:::-;17692:78;17812:1;17784:12;:25;;;:29;17781:72;;;17815:38;17825:13;17840:12;17815:9;:38::i;:::-;17781:72;17884:13;17871:62;;;17899:24;17925:7;17871:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16693:1248;;;;;;:::o;11280:28::-;;;;;;;;;;;;;:::o;14845:1339::-;15017:33;15053:7;:22;15061:13;15053:22;;;;;;;;;;;;;;;15017:58;;15122:16;15094:44;;;;;;;;:12;:24;;;;;;;;;;;;:44;;;;;;;;;15086:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15238:27;:34;;;;;;;;;;;;;;;;;;;15283:15;15342:16;;;;;;;;;;;;;;;;;15373:13;15401;15435:21;15429:28;;;;;;;;15472:12;15311:184;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;15311:184:0;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;15311:184:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;15311:184:0;;;15301:195;;;;;;15283:213;;15571:12;:26;;;;;;;;;;;;15546:51;;:21;15553:7;15562:4;15546:6;:21::i;:::-;:51;;;15538:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15674:12;:23;;;;;;;;;;;;15649:48;;:21;15656:7;15665:4;15649:6;:21::i;:::-;:48;;;15641:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15768:12;15740;:25;;:40;;;;15822:43;15852:12;15822;:25;;;:29;;:43;;;;:::i;:::-;15791:12;:28;;:74;;;;15903:18;15876:12;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;15968:1;15937:12;:28;;;:32;15934:78;;;15971:41;15984:13;15999:12;15971;:41::i;:::-;15934:78;16054:1;16026:12;:25;;;:29;16023:72;;;16057:38;16067:13;16082:12;16057:9;:38::i;:::-;16023:72;16126:13;16113:63;;;16141:25;16168:7;16113:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14845:1339;;;;;;;:::o;22216:667::-;22279:33;22315:7;:22;22323:13;22315:22;;;;;;;;;;;;;;;22279:58;;22384:24;22356:52;;;;;;;;:12;:24;;;;;;;;;;;;:52;;;;;;;;;22348:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22462:32;;:::i;:::-;22497:7;:22;22505:13;22497:22;;;;;;;;;;;;;;;22462:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22545:12;:27;;;22538:3;:34;;22530:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22656:58;22689:12;:24;;;22656:12;:28;;;:32;;:58;;;;:::i;:::-;22625:12;:28;;:89;;;;22752:18;22725:12;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;22801:13;22788:87;;;22816:30;22848:12;:26;;;22788:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22216:667;;;:::o;21281:782::-;21361:33;21397:7;:22;21405:13;21397:22;;;;;;;;;;;;;;;21361:58;;21466:24;21438:52;;;;;;;;:12;:24;;;;;;;;;;;;:52;;;;;;;;;21430:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21544:32;;:::i;:::-;21579:7;:22;21587:13;21579:22;;;;;;;;;;;;;;;21544:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21612:9;21624:34;21648:8;21631:26;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;21631:26:0;;;21624:34;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;21624:34:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21624:34:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21624:34:0;;;;;;;;;;;;;;;;21612:46;;21682:12;:19;;;21677:1;:24;21669:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21747:13;21738:61;;;21762:8;21772:12;:26;;;21738:61;;;;;;;;;;;;;;;;;;;;;;;;21840:55;21870:12;:24;;;21840:12;:25;;;:29;;:55;;;;:::i;:::-;21812:12;:25;;:83;;;;21933:18;21906:12;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;21982:13;21969:86;;;21997:29;22028:12;:26;;;21969:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21281:782;;;;;:::o;23473:430::-;23573:14;23598:13;23573:39;;23625:17;23645:12;:28;;;23625:48;;23715:1;23684:12;:28;;:32;;;;23735:6;:11;;;23747:12;:28;;;;;;;;;;;;23777:12;23735:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23735:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23735:55:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23735:55:0;;;;;;;;;;;;;;;;23727:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23851:13;23834:61;;;23866:12;:28;;;;;;;;;;;;23834:61;;;;;;;;;;;;;;;;;;;;;;23473:430;;;;:::o;23911:412::-;24008:14;24033:13;24008:39;;24060:17;24080:12;:25;;;24060:45;;24144:1;24116:12;:25;;:29;;;;24164:6;:11;;;24176:12;:25;;;;;;;;;;;;24203:12;24164:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24164:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24164:52:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24164:52:0;;;;;;;;;;;;;;;;24156:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24274:13;24257:58;;;24289:12;:25;;;;;;;;;;;;24257:58;;;;;;;;;;;;;;;;;;;;;;23911:412;;;;:::o;24500:146::-;24573:15;24611:27;24625:7;24634:3;24611:13;:27::i;:::-;24601:37;;24500:146;;;;:::o;1377:184::-;1435:7;1468:1;1463;:6;;1455:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1515:9;1531:1;1527;:5;1515:17;;1552:1;1545:8;;;1377:184;;;;:::o;921:181::-;979:7;999:9;1015:1;1011;:5;999:17;;1040:1;1035;:6;;1027:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1093:1;1086:8;;;921:181;;;;:::o;5236:1930::-;5314:7;5397:2;5377:9;:16;:22;5373:74;;5432:1;5416:19;;;;5373:74;5516:9;5536;5556:7;5808:4;5797:9;5793:20;5787:27;5782:32;;5854:4;5843:9;5839:20;5833:27;5828:32;;5908:4;5897:9;5893:20;5887:27;5884:1;5879:36;5874:41;;6838:66;6833:1;6825:10;;:79;6821:129;;;6936:1;6921:17;;;;;;;6821:129;6971:2;6966:1;:7;;;;:18;;;;;6982:2;6977:1;:7;;;;6966:18;6962:68;;;7016:1;7001:17;;;;;;;6962:68;7134:24;7144:4;7150:1;7153;7156;7134:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7134:24:0;;;;;;;;7127:31;;;;;5236:1930;;;;;:::o;8040:16609::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://33e4fc478925a8af1a370ee7970dac21d70ba854a069a9f3c2712f1aea79009c
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.