Overview
APE Balance
APE Value
$297.71 (@ $0.19/APE)Multichain Info
Latest 25 from a total of 21,112 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Cash Out | 32622147 | 17 mins ago | IN | 0 APE | 0.01188091 | ||||
| Make Guess | 32622138 | 17 mins ago | IN | 0.07321158 APE | 0.02469691 | ||||
| Play | 32622132 | 17 mins ago | IN | 50.07321158 APE | 0.06125989 | ||||
| Cash Out | 32622011 | 22 mins ago | IN | 0 APE | 0.00268391 | ||||
| Cash Out | 32622009 | 22 mins ago | IN | 0 APE | 0.01187969 | ||||
| Make Guess | 32622002 | 23 mins ago | IN | 0.07321158 APE | 0.0431629 | ||||
| Make Guess | 32621993 | 23 mins ago | IN | 0.07321158 APE | 0.0297544 | ||||
| Cash Out | 32621782 | 31 mins ago | IN | 0 APE | 0.01188091 | ||||
| Make Guess | 32621779 | 31 mins ago | IN | 0.07321158 APE | 0.02469803 | ||||
| Play | 32621777 | 32 mins ago | IN | 10.07321158 APE | 0.06417005 | ||||
| Cash Out | 32621770 | 32 mins ago | IN | 0 APE | 0.01187969 | ||||
| Make Guess | 32621767 | 32 mins ago | IN | 0.07321158 APE | 0.02466071 | ||||
| Play | 32621764 | 32 mins ago | IN | 3.07321158 APE | 0.06416761 | ||||
| Make Guess | 32621760 | 32 mins ago | IN | 0.07321158 APE | 0.02470067 | ||||
| Play | 32621753 | 33 mins ago | IN | 3.07321158 APE | 0.06416883 | ||||
| Cash Out | 32621747 | 33 mins ago | IN | 0 APE | 0.01188091 | ||||
| Make Guess | 32621745 | 33 mins ago | IN | 0.07321158 APE | 0.02466193 | ||||
| Play | 32621742 | 33 mins ago | IN | 17.07321158 APE | 0.06417005 | ||||
| Cash Out | 32621738 | 33 mins ago | IN | 0 APE | 0.01188091 | ||||
| Make Guess | 32621732 | 33 mins ago | IN | 0.07321158 APE | 0.02469314 | ||||
| Play | 32621729 | 34 mins ago | IN | 3.07321158 APE | 0.06417005 | ||||
| Cash Out | 32621722 | 34 mins ago | IN | 0 APE | 0.01188091 | ||||
| Make Guess | 32621718 | 34 mins ago | IN | 0.07321158 APE | 0.0428301 | ||||
| Make Guess | 32621714 | 34 mins ago | IN | 0.07321158 APE | 0.02469314 | ||||
| Play | 32621711 | 34 mins ago | IN | 7.07321158 APE | 0.06417005 |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 32622147 | 17 mins ago | 69.44 APE | ||||
| 32622140 | 17 mins ago | 20.94 APE | ||||
| 32622138 | 17 mins ago | 0.07321158 APE | ||||
| 32622132 | 17 mins ago | 0.07321158 APE | ||||
| 32622132 | 17 mins ago | 1.25 APE | ||||
| 32622009 | 22 mins ago | 26.04125 APE | ||||
| 32622003 | 23 mins ago | 24.020449 APE | ||||
| 32622002 | 23 mins ago | 0.07321158 APE | ||||
| 32622002 | 23 mins ago | 0.0520825 APE | ||||
| 32621997 | 23 mins ago | 1.1133 APE | ||||
| 32621993 | 23 mins ago | 0.07321158 APE | ||||
| 32621782 | 31 mins ago | 10.6 APE | ||||
| 32621780 | 31 mins ago | 0.9 APE | ||||
| 32621779 | 31 mins ago | 0.07321158 APE | ||||
| 32621777 | 32 mins ago | 0.07321158 APE | ||||
| 32621777 | 32 mins ago | 0.25 APE | ||||
| 32621770 | 32 mins ago | 3.18 APE | ||||
| 32621768 | 32 mins ago | 0.27 APE | ||||
| 32621767 | 32 mins ago | 0.07321158 APE | ||||
| 32621764 | 32 mins ago | 0.07321158 APE | ||||
| 32621764 | 32 mins ago | 0.075 APE | ||||
| 32621761 | 32 mins ago | 2.91 APE | ||||
| 32621760 | 32 mins ago | 0.07321158 APE | ||||
| 32621753 | 33 mins ago | 0.07321158 APE | ||||
| 32621753 | 33 mins ago | 0.075 APE |
Cross-Chain Transactions
Contract Source Code (Solidity)
/**
*Submitted for verification at apescan.io on 2025-06-23
*/
/**
*Submitted for verification at basescan.org on 2025-06-19
*/
//SPDX-License-Identifier: MIT
pragma solidity 0.8.28;
interface IGovernanceManager {
function RNG() external view returns (address);
function owner() external view returns (address);
function referralManager() external view returns (address);
function feeReceiver() external view returns (address);
function claimManager() external view returns (address);
function house() external view returns (address);
function isGame(address game) external view returns (bool);
function userInfoTracker() external view returns (address);
function canPlayForOthers(address addr) external view returns (bool);
function paused() external view returns (bool);
function isAdmin(address admin) external view returns (bool);
}
interface IRNG {
function requestRandom(bytes32 userRandomNumber, uint8 numWords) external payable returns (uint64);
function getFee() external view returns (uint256);
}
contract ApeOwnable {
// Governance Manager
IGovernanceManager public constant manager = IGovernanceManager(0x8632f22e5A921C751CFbBFF92F058A3b11E96b8a);
modifier onlyOwner() {
require(
msg.sender == manager.owner(),
'Only Owner'
);
_;
}
modifier onlyGame() {
require(
manager.isGame(msg.sender),
'UnAuthorized'
);
_;
}
modifier onlyRNG() {
require(
msg.sender == manager.RNG(),
'Only RNG Contract'
);
_;
}
modifier validatePlayer(address player) {
if (player != msg.sender) {
require(
manager.canPlayForOthers(msg.sender),
'UnAuthorized To Play For Others'
);
}
_;
}
modifier notPaused() {
require(
manager.paused() == false,
'All Games Paused'
);
_;
}
modifier onlyAdmin() {
require(
manager.isAdmin(msg.sender),
'UnAuthorized'
);
_;
}
}
interface IGame {
/**
Callback to provide us with randomness
*/
function fulfillRandomWords(
uint64 requestId,
uint256[] calldata randomWords
) external;
function play(address user, bytes calldata gameData) external payable;
}
interface IUserInfoTracker {
function wagered(address user, uint256 amount, uint256 GAME_ID) external;
}
interface IClaimManager {
function credit(
uint256 GAME_ID,
address user
) external payable;
function claim() external;
}
interface IHistoryManager {
function addData(address user, uint256 GAME_ID, uint256 gameId) external;
}
interface IFeeRecipient {
function takeFee(address ref, address player) external payable;
}
// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
function safeApprove(
address token,
address to,
uint256 value
) internal {
// bytes4(keccak256(bytes('approve(address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
require(
success && (data.length == 0 || abi.decode(data, (bool))),
'TransferHelper::safeApprove: approve failed'
);
}
function safeTransfer(
address token,
address to,
uint256 value
) internal {
// bytes4(keccak256(bytes('transfer(address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
require(
success && (data.length == 0 || abi.decode(data, (bool))),
'TransferHelper::safeTransfer: transfer failed'
);
}
function safeTransferFrom(
address token,
address from,
address to,
uint256 value
) internal {
// bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
require(
success && (data.length == 0 || abi.decode(data, (bool))),
'TransferHelper::transferFrom: transferFrom failed'
);
}
function safeTransferETH(address to, uint256 value) internal {
(bool success, ) = to.call{value: value}(new bytes(0));
require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');
}
}
interface IHouse {
/**
House has profited from game, call this to send value into the house and emit the correct event for SubGraphs
*/
function houseProfit(uint256 GAME_ID) external payable;
/**
Function Games Call to tell the house that a user has won the bet
*/
function payout(uint256 GAME_ID, address user, uint256 value) external;
/**
Read function to determine the maximum payout allowed by the house at the current time
*/
function maxPayout() external view returns (uint256);
/**
Randomness has been requested, withdrawals are paused until it is resolved by called `randomRequestResolved()`
*/
function randomRequested() external;
/**
Resolves a random request from chainlink, allowing house users to withdraw
*/
function randomRequestResolved() external;
}
/**
Game Master Class, any inheriting game must pass the necessary fields into the constructor
*/
contract GameMasterclass is ApeOwnable, IGame {
// GAME ID
uint256 public immutable GAME_ID;
// History Manager
IHistoryManager public immutable history;
/** Game Is Either Paused Or Unpaused */
bool public paused = false;
/** List of all used game ids */
uint256[] public usedGameIds;
mapping ( uint256 => bool ) internal isUsedGameId;
// request ID => GameID
mapping ( uint64 => uint256 ) private requestToGame;
/// @notice emitted after a random request has been sent out
event RandomnessRequested(uint256 gameId);
/**
Builds The Necessary Components Of Any Game
*/
constructor(
uint256 GAME_ID_,
address history_
) {
// set other variables
GAME_ID = GAME_ID_;
history = IHistoryManager(history_);
}
//////////////////////////////////////
/////// OWNER FUNCTIONS ////////
//////////////////////////////////////
function pause() external onlyOwner {
paused = true;
}
function resume() external onlyOwner {
paused = false;
}
function withdrawETH(address to, uint256 amount) external onlyOwner {
(bool s,) = payable(to).call{value: amount}("");
require(s);
}
function withdrawToken(address token, uint amount) external onlyOwner {
TransferHelper.safeTransfer(token, msg.sender, amount);
}
function _registerBet(address user, uint256 amount) internal {
IUserInfoTracker(manager.userInfoTracker()).wagered(user, amount, GAME_ID);
}
function _processFee(uint256 feeAmount, address ref, address player) internal {
IFeeRecipient(manager.feeReceiver()).takeFee{value: feeAmount}(ref, player);
}
function getVRFFee() public view returns (uint256) {
return IRNG(manager.RNG()).getFee();
}
function fulfillRandomWords(uint64 requestId, uint256[] calldata randomWords) external virtual {}
function play(address player, bytes calldata gameData) external payable override validatePlayer(player) notPaused() {
require(
!paused,
'Paused'
);
// play game
_playGame(player, gameData);
}
function _playGame(address player, bytes calldata gameData) internal virtual {}
function _handlePayout(address player, uint256 totalToPayout, uint256 amountForHouse) internal {
if (totalToPayout > 0) {
// there is a payout, we won something
if (totalToPayout >= amountForHouse) {
// the user has won more than we are giving to the house
// this means we need to send them (to claim manager) amountForHouse directly
// and only request that the house `payout` the difference!
// add to user's claim manager the amount for the house
IClaimManager(manager.claimManager()).credit{value: amountForHouse}(
GAME_ID,
player
);
// get the difference
uint256 remaining = totalToPayout - amountForHouse;
if (remaining > 0) {
// payout the rest from the house
IHouse(manager.house()).payout(GAME_ID, player, remaining);
}
} else {
// the user has won less than we are giving to the house
// pay them out directly in full, send whatever is left over to the house
// add to user's claim manager the amount for the house
IClaimManager(manager.claimManager()).credit{value: totalToPayout}(
GAME_ID,
player
);
// calculate remaining left for the house
uint256 remaining = amountForHouse - totalToPayout;
// send the remaining to the house
IHouse(manager.house()).houseProfit{value: remaining }(GAME_ID);
}
} else {
// we won nothing, send the house everything
IHouse(manager.house()).houseProfit{value: amountForHouse }(GAME_ID);
}
}
/// @dev logs the gameId in the used list and adds game to player's history
function _registerGameId(address player, uint256 gameId) internal {
// set history data
history.addData(player, GAME_ID, gameId);
// add to list of used game ids
usedGameIds.push(gameId);
isUsedGameId[gameId] = true;
}
function _requestRandom(uint256 gameId, uint8 numWords, bytes32 userRandomWord) internal {
// request random words from RNG contract
uint64 requestId = IRNG(manager.RNG()).requestRandom{value: getVRFFee()}(
userRandomWord, // random user seed
numWords // the number of random results to return
);
// require that the requestId is unused
require(
requestToGame[requestId] == 0,
'RequestId In Use'
);
// map this request ID to the game it belongs to
requestToGame[requestId] = gameId;
// set data in house
IHouse(manager.house()).randomRequested();
// emit event
emit RandomnessRequested(gameId);
}
function _resolveRandom(uint64 requestId) internal {
// resolve request in house
IHouse(manager.house()).randomRequestResolved();
// clear storage
delete requestToGame[requestId];
}
function getGameIdFromRequest(uint64 requestId) internal view returns (uint256) {
return requestToGame[requestId];
}
function getHouse() public view returns (address) {
return manager.house();
}
function isValidGameId(uint256 gameId) public view returns (bool) {
return isUsedGameId[gameId] == false && gameId > 0;
}
function batchCallIsUsedGameId(uint256[] calldata gameIds) external view returns (bool[] memory isUsed) {
uint len = gameIds.length;
isUsed = new bool[](len);
for (uint i = 0; i < len;) {
isUsed[i] = isUsedGameId[gameIds[i]];
unchecked { ++i; }
}
}
function paginateUsedGameIDs(uint256 start, uint256 end) external view returns (uint256[] memory) {
if (end > usedGameIds.length) {
end = usedGameIds.length;
}
uint256[] memory ids = new uint256[](end - start);
for (uint i = start; i < end;) {
ids[i - start] = usedGameIds[i];
unchecked { ++i; }
}
return ids;
}
function numUsedGameIDs() external view returns (uint256) {
return usedGameIds.length;
}
function getEssentialGameInfo(uint256[] calldata gameIds) external view virtual returns (
address[] memory players,
uint256[] memory buyInAmounts,
uint256[] memory totalPayouts,
uint256[] memory timestamps,
bool[] memory hasEndeds
) {}
function batchRawGameInfo(uint256[] calldata gameIds) external view virtual returns (bytes[] memory) {}
}
contract Claimer {
address public parent;
constructor() {
// set parent to the address that deployed this contract
parent = msg.sender;
}
function claim(address claimManager) external returns (uint256) {
require(msg.sender == parent, "Only parent can call this function");
// Call the claim function on the claim manager
IClaimManager(claimManager).claim();
// get amount
uint256 amount = address(this).balance;
// transfer the balance back to the parent
(bool success, ) = payable(parent).call{value: amount}("");
require(success, "Transfer failed");
// return the amount transferred
return amount;
}
receive() external payable {}
}
interface IHouseMaxPayout {
function getMaxPayoutForGame(uint256 GAME_ID) external view returns (uint256);
}
/**
HighLow PvH Game
*/
contract HighLow is GameMasterclass {
// Push Payout
uint32 public constant PUSH_PAYOUT = 125_000;
// Guess Direction Enum
enum GuessDirection { None, Lower, Higher, Push }
// Card Payout Structure
struct CardPayout {
uint32 higher;
uint32 lower;
}
// Payouts for each card
mapping ( uint8 => CardPayout ) public cardPayouts;
// fees
uint256 public platformFee = 250;
uint256 public jackpotFee = 50;
// number of consecutive rounds for jackpot
uint256 public roundsForJackpot = 15;
// current jackpot total value
uint256 public jackpotTotal;
/** Fee Denominator */
uint256 private constant FEE_DENOM = 10_000;
struct RoundInfo {
// the current card of this round
uint8 startingCard;
// the next card dealt
uint8 nextCard;
// 0 = not yet bet, 1 = lower, 2 = higher, 3 = push
GuessDirection DIRECTION;
// the amount bet on this round
uint256 betAmount;
// the payout of this round
uint256 payout;
}
// Game Struct
struct Game {
// user playing the game
address user;
// all the rounds played in this game
RoundInfo[] rounds;
// total payout - 0 if user lost, set when user cashed out
uint256 payout;
// bet amount sub fees for each round
uint256 amountForHouse;
// true when the game is over, either by user cashing out or game ended
bool hasEnded;
// time the game was started
uint256 timestamp;
}
// return type
struct GameInfoReturnType {
uint256 initialBetAmount; // initial bet amount
uint256 payout; // total payout
address user; // user playing the game
bool hasEnded; // has the game ended
uint256 timestamp; // timestamp of the game
RoundInfo[] rounds; // all the rounds played in this game
}
// claimer
Claimer public claimer;
// mapping from GameID => Game
mapping ( uint256 => Game ) public games;
/// @notice emitted when the platform fee is changed
event SetPlatformFee(uint256 newPlatformFee);
/// @notice emitted after a game has been started at a specific table
event GameStarted(address indexed user, uint256 gameId);
/// @notice Emitted after the VRF comes back with the index of the winning player
event GameEnded(
address indexed user,
uint256 gameId,
uint256 buyIn,
uint256 payout
);
/// @notice Emitted if the fulfilRandomWords function needs to return out for any reason
event FulfilRandomFailed(uint256 requestId, uint256 gameId, uint256[] randomWords);
constructor(
// Game ID
uint256 GAME_ID_,
/** History Manager */
address history_
) GameMasterclass(GAME_ID_, history_) {
cardPayouts[2] = CardPayout({
higher: 10_600, // 1.06x
lower: 0
});
cardPayouts[3] = CardPayout({
higher: 11363, // 1.1363x
lower: 125000 // 12.5x
});
cardPayouts[4] = CardPayout({
higher: 12500, // 1.25x
lower: 62500 // 6.25x
});
cardPayouts[5] = CardPayout({
higher: 13888, // 1.3888x
lower: 41666 // 4.1666x
});
cardPayouts[6] = CardPayout({
higher: 15625, // 1.5625x
lower: 31250 // 3.125x
});
cardPayouts[7] = CardPayout({
higher: 17857, // 1.7857x
lower: 25000 // 2.5x
});
cardPayouts[8] = CardPayout({
higher: 20833, // 2.0833x
lower: 20833 // 2.0833x
});
cardPayouts[9] = CardPayout({
higher: 25000, // 2.5x
lower: 17857 // 1.7857x
});
cardPayouts[10] = CardPayout({
higher: 31250, // 3.125x
lower: 15625 // 1.5625x
});
// Jack
cardPayouts[11] = CardPayout({
higher: 41666, // 4.1666x
lower: 13888 // 1.3888x
});
// Queen
cardPayouts[12] = CardPayout({
higher: 62500, // 6.25x
lower: 12500 // 1.25x
});
// King
cardPayouts[13] = CardPayout({
higher: 125000, // 12.5x
lower: 11363 // 1.1363x
});
// Ace
cardPayouts[14] = CardPayout({
higher: 0,
lower: 10_600 // 1.06x
});
// set claimer
claimer = new Claimer();
}
function setPlatformFees(uint256 newPlatformFee) external onlyOwner {
require(
newPlatformFee <= 500,
'Cannot Exceed 5% Fee'
);
platformFee = newPlatformFee;
emit SetPlatformFee(newPlatformFee);
}
function setJackpotFee(uint256 newJackpotFee) external onlyOwner {
require(
newJackpotFee <= 150,
'Cannot Exceed 1.5% Fee'
);
jackpotFee = newJackpotFee;
}
function setRoundsForJackpot(uint256 newRoundsForJackpot) external onlyOwner {
roundsForJackpot = newRoundsForJackpot;
}
function _playGame(address player, bytes calldata gameData) internal override {
// determine vrf fee
uint256 vrfFee = getVRFFee();
// decode game data
(
uint256 gameId,
address ref,
bytes32 userRandomWord
) = abi.decode(gameData, (uint256, address, bytes32));
// validate inputs
require(
msg.value >= vrfFee,
'ERR: MIN BUY IN'
);
require(
isValidGameId(gameId) == true,
'Invalid Game ID'
);
// determine total bet amount
uint256 totalBetAmount = msg.value - vrfFee;
require(
totalBetAmount > 0,
'Invalid Bet Amount'
);
// take platform fee out of the buy in
uint256 platformFeeAmount = (totalBetAmount * platformFee) / FEE_DENOM;
// take jackpot fee out of the buy in
uint256 jackpotFeeAmount = (totalBetAmount * jackpotFee) / FEE_DENOM;
// add to jackpot total
unchecked {
jackpotTotal += jackpotFeeAmount;
}
// send to platform receiver (taking ref into account)
_processFee(platformFeeAmount, ref, player);
// pair gameId data
games[gameId].user = player;
games[gameId].hasEnded = false;
games[gameId].timestamp = block.timestamp;
games[gameId].amountForHouse = totalBetAmount - ( platformFeeAmount + jackpotFeeAmount ); // amount for house is total bet minus platform fee
games[gameId].rounds.push(RoundInfo({
startingCard: 0, // not set yet
nextCard: 0, // not set yet
DIRECTION: GuessDirection.None, // not set yet
betAmount: totalBetAmount, // set bet amount
payout: 0 // not set yet
}));
// register game Id
_registerGameId(player, gameId);
// register bet
_registerBet(player, totalBetAmount);
// emit event
emit GameStarted(player, gameId);
// fetch random number
_requestRandom(gameId, 1, userRandomWord);
}
function makeGuess(
uint256 gameId,
GuessDirection direction, // 1 = lower, 2 = higher, 3 = push
bytes32 userRandomWord
) external payable {
require(
msg.value == getVRFFee(),
'ERR: INVALID FEE AMOUNT'
);
require(
games[gameId].user == msg.sender,
'ERR: NOT YOUR GAME'
);
require(
games[gameId].hasEnded == false,
'ERR: GAME HAS ENDED'
);
require(
games[gameId].rounds.length > 0,
'ERR: NO ROUNDS PLAYED YET'
);
require(
direction == GuessDirection.Lower || direction == GuessDirection.Higher || direction == GuessDirection.Push,
'ERR: INVALID DIRECTION'
);
uint256 roundId = games[gameId].rounds.length - 1;
require(
games[gameId].rounds[roundId].DIRECTION == GuessDirection.None,
'ERR: ALREADY MADE A GUESS'
);
require(
games[gameId].rounds[roundId].startingCard != 0,
'ERR: NO STARTING CARD YET'
);
require(
games[gameId].rounds[roundId].nextCard == 0,
'Already received result'
);
if (games[gameId].rounds[roundId].startingCard == 2) {
require(direction != GuessDirection.Lower, 'Cannot Go Lower Than 2');
} else if (games[gameId].rounds[roundId].startingCard == 14) {
require(direction != GuessDirection.Higher, 'Cannot Go Higher Than Ace');
}
// save direction bet
games[gameId].rounds[roundId].DIRECTION = direction;
// if not the first round
if (roundId > 0) {
// manage bet amount -- this is the next bet officially -- use the payout of the last round
uint256 newBetAmount = games[gameId].rounds[roundId - 1].payout;
// take platform fee out of the buy in
uint256 platformFeeAmount = (newBetAmount * platformFee) / FEE_DENOM;
// take jackpot fee out of the buy in
uint256 jackpotFeeAmount = (newBetAmount * jackpotFee) / FEE_DENOM;
// add to jackpot total
unchecked {
jackpotTotal += jackpotFeeAmount;
}
// send to platform receiver
_processFee(platformFeeAmount, address(0), msg.sender);
// update round bet amount
games[gameId].rounds[roundId].betAmount = newBetAmount;
// save amount for house
games[gameId].amountForHouse = newBetAmount - (platformFeeAmount + jackpotFeeAmount);
// register bet
_registerBet(msg.sender, newBetAmount);
}
// request random number
_requestRandom(gameId, 1, userRandomWord);
}
function cashOut(uint256 gameId) external {
// check if game exists
require(
games[gameId].user == msg.sender,
'ERR: NOT YOUR GAME'
);
// check if game has ended
require(
games[gameId].hasEnded == false,
'ERR: GAME HAS ENDED'
);
require(
games[gameId].rounds.length > 1,
'Invalid Round'
);
// check if direction has been set
uint256 roundId = games[gameId].rounds.length - 2;
require(
games[gameId].rounds[roundId + 1].DIRECTION == GuessDirection.None,
'Direction already set'
);
require(
games[gameId].rounds[roundId + 1].nextCard == 0,
'Already received result'
);
// set game as ended
games[gameId].hasEnded = true;
// if the last round has a payout, we can cash out
uint256 payout = games[gameId].rounds[roundId].payout;
require(
payout > 0,
'ERR: NO PAYOUT'
);
require(
address(this).balance >= payout,
'ERR: NOT ENOUGH FUNDS TO PAYOUT'
);
// save payout
games[gameId].payout = payout;
// send payout to user
IClaimManager(manager.claimManager()).credit{value: payout}(
GAME_ID,
games[gameId].user
);
// emit event
emit GameEnded(games[gameId].user, gameId, games[gameId].rounds[0].betAmount, payout);
}
/**
Callback to provide us with randomness
*/
function fulfillRandomWords(
uint64 requestId,
uint256[] calldata randomWords
) external override onlyRNG {
// get game ID from requestId
uint256 gameId = getGameIdFromRequest(requestId);
// resolve randomness
_resolveRandom(requestId);
// fetch round ID
uint256 roundId = games[gameId].rounds.length - 1;
// if faulty ID, remove
if (gameId == 0 || games[gameId].user == address(0) || games[gameId].hasEnded == true) {
emit FulfilRandomFailed(requestId, gameId, randomWords);
return;
}
// fetch card
uint8 nextCard = uint8((randomWords[0] % 13) + 2); // 2-14
uint8 startingCard = games[gameId].rounds[roundId].startingCard;
if (roundId == 0 && startingCard == 0) {
// set initial card
games[gameId].rounds[roundId].startingCard = nextCard; // 2-14
return;
}
// ensure a starting card has been set
if (startingCard == 0 || games[gameId].rounds[roundId].DIRECTION == GuessDirection.None) {
emit FulfilRandomFailed(requestId, gameId, randomWords);
return;
}
// if we are here, we have a next card
games[gameId].rounds[roundId].nextCard = nextCard; // 2-14
// determine if the guess was correct
if (games[gameId].rounds[roundId].DIRECTION == GuessDirection.Lower) {
// lower
if (nextCard < games[gameId].rounds[roundId].startingCard) {
// correct guess
games[gameId].rounds[roundId].payout = (games[gameId].rounds[roundId].betAmount * cardPayouts[startingCard].lower) / FEE_DENOM;
}
} else if (games[gameId].rounds[roundId].DIRECTION == GuessDirection.Higher) {
// higher
if (nextCard > games[gameId].rounds[roundId].startingCard) {
// correct guess
games[gameId].rounds[roundId].payout = (games[gameId].rounds[roundId].betAmount * cardPayouts[startingCard].higher) / FEE_DENOM;
}
} else if (games[gameId].rounds[roundId].DIRECTION == GuessDirection.Push) {
// push
if (nextCard == games[gameId].rounds[roundId].startingCard) {
// correct guess
games[gameId].rounds[roundId].payout = (games[gameId].rounds[roundId].betAmount * PUSH_PAYOUT) / FEE_DENOM;
}
}
if (games[gameId].rounds[roundId].payout > 0) {
if (games[gameId].rounds[roundId].payout > games[gameId].amountForHouse) {
// get max house payout
uint256 maxPayout = IHouseMaxPayout(manager.house()).getMaxPayoutForGame(GAME_ID);
// user won, determine amount needed to payout
uint256 diff = games[gameId].rounds[roundId].payout - games[gameId].amountForHouse;
// if the payout is larger than the max payout, we need to handle it
if (diff > maxPayout) {
// determine excess
uint256 excess = diff - maxPayout;
// reduce payout by excess
games[gameId].rounds[roundId].payout -= excess;
// handle midgame payout
uint256 amountOut = _handleMidgamePayout(maxPayout);
if (amountOut < maxPayout) {
// if the amount out is less than the max payout, we need to reduce the payout
games[gameId].rounds[roundId].payout -= (maxPayout - amountOut);
}
} else {
// handle midgame payout
_handleMidgamePayout(diff);
}
}
if (roundId == (roundsForJackpot - 1)) {
// user got a portion of the jackpot, relative to his bet amount
// TODO: Change this to a more complex jackpot system with checks and minimums and maximums
uint256 jackpotAmount = getJackpotAmount(games[gameId].rounds[roundId].betAmount);
// reset jackpot total
jackpotTotal -= jackpotAmount;
// add jackpot payout to the payout
unchecked {
games[gameId].rounds[roundId].payout += jackpotAmount;
}
// set game as ended
games[gameId].hasEnded = true;
// if the last round has a payout, we can cash out
uint256 payout = games[gameId].rounds[roundId].payout;
// save payout
games[gameId].payout = payout;
// send payout to user
IClaimManager(manager.claimManager()).credit{value: payout}(
GAME_ID,
games[gameId].user
);
// emit event
emit GameEnded(games[gameId].user, gameId, games[gameId].rounds[0].betAmount, payout);
} else {
// set up for next round
games[gameId].rounds.push(RoundInfo({
startingCard: nextCard, // set next card as starting card for next round
nextCard: 0, // not set yet
DIRECTION: GuessDirection.None, // not set yet
betAmount: 0, // same bet amount as previous round
payout: 0 // not set yet
}));
}
} else {
// game is over, user lost
games[gameId].hasEnded = true;
// emit Game Ended Event
emit GameEnded(games[gameId].user, gameId, games[gameId].rounds[roundId].betAmount, 0);
// handle payout
IHouse(manager.house()).houseProfit{value: games[gameId].amountForHouse }(GAME_ID);
}
}
function _handleMidgamePayout(uint256 amount) internal returns (uint256 amountOut) {
if (amount > 0) {
// payout the rest from the house
IHouse(manager.house()).payout(GAME_ID, address(claimer), amount);
// claim from claim manager
amountOut = claimer.claim(manager.claimManager());
}
}
function getJackpotAmount(uint256 betAmount) public view returns (uint256) {
uint256 maxHousePayout = IHouseMaxPayout(manager.house()).getMaxPayoutForGame(GAME_ID);
if (betAmount >= maxHousePayout) {
return jackpotTotal;
} else {
// calculate jackpot amount relative to bet amount
return ( jackpotTotal * betAmount ) / maxHousePayout;
}
}
function getGameInfo(uint256 _gameId) public view returns (
GameInfoReturnType memory
) {
if (games[_gameId].rounds.length == 0) {
return GameInfoReturnType({
initialBetAmount: 0,
payout: 0,
user: address(0),
hasEnded: false,
timestamp: 0,
rounds: new RoundInfo[](0)
});
}
return GameInfoReturnType({
initialBetAmount: games[_gameId].rounds[0].betAmount, // first round bet amount
payout: games[_gameId].payout,
user: games[_gameId].user,
hasEnded: games[_gameId].hasEnded,
timestamp: games[_gameId].timestamp,
rounds: games[_gameId].rounds
});
}
function batchRawGameInfo(uint256[] calldata gameIds) external view override returns (bytes[] memory) {
uint len = gameIds.length;
bytes[] memory retTypes = new bytes[](len);
for (uint i = 0; i < len;) {
retTypes[i] = abi.encode(getGameInfo(gameIds[i]));
unchecked { ++i; }
}
return retTypes;
}
function getEssentialGameInfo(uint256[] calldata gameIds) external view override returns (
address[] memory players,
uint256[] memory buyInAmounts,
uint256[] memory totalPayouts,
uint256[] memory timestamps,
bool[] memory hasEndeds
) {
uint len = gameIds.length;
players = new address[](len);
buyInAmounts = new uint256[](len);
totalPayouts = new uint256[](len);
timestamps = new uint256[](len);
hasEndeds = new bool[](len);
for (uint i = 0; i < len;) {
players[i] = games[gameIds[i]].user;
uint256 rounds = games[gameIds[i]].rounds.length;
if (rounds == 0) {
buyInAmounts[i] = 0;
totalPayouts[i] = 0;
timestamps[i] = 0;
hasEndeds[i] = false;
} else {
buyInAmounts[i] = games[gameIds[i]].rounds[0].betAmount; // first round bet amount
totalPayouts[i] = games[gameIds[i]].payout; // total payout
timestamps[i] = games[gameIds[i]].timestamp; // timestamp of the game
hasEndeds[i] = games[gameIds[i]].hasEnded; // has the game ended?
}
unchecked { ++i; }
}
}
receive() external payable {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"uint256","name":"GAME_ID_","type":"uint256"},{"internalType":"address","name":"history_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gameId","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"randomWords","type":"uint256[]"}],"name":"FulfilRandomFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"gameId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"payout","type":"uint256"}],"name":"GameEnded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"gameId","type":"uint256"}],"name":"GameStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"gameId","type":"uint256"}],"name":"RandomnessRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newPlatformFee","type":"uint256"}],"name":"SetPlatformFee","type":"event"},{"inputs":[],"name":"GAME_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUSH_PAYOUT","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"gameIds","type":"uint256[]"}],"name":"batchCallIsUsedGameId","outputs":[{"internalType":"bool[]","name":"isUsed","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"gameIds","type":"uint256[]"}],"name":"batchRawGameInfo","outputs":[{"internalType":"bytes[]","name":"","type":"bytes[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"cardPayouts","outputs":[{"internalType":"uint32","name":"higher","type":"uint32"},{"internalType":"uint32","name":"lower","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gameId","type":"uint256"}],"name":"cashOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimer","outputs":[{"internalType":"contract Claimer","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"requestId","type":"uint64"},{"internalType":"uint256[]","name":"randomWords","type":"uint256[]"}],"name":"fulfillRandomWords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"games","outputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"payout","type":"uint256"},{"internalType":"uint256","name":"amountForHouse","type":"uint256"},{"internalType":"bool","name":"hasEnded","type":"bool"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"gameIds","type":"uint256[]"}],"name":"getEssentialGameInfo","outputs":[{"internalType":"address[]","name":"players","type":"address[]"},{"internalType":"uint256[]","name":"buyInAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"totalPayouts","type":"uint256[]"},{"internalType":"uint256[]","name":"timestamps","type":"uint256[]"},{"internalType":"bool[]","name":"hasEndeds","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gameId","type":"uint256"}],"name":"getGameInfo","outputs":[{"components":[{"internalType":"uint256","name":"initialBetAmount","type":"uint256"},{"internalType":"uint256","name":"payout","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"hasEnded","type":"bool"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"components":[{"internalType":"uint8","name":"startingCard","type":"uint8"},{"internalType":"uint8","name":"nextCard","type":"uint8"},{"internalType":"enum HighLow.GuessDirection","name":"DIRECTION","type":"uint8"},{"internalType":"uint256","name":"betAmount","type":"uint256"},{"internalType":"uint256","name":"payout","type":"uint256"}],"internalType":"struct HighLow.RoundInfo[]","name":"rounds","type":"tuple[]"}],"internalType":"struct HighLow.GameInfoReturnType","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHouse","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"betAmount","type":"uint256"}],"name":"getJackpotAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVRFFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"history","outputs":[{"internalType":"contract IHistoryManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gameId","type":"uint256"}],"name":"isValidGameId","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"jackpotFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"jackpotTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gameId","type":"uint256"},{"internalType":"enum HighLow.GuessDirection","name":"direction","type":"uint8"},{"internalType":"bytes32","name":"userRandomWord","type":"bytes32"}],"name":"makeGuess","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"contract IGovernanceManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numUsedGameIDs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"paginateUsedGameIDs","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"platformFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"player","type":"address"},{"internalType":"bytes","name":"gameData","type":"bytes"}],"name":"play","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"resume","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"roundsForJackpot","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newJackpotFee","type":"uint256"}],"name":"setJackpotFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPlatformFee","type":"uint256"}],"name":"setPlatformFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRoundsForJackpot","type":"uint256"}],"name":"setRoundsForJackpot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"usedGameIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60c06040526000805460ff1916905560fa6005556032600655600f60075534801561002957600080fd5b50604051615234380380615234833981016040819052610048916107f5565b81818160808181525050806001600160a01b031660a0816001600160a01b0316815250505050604051806040016040528061296863ffffffff168152602001600063ffffffff1681525060046000600260ff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff1602179055509050506040518060400160405280612c6363ffffffff1681526020016201e84863ffffffff1681525060046000600360ff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555090505060405180604001604052806130d463ffffffff16815260200161f42463ffffffff1681525060046000600460ff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff160217905550905050604051806040016040528061364063ffffffff16815260200161a2c263ffffffff1681525060046000600560ff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff1602179055509050506040518060400160405280613d0963ffffffff168152602001617a1263ffffffff1681525060046000600660ff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555090505060405180604001604052806145c163ffffffff1681526020016161a863ffffffff1681525060046000600760ff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff160217905550905050604051806040016040528061516163ffffffff16815260200161516163ffffffff1681525060046000600860ff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555090505060405180604001604052806161a863ffffffff1681526020016145c163ffffffff1681525060046000600960ff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff1602179055509050506040518060400160405280617a1263ffffffff168152602001613d0963ffffffff1681525060046000600a60ff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff160217905550905050604051806040016040528061a2c263ffffffff16815260200161364063ffffffff1681525060046000600b60ff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff160217905550905050604051806040016040528061f42463ffffffff1681526020016130d463ffffffff1681525060046000600c60ff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555090505060405180604001604052806201e84863ffffffff168152602001612c6363ffffffff1681525060046000600d60ff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff1602179055509050506040518060400160405280600063ffffffff16815260200161296863ffffffff1681525060046000600e60ff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff1602179055509050506040516107a3906107e8565b604051809103906000f0801580156107bf573d6000803e3d6000fd5b50600980546001600160a01b0319166001600160a01b0392909216919091179055506108329050565b61029780614f9d83390190565b6000806040838503121561080857600080fd5b825160208401519092506001600160a01b038116811461082757600080fd5b809150509250929050565b60805160a051614707610896600039600081816105ad0152613ef20152600081816107070152818161183e015281816120d20152818161241c015281816126fd01528181613202015281816134f50152818161392d0152613ec501526147076000f3fe6080604052600436106101fd5760003560e01c806379caee8c1161010d578063c811ad71116100a0578063e98744361161006f578063e987443614610688578063eaa182861461069e578063f0034a7e146106ca578063f8f30a79146106df578063fdcdb06b146106f557600080fd5b8063c811ad7114610620578063cb37e4b614610633578063cc81d05514610653578063d379be231461066857600080fd5b806391ea41e6116100dc57806391ea41e61461056e57806398daac831461059b5780639e281a98146105cf578063c4fd5d6d146105ef57600080fd5b806379caee8c146104ec5780637b8d38791461050c5780638456cb591461053957806389fc2c0f1461054e57600080fd5b806346d369bc116101905780634b24f3a61161015f5780634b24f3a61461044257806351e92559146104625780635c7b79f5146104925780635c975abb146104b2578063749fa03c146104cc57600080fd5b806346d369bc146103c05780634782f779146103d357806347e1d550146103f3578063481c6a751461042057600080fd5b80631ea9487b116101cc5780631ea9487b14610301578063247939e71461032157806326232a2e1461037d57806332883e7e1461039357600080fd5b8063046f7da21461020957806304e2064f14610220578063117a5b90146102525780631da709f4146102dd57600080fd5b3661020457005b600080fd5b34801561021557600080fd5b5061021e610729565b005b34801561022c57600080fd5b506102356107de565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561025e57600080fd5b506102a961026d366004613f9a565b600a60205260009081526040902080546002820154600383015460048401546005909401546001600160a01b03909316939192909160ff169085565b604080516001600160a01b03909616865260208601949094529284019190915215156060830152608082015260a001610249565b3480156102e957600080fd5b506102f360085481565b604051908152602001610249565b34801561030d57600080fd5b5061021e61031c366004613f9a565b610855565b34801561032d57600080fd5b5061036061033c366004613fb3565b60046020526000908152604090205463ffffffff8082169164010000000090041682565b6040805163ffffffff938416815292909116602083015201610249565b34801561038957600080fd5b506102f360055481565b34801561039f57600080fd5b506103b36103ae366004613fd6565b6108fa565b6040516102499190614034565b61021e6103ce366004614047565b6109be565b3480156103df57600080fd5b5061021e6103ee36600461409b565b61102c565b3480156103ff57600080fd5b5061041361040e366004613f9a565b611131565b60405161024991906140dd565b34801561042c57600080fd5b506102356000805160206146b283398151915281565b34801561044e57600080fd5b5061021e61045d366004613f9a565b611365565b34801561046e57600080fd5b5061048261047d366004613f9a565b611454565b6040519015158152602001610249565b34801561049e57600080fd5b5061021e6104ad366004613f9a565b611474565b3480156104be57600080fd5b506000546104829060ff1681565b3480156104d857600080fd5b5061021e6104e7366004614221565b61193c565b3480156104f857600080fd5b5061021e610507366004613f9a565b612774565b34801561051857600080fd5b5061052c610527366004614275565b612898565b60405161024991906142ea565b34801561054557600080fd5b5061021e612955565b34801561055a57600080fd5b506102f3610569366004613f9a565b612a04565b34801561057a57600080fd5b5061058e610589366004614275565b612a25565b6040516102499190614321565b3480156105a757600080fd5b506102357f000000000000000000000000000000000000000000000000000000000000000081565b3480156105db57600080fd5b5061021e6105ea36600461409b565b612af1565b3480156105fb57600080fd5b5061060f61060a366004614275565b612ba0565b6040516102499594939291906143a1565b61021e61062e366004614441565b612fbf565b34801561063f57600080fd5b506102f361064e366004613f9a565b613180565b34801561065f57600080fd5b506001546102f3565b34801561067457600080fd5b50600954610235906001600160a01b031681565b34801561069457600080fd5b506102f360065481565b3480156106aa57600080fd5b506106b56201e84881565b60405163ffffffff9091168152602001610249565b3480156106d657600080fd5b506102f36132b0565b3480156106eb57600080fd5b506102f360075481565b34801561070157600080fd5b506102f37f000000000000000000000000000000000000000000000000000000000000000081565b6000805160206146b28339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610775573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079991906144c6565b6001600160a01b0316336001600160a01b0316146107d25760405162461bcd60e51b81526004016107c9906144e3565b60405180910390fd5b6000805460ff19169055565b60006000805160206146b28339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561082c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061085091906144c6565b905090565b6000805160206146b28339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c591906144c6565b6001600160a01b0316336001600160a01b0316146108f55760405162461bcd60e51b81526004016107c9906144e3565b600755565b60015460609082111561090d5760015491505b6000610919848461451d565b6001600160401b0381111561093057610930614530565b604051908082528060200260200182016040528015610959578160200160208202803683370190505b509050835b838110156109b4576001818154811061097957610979614546565b9060005260206000200154828683610991919061451d565b815181106109a1576109a1614546565b602090810291909101015260010161095e565b5090505b92915050565b6109c66132b0565b3414610a145760405162461bcd60e51b815260206004820152601760248201527f4552523a20494e56414c49442046454520414d4f554e5400000000000000000060448201526064016107c9565b6000838152600a60205260409020546001600160a01b03163314610a6f5760405162461bcd60e51b81526020600482015260126024820152714552523a204e4f5420594f55522047414d4560701b60448201526064016107c9565b6000838152600a602052604090206004015460ff1615610ac75760405162461bcd60e51b81526020600482015260136024820152721154948e8811d0535148121054c81153911151606a1b60448201526064016107c9565b6000838152600a6020526040902060010154610b255760405162461bcd60e51b815260206004820152601960248201527f4552523a204e4f20524f554e445320504c41594544205945540000000000000060448201526064016107c9565b6001826003811115610b3957610b396140c7565b1480610b5657506002826003811115610b5457610b546140c7565b145b80610b7257506003826003811115610b7057610b706140c7565b145b610bb75760405162461bcd60e51b815260206004820152601660248201527522a9291d1024a72b20a624a2102224a922a1aa24a7a760511b60448201526064016107c9565b6000838152600a60205260408120600190810154610bd5919061451d565b9050600080858152600a60205260409020600101805483908110610bfb57610bfb614546565b600091825260209091206003918202015462010000900460ff1690811115610c2557610c256140c7565b14610c725760405162461bcd60e51b815260206004820152601960248201527f4552523a20414c5245414459204d41444520412047554553530000000000000060448201526064016107c9565b6000848152600a60205260409020600101805482908110610c9557610c95614546565b6000918252602082206003909102015460ff169003610cf65760405162461bcd60e51b815260206004820152601960248201527f4552523a204e4f205354415254494e472043415244205945540000000000000060448201526064016107c9565b6000848152600a60205260409020600101805482908110610d1957610d19614546565b6000918252602090912060039091020154610100900460ff1615610d795760405162461bcd60e51b8152602060048201526017602482015276105b1c9958591e481c9958d95a5d9959081c995cdd5b1d604a1b60448201526064016107c9565b6000848152600a60205260409020600101805482908110610d9c57610d9c614546565b600091825260209091206003909102015460ff16600203610e16576001836003811115610dcb57610dcb6140c7565b03610e115760405162461bcd60e51b815260206004820152601660248201527521b0b73737ba1023b7902637bbb2b9102a3430b7101960511b60448201526064016107c9565b610eb5565b6000848152600a60205260409020600101805482908110610e3957610e39614546565b600091825260209091206003909102015460ff16600e03610eb5576002836003811115610e6857610e686140c7565b03610eb55760405162461bcd60e51b815260206004820152601960248201527f43616e6e6f7420476f20486967686572205468616e204163650000000000000060448201526064016107c9565b6000848152600a60205260409020600101805484919083908110610edb57610edb614546565b906000526020600020906003020160000160026101000a81548160ff02191690836003811115610f0d57610f0d6140c7565b0217905550801561101a576000848152600a60205260408120600190810190610f36908461451d565b81548110610f4657610f46614546565b9060005260206000209060030201600201549050600061271060055483610f6d919061455c565b610f779190614589565b9050600061271060065484610f8c919061455c565b610f969190614589565b60088054820190559050610fac82600033613383565b6000878152600a60205260409020600101805484919086908110610fd257610fd2614546565b6000918252602090912060016003909202010155610ff0818361459d565b610ffa908461451d565b6000888152600a6020526040902060030155611016338461345f565b5050505b6110268460018461355d565b50505050565b6000805160206146b28339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611078573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109c91906144c6565b6001600160a01b0316336001600160a01b0316146110cc5760405162461bcd60e51b81526004016107c9906144e3565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611119576040519150601f19603f3d011682016040523d82523d6000602084013e61111e565b606091505b505090508061112c57600080fd5b505050565b6111756040518060c00160405280600081526020016000815260200160006001600160a01b0316815260200160001515815260200160008152602001606081525090565b6000828152600a6020526040812060010154900361121d576040805160c0810182526000808252602080830182905282840182905260608301829052608083018290528351828152908101909352909160a0830191611214565b6112016040805160a0810182526000808252602082018190529091820190815260200160008152602001600081525090565b8152602001906001900390816111cf5790505b50905292915050565b6040805160c0810182526000848152600a60205291822060010180549192839261124957611249614546565b6000918252602080832060016003909302018201548452868352600a808252604080852060028101548785015280546001600160a01b031682880152600481015460ff1615156060880152600581015460808801528986529183529201805483518184028101840190945280845260a090950194929390929184015b828210156113595760008481526020908190206040805160a0810182526003808702909301805460ff808216845261010082048116968401969096529194909392850192620100009092041690811115611321576113216140c7565b6003811115611332576113326140c7565b815260200160018201548152602001600282015481525050815260200190600101906112c5565b50505091525092915050565b6000805160206146b28339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d591906144c6565b6001600160a01b0316336001600160a01b0316146114055760405162461bcd60e51b81526004016107c9906144e3565b609681111561144f5760405162461bcd60e51b815260206004820152601660248201527543616e6e6f742045786365656420312e35252046656560501b60448201526064016107c9565b600655565b60008181526002602052604081205460ff161580156109b8575050151590565b6000818152600a60205260409020546001600160a01b031633146114cf5760405162461bcd60e51b81526020600482015260126024820152714552523a204e4f5420594f55522047414d4560701b60448201526064016107c9565b6000818152600a602052604090206004015460ff16156115275760405162461bcd60e51b81526020600482015260136024820152721154948e8811d0535148121054c81153911151606a1b60448201526064016107c9565b6000818152600a60205260409020600190810154116115785760405162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a5908149bdd5b99609a1b60448201526064016107c9565b6000818152600a60205260408120600101546115969060029061451d565b9050600080838152600a602052604090206001908101906115b890849061459d565b815481106115c8576115c8614546565b600091825260209091206003918202015462010000900460ff16908111156115f2576115f26140c7565b146116375760405162461bcd60e51b8152602060048201526015602482015274111a5c9958dd1a5bdb88185b1c9958591e481cd95d605a1b60448201526064016107c9565b6000828152600a6020526040902060019081019061165690839061459d565b8154811061166657611666614546565b6000918252602090912060039091020154610100900460ff16156116c65760405162461bcd60e51b8152602060048201526017602482015276105b1c9958591e481c9958d95a5d9959081c995cdd5b1d604a1b60448201526064016107c9565b6000828152600a6020526040812060048101805460ff19166001908117909155018054839081106116f9576116f9614546565b90600052602060002090600302016002015490506000811161174e5760405162461bcd60e51b815260206004820152600e60248201526d1154948e881393c814105653d55560921b60448201526064016107c9565b8047101561179e5760405162461bcd60e51b815260206004820152601f60248201527f4552523a204e4f5420454e4f5547482046554e445320544f205041594f55540060448201526064016107c9565b6000838152600a6020908152604091829020600201839055815163a9a36dcd60e01b815291516000805160206146b28339815191529263a9a36dcd9260048083019391928290030181865afa1580156117fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181f91906144c6565b6000848152600a6020526040908190205490516304ff60cf60e51b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b039182166024820152911690639fec19e09083906044016000604051808303818588803b15801561189957600080fd5b505af11580156118ad573d6000803e3d6000fd5b5050506000858152600a602052604081208054600190910180546001600160a01b0390921694507fc542d3f545425a3b913c4056355fd70bae2039ab35205203499d8bfd03c01ae893508792909161190757611907614546565b6000918252602091829020600160039092020101546040805193845291830152810184905260600160405180910390a2505050565b6000805160206146b28339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa158015611988573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ac91906144c6565b6001600160a01b0316336001600160a01b031614611a005760405162461bcd60e51b815260206004820152601160248201527013db9b1e48149391c810dbdb9d1c9858dd607a1b60448201526064016107c9565b6001600160401b038316600090815260036020526040902054611a22846137c7565b6000818152600a60205260408120600190810154611a40919061451d565b9050811580611a6457506000828152600a60205260409020546001600160a01b0316155b80611a8557506000828152600a602052604090206004015460ff1615156001145b15611ace577f2acb79a40a39601d6c546f6db7b37fd1018c0401f5f5e07754bff874ce6ac8a585838686604051611abf94939291906145b0565b60405180910390a15050505050565b6000600d85856000818110611ae557611ae5614546565b90506020020135611af69190614602565b611b0190600261459d565b6000848152600a602052604081206001018054929350909184908110611b2957611b29614546565b600091825260209091206003909102015460ff16905082158015611b4e575060ff8116155b15611ba4576000848152600a60205260409020600101805483919085908110611b7957611b79614546565b60009182526020909120600390910201805460ff191660ff9290921691909117905550505050505050565b60ff81161580611bfe57506000848152600a60205260408120600101805485908110611bd257611bd2614546565b600091825260209091206003918202015462010000900460ff1690811115611bfc57611bfc6140c7565b145b15611c49577f2acb79a40a39601d6c546f6db7b37fd1018c0401f5f5e07754bff874ce6ac8a587858888604051611c3894939291906145b0565b60405180910390a150505050505050565b6000848152600a60205260409020600101805483919085908110611c6f57611c6f614546565b60009182526020909120600390910201805460ff929092166101000261ff001990921691909117905560016000858152600a60205260409020600101805485908110611cbd57611cbd614546565b600091825260209091206003918202015462010000900460ff1690811115611ce757611ce76140c7565b03611ddc576000848152600a60205260409020600101805484908110611d0f57611d0f614546565b600091825260209091206003909102015460ff9081169083161015611dd75760ff8116600090815260046020908152604080832054878452600a909252909120600101805461271092640100000000900463ffffffff16919086908110611d7857611d78614546565b906000526020600020906003020160010154611d94919061455c565b611d9e9190614589565b6000858152600a60205260409020600101805485908110611dc157611dc1614546565b9060005260206000209060030201600201819055505b611fd4565b60026000858152600a60205260409020600101805485908110611e0157611e01614546565b600091825260209091206003918202015462010000900460ff1690811115611e2b57611e2b6140c7565b03611eb4576000848152600a60205260409020600101805484908110611e5357611e53614546565b600091825260209091206003909102015460ff9081169083161115611dd75760ff8116600090815260046020908152604080832054878452600a90925290912060010180546127109263ffffffff16919086908110611d7857611d78614546565b60036000858152600a60205260409020600101805485908110611ed957611ed9614546565b600091825260209091206003918202015462010000900460ff1690811115611f0357611f036140c7565b03611fd4576000848152600a60205260409020600101805484908110611f2b57611f2b614546565b600091825260209091206003909102015460ff90811690831603611fd4576000848152600a602052604090206001018054612710916201e8489186908110611f7557611f75614546565b906000526020600020906003020160010154611f91919061455c565b611f9b9190614589565b6000858152600a60205260409020600101805485908110611fbe57611fbe614546565b9060005260206000209060030201600201819055505b6000848152600a60205260408120600101805485908110611ff757611ff7614546565b90600052602060002090600302016002015411156125d5576000848152600a602052604090206003810154600190910180548590811061203957612039614546565b906000526020600020906003020160020154111561227c5760006000805160206146b28339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561209f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c391906144c6565b604051630102fbc160e21b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b03919091169063040bef0490602401602060405180830381865afa158015612129573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061214d9190614616565b6000868152600a6020526040812060038101546001909101805493945091929091908790811061217f5761217f614546565b90600052602060002090600302016002015461219b919061451d565b90508181111561226e5760006121b1838361451d565b6000888152600a6020526040902060010180549192508291889081106121d9576121d9614546565b906000526020600020906003020160020160008282546121f9919061451d565b909155506000905061220a846138a3565b9050838110156122675761221e818561451d565b6000898152600a6020526040902060010180548990811061224157612241614546565b90600052602060002090600302016002016000828254612261919061451d565b90915550505b5050612279565b612277816138a3565b505b50505b600160075461228b919061451d565b830361251c576000848152600a6020526040812060010180546122d09190869081106122b9576122b9614546565b906000526020600020906003020160010154613180565b905080600860008282546122e4919061451d565b90915550506000858152600a6020526040902060010180548291908690811061230f5761230f614546565b600091825260208083206002600390930201919091018054909301909255868152600a9091526040812060048101805460ff191660019081179091550180548690811061235e5761235e614546565b906000526020600020906003020160020154905080600a6000888152602001908152602001600020600201819055506000805160206146b28339815191526001600160a01b031663a9a36dcd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123fd91906144c6565b6000878152600a6020526040908190205490516304ff60cf60e51b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b039182166024820152911690639fec19e09083906044016000604051808303818588803b15801561247757600080fd5b505af115801561248b573d6000803e3d6000fd5b5050506000888152600a602052604081208054600190910180546001600160a01b0390921694507fc542d3f545425a3b913c4056355fd70bae2039ab35205203499d8bfd03c01ae893508a9290916124e5576124e5614546565b6000918252602091829020600160039092020101546040805193845291830152810184905260600160405180910390a2505061276b565b6000848152600a60209081526040808320815160a08101835260ff87811682528185018681529382018681526060830187905260808301879052600193840180549485018155875294909520815160039384029091018054945187166101000261ffff199095169190961617929092178085559251919392839162ff00001990911690620100009084908111156125b5576125b56140c7565b02179055506060820151816001015560808201518160020155505061276b565b6000848152600a6020526040902060048101805460ff191660019081179091558154910180546001600160a01b03909216917fc542d3f545425a3b913c4056355fd70bae2039ab35205203499d8bfd03c01ae89187918790811061263b5761263b614546565b6000918252602080832060016003909302019190910154604080519485529184015282015260600160405180910390a26000805160206146b28339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126db91906144c6565b6000858152600a6020526040908190206003015490516359e5b78d60e11b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b03929092169163b3cb6f1a91906024016000604051808303818588803b15801561275157600080fd5b505af1158015612765573d6000803e3d6000fd5b50505050505b50505050505050565b6000805160206146b28339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e491906144c6565b6001600160a01b0316336001600160a01b0316146128145760405162461bcd60e51b81526004016107c9906144e3565b6101f481111561285d5760405162461bcd60e51b815260206004820152601460248201527343616e6e6f74204578636565642035252046656560601b60448201526064016107c9565b60058190556040518181527f05fd392cc4f8fe360ff8b094f628b1c29b9000441290e2f8a597c12d5379b06d9060200160405180910390a150565b606081806001600160401b038111156128b3576128b3614530565b6040519080825280602002602001820160405280156128dc578160200160208202803683370190505b50915060005b8181101561294d576002600086868481811061290057612900614546565b90506020020135815260200190815260200160002060009054906101000a900460ff1683828151811061293557612935614546565b911515602092830291909101909101526001016128e2565b505092915050565b6000805160206146b28339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129c591906144c6565b6001600160a01b0316336001600160a01b0316146129f55760405162461bcd60e51b81526004016107c9906144e3565b6000805460ff19166001179055565b60018181548110612a1457600080fd5b600091825260209091200154905081565b6060816000816001600160401b03811115612a4257612a42614530565b604051908082528060200260200182016040528015612a7557816020015b6060815260200190600190039081612a605790505b50905060005b82811015612ae857612aa4868683818110612a9857612a98614546565b90506020020135611131565b604051602001612ab491906140dd565b604051602081830303815290604052828281518110612ad557612ad5614546565b6020908102919091010152600101612a7b565b50949350505050565b6000805160206146b28339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b6191906144c6565b6001600160a01b0316336001600160a01b031614612b915760405162461bcd60e51b81526004016107c9906144e3565b612b9c823383613aa9565b5050565b60608080808085806001600160401b03811115612bbf57612bbf614530565b604051908082528060200260200182016040528015612be8578160200160208202803683370190505b509550806001600160401b03811115612c0357612c03614530565b604051908082528060200260200182016040528015612c2c578160200160208202803683370190505b509450806001600160401b03811115612c4757612c47614530565b604051908082528060200260200182016040528015612c70578160200160208202803683370190505b509350806001600160401b03811115612c8b57612c8b614530565b604051908082528060200260200182016040528015612cb4578160200160208202803683370190505b509250806001600160401b03811115612ccf57612ccf614530565b604051908082528060200260200182016040528015612cf8578160200160208202803683370190505b50915060005b81811015612fb357600a60008a8a84818110612d1c57612d1c614546565b90506020020135815260200190815260200160002060000160009054906101000a90046001600160a01b0316878281518110612d5a57612d5a614546565b60200260200101906001600160a01b031690816001600160a01b0316815250506000600a60008b8b85818110612d9257612d92614546565b90506020020135815260200190815260200160002060010180549050905080600003612e41576000878381518110612dcc57612dcc614546565b6020026020010181815250506000868381518110612dec57612dec614546565b6020026020010181815250506000858381518110612e0c57612e0c614546565b6020026020010181815250506000848381518110612e2c57612e2c614546565b91151560209283029190910190910152612faa565b600a60008b8b85818110612e5757612e57614546565b905060200201358152602001908152602001600020600101600081548110612e8157612e81614546565b906000526020600020906003020160010154878381518110612ea557612ea5614546565b602002602001018181525050600a60008b8b85818110612ec757612ec7614546565b90506020020135815260200190815260200160002060020154868381518110612ef257612ef2614546565b602002602001018181525050600a60008b8b85818110612f1457612f14614546565b90506020020135815260200190815260200160002060050154858381518110612f3f57612f3f614546565b602002602001018181525050600a60008b8b85818110612f6157612f61614546565b90506020020135815260200190815260200160002060040160009054906101000a900460ff16848381518110612f9957612f99614546565b911515602092830291909101909101525b50600101612cfe565b50509295509295909350565b826001600160a01b038116331461308957604051636d6d50a160e11b81523360048201526000805160206146b28339815191529063dadaa14290602401602060405180830381865afa158015613019573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061303d919061462f565b6130895760405162461bcd60e51b815260206004820152601f60248201527f556e417574686f72697a656420546f20506c617920466f72204f74686572730060448201526064016107c9565b6000805160206146b28339815191526001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130f9919061462f565b156131395760405162461bcd60e51b815260206004820152601060248201526f105b1b0811d85b595cc814185d5cd95960821b60448201526064016107c9565b60005460ff16156131755760405162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b60448201526064016107c9565b611026848484613bda565b6000806000805160206146b28339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131f391906144c6565b604051630102fbc160e21b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b03919091169063040bef0490602401602060405180830381865afa158015613259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061327d9190614616565b9050808310613290575050600854919050565b808360085461329f919061455c565b6132a99190614589565b9392505050565b60006000805160206146b28339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156132fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061332291906144c6565b6001600160a01b031663ced72f876040518163ffffffff1660e01b8152600401602060405180830381865afa15801561335f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108509190614616565b6000805160206146b28339815191526001600160a01b031663b3f006746040518163ffffffff1660e01b8152600401602060405180830381865afa1580156133cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133f391906144c6565b60405163bc5101e560e01b81526001600160a01b0384811660048301528381166024830152919091169063bc5101e59085906044016000604051808303818588803b15801561344157600080fd5b505af1158015613455573d6000803e3d6000fd5b5050505050505050565b6000805160206146b28339815191526001600160a01b031663846c43986040518163ffffffff1660e01b8152600401602060405180830381865afa1580156134ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134cf91906144c6565b60405163759ecdf560e11b81526001600160a01b038481166004830152602482018490527f00000000000000000000000000000000000000000000000000000000000000006044830152919091169063eb3d9bea90606401600060405180830381600087803b15801561354157600080fd5b505af1158015613555573d6000803e3d6000fd5b505050505050565b60006000805160206146b28339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156135ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135cf91906144c6565b6001600160a01b03166397cca7af6135e56132b0565b6040516001600160e01b031960e084901b1681526004810186905260ff8716602482015260440160206040518083038185885af115801561362a573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061364f9190614651565b6001600160401b038116600090815260036020526040902054909150156136ab5760405162461bcd60e51b815260206004820152601060248201526f52657175657374496420496e2055736560801b60448201526064016107c9565b6001600160401b038116600090815260036020908152604091829020869055815160016264c53160e01b0319815291516000805160206146b28339815191529263ff9b3acf9260048083019391928290030181865afa158015613712573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061373691906144c6565b6001600160a01b0316638d7fe4786040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561377057600080fd5b505af1158015613784573d6000803e3d6000fd5b505050507f9ac10fb18c93d33ad7b0a941897aef048d0f8d30756684e82b4552ba12764d45846040516137b991815260200190565b60405180910390a150505050565b6000805160206146b28339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613813573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061383791906144c6565b6001600160a01b0316638b3939f26040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561387157600080fd5b505af1158015613885573d6000803e3d6000fd5b505050506001600160401b0316600090815260036020526040812055565b60008115613aa4576000805160206146b28339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156138f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061391b91906144c6565b60095460405163ae2f5d9360e01b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b0391821660248201526044810185905291169063ae2f5d9390606401600060405180830381600087803b15801561398e57600080fd5b505af11580156139a2573d6000803e3d6000fd5b50505050600960009054906101000a90046001600160a01b03166001600160a01b0316631e83409a6000805160206146b28339815191526001600160a01b031663a9a36dcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a3a91906144c6565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526024016020604051808303816000875af1158015613a80573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b89190614616565b919050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691613b05919061466e565b6000604051808303816000865af19150503d8060008114613b42576040519150601f19603f3d011682016040523d82523d6000602084013e613b47565b606091505b5091509150818015613b71575080511580613b71575080806020019051810190613b71919061462f565b613bd35760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b60648201526084016107c9565b5050505050565b6000613be46132b0565b905060008080613bf68587018761468a565b92509250925083341015613c3e5760405162461bcd60e51b815260206004820152600f60248201526e22a9291d1026a4a710212aac9024a760891b60448201526064016107c9565b613c4783611454565b1515600114613c8a5760405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a590811d85b59481251608a1b60448201526064016107c9565b6000613c96853461451d565b905060008111613cdd5760405162461bcd60e51b8152602060048201526012602482015271125b9d985b1a590810995d08105b5bdd5b9d60721b60448201526064016107c9565b600061271060055483613cf0919061455c565b613cfa9190614589565b9050600061271060065484613d0f919061455c565b613d199190614589565b60088054820190559050613d2e82868c613383565b6000868152600a6020526040902080546001600160a01b0319166001600160a01b038c1617815560048101805460ff1916905542600590910155613d72818361459d565b613d7c908461451d565b6000878152600a60209081526040808320600380820195909555815160a081018352848152808401858152928101858152606082018a9052608082018690526001928301805493840181558652939094208451918602018054925160ff9081166101000261ffff199094169216919091179190911780825591519293909291839162ff0000199091169062010000908490811115613e1c57613e1c6140c7565b021790555060608201518160010155608082015181600201555050613e418a87613ea6565b613e4b8a8461345f565b896001600160a01b03167fea32a03505fd9f04d664676d72295a86c5fb0465e69654751907ca305bc1d1c787604051613e8691815260200190565b60405180910390a2613e9a8660018661355d565b50505050505050505050565b604051639a4918c160e01b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000006024830152604482018390527f00000000000000000000000000000000000000000000000000000000000000001690639a4918c190606401600060405180830381600087803b158015613f3657600080fd5b505af1158015613f4a573d6000803e3d6000fd5b50506001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601849055600093845260026020526040909320805460ff1916909317909255505050565b600060208284031215613fac57600080fd5b5035919050565b600060208284031215613fc557600080fd5b813560ff811681146132a957600080fd5b60008060408385031215613fe957600080fd5b50508035926020909101359150565b600081518084526020840193506020830160005b8281101561402a57815186526020958601959091019060010161400c565b5093949350505050565b6020815260006132a96020830184613ff8565b60008060006060848603121561405c57600080fd5b8335925060208401356004811061407257600080fd5b929592945050506040919091013590565b6001600160a01b038116811461409857600080fd5b50565b600080604083850312156140ae57600080fd5b82356140b981614083565b946020939093013593505050565b634e487b7160e01b600052602160045260246000fd5b60208152600060e08201835160208401526020840151604084015260018060a01b036040850151166060840152606084015115156080840152608084015160a084015260a084015160c08085015281815180845261010086019150602083019350600092505b808310156141b757835160ff815116835260ff602082015116602084015260408101516004811061418457634e487b7160e01b600052602160045260246000fd5b8060408501525060608101516060840152608081015160808401525060a082019150602084019350600183019250614143565b5095945050505050565b6001600160401b038116811461409857600080fd5b60008083601f8401126141e857600080fd5b5081356001600160401b038111156141ff57600080fd5b6020830191508360208260051b850101111561421a57600080fd5b9250929050565b60008060006040848603121561423657600080fd5b8335614241816141c1565b925060208401356001600160401b0381111561425c57600080fd5b614268868287016141d6565b9497909650939450505050565b6000806020838503121561428857600080fd5b82356001600160401b0381111561429e57600080fd5b6142aa858286016141d6565b90969095509350505050565b600081518084526020840193506020830160005b8281101561402a57815115158652602095860195909101906001016142ca565b6020815260006132a960208301846142b6565b60005b83811015614318578181015183820152602001614300565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561439557603f19878603018452815180518087526143728160208901602085016142fd565b601f01601f19169590950160209081019550938401939190910190600101614349565b50929695505050505050565b60a08082528651908201819052600090602088019060c0840190835b818110156143e45783516001600160a01b03168352602093840193909201916001016143bd565b505083810360208501526143f88189613ff8565b915050828103604084015261440d8187613ff8565b905082810360608401526144218186613ff8565b9050828103608084015261443581856142b6565b98975050505050505050565b60008060006040848603121561445657600080fd5b833561446181614083565b925060208401356001600160401b0381111561447c57600080fd5b8401601f8101861361448d57600080fd5b80356001600160401b038111156144a357600080fd5b8660208284010111156144b557600080fd5b939660209190910195509293505050565b6000602082840312156144d857600080fd5b81516132a981614083565b6020808252600a908201526927b7363c9027bbb732b960b11b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b818103818111156109b8576109b8614507565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b80820281158282048414176109b8576109b8614507565b634e487b7160e01b600052601260045260246000fd5b60008261459857614598614573565b500490565b808201808211156109b8576109b8614507565b6001600160401b038516815260208101849052606060408201819052810182905260006001600160fb1b038311156145e757600080fd5b8260051b808560808501379190910160800195945050505050565b60008261461157614611614573565b500690565b60006020828403121561462857600080fd5b5051919050565b60006020828403121561464157600080fd5b815180151581146132a957600080fd5b60006020828403121561466357600080fd5b81516132a9816141c1565b600082516146808184602087016142fd565b9190910192915050565b60008060006060848603121561469f57600080fd5b8335925060208401356140728161408356fe0000000000000000000000008632f22e5a921c751cfbbff92f058a3b11e96b8aa2646970667358221220c89e4ac6727b7a3b3636ca3648815b8fd45a93c1d556174a1de9420379ba151964736f6c634300081c00336080604052348015600f57600080fd5b50600080546001600160a01b03191633179055610266806100316000396000f3fe60806040526004361061002d5760003560e01c80631e83409a1461003957806360f96a8f1461006c57600080fd5b3661003457005b600080fd5b34801561004557600080fd5b50610059610054366004610200565b6100a4565b6040519081526020015b60405180910390f35b34801561007857600080fd5b5060005461008c906001600160a01b031681565b6040516001600160a01b039091168152602001610063565b600080546001600160a01b0316331461010f5760405162461bcd60e51b815260206004820152602260248201527f4f6e6c7920706172656e742063616e2063616c6c20746869732066756e63746960448201526137b760f11b60648201526084015b60405180910390fd5b816001600160a01b0316634e71d92d6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561014a57600080fd5b505af115801561015e573d6000803e3d6000fd5b5050600080546040514794509192506001600160a01b03169083908381818185875af1925050503d80600081146101b1576040519150601f19603f3d011682016040523d82523d6000602084013e6101b6565b606091505b50509050806101f95760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610106565b5092915050565b60006020828403121561021257600080fd5b81356001600160a01b038116811461022957600080fd5b939250505056fea264697066735822122018624476a6721dc7d7cd3622d89d7486429f953f6ab06d1bdff0137bf2f166d964736f6c634300081c00330000000000000000000000000000000000000000000000000000000000000007000000000000000000000000fa296156dac165af92f7fdb012b61a874670e1aa
Deployed Bytecode
0x6080604052600436106101fd5760003560e01c806379caee8c1161010d578063c811ad71116100a0578063e98744361161006f578063e987443614610688578063eaa182861461069e578063f0034a7e146106ca578063f8f30a79146106df578063fdcdb06b146106f557600080fd5b8063c811ad7114610620578063cb37e4b614610633578063cc81d05514610653578063d379be231461066857600080fd5b806391ea41e6116100dc57806391ea41e61461056e57806398daac831461059b5780639e281a98146105cf578063c4fd5d6d146105ef57600080fd5b806379caee8c146104ec5780637b8d38791461050c5780638456cb591461053957806389fc2c0f1461054e57600080fd5b806346d369bc116101905780634b24f3a61161015f5780634b24f3a61461044257806351e92559146104625780635c7b79f5146104925780635c975abb146104b2578063749fa03c146104cc57600080fd5b806346d369bc146103c05780634782f779146103d357806347e1d550146103f3578063481c6a751461042057600080fd5b80631ea9487b116101cc5780631ea9487b14610301578063247939e71461032157806326232a2e1461037d57806332883e7e1461039357600080fd5b8063046f7da21461020957806304e2064f14610220578063117a5b90146102525780631da709f4146102dd57600080fd5b3661020457005b600080fd5b34801561021557600080fd5b5061021e610729565b005b34801561022c57600080fd5b506102356107de565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561025e57600080fd5b506102a961026d366004613f9a565b600a60205260009081526040902080546002820154600383015460048401546005909401546001600160a01b03909316939192909160ff169085565b604080516001600160a01b03909616865260208601949094529284019190915215156060830152608082015260a001610249565b3480156102e957600080fd5b506102f360085481565b604051908152602001610249565b34801561030d57600080fd5b5061021e61031c366004613f9a565b610855565b34801561032d57600080fd5b5061036061033c366004613fb3565b60046020526000908152604090205463ffffffff8082169164010000000090041682565b6040805163ffffffff938416815292909116602083015201610249565b34801561038957600080fd5b506102f360055481565b34801561039f57600080fd5b506103b36103ae366004613fd6565b6108fa565b6040516102499190614034565b61021e6103ce366004614047565b6109be565b3480156103df57600080fd5b5061021e6103ee36600461409b565b61102c565b3480156103ff57600080fd5b5061041361040e366004613f9a565b611131565b60405161024991906140dd565b34801561042c57600080fd5b506102356000805160206146b283398151915281565b34801561044e57600080fd5b5061021e61045d366004613f9a565b611365565b34801561046e57600080fd5b5061048261047d366004613f9a565b611454565b6040519015158152602001610249565b34801561049e57600080fd5b5061021e6104ad366004613f9a565b611474565b3480156104be57600080fd5b506000546104829060ff1681565b3480156104d857600080fd5b5061021e6104e7366004614221565b61193c565b3480156104f857600080fd5b5061021e610507366004613f9a565b612774565b34801561051857600080fd5b5061052c610527366004614275565b612898565b60405161024991906142ea565b34801561054557600080fd5b5061021e612955565b34801561055a57600080fd5b506102f3610569366004613f9a565b612a04565b34801561057a57600080fd5b5061058e610589366004614275565b612a25565b6040516102499190614321565b3480156105a757600080fd5b506102357f000000000000000000000000fa296156dac165af92f7fdb012b61a874670e1aa81565b3480156105db57600080fd5b5061021e6105ea36600461409b565b612af1565b3480156105fb57600080fd5b5061060f61060a366004614275565b612ba0565b6040516102499594939291906143a1565b61021e61062e366004614441565b612fbf565b34801561063f57600080fd5b506102f361064e366004613f9a565b613180565b34801561065f57600080fd5b506001546102f3565b34801561067457600080fd5b50600954610235906001600160a01b031681565b34801561069457600080fd5b506102f360065481565b3480156106aa57600080fd5b506106b56201e84881565b60405163ffffffff9091168152602001610249565b3480156106d657600080fd5b506102f36132b0565b3480156106eb57600080fd5b506102f360075481565b34801561070157600080fd5b506102f37f000000000000000000000000000000000000000000000000000000000000000781565b6000805160206146b28339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610775573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079991906144c6565b6001600160a01b0316336001600160a01b0316146107d25760405162461bcd60e51b81526004016107c9906144e3565b60405180910390fd5b6000805460ff19169055565b60006000805160206146b28339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561082c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061085091906144c6565b905090565b6000805160206146b28339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c591906144c6565b6001600160a01b0316336001600160a01b0316146108f55760405162461bcd60e51b81526004016107c9906144e3565b600755565b60015460609082111561090d5760015491505b6000610919848461451d565b6001600160401b0381111561093057610930614530565b604051908082528060200260200182016040528015610959578160200160208202803683370190505b509050835b838110156109b4576001818154811061097957610979614546565b9060005260206000200154828683610991919061451d565b815181106109a1576109a1614546565b602090810291909101015260010161095e565b5090505b92915050565b6109c66132b0565b3414610a145760405162461bcd60e51b815260206004820152601760248201527f4552523a20494e56414c49442046454520414d4f554e5400000000000000000060448201526064016107c9565b6000838152600a60205260409020546001600160a01b03163314610a6f5760405162461bcd60e51b81526020600482015260126024820152714552523a204e4f5420594f55522047414d4560701b60448201526064016107c9565b6000838152600a602052604090206004015460ff1615610ac75760405162461bcd60e51b81526020600482015260136024820152721154948e8811d0535148121054c81153911151606a1b60448201526064016107c9565b6000838152600a6020526040902060010154610b255760405162461bcd60e51b815260206004820152601960248201527f4552523a204e4f20524f554e445320504c41594544205945540000000000000060448201526064016107c9565b6001826003811115610b3957610b396140c7565b1480610b5657506002826003811115610b5457610b546140c7565b145b80610b7257506003826003811115610b7057610b706140c7565b145b610bb75760405162461bcd60e51b815260206004820152601660248201527522a9291d1024a72b20a624a2102224a922a1aa24a7a760511b60448201526064016107c9565b6000838152600a60205260408120600190810154610bd5919061451d565b9050600080858152600a60205260409020600101805483908110610bfb57610bfb614546565b600091825260209091206003918202015462010000900460ff1690811115610c2557610c256140c7565b14610c725760405162461bcd60e51b815260206004820152601960248201527f4552523a20414c5245414459204d41444520412047554553530000000000000060448201526064016107c9565b6000848152600a60205260409020600101805482908110610c9557610c95614546565b6000918252602082206003909102015460ff169003610cf65760405162461bcd60e51b815260206004820152601960248201527f4552523a204e4f205354415254494e472043415244205945540000000000000060448201526064016107c9565b6000848152600a60205260409020600101805482908110610d1957610d19614546565b6000918252602090912060039091020154610100900460ff1615610d795760405162461bcd60e51b8152602060048201526017602482015276105b1c9958591e481c9958d95a5d9959081c995cdd5b1d604a1b60448201526064016107c9565b6000848152600a60205260409020600101805482908110610d9c57610d9c614546565b600091825260209091206003909102015460ff16600203610e16576001836003811115610dcb57610dcb6140c7565b03610e115760405162461bcd60e51b815260206004820152601660248201527521b0b73737ba1023b7902637bbb2b9102a3430b7101960511b60448201526064016107c9565b610eb5565b6000848152600a60205260409020600101805482908110610e3957610e39614546565b600091825260209091206003909102015460ff16600e03610eb5576002836003811115610e6857610e686140c7565b03610eb55760405162461bcd60e51b815260206004820152601960248201527f43616e6e6f7420476f20486967686572205468616e204163650000000000000060448201526064016107c9565b6000848152600a60205260409020600101805484919083908110610edb57610edb614546565b906000526020600020906003020160000160026101000a81548160ff02191690836003811115610f0d57610f0d6140c7565b0217905550801561101a576000848152600a60205260408120600190810190610f36908461451d565b81548110610f4657610f46614546565b9060005260206000209060030201600201549050600061271060055483610f6d919061455c565b610f779190614589565b9050600061271060065484610f8c919061455c565b610f969190614589565b60088054820190559050610fac82600033613383565b6000878152600a60205260409020600101805484919086908110610fd257610fd2614546565b6000918252602090912060016003909202010155610ff0818361459d565b610ffa908461451d565b6000888152600a6020526040902060030155611016338461345f565b5050505b6110268460018461355d565b50505050565b6000805160206146b28339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611078573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109c91906144c6565b6001600160a01b0316336001600160a01b0316146110cc5760405162461bcd60e51b81526004016107c9906144e3565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611119576040519150601f19603f3d011682016040523d82523d6000602084013e61111e565b606091505b505090508061112c57600080fd5b505050565b6111756040518060c00160405280600081526020016000815260200160006001600160a01b0316815260200160001515815260200160008152602001606081525090565b6000828152600a6020526040812060010154900361121d576040805160c0810182526000808252602080830182905282840182905260608301829052608083018290528351828152908101909352909160a0830191611214565b6112016040805160a0810182526000808252602082018190529091820190815260200160008152602001600081525090565b8152602001906001900390816111cf5790505b50905292915050565b6040805160c0810182526000848152600a60205291822060010180549192839261124957611249614546565b6000918252602080832060016003909302018201548452868352600a808252604080852060028101548785015280546001600160a01b031682880152600481015460ff1615156060880152600581015460808801528986529183529201805483518184028101840190945280845260a090950194929390929184015b828210156113595760008481526020908190206040805160a0810182526003808702909301805460ff808216845261010082048116968401969096529194909392850192620100009092041690811115611321576113216140c7565b6003811115611332576113326140c7565b815260200160018201548152602001600282015481525050815260200190600101906112c5565b50505091525092915050565b6000805160206146b28339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d591906144c6565b6001600160a01b0316336001600160a01b0316146114055760405162461bcd60e51b81526004016107c9906144e3565b609681111561144f5760405162461bcd60e51b815260206004820152601660248201527543616e6e6f742045786365656420312e35252046656560501b60448201526064016107c9565b600655565b60008181526002602052604081205460ff161580156109b8575050151590565b6000818152600a60205260409020546001600160a01b031633146114cf5760405162461bcd60e51b81526020600482015260126024820152714552523a204e4f5420594f55522047414d4560701b60448201526064016107c9565b6000818152600a602052604090206004015460ff16156115275760405162461bcd60e51b81526020600482015260136024820152721154948e8811d0535148121054c81153911151606a1b60448201526064016107c9565b6000818152600a60205260409020600190810154116115785760405162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a5908149bdd5b99609a1b60448201526064016107c9565b6000818152600a60205260408120600101546115969060029061451d565b9050600080838152600a602052604090206001908101906115b890849061459d565b815481106115c8576115c8614546565b600091825260209091206003918202015462010000900460ff16908111156115f2576115f26140c7565b146116375760405162461bcd60e51b8152602060048201526015602482015274111a5c9958dd1a5bdb88185b1c9958591e481cd95d605a1b60448201526064016107c9565b6000828152600a6020526040902060019081019061165690839061459d565b8154811061166657611666614546565b6000918252602090912060039091020154610100900460ff16156116c65760405162461bcd60e51b8152602060048201526017602482015276105b1c9958591e481c9958d95a5d9959081c995cdd5b1d604a1b60448201526064016107c9565b6000828152600a6020526040812060048101805460ff19166001908117909155018054839081106116f9576116f9614546565b90600052602060002090600302016002015490506000811161174e5760405162461bcd60e51b815260206004820152600e60248201526d1154948e881393c814105653d55560921b60448201526064016107c9565b8047101561179e5760405162461bcd60e51b815260206004820152601f60248201527f4552523a204e4f5420454e4f5547482046554e445320544f205041594f55540060448201526064016107c9565b6000838152600a6020908152604091829020600201839055815163a9a36dcd60e01b815291516000805160206146b28339815191529263a9a36dcd9260048083019391928290030181865afa1580156117fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181f91906144c6565b6000848152600a6020526040908190205490516304ff60cf60e51b81527f000000000000000000000000000000000000000000000000000000000000000760048201526001600160a01b039182166024820152911690639fec19e09083906044016000604051808303818588803b15801561189957600080fd5b505af11580156118ad573d6000803e3d6000fd5b5050506000858152600a602052604081208054600190910180546001600160a01b0390921694507fc542d3f545425a3b913c4056355fd70bae2039ab35205203499d8bfd03c01ae893508792909161190757611907614546565b6000918252602091829020600160039092020101546040805193845291830152810184905260600160405180910390a2505050565b6000805160206146b28339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa158015611988573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ac91906144c6565b6001600160a01b0316336001600160a01b031614611a005760405162461bcd60e51b815260206004820152601160248201527013db9b1e48149391c810dbdb9d1c9858dd607a1b60448201526064016107c9565b6001600160401b038316600090815260036020526040902054611a22846137c7565b6000818152600a60205260408120600190810154611a40919061451d565b9050811580611a6457506000828152600a60205260409020546001600160a01b0316155b80611a8557506000828152600a602052604090206004015460ff1615156001145b15611ace577f2acb79a40a39601d6c546f6db7b37fd1018c0401f5f5e07754bff874ce6ac8a585838686604051611abf94939291906145b0565b60405180910390a15050505050565b6000600d85856000818110611ae557611ae5614546565b90506020020135611af69190614602565b611b0190600261459d565b6000848152600a602052604081206001018054929350909184908110611b2957611b29614546565b600091825260209091206003909102015460ff16905082158015611b4e575060ff8116155b15611ba4576000848152600a60205260409020600101805483919085908110611b7957611b79614546565b60009182526020909120600390910201805460ff191660ff9290921691909117905550505050505050565b60ff81161580611bfe57506000848152600a60205260408120600101805485908110611bd257611bd2614546565b600091825260209091206003918202015462010000900460ff1690811115611bfc57611bfc6140c7565b145b15611c49577f2acb79a40a39601d6c546f6db7b37fd1018c0401f5f5e07754bff874ce6ac8a587858888604051611c3894939291906145b0565b60405180910390a150505050505050565b6000848152600a60205260409020600101805483919085908110611c6f57611c6f614546565b60009182526020909120600390910201805460ff929092166101000261ff001990921691909117905560016000858152600a60205260409020600101805485908110611cbd57611cbd614546565b600091825260209091206003918202015462010000900460ff1690811115611ce757611ce76140c7565b03611ddc576000848152600a60205260409020600101805484908110611d0f57611d0f614546565b600091825260209091206003909102015460ff9081169083161015611dd75760ff8116600090815260046020908152604080832054878452600a909252909120600101805461271092640100000000900463ffffffff16919086908110611d7857611d78614546565b906000526020600020906003020160010154611d94919061455c565b611d9e9190614589565b6000858152600a60205260409020600101805485908110611dc157611dc1614546565b9060005260206000209060030201600201819055505b611fd4565b60026000858152600a60205260409020600101805485908110611e0157611e01614546565b600091825260209091206003918202015462010000900460ff1690811115611e2b57611e2b6140c7565b03611eb4576000848152600a60205260409020600101805484908110611e5357611e53614546565b600091825260209091206003909102015460ff9081169083161115611dd75760ff8116600090815260046020908152604080832054878452600a90925290912060010180546127109263ffffffff16919086908110611d7857611d78614546565b60036000858152600a60205260409020600101805485908110611ed957611ed9614546565b600091825260209091206003918202015462010000900460ff1690811115611f0357611f036140c7565b03611fd4576000848152600a60205260409020600101805484908110611f2b57611f2b614546565b600091825260209091206003909102015460ff90811690831603611fd4576000848152600a602052604090206001018054612710916201e8489186908110611f7557611f75614546565b906000526020600020906003020160010154611f91919061455c565b611f9b9190614589565b6000858152600a60205260409020600101805485908110611fbe57611fbe614546565b9060005260206000209060030201600201819055505b6000848152600a60205260408120600101805485908110611ff757611ff7614546565b90600052602060002090600302016002015411156125d5576000848152600a602052604090206003810154600190910180548590811061203957612039614546565b906000526020600020906003020160020154111561227c5760006000805160206146b28339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561209f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c391906144c6565b604051630102fbc160e21b81527f000000000000000000000000000000000000000000000000000000000000000760048201526001600160a01b03919091169063040bef0490602401602060405180830381865afa158015612129573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061214d9190614616565b6000868152600a6020526040812060038101546001909101805493945091929091908790811061217f5761217f614546565b90600052602060002090600302016002015461219b919061451d565b90508181111561226e5760006121b1838361451d565b6000888152600a6020526040902060010180549192508291889081106121d9576121d9614546565b906000526020600020906003020160020160008282546121f9919061451d565b909155506000905061220a846138a3565b9050838110156122675761221e818561451d565b6000898152600a6020526040902060010180548990811061224157612241614546565b90600052602060002090600302016002016000828254612261919061451d565b90915550505b5050612279565b612277816138a3565b505b50505b600160075461228b919061451d565b830361251c576000848152600a6020526040812060010180546122d09190869081106122b9576122b9614546565b906000526020600020906003020160010154613180565b905080600860008282546122e4919061451d565b90915550506000858152600a6020526040902060010180548291908690811061230f5761230f614546565b600091825260208083206002600390930201919091018054909301909255868152600a9091526040812060048101805460ff191660019081179091550180548690811061235e5761235e614546565b906000526020600020906003020160020154905080600a6000888152602001908152602001600020600201819055506000805160206146b28339815191526001600160a01b031663a9a36dcd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123fd91906144c6565b6000878152600a6020526040908190205490516304ff60cf60e51b81527f000000000000000000000000000000000000000000000000000000000000000760048201526001600160a01b039182166024820152911690639fec19e09083906044016000604051808303818588803b15801561247757600080fd5b505af115801561248b573d6000803e3d6000fd5b5050506000888152600a602052604081208054600190910180546001600160a01b0390921694507fc542d3f545425a3b913c4056355fd70bae2039ab35205203499d8bfd03c01ae893508a9290916124e5576124e5614546565b6000918252602091829020600160039092020101546040805193845291830152810184905260600160405180910390a2505061276b565b6000848152600a60209081526040808320815160a08101835260ff87811682528185018681529382018681526060830187905260808301879052600193840180549485018155875294909520815160039384029091018054945187166101000261ffff199095169190961617929092178085559251919392839162ff00001990911690620100009084908111156125b5576125b56140c7565b02179055506060820151816001015560808201518160020155505061276b565b6000848152600a6020526040902060048101805460ff191660019081179091558154910180546001600160a01b03909216917fc542d3f545425a3b913c4056355fd70bae2039ab35205203499d8bfd03c01ae89187918790811061263b5761263b614546565b6000918252602080832060016003909302019190910154604080519485529184015282015260600160405180910390a26000805160206146b28339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126db91906144c6565b6000858152600a6020526040908190206003015490516359e5b78d60e11b81527f000000000000000000000000000000000000000000000000000000000000000760048201526001600160a01b03929092169163b3cb6f1a91906024016000604051808303818588803b15801561275157600080fd5b505af1158015612765573d6000803e3d6000fd5b50505050505b50505050505050565b6000805160206146b28339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e491906144c6565b6001600160a01b0316336001600160a01b0316146128145760405162461bcd60e51b81526004016107c9906144e3565b6101f481111561285d5760405162461bcd60e51b815260206004820152601460248201527343616e6e6f74204578636565642035252046656560601b60448201526064016107c9565b60058190556040518181527f05fd392cc4f8fe360ff8b094f628b1c29b9000441290e2f8a597c12d5379b06d9060200160405180910390a150565b606081806001600160401b038111156128b3576128b3614530565b6040519080825280602002602001820160405280156128dc578160200160208202803683370190505b50915060005b8181101561294d576002600086868481811061290057612900614546565b90506020020135815260200190815260200160002060009054906101000a900460ff1683828151811061293557612935614546565b911515602092830291909101909101526001016128e2565b505092915050565b6000805160206146b28339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129c591906144c6565b6001600160a01b0316336001600160a01b0316146129f55760405162461bcd60e51b81526004016107c9906144e3565b6000805460ff19166001179055565b60018181548110612a1457600080fd5b600091825260209091200154905081565b6060816000816001600160401b03811115612a4257612a42614530565b604051908082528060200260200182016040528015612a7557816020015b6060815260200190600190039081612a605790505b50905060005b82811015612ae857612aa4868683818110612a9857612a98614546565b90506020020135611131565b604051602001612ab491906140dd565b604051602081830303815290604052828281518110612ad557612ad5614546565b6020908102919091010152600101612a7b565b50949350505050565b6000805160206146b28339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b6191906144c6565b6001600160a01b0316336001600160a01b031614612b915760405162461bcd60e51b81526004016107c9906144e3565b612b9c823383613aa9565b5050565b60608080808085806001600160401b03811115612bbf57612bbf614530565b604051908082528060200260200182016040528015612be8578160200160208202803683370190505b509550806001600160401b03811115612c0357612c03614530565b604051908082528060200260200182016040528015612c2c578160200160208202803683370190505b509450806001600160401b03811115612c4757612c47614530565b604051908082528060200260200182016040528015612c70578160200160208202803683370190505b509350806001600160401b03811115612c8b57612c8b614530565b604051908082528060200260200182016040528015612cb4578160200160208202803683370190505b509250806001600160401b03811115612ccf57612ccf614530565b604051908082528060200260200182016040528015612cf8578160200160208202803683370190505b50915060005b81811015612fb357600a60008a8a84818110612d1c57612d1c614546565b90506020020135815260200190815260200160002060000160009054906101000a90046001600160a01b0316878281518110612d5a57612d5a614546565b60200260200101906001600160a01b031690816001600160a01b0316815250506000600a60008b8b85818110612d9257612d92614546565b90506020020135815260200190815260200160002060010180549050905080600003612e41576000878381518110612dcc57612dcc614546565b6020026020010181815250506000868381518110612dec57612dec614546565b6020026020010181815250506000858381518110612e0c57612e0c614546565b6020026020010181815250506000848381518110612e2c57612e2c614546565b91151560209283029190910190910152612faa565b600a60008b8b85818110612e5757612e57614546565b905060200201358152602001908152602001600020600101600081548110612e8157612e81614546565b906000526020600020906003020160010154878381518110612ea557612ea5614546565b602002602001018181525050600a60008b8b85818110612ec757612ec7614546565b90506020020135815260200190815260200160002060020154868381518110612ef257612ef2614546565b602002602001018181525050600a60008b8b85818110612f1457612f14614546565b90506020020135815260200190815260200160002060050154858381518110612f3f57612f3f614546565b602002602001018181525050600a60008b8b85818110612f6157612f61614546565b90506020020135815260200190815260200160002060040160009054906101000a900460ff16848381518110612f9957612f99614546565b911515602092830291909101909101525b50600101612cfe565b50509295509295909350565b826001600160a01b038116331461308957604051636d6d50a160e11b81523360048201526000805160206146b28339815191529063dadaa14290602401602060405180830381865afa158015613019573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061303d919061462f565b6130895760405162461bcd60e51b815260206004820152601f60248201527f556e417574686f72697a656420546f20506c617920466f72204f74686572730060448201526064016107c9565b6000805160206146b28339815191526001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130f9919061462f565b156131395760405162461bcd60e51b815260206004820152601060248201526f105b1b0811d85b595cc814185d5cd95960821b60448201526064016107c9565b60005460ff16156131755760405162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b60448201526064016107c9565b611026848484613bda565b6000806000805160206146b28339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131f391906144c6565b604051630102fbc160e21b81527f000000000000000000000000000000000000000000000000000000000000000760048201526001600160a01b03919091169063040bef0490602401602060405180830381865afa158015613259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061327d9190614616565b9050808310613290575050600854919050565b808360085461329f919061455c565b6132a99190614589565b9392505050565b60006000805160206146b28339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156132fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061332291906144c6565b6001600160a01b031663ced72f876040518163ffffffff1660e01b8152600401602060405180830381865afa15801561335f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108509190614616565b6000805160206146b28339815191526001600160a01b031663b3f006746040518163ffffffff1660e01b8152600401602060405180830381865afa1580156133cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133f391906144c6565b60405163bc5101e560e01b81526001600160a01b0384811660048301528381166024830152919091169063bc5101e59085906044016000604051808303818588803b15801561344157600080fd5b505af1158015613455573d6000803e3d6000fd5b5050505050505050565b6000805160206146b28339815191526001600160a01b031663846c43986040518163ffffffff1660e01b8152600401602060405180830381865afa1580156134ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134cf91906144c6565b60405163759ecdf560e11b81526001600160a01b038481166004830152602482018490527f00000000000000000000000000000000000000000000000000000000000000076044830152919091169063eb3d9bea90606401600060405180830381600087803b15801561354157600080fd5b505af1158015613555573d6000803e3d6000fd5b505050505050565b60006000805160206146b28339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156135ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135cf91906144c6565b6001600160a01b03166397cca7af6135e56132b0565b6040516001600160e01b031960e084901b1681526004810186905260ff8716602482015260440160206040518083038185885af115801561362a573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061364f9190614651565b6001600160401b038116600090815260036020526040902054909150156136ab5760405162461bcd60e51b815260206004820152601060248201526f52657175657374496420496e2055736560801b60448201526064016107c9565b6001600160401b038116600090815260036020908152604091829020869055815160016264c53160e01b0319815291516000805160206146b28339815191529263ff9b3acf9260048083019391928290030181865afa158015613712573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061373691906144c6565b6001600160a01b0316638d7fe4786040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561377057600080fd5b505af1158015613784573d6000803e3d6000fd5b505050507f9ac10fb18c93d33ad7b0a941897aef048d0f8d30756684e82b4552ba12764d45846040516137b991815260200190565b60405180910390a150505050565b6000805160206146b28339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613813573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061383791906144c6565b6001600160a01b0316638b3939f26040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561387157600080fd5b505af1158015613885573d6000803e3d6000fd5b505050506001600160401b0316600090815260036020526040812055565b60008115613aa4576000805160206146b28339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156138f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061391b91906144c6565b60095460405163ae2f5d9360e01b81527f000000000000000000000000000000000000000000000000000000000000000760048201526001600160a01b0391821660248201526044810185905291169063ae2f5d9390606401600060405180830381600087803b15801561398e57600080fd5b505af11580156139a2573d6000803e3d6000fd5b50505050600960009054906101000a90046001600160a01b03166001600160a01b0316631e83409a6000805160206146b28339815191526001600160a01b031663a9a36dcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a3a91906144c6565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526024016020604051808303816000875af1158015613a80573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b89190614616565b919050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691613b05919061466e565b6000604051808303816000865af19150503d8060008114613b42576040519150601f19603f3d011682016040523d82523d6000602084013e613b47565b606091505b5091509150818015613b71575080511580613b71575080806020019051810190613b71919061462f565b613bd35760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b60648201526084016107c9565b5050505050565b6000613be46132b0565b905060008080613bf68587018761468a565b92509250925083341015613c3e5760405162461bcd60e51b815260206004820152600f60248201526e22a9291d1026a4a710212aac9024a760891b60448201526064016107c9565b613c4783611454565b1515600114613c8a5760405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a590811d85b59481251608a1b60448201526064016107c9565b6000613c96853461451d565b905060008111613cdd5760405162461bcd60e51b8152602060048201526012602482015271125b9d985b1a590810995d08105b5bdd5b9d60721b60448201526064016107c9565b600061271060055483613cf0919061455c565b613cfa9190614589565b9050600061271060065484613d0f919061455c565b613d199190614589565b60088054820190559050613d2e82868c613383565b6000868152600a6020526040902080546001600160a01b0319166001600160a01b038c1617815560048101805460ff1916905542600590910155613d72818361459d565b613d7c908461451d565b6000878152600a60209081526040808320600380820195909555815160a081018352848152808401858152928101858152606082018a9052608082018690526001928301805493840181558652939094208451918602018054925160ff9081166101000261ffff199094169216919091179190911780825591519293909291839162ff0000199091169062010000908490811115613e1c57613e1c6140c7565b021790555060608201518160010155608082015181600201555050613e418a87613ea6565b613e4b8a8461345f565b896001600160a01b03167fea32a03505fd9f04d664676d72295a86c5fb0465e69654751907ca305bc1d1c787604051613e8691815260200190565b60405180910390a2613e9a8660018661355d565b50505050505050505050565b604051639a4918c160e01b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000076024830152604482018390527f000000000000000000000000fa296156dac165af92f7fdb012b61a874670e1aa1690639a4918c190606401600060405180830381600087803b158015613f3657600080fd5b505af1158015613f4a573d6000803e3d6000fd5b50506001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601849055600093845260026020526040909320805460ff1916909317909255505050565b600060208284031215613fac57600080fd5b5035919050565b600060208284031215613fc557600080fd5b813560ff811681146132a957600080fd5b60008060408385031215613fe957600080fd5b50508035926020909101359150565b600081518084526020840193506020830160005b8281101561402a57815186526020958601959091019060010161400c565b5093949350505050565b6020815260006132a96020830184613ff8565b60008060006060848603121561405c57600080fd5b8335925060208401356004811061407257600080fd5b929592945050506040919091013590565b6001600160a01b038116811461409857600080fd5b50565b600080604083850312156140ae57600080fd5b82356140b981614083565b946020939093013593505050565b634e487b7160e01b600052602160045260246000fd5b60208152600060e08201835160208401526020840151604084015260018060a01b036040850151166060840152606084015115156080840152608084015160a084015260a084015160c08085015281815180845261010086019150602083019350600092505b808310156141b757835160ff815116835260ff602082015116602084015260408101516004811061418457634e487b7160e01b600052602160045260246000fd5b8060408501525060608101516060840152608081015160808401525060a082019150602084019350600183019250614143565b5095945050505050565b6001600160401b038116811461409857600080fd5b60008083601f8401126141e857600080fd5b5081356001600160401b038111156141ff57600080fd5b6020830191508360208260051b850101111561421a57600080fd5b9250929050565b60008060006040848603121561423657600080fd5b8335614241816141c1565b925060208401356001600160401b0381111561425c57600080fd5b614268868287016141d6565b9497909650939450505050565b6000806020838503121561428857600080fd5b82356001600160401b0381111561429e57600080fd5b6142aa858286016141d6565b90969095509350505050565b600081518084526020840193506020830160005b8281101561402a57815115158652602095860195909101906001016142ca565b6020815260006132a960208301846142b6565b60005b83811015614318578181015183820152602001614300565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561439557603f19878603018452815180518087526143728160208901602085016142fd565b601f01601f19169590950160209081019550938401939190910190600101614349565b50929695505050505050565b60a08082528651908201819052600090602088019060c0840190835b818110156143e45783516001600160a01b03168352602093840193909201916001016143bd565b505083810360208501526143f88189613ff8565b915050828103604084015261440d8187613ff8565b905082810360608401526144218186613ff8565b9050828103608084015261443581856142b6565b98975050505050505050565b60008060006040848603121561445657600080fd5b833561446181614083565b925060208401356001600160401b0381111561447c57600080fd5b8401601f8101861361448d57600080fd5b80356001600160401b038111156144a357600080fd5b8660208284010111156144b557600080fd5b939660209190910195509293505050565b6000602082840312156144d857600080fd5b81516132a981614083565b6020808252600a908201526927b7363c9027bbb732b960b11b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b818103818111156109b8576109b8614507565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b80820281158282048414176109b8576109b8614507565b634e487b7160e01b600052601260045260246000fd5b60008261459857614598614573565b500490565b808201808211156109b8576109b8614507565b6001600160401b038516815260208101849052606060408201819052810182905260006001600160fb1b038311156145e757600080fd5b8260051b808560808501379190910160800195945050505050565b60008261461157614611614573565b500690565b60006020828403121561462857600080fd5b5051919050565b60006020828403121561464157600080fd5b815180151581146132a957600080fd5b60006020828403121561466357600080fd5b81516132a9816141c1565b600082516146808184602087016142fd565b9190910192915050565b60008060006060848603121561469f57600080fd5b8335925060208401356140728161408356fe0000000000000000000000008632f22e5a921c751cfbbff92f058a3b11e96b8aa2646970667358221220c89e4ac6727b7a3b3636ca3648815b8fd45a93c1d556174a1de9420379ba151964736f6c634300081c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000007000000000000000000000000fa296156dac165af92f7fdb012b61a874670e1aa
-----Decoded View---------------
Arg [0] : GAME_ID_ (uint256): 7
Arg [1] : history_ (address): 0xFa296156dAc165Af92F7Fdb012B61a874670e1AA
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [1] : 000000000000000000000000fa296156dac165af92f7fdb012b61a874670e1aa
Deployed Bytecode Sourcemap
14081:21781:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6867:70;;;;;;;;;;;;;:::i;:::-;;11644:91;;;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;11644:91:0;;;;;;;;16221:40;;;;;;;;;;-1:-1:-1;16221:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16221:40:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;724:32:1;;;706:51;;788:2;773:18;;766:34;;;;816:18;;;809:34;;;;886:14;879:22;874:2;859:18;;852:50;933:3;918:19;;911:35;693:3;678:19;16221:40:0;453:499:1;14708:27:0;;;;;;;;;;;;;;;;;;;1103:25:1;;;1091:2;1076:18;14708:27:0;957:177:1;19424:142:0;;;;;;;;;;-1:-1:-1;19424:142:0;;;;;:::i;:::-;;:::i;14427:50::-;;;;;;;;;;-1:-1:-1;14427:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;1613:10:1;1601:23;;;1583:42;;1661:23;;;;1656:2;1641:18;;1634:51;1556:18;14427:50:0;1413:278:1;14499:32:0;;;;;;;;;;;;;;;;12209:409;;;;;;;;;;-1:-1:-1;12209:409:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;21776:2907::-;;;;;;:::i;:::-;;:::i;6945:155::-;;;;;;;;;;-1:-1:-1;6945:155:0;;;;;:::i;:::-;;:::i;33329:809::-;;;;;;;;;;-1:-1:-1;33329:809:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1085:107::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1085:107:0;;19193:223;;;;;;;;;;-1:-1:-1;19193:223:0;;;;;:::i;:::-;;:::i;11743:135::-;;;;;;;;;;-1:-1:-1;11743:135:0;;;;;:::i;:::-;;:::i;:::-;;;5877:14:1;;5870:22;5852:41;;5840:2;5825:18;11743:135:0;5712:187:1;24691:1608:0;;;;;;;;;;-1:-1:-1;24691:1608:0;;;;;:::i;:::-;;:::i;6016:26::-;;;;;;;;;;-1:-1:-1;6016:26:0;;;;;;;;26373:6145;;;;;;;;;;-1:-1:-1;26373:6145:0;;;;;:::i;:::-;;:::i;18912:273::-;;;;;;;;;;-1:-1:-1;18912:273:0;;;;;:::i;:::-;;:::i;11886:315::-;;;;;;;;;;-1:-1:-1;11886:315:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;6791:68::-;;;;;;;;;;;;;:::i;6089:28::-;;;;;;;;;;-1:-1:-1;6089:28:0;;;;;:::i;:::-;;:::i;34146:370::-;;;;;;;;;;-1:-1:-1;34146:370:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;5921:40::-;;;;;;;;;;;;;;;7108:143;;;;;;;;;;-1:-1:-1;7108:143:0;;;;;:::i;:::-;;:::i;34524:1298::-;;;;;;;;;;-1:-1:-1;34524:1298:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;7823:260::-;;;;;;:::i;:::-;;:::i;32901:420::-;;;;;;;;;;-1:-1:-1;32901:420:0;;;;;:::i;:::-;;:::i;12626:102::-;;;;;;;;;;-1:-1:-1;12702:11:0;:18;12626:102;;16154:22;;;;;;;;;;-1:-1:-1;16154:22:0;;;;-1:-1:-1;;;;;16154:22:0;;;14538:31;;;;;;;;;;;;;;;;14146:44;;;;;;;;;;;;14183:7;14146:44;;;;;12165:10:1;12153:23;;;12135:42;;12123:2;12108:18;14146:44:0;11991:192:1;7605:105:0;;;;;;;;;;;;;:::i;14627:36::-;;;;;;;;;;;;;;;;5856:32;;;;;;;;;;;;;;;6867:70;-1:-1:-1;;;;;;;;;;;;;;;;1269:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1255:29:0;:10;-1:-1:-1;;;;;1255:29:0;;1233:89;;;;-1:-1:-1;;;1233:89:0;;;;;;;:::i;:::-;;;;;;;;;6924:5:::1;6915:14:::0;;-1:-1:-1;;6915:14:0::1;::::0;;6867:70::o;11644:91::-;11685:7;-1:-1:-1;;;;;;;;;;;;;;;;11712:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11705:22;;11644:91;:::o;19424:142::-;-1:-1:-1;;;;;;;;;;;;;;;;1269:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1255:29:0;:10;-1:-1:-1;;;;;1255:29:0;;1233:89;;;;-1:-1:-1;;;1233:89:0;;;;;;;:::i;:::-;19520:16:::1;:38:::0;19424:142::o;12209:409::-;12328:11;:18;12289:16;;12322:24;;12318:81;;;12369:11;:18;;-1:-1:-1;12318:81:0;12409:20;12446:11;12452:5;12446:3;:11;:::i;:::-;-1:-1:-1;;;;;12432:26:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12432:26:0;-1:-1:-1;12409:49:0;-1:-1:-1;12483:5:0;12469:121;12494:3;12490:1;:7;12469:121;;;12532:11;12544:1;12532:14;;;;;;;;:::i;:::-;;;;;;;;;12515:3;12523:5;12519:1;:9;;;;:::i;:::-;12515:14;;;;;;;;:::i;:::-;;;;;;;;;;:31;12573:3;;12469:121;;;-1:-1:-1;12607:3:0;-1:-1:-1;12209:409:0;;;;;:::o;21776:2907::-;21993:11;:9;:11::i;:::-;21980:9;:24;21958:97;;;;-1:-1:-1;;;21958:97:0;;13514:2:1;21958:97:0;;;13496:21:1;13553:2;13533:18;;;13526:30;13592:25;13572:18;;;13565:53;13635:18;;21958:97:0;13312:347:1;21958:97:0;22088:13;;;;:5;:13;;;;;:18;-1:-1:-1;;;;;22088:18:0;22110:10;22088:32;22066:100;;;;-1:-1:-1;;;22066:100:0;;13866:2:1;22066:100:0;;;13848:21:1;13905:2;13885:18;;;13878:30;-1:-1:-1;;;13924:18:1;;;13917:48;13982:18;;22066:100:0;13664:342:1;22066:100:0;22199:13;;;;:5;:13;;;;;:22;;;;;:31;22177:100;;;;-1:-1:-1;;;22177:100:0;;14213:2:1;22177:100:0;;;14195:21:1;14252:2;14232:18;;;14225:30;-1:-1:-1;;;14271:18:1;;;14264:49;14330:18;;22177:100:0;14011:343:1;22177:100:0;22340:1;22310:13;;;:5;:13;;;;;:20;;:27;22288:106;;;;-1:-1:-1;;;22288:106:0;;14561:2:1;22288:106:0;;;14543:21:1;14600:2;14580:18;;;14573:30;14639:27;14619:18;;;14612:55;14684:18;;22288:106:0;14359:349:1;22288:106:0;22440:20;22427:9;:33;;;;;;;;:::i;:::-;;:71;;;-1:-1:-1;22477:21:0;22464:9;:34;;;;;;;;:::i;:::-;;22427:71;:107;;;-1:-1:-1;22515:19:0;22502:9;:32;;;;;;;;:::i;:::-;;22427:107;22405:179;;;;-1:-1:-1;;;22405:179:0;;14915:2:1;22405:179:0;;;14897:21:1;14954:2;14934:18;;;14927:30;-1:-1:-1;;;14973:18:1;;;14966:52;15035:18;;22405:179:0;14713:346:1;22405:179:0;22595:15;22613:13;;;:5;:13;;;;;22643:1;22613:20;;;:27;:31;;22643:1;22613:31;:::i;:::-;22595:49;-1:-1:-1;22720:19:0;22677:13;;;;:5;:13;;;;;:20;;:29;;22698:7;;22677:29;;;;;;:::i;:::-;;;;;;;;;;;;;;:39;;;;;;;:62;;;;;;;:::i;:::-;;22655:137;;;;-1:-1:-1;;;22655:137:0;;15266:2:1;22655:137:0;;;15248:21:1;15305:2;15285:18;;;15278:30;15344:27;15324:18;;;15317:55;15389:18;;22655:137:0;15064:349:1;22655:137:0;22825:13;;;;:5;:13;;;;;:20;;:29;;22846:7;;22825:29;;;;;;:::i;:::-;;;;;;;;;;;;;:42;;;:47;;22803:122;;;;-1:-1:-1;;;22803:122:0;;15620:2:1;22803:122:0;;;15602:21:1;15659:2;15639:18;;;15632:30;15698:27;15678:18;;;15671:55;15743:18;;22803:122:0;15418:349:1;22803:122:0;22958:13;;;;:5;:13;;;;;:20;;:29;;22979:7;;22958:29;;;;;;:::i;:::-;;;;;;;;;;;;;;:38;;;;;;:43;22936:116;;;;-1:-1:-1;;;22936:116:0;;15974:2:1;22936:116:0;;;15956:21:1;16013:2;15993:18;;;15986:30;-1:-1:-1;;;16032:18:1;;;16025:53;16095:18;;22936:116:0;15772:347:1;22936:116:0;23067:13;;;;:5;:13;;;;;:20;;:29;;23088:7;;23067:29;;;;;;:::i;:::-;;;;;;;;;;;;;;:42;;;23113:1;23067:47;23063:307;;23152:20;23139:9;:33;;;;;;;;:::i;:::-;;23131:68;;;;-1:-1:-1;;;23131:68:0;;16326:2:1;23131:68:0;;;16308:21:1;16365:2;16345:18;;;16338:30;-1:-1:-1;;;16384:18:1;;;16377:52;16446:18;;23131:68:0;16124:346:1;23131:68:0;23063:307;;;23221:13;;;;:5;:13;;;;;:20;;:29;;23242:7;;23221:29;;;;;;:::i;:::-;;;;;;;;;;;;;;:42;;;23267:2;23221:48;23217:153;;23307:21;23294:9;:34;;;;;;;;:::i;:::-;;23286:72;;;;-1:-1:-1;;;23286:72:0;;16677:2:1;23286:72:0;;;16659:21:1;16716:2;16696:18;;;16689:30;16755:27;16735:18;;;16728:55;16800:18;;23286:72:0;16475:349:1;23286:72:0;23413:13;;;;:5;:13;;;;;:20;;:29;;23455:9;;23413:20;23434:7;;23413:29;;;;;;:::i;:::-;;;;;;;;;;;:39;;;:51;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;23516:11:0;;23512:1076;;23651:20;23674:13;;;:5;:13;;;;;:20;;;;;23695:11;;:7;:11;:::i;:::-;23674:33;;;;;;;;:::i;:::-;;;;;;;;;;;:40;;;23651:63;;23783:25;14809:6;23827:11;;23812:12;:26;;;;:::i;:::-;23811:40;;;;:::i;:::-;23783:68;;23919:24;14809:6;23962:10;;23947:12;:25;;;;:::i;:::-;23946:39;;;;:::i;:::-;24068:12;:32;;;;;;23919:66;-1:-1:-1;24174:54:0;24186:17;24068:12;24217:10;24174:11;:54::i;:::-;24298:13;;;;:5;:13;;;;;:20;;:29;;24340:12;;24298:20;24319:7;;24298:29;;;;;;:::i;:::-;;;;;;;;;:39;:29;;;;;:39;:54;24454:36;24474:16;24454:17;:36;:::i;:::-;24438:53;;:12;:53;:::i;:::-;24407:13;;;;:5;:13;;;;;:28;;:84;24538:38;24551:10;24563:12;24538;:38::i;:::-;23529:1059;;;23512:1076;24634:41;24649:6;24657:1;24660:14;24634;:41::i;:::-;21947:2736;21776:2907;;;:::o;6945:155::-;-1:-1:-1;;;;;;;;;;;;;;;;1269:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1255:29:0;:10;-1:-1:-1;;;;;1255:29:0;;1233:89;;;;-1:-1:-1;;;1233:89:0;;;;;;;:::i;:::-;7025:6:::1;7044:2;-1:-1:-1::0;;;;;7036:16:0::1;7060:6;7036:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7024:47;;;7090:1;7082:10;;;::::0;::::1;;7013:87;6945:155:::0;;:::o;33329:809::-;33398:25;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33398:25:0;33446:14;;;;:5;:14;;;;;:21;;:28;:33;;33442:319;;33503:246;;;;;;;;-1:-1:-1;33503:246:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33715:18;;;;;;;;;;;33503:246;;;;;;33715:18;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33715:18:0;;;;;;;;;;;;;;;;-1:-1:-1;33503:246:0;;33496:253;33329:809;-1:-1:-1;;33329:809:0:o;33442:319::-;33780:350;;;;;;;;-1:-1:-1;33832:14:0;;;:5;:14;;;;;:21;;:24;;33780:350;;;;33832:24;;;;:::i;:::-;;;;;;;;;:34;:24;;;;;:34;;;33780:350;;33915:14;;;:5;:14;;;;;;;:21;;;;33780:350;;;;33957:19;;-1:-1:-1;;;;;33957:19:0;33780:350;;;;34001:23;;;;;;33780:350;;;;;;34050:24;;;;33780:350;;;;34097:14;;;;;;:21;;33780:350;;;;;;;;;;;;;;;;;;;;;;;;34097:21;;33780:350;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33780:350:0;;-1:-1:-1;33773:357:0;33329:809;-1:-1:-1;;33329:809:0:o;19193:223::-;-1:-1:-1;;;;;;;;;;;;;;;;1269:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1255:29:0;:10;-1:-1:-1;;;;;1255:29:0;;1233:89;;;;-1:-1:-1;;;1233:89:0;;;;;;;:::i;:::-;19308:3:::1;19291:13;:20;;19269:92;;;::::0;-1:-1:-1;;;19269:92:0;;17801:2:1;19269:92:0::1;::::0;::::1;17783:21:1::0;17840:2;17820:18;;;17813:30;-1:-1:-1;;;17859:18:1;;;17852:52;17921:18;;19269:92:0::1;17599:346:1::0;19269:92:0::1;19382:10;:26:::0;19193:223::o;11743:135::-;11803:4;11827:20;;;:12;:20;;;;;;;;:29;;;:43;;-1:-1:-1;;11860:10:0;;;11743:135::o;24691:1608::-;24801:13;;;;:5;:13;;;;;:18;-1:-1:-1;;;;;24801:18:0;24823:10;24801:32;24779:100;;;;-1:-1:-1;;;24779:100:0;;13866:2:1;24779:100:0;;;13848:21:1;13905:2;13885:18;;;13878:30;-1:-1:-1;;;13924:18:1;;;13917:48;13982:18;;24779:100:0;13664:342:1;24779:100:0;24950:13;;;;:5;:13;;;;;:22;;;;;:31;24928:100;;;;-1:-1:-1;;;24928:100:0;;14213:2:1;24928:100:0;;;14195:21:1;14252:2;14232:18;;;14225:30;-1:-1:-1;;;14271:18:1;;;14264:49;14330:18;;24928:100:0;14011:343:1;24928:100:0;25061:13;;;;:5;:13;;;;;25091:1;25061:20;;;:27;:31;25039:94;;;;-1:-1:-1;;;25039:94:0;;18152:2:1;25039:94:0;;;18134:21:1;18191:2;18171:18;;;18164:30;-1:-1:-1;;;18210:18:1;;;18203:43;18263:18;;25039:94:0;17950:337:1;25039:94:0;25190:15;25208:13;;;:5;:13;;;;;:20;;:27;:31;;25238:1;;25208:31;:::i;:::-;25190:49;-1:-1:-1;25319:19:0;25272:13;;;;:5;:13;;;;;:20;;;;;25293:11;;:7;;:11;:::i;:::-;25272:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:43;;;;;;;:66;;;;;;;:::i;:::-;;25250:137;;;;-1:-1:-1;;;25250:137:0;;18494:2:1;25250:137:0;;;18476:21:1;18533:2;18513:18;;;18506:30;-1:-1:-1;;;18552:18:1;;;18545:51;18613:18;;25250:137:0;18292:345:1;25250:137:0;25420:13;;;;:5;:13;;;;;:20;;;;;25441:11;;:7;;:11;:::i;:::-;25420:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:42;;;;;;:47;25398:120;;;;-1:-1:-1;;;25398:120:0;;15974:2:1;25398:120:0;;;15956:21:1;16013:2;15993:18;;;15986:30;-1:-1:-1;;;16032:18:1;;;16025:53;16095:18;;25398:120:0;15772:347:1;25398:120:0;25561:13;;;;:5;:13;;;;;:22;;;:29;;-1:-1:-1;;25561:29:0;25586:4;25561:29;;;;;;25680:20;:29;;25701:7;;25680:29;;;;;;:::i;:::-;;;;;;;;;;;:36;;;25663:53;;25758:1;25749:6;:10;25727:74;;;;-1:-1:-1;;;25727:74:0;;18844:2:1;25727:74:0;;;18826:21:1;18883:2;18863:18;;;18856:30;-1:-1:-1;;;18902:18:1;;;18895:44;18956:18;;25727:74:0;18642:338:1;25727:74:0;25861:6;25836:21;:31;;25814:112;;;;-1:-1:-1;;;25814:112:0;;19187:2:1;25814:112:0;;;19169:21:1;19226:2;19206:18;;;19199:30;19265:33;19245:18;;;19238:61;19316:18;;25814:112:0;18985:355:1;25814:112:0;25963:13;;;;:5;:13;;;;;;;;;:20;;:29;;;26051:22;;-1:-1:-1;;;26051:22:0;;;;-1:-1:-1;;;;;;;;;;;1149:42:0;26051:20;;:22;;;;;25963:13;;26051:22;;;;;1149:42;26051:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26133:13;;;;:5;:13;;;;;;;:18;26037:125;;-1:-1:-1;;;26037:125:0;;26111:7;26037:125;;;19519:25:1;-1:-1:-1;;;;;26133:18:0;;;19560::1;;;19553:60;26037:44:0;;;;;26089:6;;19492:18:1;;26037:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26221:13:0;;;;:5;:13;;;;;:18;;;26249:20;;;:23;;-1:-1:-1;;;;;26221:18:0;;;;-1:-1:-1;26211:80:0;;-1:-1:-1;26227:6:0;;26249:20;;:23;;;;:::i;:::-;;;;;;;;;;:33;:23;;;;;:33;;26211:80;;;19826:25:1;;;19867:18;;;19860:34;19910:18;;19903:34;;;19814:2;19799:18;26211:80:0;;;;;;;24733:1566;;24691:1608;:::o;26373:6145::-;-1:-1:-1;;;;;;;;;;;;;;;;1563:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1549:27:0;:10;-1:-1:-1;;;;;1549:27:0;;1527:94;;;;-1:-1:-1;;;1527:94:0;;20150:2:1;1527:94:0;;;20132:21:1;20189:2;20169:18;;;20162:30;-1:-1:-1;;;20208:18:1;;;20201:47;20265:18;;1527:94:0;19948:341:1;1527:94:0;-1:-1:-1;;;;;11604:24:0;;26554:14:::1;11604:24:::0;;;:13;:24;;;;;;26646:25:::1;11604:24:::0;26646:14:::1;:25::i;:::-;26711:15;26729:13:::0;;;:5:::1;:13;::::0;;;;26759:1:::1;26729:20:::0;;::::1;:27:::0;:31:::1;::::0;26759:1;26729:31:::1;:::i;:::-;26711:49:::0;-1:-1:-1;26818:11:0;;;:47:::1;;-1:-1:-1::0;26863:1:0::1;26833:13:::0;;;:5:::1;:13;::::0;;;;:18;-1:-1:-1;;;;;26833:18:0::1;:32:::0;26818:47:::1;:81;;;-1:-1:-1::0;26869:13:0::1;::::0;;;:5:::1;:13;::::0;;;;:22:::1;;::::0;::::1;;:30;;:22:::0;:30:::1;26818:81;26814:190;;;26921:50;26940:9;26951:6;26959:11;;26921:50;;;;;;;;;:::i;:::-;;;;;;;;26986:7;;7013:87;6945:155:::0;;:::o;26814:190::-:1;27047:14;27088:2;27071:11;;27083:1;27071:14;;;;;;;:::i;:::-;;;;;;;:19;;;;:::i;:::-;27070:25;::::0;27094:1:::1;27070:25;:::i;:::-;27115:18;27136:13:::0;;;:5:::1;:13;::::0;;;;:20:::1;;:29:::0;;27047:49;;-1:-1:-1;27115:18:0;;27157:7;;27136:29;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:42:::0;::::1;;::::0;-1:-1:-1;27195:12:0;;:33;::::1;;;-1:-1:-1::0;27211:17:0::1;::::0;::::1;::::0;27195:33:::1;27191:183;;;27280:13;::::0;;;:5:::1;:13;::::0;;;;:20:::1;;:29:::0;;27325:8;;27280:20;27301:7;;27280:29;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:53:::0;;-1:-1:-1;;27280:53:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;;;;;6945:155:0:o;27191:183::-:1;27438:17;::::0;::::1;::::0;;:83:::1;;-1:-1:-1::0;27502:19:0::1;27459:13:::0;;;:5:::1;:13;::::0;;;;:20:::1;;:29:::0;;27480:7;;27459:29;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:39:::0;;;::::1;;;::::0;:62;::::1;;;;;;:::i;:::-;;27438:83;27434:192;;;27543:50;27562:9;27573:6;27581:11;;27543:50;;;;;;;;;:::i;:::-;;;;;;;;27608:7;;;;7013:87;6945:155:::0;;:::o;27434:192::-:1;27686:13;::::0;;;:5:::1;:13;::::0;;;;:20:::1;;:29:::0;;27727:8;;27686:20;27707:7;;27686:29;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:49:::0;;::::1;::::0;;;::::1;;;-1:-1:-1::0;;27686:49:0;;::::1;::::0;;;::::1;::::0;;:38:::1;27809:13;::::0;;;:5:::1;:13;::::0;;;;:20:::1;;:29:::0;;27830:7;;27809:29;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:39:::0;;;::::1;;;::::0;:63;::::1;;;;;;:::i;:::-;::::0;27805:1155:::1;;27928:13;::::0;;;:5:::1;:13;::::0;;;;:20:::1;;:29:::0;;27949:7;;27928:29;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:42:::0;::::1;::::0;;::::1;27917:53:::0;;::::1;;27913:258;;;28109:25;::::0;::::1;;::::0;;;:11:::1;:25;::::0;;;;;;;:31;28067:13;;;:5:::1;:13:::0;;;;;;:20:::1;;:29:::0;;14809:6:::1;::::0;28109:31;;::::1;;;::::0;28067:20;28088:7;;28067:29;::::1;;;;;:::i;:::-;;;;;;;;;;;:39;;;:73;;;;:::i;:::-;28066:87;;;;:::i;:::-;28027:13;::::0;;;:5:::1;:13;::::0;;;;:20:::1;;:29:::0;;28048:7;;28027:29;::::1;;;;;:::i;:::-;;;;;;;;;;;:36;;:126;;;;27913:258;27805:1155;;;28237:21;28194:13;::::0;;;:5:::1;:13;::::0;;;;:20:::1;;:29:::0;;28215:7;;28194:29;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:39:::0;;;::::1;;;::::0;:64;::::1;;;;;;:::i;:::-;::::0;28190:770:::1;;28315:13;::::0;;;:5:::1;:13;::::0;;;;:20:::1;;:29:::0;;28336:7;;28315:29;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:42:::0;::::1;::::0;;::::1;28304:53:::0;;::::1;;28300:259;;;28496:25;::::0;::::1;;::::0;;;:11:::1;:25;::::0;;;;;;;:32;28454:13;;;:5:::1;:13:::0;;;;;;28496:32;28454:20:::1;:29:::0;;14809:6:::1;::::0;28496:32:::1;;::::0;28454:20;28475:7;;28454:29;::::1;;;;;:::i;28190:770::-;28625:19;28582:13;::::0;;;:5:::1;:13;::::0;;;;:20:::1;;:29:::0;;28603:7;;28582:29;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:39:::0;;;::::1;;;::::0;:62;::::1;;;;;;:::i;:::-;::::0;28578:382:::1;;28700:13;::::0;;;:5:::1;:13;::::0;;;;:20:::1;;:29:::0;;28721:7;;28700:29;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:42:::0;::::1;::::0;;::::1;28688:54:::0;;::::1;::::0;28684:255:::1;;28855:13;::::0;;;:5:::1;:13;::::0;;;;:20:::1;;:29:::0;;14809:6:::1;::::0;14183:7:::1;::::0;28876;;28855:29;::::1;;;;;:::i;:::-;;;;;;;;;;;:39;;;:53;;;;:::i;:::-;28854:67;;;;:::i;:::-;28815:13;::::0;;;:5:::1;:13;::::0;;;;:20:::1;;:29:::0;;28836:7;;28815:29;::::1;;;;;:::i;:::-;;;;;;;;;;;:36;;:106;;;;28684:255;29015:1;28976:13:::0;;;:5:::1;:13;::::0;;;;:20:::1;;:29:::0;;28997:7;;28976:29;::::1;;;;;:::i;:::-;;;;;;;;;;;:36;;;:40;28972:3539;;;29090:13;::::0;;;:5:::1;:13;::::0;;;;:28:::1;::::0;::::1;::::0;29051:20:::1;::::0;;::::1;:29:::0;;29072:7;;29051:29;::::1;;;;;:::i;:::-;;;;;;;;;;;:36;;;:67;29047:1295;;;29180:17;-1:-1:-1::0;;;;;;;;;;;;;;;;29216:13:0::1;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29200:61;::::0;-1:-1:-1;;;29200:61:0;;29253:7:::1;29200:61;::::0;::::1;1103:25:1::0;-1:-1:-1;;;;;29200:52:0;;;::::1;::::0;::::1;::::0;1076:18:1;;29200:61:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29346:12;29400:13:::0;;;:5:::1;:13;::::0;;;;:28:::1;::::0;::::1;::::0;29361:20:::1;::::0;;::::1;:29:::0;;29180:81;;-1:-1:-1;29346:12:0;;29400:28;;29361:20;29382:7;;29361:29;::::1;;;;;:::i;:::-;;;;;;;;;;;:36;;;:67;;;;:::i;:::-;29346:82;;29562:9;29555:4;:16;29551:776;;;29639:14;29656:16;29663:9:::0;29656:4;:16:::1;:::i;:::-;29745:13;::::0;;;:5:::1;:13;::::0;;;;:20:::1;;:29:::0;;29639:33;;-1:-1:-1;29639:33:0;;29766:7;;29745:29;::::1;;;;;:::i;:::-;;;;;;;;;;;:36;;;:46;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;29862:17:0::1;::::0;-1:-1:-1;29882:31:0::1;29903:9:::0;29882:20:::1;:31::i;:::-;29862:51;;29954:9;29942;:21;29938:245;;;30137:21;30149:9:::0;30137;:21:::1;:::i;:::-;30096:13;::::0;;;:5:::1;:13;::::0;;;;:20:::1;;:29:::0;;30117:7;;30096:29;::::1;;;;;:::i;:::-;;;;;;;;;;;:36;;;:63;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;29938:245:0::1;29573:631;;29551:776;;;30281:26;30302:4;30281:20;:26::i;:::-;;29551:776;29120:1222;;29047:1295;30393:1;30374:16;;:20;;;;:::i;:::-;30362:7;:33:::0;30358:1766:::1;;30611:21;30652:13:::0;;;:5:::1;:13;::::0;;;;:20:::1;;:29:::0;;30635:57:::1;::::0;30652:20;30673:7;;30652:29;::::1;;;;;:::i;:::-;;;;;;;;;;;:39;;;30635:16;:57::i;:::-;30611:81;;30769:13;30753:12;;:29;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;30889:13:0::1;::::0;;;:5:::1;:13;::::0;;;;:20:::1;;:29:::0;;30929:13;;30889:20;30910:7;;30889:29;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:36:::1;:29;::::0;;::::1;;:36:::0;;;::::1;:53:::0;;;;::::1;::::0;;;31020:13;;;:5:::1;:13:::0;;;;;;:22:::1;::::0;::::1;:29:::0;;-1:-1:-1;;31020:29:0::1;-1:-1:-1::0;31020:29:0;;::::1;::::0;;;31155:20:::1;:29:::0;;31176:7;;31155:29;::::1;;;;;:::i;:::-;;;;;;;;;;;:36;;;31138:53;;31267:6;31244:5;:13;31250:6;31244:13;;;;;;;;;;;:20;;:29;;;;-1:-1:-1::0;;;;;;;;;;;;;;;;31348:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31446:13;::::0;;;:5:::1;:13;::::0;;;;;;:18;31334:149;;-1:-1:-1;;;31334:149:0;;31416:7:::1;31334:149;::::0;::::1;19519:25:1::0;-1:-1:-1;;;;;31446:18:0;;::::1;19560::1::0;;;19553:60;31334:44:0;::::1;::::0;::::1;::::0;31386:6;;19492:18:1;;31334:149:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;31566:13:0::1;::::0;;;:5:::1;:13;::::0;;;;:18;;;31594:20;;::::1;:23:::0;;-1:-1:-1;;;;;31566:18:0;;::::1;::::0;-1:-1:-1;31556:80:0::1;::::0;-1:-1:-1;31572:6:0;;31594:20;;:23:::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;:33:::1;:23;::::0;;::::1;;:33;::::0;31556:80:::1;::::0;;19826:25:1;;;19867:18;;;19860:34;19910:18;;19903:34;;;19814:2;19799:18;31556:80:0::1;;;;;;;30397:1257;;28972:3539;;30358:1766;31721:13;::::0;;;:5:::1;:13;::::0;;;;;;;31747:360;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;31721:20:::1;::::0;;::::1;:387:::0;;;;::::1;::::0;;;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;;;-1:-1:-1::0;;31721:387:0;;;;;;::::1;::::0;;;;::::1;::::0;;;;;31747:360;;31721:387;;;-1:-1:-1;;31721:387:0;;::::1;::::0;;;;;;::::1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;28972:3539;;;32200:13;::::0;;;:5:::1;:13;::::0;;;;:22:::1;::::0;::::1;:29:::0;;-1:-1:-1;;32200:29:0::1;32225:4;32200:29:::0;;::::1;::::0;;;32299:18;;32327:20;::::1;:29:::0;;-1:-1:-1;;;;;32299:18:0;;::::1;::::0;32289:81:::1;::::0;32206:6;;32348:7;;32327:29;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:39:::1;:29;::::0;;::::1;;:39:::0;;;::::1;::::0;32289:81:::1;::::0;;19826:25:1;;;19867:18;;;19860:34;19910:18;;19903:34;19814:2;19799:18;32289:81:0::1;;;;;;;-1:-1:-1::0;;;;;;;;;;;;;;;;32424:13:0::1;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32460:13;::::0;;;:5:::1;:13;::::0;;;;;;:28:::1;;::::0;32417:82;;-1:-1:-1;;;32417:82:0;;32491:7:::1;32417:82;::::0;::::1;1103:25:1::0;-1:-1:-1;;;;;32417:35:0;;;::::1;::::0;::::1;::::0;32460:28;1076:18:1;;32417:82:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;28972:3539;26502:6016;;;;26373:6145:::0;;;:::o;18912:273::-;-1:-1:-1;;;;;;;;;;;;;;;;1269:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1255:29:0;:10;-1:-1:-1;;;;;1255:29:0;;1233:89;;;;-1:-1:-1;;;1233:89:0;;;;;;;:::i;:::-;19031:3:::1;19013:14;:21;;18991:91;;;::::0;-1:-1:-1;;;18991:91:0;;21750:2:1;18991:91:0::1;::::0;::::1;21732:21:1::0;21789:2;21769:18;;;21762:30;-1:-1:-1;;;21808:18:1;;;21801:50;21868:18;;18991:91:0::1;21548:344:1::0;18991:91:0::1;19103:11;:28:::0;;;19147:30:::1;::::0;1103:25:1;;;19147:30:0::1;::::0;1091:2:1;1076:18;19147:30:0::1;;;;;;;18912:273:::0;:::o;11886:315::-;11968:20;12012:7;;-1:-1:-1;;;;;12046:15:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12046:15:0;;12037:24;;12077:6;12072:122;12093:3;12089:1;:7;12072:122;;;12126:12;:24;12139:7;;12147:1;12139:10;;;;;;;:::i;:::-;;;;;;;12126:24;;;;;;;;;;;;;;;;;;;;;12114:6;12121:1;12114:9;;;;;;;;:::i;:::-;:36;;;:9;;;;;;;;;;;:36;12177:3;;12072:122;;;;11990:211;11886:315;;;;:::o;6791:68::-;-1:-1:-1;;;;;;;;;;;;;;;;1269:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1255:29:0;:10;-1:-1:-1;;;;;1255:29:0;;1233:89;;;;-1:-1:-1;;;1233:89:0;;;;;;;:::i;:::-;6838:6:::1;:13:::0;;-1:-1:-1;;6838:13:0::1;6847:4;6838:13;::::0;;6791:68::o;6089:28::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6089:28:0;:::o;34146:370::-;34232:14;34270:7;34259:8;34270:7;-1:-1:-1;;;;;34321:16:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34295:42;;34353:6;34348:135;34369:3;34365:1;:7;34348:135;;;34415:23;34427:7;;34435:1;34427:10;;;;;;;:::i;:::-;;;;;;;34415:11;:23::i;:::-;34404:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;34390:8;34399:1;34390:11;;;;;;;;:::i;:::-;;;;;;;;;;:49;34466:3;;34348:135;;;-1:-1:-1;34500:8:0;34146:370;-1:-1:-1;;;;34146:370:0:o;7108:143::-;-1:-1:-1;;;;;;;;;;;;;;;;1269:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1255:29:0;:10;-1:-1:-1;;;;;1255:29:0;;1233:89;;;;-1:-1:-1;;;1233:89:0;;;;;;;:::i;:::-;7189:54:::1;7217:5;7224:10;7236:6;7189:27;:54::i;:::-;7108:143:::0;;:::o;34524:1298::-;34624:24;;;;;34830:7;;-1:-1:-1;;;;;34865:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34865:18:0;;34855:28;;34923:3;-1:-1:-1;;;;;34909:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34909:18:0;;34894:33;;34967:3;-1:-1:-1;;;;;34953:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34953:18:0;;34938:33;;35009:3;-1:-1:-1;;;;;34995:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34995:18:0;;34982:31;;35047:3;-1:-1:-1;;;;;35036:15:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35036:15:0;;35024:27;;35069:6;35064:751;35085:3;35081:1;:7;35064:751;;;35119:5;:17;35125:7;;35133:1;35125:10;;;;;;;:::i;:::-;;;;;;;35119:17;;;;;;;;;;;:22;;;;;;;;;;-1:-1:-1;;;;;35119:22:0;35106:7;35114:1;35106:10;;;;;;;;:::i;:::-;;;;;;:35;-1:-1:-1;;;;;35106:35:0;;;-1:-1:-1;;;;;35106:35:0;;;;;35156:14;35173:5;:17;35179:7;;35187:1;35179:10;;;;;;;:::i;:::-;;;;;;;35173:17;;;;;;;;;;;:24;;:31;;;;35156:48;;35223:6;35233:1;35223:11;35219:553;;35273:1;35255:12;35268:1;35255:15;;;;;;;;:::i;:::-;;;;;;:19;;;;;35311:1;35293:12;35306:1;35293:15;;;;;;;;:::i;:::-;;;;;;:19;;;;;35347:1;35331:10;35342:1;35331:13;;;;;;;;:::i;:::-;;;;;;:17;;;;;35382:5;35367:9;35377:1;35367:12;;;;;;;;:::i;:::-;:20;;;:12;;;;;;;;;;;:20;35219:553;;;35446:5;:17;35452:7;;35460:1;35452:10;;;;;;;:::i;:::-;;;;;;;35446:17;;;;;;;;;;;:24;;35471:1;35446:27;;;;;;;;:::i;:::-;;;;;;;;;;;:37;;;35428:12;35441:1;35428:15;;;;;;;;:::i;:::-;;;;;;:55;;;;;35546:5;:17;35552:7;;35560:1;35552:10;;;;;;;:::i;:::-;;;;;;;35546:17;;;;;;;;;;;:24;;;35528:12;35541:1;35528:15;;;;;;;;:::i;:::-;;;;;;:42;;;;;35621:5;:17;35627:7;;35635:1;35627:10;;;;;;;:::i;:::-;;;;;;;35621:17;;;;;;;;;;;:27;;;35605:10;35616:1;35605:13;;;;;;;;:::i;:::-;;;;;;:43;;;;;35707:5;:17;35713:7;;35721:1;35713:10;;;;;;;:::i;:::-;;;;;;;35707:17;;;;;;;;;;;:26;;;;;;;;;;;;35692:9;35702:1;35692:12;;;;;;;;:::i;:::-;:41;;;:12;;;;;;;;;;;:41;35219:553;-1:-1:-1;35798:3:0;;35064:751;;;;34808:1014;34524:1298;;;;;;;;:::o;7823:260::-;7919:6;-1:-1:-1;;;;;1704:20:0;;1714:10;1704:20;1700:182;;1767:36;;-1:-1:-1;;;1767:36:0;;1792:10;1767:36;;;160:51:1;-1:-1:-1;;;;;;;;;;;1149:42:0;1767:24;;133:18:1;;1767:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1741:129;;;;-1:-1:-1;;;1741:129:0;;22381:2:1;1741:129:0;;;22363:21:1;22420:2;22400:18;;;22393:30;22459:33;22439:18;;;22432:61;22510:18;;1741:129:0;22179:355:1;1741:129:0;-1:-1:-1;;;;;;;;;;;;;;;;1963:14:0::1;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:25;1941:91;;;::::0;-1:-1:-1;;;1941:91:0;;22741:2:1;1941:91:0::1;::::0;::::1;22723:21:1::0;22780:2;22760:18;;;22753:30;-1:-1:-1;;;22799:18:1;;;22792:46;22855:18;;1941:91:0::1;22539:340:1::0;1941:91:0::1;7973:6:::2;::::0;::::2;;7972:7;7950:63;;;::::0;-1:-1:-1;;;7950:63:0;;23086:2:1;7950:63:0::2;::::0;::::2;23068:21:1::0;23125:1;23105:18;;;23098:29;-1:-1:-1;;;23143:18:1;;;23136:36;23189:18;;7950:63:0::2;22884:329:1::0;7950:63:0::2;8048:27;8058:6;8066:8;;8048:9;:27::i;32901:420::-:0;32967:7;32987:22;-1:-1:-1;;;;;;;;;;;;;;;;33028:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33012:61;;-1:-1:-1;;;33012:61:0;;33065:7;33012:61;;;1103:25:1;-1:-1:-1;;;;;33012:52:0;;;;;;;1076:18:1;;33012:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32987:86;;33103:14;33090:9;:27;33086:228;;-1:-1:-1;;33141:12:0;;;32901:420;-1:-1:-1;32901:420:0:o;33086:228::-;33288:14;33274:9;33259:12;;:24;;;;:::i;:::-;33257:45;;;;:::i;:::-;33250:52;32901:420;-1:-1:-1;;;32901:420:0:o;7605:105::-;7647:7;-1:-1:-1;;;;;;;;;;;;;;;;7679:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;7674:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;7421:172::-;-1:-1:-1;;;;;;;;;;;;;;;;7524:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7510:75;;-1:-1:-1;;;7510:75:0;;-1:-1:-1;;;;;23410:32:1;;;7510:75:0;;;23392:51:1;23479:32;;;23459:18;;;23452:60;7510:44:0;;;;;;;7562:9;;23365:18:1;;7510:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7421:172;;;:::o;7259:154::-;-1:-1:-1;;;;;;;;;;;;;;;;7348:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7331:74;;-1:-1:-1;;;7331:74:0;;-1:-1:-1;;;;;23743:32:1;;;7331:74:0;;;23725:51:1;23792:18;;;23785:34;;;7397:7:0;23835:18:1;;;23828:34;7331:51:0;;;;;;;23698:18:1;;7331:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7259:154;;:::o;10488:778::-;10641:16;-1:-1:-1;;;;;;;;;;;;;;;;10665:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10660:33:0;;10701:11;:9;:11::i;:::-;10660:185;;-1:-1:-1;;;;;;10660:185:0;;;;;;;;;;24043:25:1;;;24116:4;24104:17;;24084:18;;;24077:45;24016:18;;10660:185:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10929:24:0;;;;;;:13;:24;;;;;;10641:204;;-1:-1:-1;10929:29:0;10907:95;;;;-1:-1:-1;;;10907:95:0;;24589:2:1;10907:95:0;;;24571:21:1;24628:2;24608:18;;;24601:30;-1:-1:-1;;;24647:18:1;;;24640:46;24703:18;;10907:95:0;24387:340:1;10907:95:0;-1:-1:-1;;;;;11073:24:0;;;;;;:13;:24;;;;;;;;;:33;;;11156:15;;-1:-1:-1;;;;;;11156:15:0;;;;-1:-1:-1;;;;;;;;;;;1149:42:0;11156:13;;:15;;;;;11073:24;;11156:15;;;;;1149:42;11156:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;11149:39:0;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11231:27;11251:6;11231:27;;;;1103:25:1;;1091:2;1076:18;;957:177;11231:27:0;;;;;;;;10577:689;10488:778;;;:::o;11274:224::-;-1:-1:-1;;;;;;;;;;;;;;;;11380:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;11373:45:0;;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;11466:24:0;;;;;:13;:24;;;;;11459:31;11274:224::o;32526:367::-;32590:17;32626:10;;32622:264;;-1:-1:-1;;;;;;;;;;;;;;;;32709:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32750:7;;32702:65;;-1:-1:-1;;;32702:65:0;;32733:7;32702:65;;;24934:25:1;-1:-1:-1;;;;;32750:7:0;;;24975:18:1;;;24968:60;25044:18;;;25037:34;;;32702:30:0;;;;;24907:18:1;;32702:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32837:7;;;;;;;;;-1:-1:-1;;;;;32837:7:0;-1:-1:-1;;;;;32837:13:0;;-1:-1:-1;;;;;;;;;;;;;;;;32851:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32837:37;;-1:-1:-1;;;;;;32837:37:0;;;;;;;-1:-1:-1;;;;;178:32:1;;;32837:37:0;;;160:51:1;133:18;;32837:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32622:264::-;32526:367;;;:::o;3576:449::-;3808:45;;;-1:-1:-1;;;;;25274:32:1;;;3808:45:0;;;25256:51:1;25323:18;;;;25316:34;;;3808:45:0;;;;;;;;;;25229:18:1;;;;3808:45:0;;;;;;;-1:-1:-1;;;;;3808:45:0;-1:-1:-1;;;3808:45:0;;;3797:57;;-1:-1:-1;;;;3797:10:0;;;;:57;;3808:45;3797:57;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3761:93;;;;3887:7;:57;;;;-1:-1:-1;3899:11:0;;:16;;:44;;;3930:4;3919:24;;;;;;;;;;;;:::i;:::-;3865:152;;;;-1:-1:-1;;;3865:152:0;;25855:2:1;3865:152:0;;;25837:21:1;25894:2;25874:18;;;25867:30;25933:34;25913:18;;;25906:62;-1:-1:-1;;;25984:18:1;;;25977:43;26037:19;;3865:152:0;25653:409:1;3865:152:0;3683:342;;3576:449;;;:::o;19574:2194::-;19695:14;19712:11;:9;:11::i;:::-;19695:28;-1:-1:-1;19780:14:0;;;19871:49;;;;19882:8;19871:49;:::i;:::-;19765:155;;;;;;19996:6;19983:9;:19;;19961:84;;;;-1:-1:-1;;;19961:84:0;;26769:2:1;19961:84:0;;;26751:21:1;26808:2;26788:18;;;26781:30;-1:-1:-1;;;26827:18:1;;;26820:45;26882:18;;19961:84:0;26567:339:1;19961:84:0;20078:21;20092:6;20078:13;:21::i;:::-;:29;;20103:4;20078:29;20056:94;;;;-1:-1:-1;;;20056:94:0;;27113:2:1;20056:94:0;;;27095:21:1;27152:2;27132:18;;;27125:30;-1:-1:-1;;;27171:18:1;;;27164:45;27226:18;;20056:94:0;26911:339:1;20056:94:0;20202:22;20227:18;20239:6;20227:9;:18;:::i;:::-;20202:43;;20295:1;20278:14;:18;20256:86;;;;-1:-1:-1;;;20256:86:0;;27457:2:1;20256:86:0;;;27439:21:1;27496:2;27476:18;;;27469:30;-1:-1:-1;;;27515:18:1;;;27508:48;27573:18;;20256:86:0;27255:342:1;20256:86:0;20403:25;14809:6;20449:11;;20432:14;:28;;;;:::i;:::-;20431:42;;;;:::i;:::-;20403:70;;20533:24;14809:6;20578:10;;20561:14;:27;;;;:::i;:::-;20560:41;;;;:::i;:::-;20672:12;:32;;;;;;20533:68;-1:-1:-1;20792:43:0;20804:17;20823:3;20828:6;20792:11;:43::i;:::-;20877:13;;;;:5;:13;;;;;:27;;-1:-1:-1;;;;;;20877:27:0;-1:-1:-1;;;;;20877:27:0;;;;;20915:22;;;:30;;-1:-1:-1;;20915:30:0;;;20982:15;20956:23;;;;:41;21058:36;21078:16;21058:17;:36;:::i;:::-;21039:57;;:14;:57;:::i;:::-;21008:13;;;;:5;:13;;;;;;;;:28;;;;:88;;;;21185:265;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21159:20;;;;:292;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;21159:292:0;;;;;;;;;;;;;;;;;;21185:265;;21159:292;;;;;-1:-1:-1;;21159:292:0;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;21493:31;21509:6;21517;21493:15;:31::i;:::-;21562:36;21575:6;21583:14;21562:12;:36::i;:::-;21659:6;-1:-1:-1;;;;;21647:27:0;;21667:6;21647:27;;;;1103:25:1;;1091:2;1076:18;;957:177;21647:27:0;;;;;;;;21719:41;21734:6;21742:1;21745:14;21719;:41::i;:::-;19652:2116;;;;;;;19574:2194;;;:::o;10208:272::-;10316:40;;-1:-1:-1;;;10316:40:0;;-1:-1:-1;;;;;23743:32:1;;;10316:40:0;;;23725:51:1;10340:7:0;23792:18:1;;;23785:34;23835:18;;;23828:34;;;10316:7:0;:15;;;;23698:18:1;;10316:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10410:11:0;:24;;;;;;;;;;;;-1:-1:-1;10445:20:0;;;:12;10410:24;10445:20;;;;;:27;;-1:-1:-1;;10445:27:0;;;;;;;-1:-1:-1;;;10208:272:0:o;222:226:1:-;281:6;334:2;322:9;313:7;309:23;305:32;302:52;;;350:1;347;340:12;302:52;-1:-1:-1;395:23:1;;222:226;-1:-1:-1;222:226:1:o;1139:269::-;1196:6;1249:2;1237:9;1228:7;1224:23;1220:32;1217:52;;;1265:1;1262;1255:12;1217:52;1304:9;1291:23;1354:4;1347:5;1343:16;1336:5;1333:27;1323:55;;1374:1;1371;1364:12;1696:346;1764:6;1772;1825:2;1813:9;1804:7;1800:23;1796:32;1793:52;;;1841:1;1838;1831:12;1793:52;-1:-1:-1;;1886:23:1;;;2006:2;1991:18;;;1978:32;;-1:-1:-1;1696:346:1:o;2047:420::-;2100:3;2138:5;2132:12;2165:6;2160:3;2153:19;2197:4;2192:3;2188:14;2181:21;;2236:4;2229:5;2225:16;2259:1;2269:173;2283:6;2280:1;2277:13;2269:173;;;2344:13;;2332:26;;2387:4;2378:14;;;;2415:17;;;;2305:1;2298:9;2269:173;;;-1:-1:-1;2458:3:1;;2047:420;-1:-1:-1;;;;2047:420:1:o;2472:261::-;2651:2;2640:9;2633:21;2614:4;2671:56;2723:2;2712:9;2708:18;2700:6;2671:56;:::i;2738:515::-;2834:6;2842;2850;2903:2;2891:9;2882:7;2878:23;2874:32;2871:52;;;2919:1;2916;2909:12;2871:52;2964:23;;;-1:-1:-1;3063:2:1;3048:18;;3035:32;3098:1;3086:14;;3076:42;;3114:1;3111;3104:12;3076:42;2738:515;;3137:7;;-1:-1:-1;;;3217:2:1;3202:18;;;;3189:32;;2738:515::o;3258:131::-;-1:-1:-1;;;;;3333:31:1;;3323:42;;3313:70;;3379:1;3376;3369:12;3313:70;3258:131;:::o;3394:367::-;3462:6;3470;3523:2;3511:9;3502:7;3498:23;3494:32;3491:52;;;3539:1;3536;3529:12;3491:52;3578:9;3565:23;3597:31;3622:5;3597:31;:::i;:::-;3647:5;3725:2;3710:18;;;;3697:32;;-1:-1:-1;;;3394:367:1:o;3766:127::-;3827:10;3822:3;3818:20;3815:1;3808:31;3858:4;3855:1;3848:15;3882:4;3879:1;3872:15;3898:1576;4099:2;4088:9;4081:21;4062:4;4140:3;4129:9;4125:19;4186:6;4180:13;4175:2;4164:9;4160:18;4153:41;4248:2;4240:6;4236:15;4230:22;4225:2;4214:9;4210:18;4203:50;4334:1;4330;4325:3;4321:11;4317:19;4311:2;4303:6;4299:15;4293:22;4289:48;4284:2;4273:9;4269:18;4262:76;4407:2;4399:6;4395:15;4389:22;4382:30;4375:38;4369:3;4358:9;4354:19;4347:67;4469:3;4461:6;4457:16;4451:23;4445:3;4434:9;4430:19;4423:52;4522:3;4514:6;4510:16;4504:23;4565:4;4558;4547:9;4543:20;4536:34;4590:6;4625:12;4619:19;4662:6;4654;4647:22;4700:3;4689:9;4685:19;4678:26;;4745:2;4731:12;4727:21;4713:35;;4766:1;4757:10;;4776:672;4790:6;4787:1;4784:13;4776:672;;;4855:6;4849:13;4902:4;4897:2;4891:9;4887:20;4882:3;4875:33;4966:4;4960:2;4956;4952:11;4946:18;4942:29;4937:2;4932:3;4928:12;4921:51;5021:2;5017;5013:11;5007:18;5067:1;5051:14;5048:21;5038:172;;5120:10;5115:3;5111:20;5108:1;5101:31;5159:4;5156:1;5149:15;5191:4;5188:1;5181:15;5038:172;5244:14;5239:2;5234:3;5230:12;5223:36;;5307:2;5303;5299:11;5293:18;5288:2;5283:3;5279:12;5272:40;5361:3;5357:2;5353:12;5347:19;5341:3;5336;5332:13;5325:42;;5396:3;5391;5387:13;5380:20;;5435:2;5427:6;5423:15;5413:25;;4812:1;4809;4805:9;4800:14;;4776:672;;;-1:-1:-1;5465:3:1;3898:1576;-1:-1:-1;;;;;3898:1576:1:o;5904:129::-;-1:-1:-1;;;;;5982:5:1;5978:30;5971:5;5968:41;5958:69;;6023:1;6020;6013:12;6038:367;6101:8;6111:6;6165:3;6158:4;6150:6;6146:17;6142:27;6132:55;;6183:1;6180;6173:12;6132:55;-1:-1:-1;6206:20:1;;-1:-1:-1;;;;;6238:30:1;;6235:50;;;6281:1;6278;6271:12;6235:50;6318:4;6310:6;6306:17;6294:29;;6378:3;6371:4;6361:6;6358:1;6354:14;6346:6;6342:27;6338:38;6335:47;6332:67;;;6395:1;6392;6385:12;6332:67;6038:367;;;;;:::o;6410:570::-;6504:6;6512;6520;6573:2;6561:9;6552:7;6548:23;6544:32;6541:52;;;6589:1;6586;6579:12;6541:52;6628:9;6615:23;6647:30;6671:5;6647:30;:::i;:::-;6696:5;-1:-1:-1;6752:2:1;6737:18;;6724:32;-1:-1:-1;;;;;6768:30:1;;6765:50;;;6811:1;6808;6801:12;6765:50;6850:70;6912:7;6903:6;6892:9;6888:22;6850:70;:::i;:::-;6410:570;;6939:8;;-1:-1:-1;6824:96:1;;-1:-1:-1;;;;6410:570:1:o;6985:437::-;7071:6;7079;7132:2;7120:9;7111:7;7107:23;7103:32;7100:52;;;7148:1;7145;7138:12;7100:52;7188:9;7175:23;-1:-1:-1;;;;;7213:6:1;7210:30;7207:50;;;7253:1;7250;7243:12;7207:50;7292:70;7354:7;7345:6;7334:9;7330:22;7292:70;:::i;:::-;7381:8;;7266:96;;-1:-1:-1;6985:437:1;-1:-1:-1;;;;6985:437:1:o;7427:433::-;7477:3;7515:5;7509:12;7542:6;7537:3;7530:19;7574:4;7569:3;7565:14;7558:21;;7613:4;7606:5;7602:16;7636:1;7646:189;7660:6;7657:1;7654:13;7646:189;;;7735:13;;7728:21;7721:29;7709:42;;7780:4;7771:14;;;;7808:17;;;;7682:1;7675:9;7646:189;;7865:252;8038:2;8027:9;8020:21;8001:4;8058:53;8107:2;8096:9;8092:18;8084:6;8058:53;:::i;8122:250::-;8207:1;8217:113;8231:6;8228:1;8225:13;8217:113;;;8307:11;;;8301:18;8288:11;;;8281:39;8253:2;8246:10;8217:113;;;-1:-1:-1;;8364:1:1;8346:16;;8339:27;8122:250::o;8377:991::-;8537:4;8585:2;8574:9;8570:18;8615:2;8604:9;8597:21;8638:6;8673;8667:13;8704:6;8696;8689:22;8742:2;8731:9;8727:18;8720:25;;8804:2;8794:6;8791:1;8787:14;8776:9;8772:30;8768:39;8754:53;;8842:2;8834:6;8830:15;8863:1;8873:466;8887:6;8884:1;8881:13;8873:466;;;8980:2;8976:7;8964:9;8956:6;8952:22;8948:36;8943:3;8936:49;9014:6;9008:13;9056:2;9050:9;9087:8;9079:6;9072:24;9109:74;9174:8;9169:2;9161:6;9157:15;9152:2;9148;9144:11;9109:74;:::i;:::-;9249:2;9226:17;-1:-1:-1;;9222:31:1;9210:44;;;;9256:2;9206:53;;;;-1:-1:-1;9317:12:1;;;;9282:15;;;;;8909:1;8902:9;8873:466;;;-1:-1:-1;9356:6:1;;8377:991;-1:-1:-1;;;;;;8377:991:1:o;9604:1424::-;10100:3;10113:22;;;10184:13;;10085:19;;;10206:22;;;10052:4;;10298;10286:17;;;10259:3;10244:19;;;10052:4;10331:199;10345:6;10342:1;10339:13;10331:199;;;10410:13;;-1:-1:-1;;;;;10406:39:1;10394:52;;10475:4;10503:17;;;;10466:14;;;;10442:1;10360:9;10331:199;;;10335:3;;10577:9;10572:3;10568:19;10561:4;10550:9;10546:20;10539:49;10611:41;10648:3;10640:6;10611:41;:::i;:::-;10597:55;;;10700:9;10692:6;10688:22;10683:2;10672:9;10668:18;10661:50;10734:44;10771:6;10763;10734:44;:::i;:::-;10720:58;;10826:9;10818:6;10814:22;10809:2;10798:9;10794:18;10787:50;10860:44;10897:6;10889;10860:44;:::i;:::-;10846:58;;10953:9;10945:6;10941:22;10935:3;10924:9;10920:19;10913:51;10981:41;11015:6;11007;10981:41;:::i;:::-;10973:49;9604:1424;-1:-1:-1;;;;;;;;9604:1424:1:o;11033:721::-;11112:6;11120;11128;11181:2;11169:9;11160:7;11156:23;11152:32;11149:52;;;11197:1;11194;11187:12;11149:52;11236:9;11223:23;11255:31;11280:5;11255:31;:::i;:::-;11305:5;-1:-1:-1;11361:2:1;11346:18;;11333:32;-1:-1:-1;;;;;11377:30:1;;11374:50;;;11420:1;11417;11410:12;11374:50;11443:22;;11496:4;11488:13;;11484:27;-1:-1:-1;11474:55:1;;11525:1;11522;11515:12;11474:55;11565:2;11552:16;-1:-1:-1;;;;;11583:6:1;11580:30;11577:50;;;11623:1;11620;11613:12;11577:50;11668:7;11663:2;11654:6;11650:2;11646:15;11642:24;11639:37;11636:57;;;11689:1;11686;11679:12;11636:57;11033:721;;11720:2;11712:11;;;;;-1:-1:-1;11742:6:1;;-1:-1:-1;;;11033:721:1:o;12188:251::-;12258:6;12311:2;12299:9;12290:7;12286:23;12282:32;12279:52;;;12327:1;12324;12317:12;12279:52;12359:9;12353:16;12378:31;12403:5;12378:31;:::i;12444:334::-;12646:2;12628:21;;;12685:2;12665:18;;;12658:30;-1:-1:-1;;;12719:2:1;12704:18;;12697:40;12769:2;12754:18;;12444:334::o;12783:127::-;12844:10;12839:3;12835:20;12832:1;12825:31;12875:4;12872:1;12865:15;12899:4;12896:1;12889:15;12915:128;12982:9;;;13003:11;;;13000:37;;;13017:18;;:::i;13048:127::-;13109:10;13104:3;13100:20;13097:1;13090:31;13140:4;13137:1;13130:15;13164:4;13161:1;13154:15;13180:127;13241:10;13236:3;13232:20;13229:1;13222:31;13272:4;13269:1;13262:15;13296:4;13293:1;13286:15;16829:168;16902:9;;;16933;;16950:15;;;16944:22;;16930:37;16920:71;;16971:18;;:::i;17002:127::-;17063:10;17058:3;17054:20;17051:1;17044:31;17094:4;17091:1;17084:15;17118:4;17115:1;17108:15;17134:120;17174:1;17200;17190:35;;17205:18;;:::i;:::-;-1:-1:-1;17239:9:1;;17134:120::o;17259:125::-;17324:9;;;17345:10;;;17342:36;;;17358:18;;:::i;20294:611::-;-1:-1:-1;;;;;20538:31:1;;20520:50;;20601:2;20586:18;;20579:34;;;20649:2;20644;20629:18;;20622:30;;;20668:18;;20661:34;;;-1:-1:-1;;;;;;20707:31:1;;20704:51;;;20751:1;20748;20741:12;20704:51;20785:6;20782:1;20778:14;20843:6;20835;20829:3;20818:9;20814:19;20801:49;20871:22;;;;20895:3;20867:32;;20294:611;-1:-1:-1;;;;;20294:611:1:o;20910:112::-;20942:1;20968;20958:35;;20973:18;;:::i;:::-;-1:-1:-1;21007:9:1;;20910:112::o;21027:184::-;21097:6;21150:2;21138:9;21129:7;21125:23;21121:32;21118:52;;;21166:1;21163;21156:12;21118:52;-1:-1:-1;21189:16:1;;21027:184;-1:-1:-1;21027:184:1:o;21897:277::-;21964:6;22017:2;22005:9;21996:7;21992:23;21988:32;21985:52;;;22033:1;22030;22023:12;21985:52;22065:9;22059:16;22118:5;22111:13;22104:21;22097:5;22094:32;22084:60;;22140:1;22137;22130:12;24133:249;24202:6;24255:2;24243:9;24234:7;24230:23;24226:32;24223:52;;;24271:1;24268;24261:12;24223:52;24303:9;24297:16;24322:30;24346:5;24322:30;:::i;25361:287::-;25490:3;25528:6;25522:13;25544:66;25603:6;25598:3;25591:4;25583:6;25579:17;25544:66;:::i;:::-;25626:16;;;;;25361:287;-1:-1:-1;;25361:287:1:o;26067:495::-;26152:6;26160;26168;26221:2;26209:9;26200:7;26196:23;26192:32;26189:52;;;26237:1;26234;26227:12;26189:52;26282:23;;;-1:-1:-1;26381:2:1;26366:18;;26353:32;26394:33;26353:32;26394:33;:::i
Swarm Source
ipfs://18624476a6721dc7d7cd3622d89d7486429f953f6ab06d1bdff0137bf2f166d9
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.