More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,280 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Stop | 7085657 | 2204 days ago | IN | 0 ETH | 0.00080931 | ||||
Sell Character | 7081696 | 2204 days ago | IN | 0 ETH | 0.00007611 | ||||
Fight | 7081227 | 2205 days ago | IN | 0 ETH | 0.00017131 | ||||
Trigger Volcano ... | 7081170 | 2205 days ago | IN | 0 ETH | 0.00021245 | ||||
Trigger Volcano ... | 7079304 | 2205 days ago | IN | 0 ETH | 0.00010567 | ||||
Exit | 7078683 | 2205 days ago | IN | 0 ETH | 0.00143194 | ||||
Fight | 7078671 | 2205 days ago | IN | 0 ETH | 0.00057642 | ||||
Fight | 7078662 | 2205 days ago | IN | 0 ETH | 0.00008676 | ||||
Fight | 7077721 | 2205 days ago | IN | 0 ETH | 0.00010506 | ||||
Fight | 7077721 | 2205 days ago | IN | 0 ETH | 0.00012574 | ||||
Fight | 7077721 | 2205 days ago | IN | 0 ETH | 0.000145 | ||||
Trigger Volcano ... | 7077456 | 2205 days ago | IN | 0 ETH | 0.00010587 | ||||
Sell Character | 7077281 | 2205 days ago | IN | 0 ETH | 0.00011389 | ||||
Sell Character | 7077280 | 2205 days ago | IN | 0 ETH | 0.00012072 | ||||
Fight | 7075635 | 2206 days ago | IN | 0 ETH | 0.00066335 | ||||
Fight | 7075623 | 2206 days ago | IN | 0 ETH | 0.00063015 | ||||
Fight | 7075614 | 2206 days ago | IN | 0 ETH | 0.00093454 | ||||
Trigger Volcano ... | 7075531 | 2206 days ago | IN | 0 ETH | 0.00011624 | ||||
Fight | 7075082 | 2206 days ago | IN | 0 ETH | 0.00040351 | ||||
Fight | 7075072 | 2206 days ago | IN | 0 ETH | 0.0002763 | ||||
Trigger Volcano ... | 7073725 | 2206 days ago | IN | 0 ETH | 0.00020116 | ||||
Fight | 7073009 | 2206 days ago | IN | 0 ETH | 0.00074639 | ||||
Fight | 7072998 | 2206 days ago | IN | 0 ETH | 0.00070085 | ||||
Fight | 7072528 | 2206 days ago | IN | 0 ETH | 0.00009609 | ||||
Trigger Volcano ... | 7071835 | 2206 days ago | IN | 0 ETH | 0.00021281 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
7085657 | 2204 days ago | 1.41063525 ETH | ||||
7085657 | 2204 days ago | 0.0097 ETH | ||||
7085657 | 2204 days ago | 0.00531217 ETH | ||||
7085657 | 2204 days ago | 0.00485 ETH | ||||
7085657 | 2204 days ago | 0.00971661 ETH | ||||
7085657 | 2204 days ago | 0.00489946 ETH | ||||
7085657 | 2204 days ago | 0.01701814 ETH | ||||
7085657 | 2204 days ago | 0.00487963 ETH | ||||
7085657 | 2204 days ago | 0.00575736 ETH | ||||
7085657 | 2204 days ago | 0.00514665 ETH | ||||
7085657 | 2204 days ago | 0.00529909 ETH | ||||
7085657 | 2204 days ago | 0.00485 ETH | ||||
7085657 | 2204 days ago | 0.01163743 ETH | ||||
7085657 | 2204 days ago | 0.00974938 ETH | ||||
7085657 | 2204 days ago | 0.00485 ETH | ||||
7085657 | 2204 days ago | 0.00487963 ETH | ||||
7085657 | 2204 days ago | 0.00575736 ETH | ||||
7085657 | 2204 days ago | 0.097 ETH | ||||
7085657 | 2204 days ago | 0.00485 ETH | ||||
7085657 | 2204 days ago | 0.00485 ETH | ||||
7081696 | 2204 days ago | 0.00485 ETH | ||||
7078683 | 2205 days ago | 0.76779675 ETH | ||||
7077281 | 2205 days ago | 0.00489938 ETH | ||||
7077280 | 2205 days ago | 0.00486646 ETH | ||||
7069176 | 2207 days ago | 0.09729632 ETH |
Loading...
Loading
Contract Self Destruct called at Txn Hash 0x0cc2dca7ea1bcb6cf99454d4ba523aa18658570eb1860f904eeaa7f266349966
Contract Source Code Verified (Exact Match)
Contract Name:
DragonKing
Compiler Version
v0.4.25+commit.59dbf8f1
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2018-10-04 */ /** * Dragonking is a blockchain game in which players may purchase dragons and knights of different levels and values. * Once every period of time the volcano erupts and wipes a few of them from the board. The value of the killed characters * gets distributed amongst all of the survivors. The dragon king receive a bigger share than the others. * In contrast to dragons, knights need to be teleported to the battlefield first with the use of teleport tokens. * Additionally, they may attack a dragon once per period. * Both character types can be protected from death up to three times. * Take a look at dragonking.io for more detailed information. * @author: Julia Altenried, Yuriy Kashnikov * */ pragma solidity ^0.4.24; // DragonKing v2.0 2e59d4 // File: zeppelin-solidity/contracts/ownership/Ownable.sol /** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". */ contract Ownable { address public owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ function Ownable() public { owner = msg.sender; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner); _; } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function transferOwnership(address newOwner) public onlyOwner { require(newOwner != address(0)); OwnershipTransferred(owner, newOwner); owner = newOwner; } } // File: zeppelin-solidity/contracts/token/ERC20Basic.sol /** * @title ERC20Basic * @dev Simpler version of ERC20 interface * @dev see https://github.com/ethereum/EIPs/issues/179 */ contract ERC20Basic { uint256 public totalSupply; function balanceOf(address who) public view returns (uint256); function transfer(address to, uint256 value) public returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); } // File: zeppelin-solidity/contracts/token/ERC20.sol /** * @title ERC20 interface * @dev see https://github.com/ethereum/EIPs/issues/20 */ contract ERC20 is ERC20Basic { function allowance(address owner, address spender) public view returns (uint256); function transferFrom(address from, address to, uint256 value) public returns (bool); function approve(address spender, uint256 value) public returns (bool); event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @title Destructible * @dev Base contract that can be destroyed by owner. All funds in contract will be sent to the owner. */ contract Destructible is Ownable { function Destructible() public payable { } /** * @dev Transfers the current balance to the owner and terminates the contract. */ function destroy() onlyOwner public { selfdestruct(owner); } function destroyAndSend(address _recipient) onlyOwner public { selfdestruct(_recipient); } } contract DragonKingConfig is Ownable { /** the Gift token contract **/ ERC20 public giftToken; /** amount of gift tokens to send **/ uint256 public giftTokenAmount; /** the cost of each character type */ uint128[] public costs; /** the value of each character type (cost - fee), so it's not necessary to compute it each time*/ uint128[] public values; /** the fee to be paid each time an character is bought in percent*/ uint8 fee; /** The maximum of characters allowed in the game */ uint16 public maxCharacters; /** the amount of time that should pass since last eruption **/ uint256 public eruptionThreshold; /** the amount of time that should pass ince last castle loot distribution **/ uint256 public castleLootDistributionThreshold; /** how many characters to kill in %, e.g. 20 will stand for 20%, should be < 100 **/ uint8 public percentageToKill; /* Cooldown threshold */ uint256 public constant CooldownThreshold = 1 days; /** fight factor, used to compute extra probability in fight **/ uint8 public fightFactor; /** the price for teleportation*/ uint256 public teleportPrice; /** the price for protection */ uint256 public protectionPrice; /** the luck threshold */ uint256 public luckThreshold; function hasEnoughTokensToPurchase(address buyer, uint8 characterType) external returns (bool canBuy); } contract DragonKing is Destructible { /** * @dev Throws if called by contract not a user */ modifier onlyUser() { require(msg.sender == tx.origin, "contracts cannot execute this method" ); _; } struct Character { uint8 characterType; uint128 value; address owner; uint64 purchaseTimestamp; uint8 fightCount; } DragonKingConfig public config; /** the neverdie token contract used to purchase protection from eruptions and fights */ ERC20 neverdieToken; /** the teleport token contract used to send knights to the game scene */ ERC20 teleportToken; /** the luck token contract **/ ERC20 luckToken; /** the SKL token contract **/ ERC20 sklToken; /** the XP token contract **/ ERC20 xperToken; /** array holding ids of the curret characters **/ uint32[] public ids; /** the id to be given to the next character **/ uint32 public nextId; /** non-existant character **/ uint16 public constant INVALID_CHARACTER_INDEX = ~uint16(0); /** the castle treasury **/ uint128 public castleTreasury; /** the id of the oldest character **/ uint32 public oldest; /** the character belonging to a given id **/ mapping(uint32 => Character) characters; /** teleported knights **/ mapping(uint32 => bool) teleported; /** constant used to signal that there is no King at the moment **/ uint32 constant public noKing = ~uint32(0); /** total number of characters in the game **/ uint16 public numCharacters; /** number of characters per type **/ mapping(uint8 => uint16) public numCharactersXType; /** timestamp of the last eruption event **/ uint256 public lastEruptionTimestamp; /** timestamp of the last castle loot distribution **/ uint256 public lastCastleLootDistributionTimestamp; /** character type range constants **/ uint8 public constant DRAGON_MIN_TYPE = 0; uint8 public constant DRAGON_MAX_TYPE = 5; uint8 public constant KNIGHT_MIN_TYPE = 6; uint8 public constant KNIGHT_MAX_TYPE = 11; uint8 public constant BALLOON_MIN_TYPE = 12; uint8 public constant BALLOON_MAX_TYPE = 14; uint8 public constant WIZARD_MIN_TYPE = 15; uint8 public constant WIZARD_MAX_TYPE = 20; uint8 public constant ARCHER_MIN_TYPE = 21; uint8 public constant ARCHER_MAX_TYPE = 26; uint8 public constant NUMBER_OF_LEVELS = 6; uint8 public constant INVALID_CHARACTER_TYPE = 27; /** knight cooldown. contains the timestamp of the earliest possible moment to start a fight */ mapping(uint32 => uint) public cooldown; /** tells the number of times a character is protected */ mapping(uint32 => uint8) public protection; // EVENTS /** is fired when new characters are purchased (who bought how many characters of which type?) */ event NewPurchase(address player, uint8 characterType, uint16 amount, uint32 startId); /** is fired when a player leaves the game */ event NewExit(address player, uint256 totalBalance, uint32[] removedCharacters); /** is fired when an eruption occurs */ event NewEruption(uint32[] hitCharacters, uint128 value, uint128 gasCost); /** is fired when a single character is sold **/ event NewSell(uint32 characterId, address player, uint256 value); /** is fired when a knight fights a dragon **/ event NewFight(uint32 winnerID, uint32 loserID, uint256 value, uint16 probability, uint16 dice); /** is fired when a knight is teleported to the field **/ event NewTeleport(uint32 characterId); /** is fired when a protection is purchased **/ event NewProtection(uint32 characterId, uint8 lifes); /** is fired when a castle loot distribution occurs**/ event NewDistributionCastleLoot(uint128 castleLoot); /* initializes the contract parameter */ constructor(address tptAddress, address ndcAddress, address sklAddress, address xperAddress, address luckAddress, address _configAddress) public { nextId = 1; teleportToken = ERC20(tptAddress); neverdieToken = ERC20(ndcAddress); sklToken = ERC20(sklAddress); xperToken = ERC20(xperAddress); luckToken = ERC20(luckAddress); config = DragonKingConfig(_configAddress); } /** * gifts one character * @param receiver gift character owner * @param characterType type of the character to create as a gift */ function giftCharacter(address receiver, uint8 characterType) payable public onlyUser { _addCharacters(receiver, characterType); assert(config.giftToken().transfer(receiver, config.giftTokenAmount())); } /** * buys as many characters as possible with the transfered value of the given type * @param characterType the type of the character */ function addCharacters(uint8 characterType) payable public onlyUser { _addCharacters(msg.sender, characterType); } function _addCharacters(address receiver, uint8 characterType) internal { uint16 amount = uint16(msg.value / config.costs(characterType)); require( amount > 0, "insufficient amount of ether to purchase a given type of character"); uint16 nchars = numCharacters; require( config.hasEnoughTokensToPurchase(receiver, characterType), "insufficinet amount of tokens to purchase a given type of character" ); if (characterType >= INVALID_CHARACTER_TYPE || msg.value < config.costs(characterType) || nchars + amount > config.maxCharacters()) revert(); uint32 nid = nextId; //if type exists, enough ether was transferred and there are less than maxCharacters characters in the game if (characterType <= DRAGON_MAX_TYPE) { //dragons enter the game directly if (oldest == 0 || oldest == noKing) oldest = nid; for (uint8 i = 0; i < amount; i++) { addCharacter(nid + i, nchars + i); characters[nid + i] = Character(characterType, config.values(characterType), receiver, uint64(now), 0); } numCharactersXType[characterType] += amount; numCharacters += amount; } else { // to enter game knights, mages, and archers should be teleported later for (uint8 j = 0; j < amount; j++) { characters[nid + j] = Character(characterType, config.values(characterType), receiver, uint64(now), 0); } } nextId = nid + amount; emit NewPurchase(receiver, characterType, amount, nid); } /** * adds a single dragon of the given type to the ids array, which is used to iterate over all characters * @param nId the id the character is about to receive * @param nchars the number of characters currently in the game */ function addCharacter(uint32 nId, uint16 nchars) internal { if (nchars < ids.length) ids[nchars] = nId; else ids.push(nId); } /** * leave the game. * pays out the sender's balance and removes him and his characters from the game * */ function exit() public { uint32[] memory removed = new uint32[](50); uint8 count; uint32 lastId; uint playerBalance; uint16 nchars = numCharacters; for (uint16 i = 0; i < nchars; i++) { if (characters[ids[i]].owner == msg.sender && characters[ids[i]].purchaseTimestamp + 1 days < now && (characters[ids[i]].characterType < BALLOON_MIN_TYPE || characters[ids[i]].characterType > BALLOON_MAX_TYPE)) { //first delete all characters at the end of the array while (nchars > 0 && characters[ids[nchars - 1]].owner == msg.sender && characters[ids[nchars - 1]].purchaseTimestamp + 1 days < now && (characters[ids[i]].characterType < BALLOON_MIN_TYPE || characters[ids[i]].characterType > BALLOON_MAX_TYPE)) { nchars--; lastId = ids[nchars]; numCharactersXType[characters[lastId].characterType]--; playerBalance += characters[lastId].value; removed[count] = lastId; count++; if (lastId == oldest) oldest = 0; delete characters[lastId]; } //replace the players character by the last one if (nchars > i + 1) { playerBalance += characters[ids[i]].value; removed[count] = ids[i]; count++; nchars--; replaceCharacter(i, nchars); } } } numCharacters = nchars; emit NewExit(msg.sender, playerBalance, removed); //fire the event to notify the client msg.sender.transfer(playerBalance); if (oldest == 0) findOldest(); } /** * Replaces the character with the given id with the last character in the array * @param index the index of the character in the id array * @param nchars the number of characters * */ function replaceCharacter(uint16 index, uint16 nchars) internal { uint32 characterId = ids[index]; numCharactersXType[characters[characterId].characterType]--; if (characterId == oldest) oldest = 0; delete characters[characterId]; ids[index] = ids[nchars]; delete ids[nchars]; } /** * The volcano eruption can be triggered by anybody but only if enough time has passed since the last eription. * The volcano hits up to a certain percentage of characters, but at least one. * The percantage is specified in 'percentageToKill' * */ function triggerVolcanoEruption() public onlyUser { require(now >= lastEruptionTimestamp + config.eruptionThreshold(), "not enough time passed since last eruption"); require(numCharacters > 0, "there are no characters in the game"); lastEruptionTimestamp = now; uint128 pot; uint128 value; uint16 random; uint32 nextHitId; uint16 nchars = numCharacters; uint32 howmany = nchars * config.percentageToKill() / 100; uint128 neededGas = 80000 + 10000 * uint32(nchars); if(howmany == 0) howmany = 1;//hit at least 1 uint32[] memory hitCharacters = new uint32[](howmany); bool[] memory alreadyHit = new bool[](nextId); uint16 i = 0; uint16 j = 0; while (i < howmany) { j++; random = uint16(generateRandomNumber(lastEruptionTimestamp + j) % nchars); nextHitId = ids[random]; if (!alreadyHit[nextHitId]) { alreadyHit[nextHitId] = true; hitCharacters[i] = nextHitId; value = hitCharacter(random, nchars, 0); if (value > 0) { nchars--; } pot += value; i++; } } uint128 gasCost = uint128(neededGas * tx.gasprice); numCharacters = nchars; if (pot > gasCost){ distribute(pot - gasCost); //distribute the pot minus the oraclize gas costs emit NewEruption(hitCharacters, pot - gasCost, gasCost); } else emit NewEruption(hitCharacters, 0, gasCost); } /** * Knight can attack a dragon. * Archer can attack only a balloon. * Dragon can attack wizards and archers. * Wizard can attack anyone, except balloon. * Balloon cannot attack. * The value of the loser is transfered to the winner. * @param characterID the ID of the knight to perfrom the attack * @param characterIndex the index of the knight in the ids-array. Just needed to save gas costs. * In case it's unknown or incorrect, the index is looked up in the array. * */ function fight(uint32 characterID, uint16 characterIndex) public onlyUser { if (characterID != ids[characterIndex]) characterIndex = getCharacterIndex(characterID); Character storage character = characters[characterID]; require(cooldown[characterID] + config.CooldownThreshold() <= now, "not enough time passed since the last fight of this character"); require(character.owner == msg.sender, "only owner can initiate a fight for this character"); uint8 ctype = character.characterType; require(ctype < BALLOON_MIN_TYPE || ctype > BALLOON_MAX_TYPE, "balloons cannot fight"); uint16 adversaryIndex = getRandomAdversary(characterID, ctype); assert(adversaryIndex != INVALID_CHARACTER_INDEX); uint32 adversaryID = ids[adversaryIndex]; Character storage adversary = characters[adversaryID]; uint128 value; uint16 base_probability; uint16 dice = uint16(generateRandomNumber(characterID) % 100); if (luckToken.balanceOf(msg.sender) >= config.luckThreshold()) { base_probability = uint16(generateRandomNumber(dice) % 100); if (base_probability < dice) { dice = base_probability; } base_probability = 0; } uint256 characterPower = sklToken.balanceOf(character.owner) / 10**15 + xperToken.balanceOf(character.owner); uint256 adversaryPower = sklToken.balanceOf(adversary.owner) / 10**15 + xperToken.balanceOf(adversary.owner); if (character.value == adversary.value) { base_probability = 50; if (characterPower > adversaryPower) { base_probability += uint16(100 / config.fightFactor()); } else if (adversaryPower > characterPower) { base_probability -= uint16(100 / config.fightFactor()); } } else if (character.value > adversary.value) { base_probability = 100; if (adversaryPower > characterPower) { base_probability -= uint16((100 * adversary.value) / character.value / config.fightFactor()); } } else if (characterPower > adversaryPower) { base_probability += uint16((100 * character.value) / adversary.value / config.fightFactor()); } if (dice >= base_probability) { // adversary won if (adversary.characterType < BALLOON_MIN_TYPE || adversary.characterType > BALLOON_MAX_TYPE) { value = hitCharacter(characterIndex, numCharacters, adversary.characterType); if (value > 0) { numCharacters--; } else { cooldown[characterID] = now; if (characters[characterID].fightCount < 3) { characters[characterID].fightCount++; } } if (adversary.characterType >= ARCHER_MIN_TYPE && adversary.characterType <= ARCHER_MAX_TYPE) { castleTreasury += value; } else { adversary.value += value; } emit NewFight(adversaryID, characterID, value, base_probability, dice); } else { emit NewFight(adversaryID, characterID, 0, base_probability, dice); // balloons do not hit back } } else { // character won cooldown[characterID] = now; if (characters[characterID].fightCount < 3) { characters[characterID].fightCount++; } value = hitCharacter(adversaryIndex, numCharacters, character.characterType); if (value > 0) { numCharacters--; } if (character.characterType >= ARCHER_MIN_TYPE && character.characterType <= ARCHER_MAX_TYPE) { castleTreasury += value; } else { character.value += value; } if (oldest == 0) findOldest(); emit NewFight(characterID, adversaryID, value, base_probability, dice); } } /* * @param characterType * @param adversaryType * @return whether adversaryType is a valid type of adversary for a given character */ function isValidAdversary(uint8 characterType, uint8 adversaryType) pure returns (bool) { if (characterType >= KNIGHT_MIN_TYPE && characterType <= KNIGHT_MAX_TYPE) { // knight return (adversaryType <= DRAGON_MAX_TYPE); } else if (characterType >= WIZARD_MIN_TYPE && characterType <= WIZARD_MAX_TYPE) { // wizard return (adversaryType < BALLOON_MIN_TYPE || adversaryType > BALLOON_MAX_TYPE); } else if (characterType >= DRAGON_MIN_TYPE && characterType <= DRAGON_MAX_TYPE) { // dragon return (adversaryType >= WIZARD_MIN_TYPE); } else if (characterType >= ARCHER_MIN_TYPE && characterType <= ARCHER_MAX_TYPE) { // archer return ((adversaryType >= BALLOON_MIN_TYPE && adversaryType <= BALLOON_MAX_TYPE) || (adversaryType >= KNIGHT_MIN_TYPE && adversaryType <= KNIGHT_MAX_TYPE)); } return false; } /** * pick a random adversary. * @param nonce a nonce to make sure there's not always the same adversary chosen in a single block. * @return the index of a random adversary character * */ function getRandomAdversary(uint256 nonce, uint8 characterType) internal view returns(uint16) { uint16 randomIndex = uint16(generateRandomNumber(nonce) % numCharacters); // use 7, 11 or 13 as step size. scales for up to 1000 characters uint16 stepSize = numCharacters % 7 == 0 ? (numCharacters % 11 == 0 ? 13 : 11) : 7; uint16 i = randomIndex; //if the picked character is a knight or belongs to the sender, look at the character + stepSizes ahead in the array (modulo the total number) //will at some point return to the startingPoint if no character is suited do { if (isValidAdversary(characterType, characters[ids[i]].characterType) && characters[ids[i]].owner != msg.sender) { return i; } i = (i + stepSize) % numCharacters; } while (i != randomIndex); return INVALID_CHARACTER_INDEX; } /** * generate a random number. * @param nonce a nonce to make sure there's not always the same number returned in a single block. * @return the random number * */ function generateRandomNumber(uint256 nonce) internal view returns(uint) { return uint(keccak256(block.blockhash(block.number - 1), now, numCharacters, nonce)); } /** * Hits the character of the given type at the given index. * Wizards can knock off two protections. Other characters can do only one. * @param index the index of the character * @param nchars the number of characters * @return the value gained from hitting the characters (zero is the character was protected) * */ function hitCharacter(uint16 index, uint16 nchars, uint8 characterType) internal returns(uint128 characterValue) { uint32 id = ids[index]; uint8 knockOffProtections = 1; if (characterType >= WIZARD_MIN_TYPE && characterType <= WIZARD_MAX_TYPE) { knockOffProtections = 2; } if (protection[id] >= knockOffProtections) { protection[id] = protection[id] - knockOffProtections; return 0; } characterValue = characters[ids[index]].value; nchars--; replaceCharacter(index, nchars); } /** * finds the oldest character * */ function findOldest() public { uint32 newOldest = noKing; for (uint16 i = 0; i < numCharacters; i++) { if (ids[i] < newOldest && characters[ids[i]].characterType <= DRAGON_MAX_TYPE) newOldest = ids[i]; } oldest = newOldest; } /** * distributes the given amount among the surviving characters * @param totalAmount nthe amount to distribute */ function distribute(uint128 totalAmount) internal { uint128 amount; if (oldest == 0) findOldest(); if (oldest != noKing) { //pay 10% to the oldest dragon characters[oldest].value += totalAmount / 10; amount = totalAmount / 10 * 9; } else { amount = totalAmount; } //distribute the rest according to their type uint128 valueSum; uint8 size = ARCHER_MAX_TYPE + 1; uint128[] memory shares = new uint128[](size); for (uint8 v = 0; v < size; v++) { if ((v < BALLOON_MIN_TYPE || v > BALLOON_MAX_TYPE) && numCharactersXType[v] > 0) { valueSum += config.values(v); } } for (uint8 m = 0; m < size; m++) { if ((v < BALLOON_MIN_TYPE || v > BALLOON_MAX_TYPE) && numCharactersXType[m] > 0) { shares[m] = amount * config.values(m) / valueSum / numCharactersXType[m]; } } uint8 cType; for (uint16 i = 0; i < numCharacters; i++) { cType = characters[ids[i]].characterType; if (cType < BALLOON_MIN_TYPE || cType > BALLOON_MAX_TYPE) characters[ids[i]].value += shares[characters[ids[i]].characterType]; } } /** * allows the owner to collect the accumulated fees * sends the given amount to the owner's address if the amount does not exceed the * fees (cannot touch the players' balances) minus 100 finney (ensure that oraclize fees can be paid) * @param amount the amount to be collected * */ function collectFees(uint128 amount) public onlyOwner { uint collectedFees = getFees(); if (amount + 100 finney < collectedFees) { owner.transfer(amount); } } /** * withdraw NDC and TPT tokens */ function withdraw() public onlyOwner { uint256 ndcBalance = neverdieToken.balanceOf(this); assert(neverdieToken.transfer(owner, ndcBalance)); uint256 tptBalance = teleportToken.balanceOf(this); assert(teleportToken.transfer(owner, tptBalance)); } /** * pays out the players. * */ function payOut() public onlyOwner { for (uint16 i = 0; i < numCharacters; i++) { characters[ids[i]].owner.transfer(characters[ids[i]].value); delete characters[ids[i]]; } delete ids; numCharacters = 0; } /** * pays out the players and kills the game. * */ function stop() public onlyOwner { withdraw(); payOut(); destroy(); } function generateLuckFactor(uint128 nonce) internal view returns(uint128) { uint128 sum = 0; uint128 inc = 1; for (uint128 i = 49; i >= 5; i--) { if (sum > nonce) { return i+2; } sum += inc; if (i != 40 && i != 8) { inc += 1; } } return 5; } /* @dev distributes castle loot among archers */ function distributeCastleLoot() external onlyUser { require(now >= lastCastleLootDistributionTimestamp + config.castleLootDistributionThreshold(), "not enough time passed since the last castle loot distribution"); lastCastleLootDistributionTimestamp = now; uint128 luckFactor = generateLuckFactor(uint128(now % 1000)); if (luckFactor < 5) { luckFactor = 5; } uint128 amount = castleTreasury * luckFactor / 100; uint128 valueSum; uint128[] memory shares = new uint128[](NUMBER_OF_LEVELS); uint16 archersCount; uint32[] memory archers = new uint32[](numCharacters); uint8 cType; for (uint8 i = 0; i < ids.length; i++) { cType = characters[ids[i]].characterType; if ((cType >= ARCHER_MIN_TYPE && cType <= ARCHER_MAX_TYPE) && (characters[ids[i]].fightCount >= 3) && (now - characters[ids[i]].purchaseTimestamp >= 7 days)) { valueSum += config.values(cType); archers[archersCount] = ids[i]; archersCount++; } } if (valueSum > 0) { for (uint8 j = 0; j < NUMBER_OF_LEVELS; j++) { shares[j] = amount * config.values(ARCHER_MIN_TYPE + j) / valueSum; } for (uint16 k = 0; k < archersCount; k++) { characters[archers[k]].value += shares[characters[archers[k]].characterType - ARCHER_MIN_TYPE]; } castleTreasury -= amount; emit NewDistributionCastleLoot(amount); } else { emit NewDistributionCastleLoot(0); } } /** * sell the character of the given id * throws an exception in case of a knight not yet teleported to the game * @param characterId the id of the character * */ function sellCharacter(uint32 characterId) public onlyUser { require(msg.sender == characters[characterId].owner, "only owners can sell their characters"); require(characters[characterId].characterType < BALLOON_MIN_TYPE || characters[characterId].characterType > BALLOON_MAX_TYPE, "balloons are not sellable"); require(characters[characterId].purchaseTimestamp + 1 days < now, "character can be sold only 1 day after the purchase"); uint128 val = characters[characterId].value; numCharacters--; replaceCharacter(getCharacterIndex(characterId), numCharacters); msg.sender.transfer(val); if (oldest == 0) findOldest(); emit NewSell(characterId, msg.sender, val); } /** * receive approval to spend some tokens. * used for teleport and protection. * @param sender the sender address * @param value the transferred value * @param tokenContract the address of the token contract * @param callData the data passed by the token contract * */ function receiveApproval(address sender, uint256 value, address tokenContract, bytes callData) public { uint32 id; uint256 price; if (msg.sender == address(teleportToken)) { id = toUint32(callData); price = config.teleportPrice(); if (characters[id].characterType >= BALLOON_MIN_TYPE && characters[id].characterType <= WIZARD_MAX_TYPE) { price *= 2; } require(value >= price, "insufficinet amount of tokens to teleport this character"); assert(teleportToken.transferFrom(sender, this, price)); teleportCharacter(id); } else if (msg.sender == address(neverdieToken)) { id = toUint32(callData); // user can purchase extra lifes only right after character purchaes // in other words, user value should be equal the initial value uint8 cType = characters[id].characterType; require(characters[id].value == config.values(cType), "protection could be bought only before the first fight and before the first volcano eruption"); // calc how many lifes user can actually buy // the formula is the following: uint256 lifePrice; uint8 max; if(cType <= KNIGHT_MAX_TYPE ){ lifePrice = ((cType % NUMBER_OF_LEVELS) + 1) * config.protectionPrice(); max = 3; } else if (cType >= BALLOON_MIN_TYPE && cType <= BALLOON_MAX_TYPE) { lifePrice = (((cType+3) % NUMBER_OF_LEVELS) + 1) * config.protectionPrice() * 2; max = 6; } else if (cType >= WIZARD_MIN_TYPE && cType <= WIZARD_MAX_TYPE) { lifePrice = (((cType+3) % NUMBER_OF_LEVELS) + 1) * config.protectionPrice() * 2; max = 3; } else if (cType >= ARCHER_MIN_TYPE && cType <= ARCHER_MAX_TYPE) { lifePrice = (((cType+3) % NUMBER_OF_LEVELS) + 1) * config.protectionPrice(); max = 3; } price = 0; uint8 i = protection[id]; for (i; i < max && value >= price + lifePrice * (i + 1); i++) { price += lifePrice * (i + 1); } assert(neverdieToken.transferFrom(sender, this, price)); protectCharacter(id, i); } else { revert("Should be either from Neverdie or Teleport tokens"); } } /** * Knights, balloons, wizards, and archers are only entering the game completely, when they are teleported to the scene * @param id the character id * */ function teleportCharacter(uint32 id) internal { // ensure we do not teleport twice require(teleported[id] == false, "already teleported"); teleported[id] = true; Character storage character = characters[id]; require(character.characterType > DRAGON_MAX_TYPE, "dragons do not need to be teleported"); //this also makes calls with non-existent ids fail addCharacter(id, numCharacters); numCharacters++; numCharactersXType[character.characterType]++; emit NewTeleport(id); } /** * adds protection to a character * @param id the character id * @param lifes the number of protections * */ function protectCharacter(uint32 id, uint8 lifes) internal { protection[id] = lifes; emit NewProtection(id, lifes); } /****************** GETTERS *************************/ /** * returns the character of the given id * @param characterId the character id * @return the type, value and owner of the character * */ function getCharacter(uint32 characterId) public view returns(uint8, uint128, address) { return (characters[characterId].characterType, characters[characterId].value, characters[characterId].owner); } /** * returns the index of a character of the given id * @param characterId the character id * @return the character id * */ function getCharacterIndex(uint32 characterId) constant public returns(uint16) { for (uint16 i = 0; i < ids.length; i++) { if (ids[i] == characterId) { return i; } } revert(); } /** * returns 10 characters starting from a certain indey * @param startIndex the index to start from * @return 4 arrays containing the ids, types, values and owners of the characters * */ function get10Characters(uint16 startIndex) constant public returns(uint32[10] characterIds, uint8[10] types, uint128[10] values, address[10] owners) { uint32 endIndex = startIndex + 10 > numCharacters ? numCharacters : startIndex + 10; uint8 j = 0; uint32 id; for (uint16 i = startIndex; i < endIndex; i++) { id = ids[i]; characterIds[j] = id; types[j] = characters[id].characterType; values[j] = characters[id].value; owners[j] = characters[id].owner; j++; } } /** * returns the number of dragons in the game * @return the number of dragons * */ function getNumDragons() constant public returns(uint16 numDragons) { for (uint8 i = DRAGON_MIN_TYPE; i <= DRAGON_MAX_TYPE; i++) numDragons += numCharactersXType[i]; } /** * returns the number of wizards in the game * @return the number of wizards * */ function getNumWizards() constant public returns(uint16 numWizards) { for (uint8 i = WIZARD_MIN_TYPE; i <= WIZARD_MAX_TYPE; i++) numWizards += numCharactersXType[i]; } /** * returns the number of archers in the game * @return the number of archers * */ function getNumArchers() constant public returns(uint16 numArchers) { for (uint8 i = ARCHER_MIN_TYPE; i <= ARCHER_MAX_TYPE; i++) numArchers += numCharactersXType[i]; } /** * returns the number of knights in the game * @return the number of knights * */ function getNumKnights() constant public returns(uint16 numKnights) { for (uint8 i = KNIGHT_MIN_TYPE; i <= KNIGHT_MAX_TYPE; i++) numKnights += numCharactersXType[i]; } /** * @return the accumulated fees * */ function getFees() constant public returns(uint) { uint reserved = 0; for (uint16 j = 0; j < numCharacters; j++) reserved += characters[ids[j]].value; return address(this).balance - reserved; } /************* SETTERS ****************/ /** * sets DragonKingConfig * */ function setConfig(address _value) public onlyOwner { config = DragonKingConfig(_value); } /************* HELPERS ****************/ /** * only works for bytes of length < 32 * @param b the byte input * @return the uint * */ function toUint32(bytes b) internal pure returns(uint32) { bytes32 newB; assembly { newB: = mload(0xa0) } return uint32(newB); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":false,"inputs":[],"name":"stop","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"receiver","type":"address"},{"name":"characterType","type":"uint8"}],"name":"giftCharacter","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"characterId","type":"uint32"}],"name":"sellCharacter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getNumArchers","outputs":[{"name":"numArchers","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"triggerVolcanoEruption","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"address"}],"name":"setConfig","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"KNIGHT_MAX_TYPE","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint128"}],"name":"collectFees","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"castleTreasury","outputs":[{"name":"","type":"uint128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint8"}],"name":"numCharactersXType","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BALLOON_MIN_TYPE","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"characterId","type":"uint32"}],"name":"getCharacter","outputs":[{"name":"","type":"uint8"},{"name":"","type":"uint128"},{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"oldest","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"INVALID_CHARACTER_INDEX","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"characterId","type":"uint32"}],"name":"getCharacterIndex","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"startIndex","type":"uint16"}],"name":"get10Characters","outputs":[{"name":"characterIds","type":"uint32[10]"},{"name":"types","type":"uint8[10]"},{"name":"values","type":"uint128[10]"},{"name":"owners","type":"address[10]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"nextId","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastCastleLootDistributionTimestamp","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint32"}],"name":"protection","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"characterID","type":"uint32"},{"name":"characterIndex","type":"uint16"}],"name":"fight","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"config","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"characterType","type":"uint8"}],"name":"addCharacters","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"destroy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getNumDragons","outputs":[{"name":"numDragons","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"sender","type":"address"},{"name":"value","type":"uint256"},{"name":"tokenContract","type":"address"},{"name":"callData","type":"bytes"}],"name":"receiveApproval","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"KNIGHT_MIN_TYPE","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"distributeCastleLoot","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"WIZARD_MAX_TYPE","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getNumWizards","outputs":[{"name":"numWizards","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"NUMBER_OF_LEVELS","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"characterType","type":"uint8"},{"name":"adversaryType","type":"uint8"}],"name":"isValidAdversary","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"ARCHER_MIN_TYPE","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint32"}],"name":"cooldown","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"WIZARD_MIN_TYPE","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getNumKnights","outputs":[{"name":"numKnights","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastEruptionTimestamp","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DRAGON_MAX_TYPE","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"payOut","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ARCHER_MAX_TYPE","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BALLOON_MAX_TYPE","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getFees","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"noKing","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"exit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"DRAGON_MIN_TYPE","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"numCharacters","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_recipient","type":"address"}],"name":"destroyAndSend","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"INVALID_CHARACTER_TYPE","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"ids","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"findOldest","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"tptAddress","type":"address"},{"name":"ndcAddress","type":"address"},{"name":"sklAddress","type":"address"},{"name":"xperAddress","type":"address"},{"name":"luckAddress","type":"address"},{"name":"_configAddress","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"player","type":"address"},{"indexed":false,"name":"characterType","type":"uint8"},{"indexed":false,"name":"amount","type":"uint16"},{"indexed":false,"name":"startId","type":"uint32"}],"name":"NewPurchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"player","type":"address"},{"indexed":false,"name":"totalBalance","type":"uint256"},{"indexed":false,"name":"removedCharacters","type":"uint32[]"}],"name":"NewExit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"hitCharacters","type":"uint32[]"},{"indexed":false,"name":"value","type":"uint128"},{"indexed":false,"name":"gasCost","type":"uint128"}],"name":"NewEruption","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"characterId","type":"uint32"},{"indexed":false,"name":"player","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"NewSell","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"winnerID","type":"uint32"},{"indexed":false,"name":"loserID","type":"uint32"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"probability","type":"uint16"},{"indexed":false,"name":"dice","type":"uint16"}],"name":"NewFight","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"characterId","type":"uint32"}],"name":"NewTeleport","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"characterId","type":"uint32"},{"indexed":false,"name":"lifes","type":"uint8"}],"name":"NewProtection","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"castleLoot","type":"uint128"}],"name":"NewDistributionCastleLoot","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]
Contract Creation Code
608060405234801561001057600080fd5b5060405160c08062005bb683398101604090815281516020830151918301516060840151608085015160a0909501516000805433600160a060020a03199182161782556008805463ffffffff19166001908117909155600380548316600160a060020a0398891617905560028054831698881698909817909755600580548216958716959095179094556006805485169386169390931790925560048054841696851696909617909555835490911691909316179055615adf908190620000d790396000f3006080604052600436106102585763ffffffff60e060020a60003504166307da68f5811461025d5780630a3dfba7146102745780630fa6002e1461028e5780631d2a6dcf146102ac5780631e466eee146102d857806320e3dbd4146102ed57806326bdce711461030e57806328acb00214610339578063291ed7731461035a57806329b20bb61461038b57806330aaed53146103a65780633728bec2146103bb5780633c3c22b31461040c5780633ccfd60b1461043a5780634afe49c21461044f5780634f255b8014610464578063603709e31461048257806361b8ce8c1461055b578063726c86411461057057806372ad21c714610597578063773e1e84146105b557806379502c55146105da578063797e2aec1461060b57806383197ef014610619578063851ad4d61461062e5780638da5cb5b146106435780638f4ffcb1146106585780639271a988146106c85780639c73048b146106dd5780639ced242b146106f2578063a050d07d14610707578063a9689b4f146106c8578063ad389d5d1461071c578063ad70ae1a14610751578063b066ef3c14610766578063b0eee8db14610784578063b32dbcd814610799578063c10435cc146107ae578063c1255299146107c3578063c2052403146107d8578063d0f9bad1146107ed578063d39512b814610802578063db8d55f114610817578063dc9bb7db1461082c578063e9fad8ee14610841578063f10e2ec114610856578063f1be42f11461086b578063f2fde38b14610880578063f5074f41146108a1578063f690648d146108c2578063fac333ac146108d7578063fbe6529f146108ef575b600080fd5b34801561026957600080fd5b50610272610904565b005b610272600160a060020a036004351660ff60243516610935565b34801561029a57600080fd5b5061027263ffffffff60043516610b2e565b3480156102b857600080fd5b506102c1610e66565b6040805161ffff9092168252519081900360200190f35b3480156102e457600080fd5b50610272610e9e565b3480156102f957600080fd5b50610272600160a060020a0360043516611494565b34801561031a57600080fd5b506103236114da565b6040805160ff9092168252519081900360200190f35b34801561034557600080fd5b506102726001608060020a03600435166114df565b34801561036657600080fd5b5061036f611564565b604080516001608060020a039092168252519081900360200190f35b34801561039757600080fd5b506102c160ff6004351661157b565b3480156103b257600080fd5b50610323611591565b3480156103c757600080fd5b506103d963ffffffff60043516611596565b6040805160ff90941684526001608060020a039092166020840152600160a060020a031682820152519081900360600190f35b34801561041857600080fd5b506104216115d5565b6040805163ffffffff9092168252519081900360200190f35b34801561044657600080fd5b506102726115e8565b34801561045b57600080fd5b506102c1611818565b34801561047057600080fd5b506102c163ffffffff6004351661181e565b34801561048e57600080fd5b5061049e61ffff6004351661188a565b604051808561014080838360005b838110156104c45781810151838201526020016104ac565b5050505090500184600a60200280838360005b838110156104ef5781810151838201526020016104d7565b5050505090500183600a60200280838360005b8381101561051a578181015183820152602001610502565b5050505090500182600a60200280838360005b8381101561054557818101518382015260200161052d565b5050505090500194505050505060405180910390f35b34801561056757600080fd5b50610421611a31565b34801561057c57600080fd5b50610585611a3d565b60408051918252519081900360200190f35b3480156105a357600080fd5b5061032363ffffffff60043516611a43565b3480156105c157600080fd5b5061027263ffffffff6004351661ffff60243516611a58565b3480156105e657600080fd5b506105ef612895565b60408051600160a060020a039092168252519081900360200190f35b61027260ff600435166128a4565b34801561062557600080fd5b50610272612905565b34801561063a57600080fd5b506102c161292a565b34801561064f57600080fd5b506105ef61295d565b34801561066457600080fd5b50604080516020601f60643560048181013592830184900484028501840190955281845261027294600160a060020a0381358116956024803596604435909316953695608494920191819084018382808284375094975061296c9650505050505050565b3480156106d457600080fd5b50610323613176565b3480156106e957600080fd5b5061027261317b565b3480156106fe57600080fd5b50610323613845565b34801561071357600080fd5b506102c161384a565b34801561072857600080fd5b5061073d60ff6004358116906024351661387e565b604080519115158252519081900360200190f35b34801561075d57600080fd5b50610323613971565b34801561077257600080fd5b5061058563ffffffff60043516613976565b34801561079057600080fd5b50610323613988565b3480156107a557600080fd5b506102c161398d565b3480156107ba57600080fd5b506105856139c1565b3480156107cf57600080fd5b506103236139c7565b3480156107e457600080fd5b506102726139cc565b3480156107f957600080fd5b50610323613ba4565b34801561080e57600080fd5b50610323613ba9565b34801561082357600080fd5b50610585613bae565b34801561083857600080fd5b50610421611818565b34801561084d57600080fd5b50610272613c33565b34801561086257600080fd5b506103236142e1565b34801561087757600080fd5b506102c16142e6565b34801561088c57600080fd5b50610272600160a060020a03600435166142f0565b3480156108ad57600080fd5b50610272600160a060020a0360043516614384565b3480156108ce57600080fd5b506103236143a7565b3480156108e357600080fd5b506104216004356143ac565b3480156108fb57600080fd5b506102726143e4565b600054600160a060020a0316331461091b57600080fd5b6109236115e8565b61092b6139cc565b610933612905565b565b333214610989576040805160e560020a62461bcd02815260206004820152602480820152600080516020615a94833981519152604482015260e260020a631d1a1bd902606482015290519081900360840190fd5b6109938282614517565b600160009054906101000a9004600160a060020a0316600160a060020a0316632091f9556040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156109e657600080fd5b505af11580156109fa573d6000803e3d6000fd5b505050506040513d6020811015610a1057600080fd5b5051600154604080517f5bdaa8e70000000000000000000000000000000000000000000000000000000081529051600160a060020a039384169363a9059cbb938793911691635bdaa8e7916004808201926020929091908290030181600087803b158015610a7d57600080fd5b505af1158015610a91573d6000803e3d6000fd5b505050506040513d6020811015610aa757600080fd5b50516040805160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091525160448083019260209291908290030181600087803b158015610af657600080fd5b505af1158015610b0a573d6000803e3d6000fd5b505050506040513d6020811015610b2057600080fd5b50511515610b2a57fe5b5050565b6000333214610b84576040805160e560020a62461bcd02815260206004820152602480820152600080516020615a94833981519152604482015260e260020a631d1a1bd902606482015290519081900360840190fd5b63ffffffff8216600090815260096020526040902060010154600160a060020a03163314610c22576040805160e560020a62461bcd02815260206004820152602560248201527f6f6e6c79206f776e6572732063616e2073656c6c20746865697220636861726160448201527f6374657273000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b63ffffffff8216600090815260096020526040902054600c60ff9091161080610c65575063ffffffff8216600090815260096020526040902054600e60ff909116115b1515610cbb576040805160e560020a62461bcd02815260206004820152601960248201527f62616c6c6f6f6e7320617265206e6f742073656c6c61626c6500000000000000604482015290519081900360640190fd5b63ffffffff82166000908152600960205260409020600101544260a060020a90910467ffffffffffffffff90811662015180011610610d6a576040805160e560020a62461bcd02815260206004820152603360248201527f6368617261637465722063616e20626520736f6c64206f6e6c7920312064617960448201527f2061667465722074686520707572636861736500000000000000000000000000606482015290519081900360840190fd5b5063ffffffff8116600090815260096020526040902054600b805461ffff19811661ffff9182166000190190911617905561010090046001608060020a0316610dc1610db58361181e565b600b5461ffff16614db5565b60405133906001608060020a03831680156108fc02916000818181858888f19350505050158015610df6573d6000803e3d6000fd5b5060085460a060020a900463ffffffff161515610e1557610e156143e4565b6040805163ffffffff841681523360208201526001608060020a0383168183015290517fe5cc68f68d9672681158062a835b6abc2ff3fba89f8db70f3a227d4ac35da3c39181900360600190a15050565b600060155b601a60ff821611610e9a5760ff81166000908152600c602052604090205461ffff169190910190600101610e6b565b5090565b6000808080808080606080828080333214610f00576040805160e560020a62461bcd02815260206004820152602480820152600080516020615a94833981519152604482015260e260020a631d1a1bd902606482015290519081900360840190fd5b600160009054906101000a9004600160a060020a0316600160a060020a031663afb7e4956040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610f5357600080fd5b505af1158015610f67573d6000803e3d6000fd5b505050506040513d6020811015610f7d57600080fd5b5051600d5401421015611000576040805160e560020a62461bcd02815260206004820152602a60248201527f6e6f7420656e6f7567682074696d65207061737365642073696e6365206c617360448201527f74206572757074696f6e00000000000000000000000000000000000000000000606482015290519081900360840190fd5b600b54600061ffff90911611611086576040805160e560020a62461bcd02815260206004820152602360248201527f746865726520617265206e6f206368617261637465727320696e20746865206760448201527f616d650000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b42600d55600b54600154604080517f11a5a793000000000000000000000000000000000000000000000000000000008152905161ffff9093169a50606492600160a060020a03909216916311a5a793916004808201926020929091908290030181600087803b1580156110f857600080fd5b505af115801561110c573d6000803e3d6000fd5b505050506040513d602081101561112257600080fd5b505160ff16890261ffff1681151561113657fe5b0461ffff1696508761ffff1661271002620138800163ffffffff1695508663ffffffff166000141561116757600196505b8663ffffffff16604051908082528060200260200182016040528015611197578160200160208202803883390190505b506008546040805163ffffffff90921680835260208082028401019091529196509080156111cf578160200160208202803883390190505b50935060009250600091505b8663ffffffff168361ffff1610156112fb5781806001019250508761ffff1661120b8361ffff16600d5401614f6f565b81151561121457fe5b06995060078a61ffff1681548110151561122a57fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff169850838963ffffffff1681518110151561126657fe5b9060200190602002015115156112f6576001848a63ffffffff1681518110151561128c57fe5b91151560209283029091019091015284518990869061ffff86169081106112af57fe5b63ffffffff9092166020928302909101909101526112cf8a896000614fc8565b9a5060008b6001608060020a031611156112eb57600019909701965b9a8a019a6001909201915b6111db565b50600b805461ffff891661ffff199091161790556001608060020a038086163a0290818116908d1611156113e457611334818d036150f2565b7fa06ad7d0261a795ad8f33fdbef7cf65a0f9f9a825353b13358a96a750acd6b3d85828e03836040518080602001846001608060020a03166001608060020a03168152602001836001608060020a03166001608060020a03168152602001828103825285818151815260200191508051906020019060200280838360005b838110156113ca5781810151838201526020016113b2565b5050505090500194505050505060405180910390a1611486565b7fa06ad7d0261a795ad8f33fdbef7cf65a0f9f9a825353b13358a96a750acd6b3d856000836040518080602001846001608060020a03168152602001836001608060020a03166001608060020a03168152602001828103825285818151815260200191508051906020019060200280838360005b83811015611470578181015183820152602001611458565b5050505090500194505050505060405180910390a15b505050505050505050505050565b600054600160a060020a031633146114ab57600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600b81565b60008054600160a060020a031633146114f757600080fd5b6114ff613bae565b9050808267016345785d8a0000016001608060020a03161015610b2a5760008054604051600160a060020a03909116916001608060020a03851680156108fc02929091818181858888f1935050505015801561155f573d6000803e3d6000fd5b505050565b60085464010000000090046001608060020a031681565b600c6020526000908152604090205461ffff1681565b600c81565b63ffffffff166000908152600960205260409020805460019091015460ff8216926101009092046001608060020a031691600160a060020a0390911690565b60085460a060020a900463ffffffff1681565b600080548190600160a060020a0316331461160257600080fd5b6002546040805160e060020a6370a082310281523060048201529051600160a060020a03909216916370a08231916024808201926020929091908290030181600087803b15801561165257600080fd5b505af1158015611666573d6000803e3d6000fd5b505050506040513d602081101561167c57600080fd5b505160025460008054604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015260248101869052905194965092169263a9059cbb926044808201936020939283900390910190829087803b1580156116f357600080fd5b505af1158015611707573d6000803e3d6000fd5b505050506040513d602081101561171d57600080fd5b5051151561172757fe5b6003546040805160e060020a6370a082310281523060048201529051600160a060020a03909216916370a08231916024808201926020929091908290030181600087803b15801561177757600080fd5b505af115801561178b573d6000803e3d6000fd5b505050506040513d60208110156117a157600080fd5b505160035460008054604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015260248101869052905194955092169263a9059cbb926044808201936020939283900390910190829087803b158015610af657600080fd5b60001981565b6000805b60075461ffff82161015610258578263ffffffff1660078261ffff1681548110151561184a57fe5b6000918252602090912060088204015460079091166004026101000a900463ffffffff16141561187c57809150611884565b600101611822565b50919050565b611892615a36565b61189a615a36565b6118a2615a36565b6118aa615a36565b600b5460009081908190819061ffff908116600a8b01909116116118d15788600a016118d9565b600b5461ffff165b61ffff169350600092508890505b8363ffffffff168161ffff161015611a26576007805461ffff831690811061190b57fe5b6000918252602090912060088204015460079091166004026101000a900463ffffffff169150818860ff8516600a811061194157fe5b63ffffffff9283166020918202929092019190915290831660009081526009909152604090205460ff9081169088908516600a811061197c57fe5b60ff9283166020918202929092019190915263ffffffff841660009081526009909152604090205461010090046001608060020a03169087908516600a81106119c157fe5b6001608060020a039092166020928302919091015263ffffffff8316600090815260099091526040902060010154600160a060020a03168560ff8516600a8110611a0757fe5b600160a060020a039092166020929092020152600192830192016118e7565b505050509193509193565b60085463ffffffff1681565b600e5481565b60106020526000908152604090205460ff1681565b6000808080808080808080333214611ab7576040805160e560020a62461bcd02815260206004820152602480820152600080516020615a94833981519152604482015260e260020a631d1a1bd902606482015290519081900360840190fd5b6007805461ffff8d16908110611ac957fe5b6000918252602090912060088204015460079091166004026101000a900463ffffffff908116908d1614611b0357611b008c61181e565b9a505b63ffffffff8c16600090815260096020908152604080832060015482517f4597dc8e0000000000000000000000000000000000000000000000000000000081529251919e504294600160a060020a0390911693634597dc8e936004808201949293918390030190829087803b158015611b7b57600080fd5b505af1158015611b8f573d6000803e3d6000fd5b505050506040513d6020811015611ba557600080fd5b505163ffffffff8e166000908152600f6020526040902054011115611c3a576040805160e560020a62461bcd02815260206004820152603d60248201527f6e6f7420656e6f7567682074696d65207061737365642073696e63652074686560448201527f206c617374206669676874206f66207468697320636861726163746572000000606482015290519081900360840190fd5b60018a0154600160a060020a03163314611cc4576040805160e560020a62461bcd02815260206004820152603260248201527f6f6e6c79206f776e65722063616e20696e69746961746520612066696768742060448201527f666f722074686973206368617261637465720000000000000000000000000000606482015290519081900360840190fd5b895460ff169850600c891080611cdd5750600e60ff8a16115b1515611d33576040805160e560020a62461bcd02815260206004820152601560248201527f62616c6c6f6f6e732063616e6e6f742066696768740000000000000000000000604482015290519081900360640190fd5b611d438c63ffffffff168a61556d565b975061ffff8089161415611d5357fe5b6007805461ffff8a16908110611d6557fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff908116808452600990925260409092209098509650606490611dac908e16614f6f565b811515611db557fe5b069250600160009054906101000a9004600160a060020a0316600160a060020a0316638f7561476040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611e0b57600080fd5b505af1158015611e1f573d6000803e3d6000fd5b505050506040513d6020811015611e3557600080fd5b5051600480546040805160e060020a6370a08231028152339381019390935251600160a060020a03909116916370a082319160248083019260209291908290030181600087803b158015611e8857600080fd5b505af1158015611e9c573d6000803e3d6000fd5b505050506040513d6020811015611eb257600080fd5b505110611eed576064611ec88461ffff16614f6f565b811515611ed157fe5b0693508261ffff168461ffff161015611ee8578392505b600093505b60065460018b01546040805160e060020a6370a08231028152600160a060020a039283166004820152905191909216916370a082319160248083019260209291908290030181600087803b158015611f4457600080fd5b505af1158015611f58573d6000803e3d6000fd5b505050506040513d6020811015611f6e57600080fd5b505160055460018c01546040805160e060020a6370a08231028152600160a060020a039283166004820152905166038d7ea4c680009392909216916370a08231916024808201926020929091908290030181600087803b158015611fd157600080fd5b505af1158015611fe5573d6000803e3d6000fd5b505050506040513d6020811015611ffb57600080fd5b505181151561200657fe5b60065460018a01546040805160e060020a6370a08231028152600160a060020a03928316600482015290519490930494909401955092909216916370a082319160248083019260209291908290030181600087803b15801561206757600080fd5b505af115801561207b573d6000803e3d6000fd5b505050506040513d602081101561209157600080fd5b505160055460018801546040805160e060020a6370a08231028152600160a060020a039283166004820152905166038d7ea4c680009392909216916370a08231916024808201926020929091908290030181600087803b1580156120f457600080fd5b505af1158015612108573d6000803e3d6000fd5b505050506040513d602081101561211e57600080fd5b505181151561212957fe5b88548d5492909104929092019250610100918290046001608060020a039081169290910416141561229d5760329350808211156121fa57600160009054906101000a9004600160a060020a0316600160a060020a0316634ad6e6486040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156121b357600080fd5b505af11580156121c7573d6000803e3d6000fd5b505050506040513d60208110156121dd57600080fd5b505160ff1660648115156121ed57fe5b0460ff1684019350612298565b8181111561229857600160009054906101000a9004600160a060020a0316600160a060020a0316634ad6e6486040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561225557600080fd5b505af1158015612269573d6000803e3d6000fd5b505050506040513d602081101561227f57600080fd5b505160ff16606481151561228f57fe5b0460ff16840393505b612463565b85548a546001608060020a036101009283900481169290910416111561239457606493508181111561229857600160009054906101000a9004600160a060020a0316600160a060020a0316634ad6e6486040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561231c57600080fd5b505af1158015612330573d6000803e3d6000fd5b505050506040513d602081101561234657600080fd5b50518a54875460ff90921691610100918290046001608060020a039081169290910481166064021681151561237757fe5b046001608060020a031681151561238a57fe5b0484039350612463565b8082111561246357600160009054906101000a9004600160a060020a0316600160a060020a0316634ad6e6486040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156123ef57600080fd5b505af1158015612403573d6000803e3d6000fd5b505050506040513d602081101561241957600080fd5b505186548b5460ff90921691610100918290046001608060020a039081169290910481166064021681151561244a57fe5b046001608060020a031681151561245d57fe5b04840193505b61ffff808516908416106126b1578554600c60ff909116108061248c57508554600e60ff909116115b1561265257600b5486546124ab918d9161ffff9091169060ff16614fc8565b94506000856001608060020a031611156124de57600b805461ffff19811661ffff91821660001901909116179055612559565b63ffffffff8c166000908152600f602090815260408083204290556009909152902060010154600360e060020a90910460ff1610156125595763ffffffff8c1660009081526009602052604090206001908101805460ff60e060020a80830482169094011690920260e060020a60ff02199092169190911790555b8554601560ff9091161080159061257757508554601a60ff90911611155b156125ba57600880546001608060020a03640100000000808304821689019091160273ffffffffffffffffffffffffffffffff00000000199091161790556125ec565b85546001608060020a03610100808304821688019091160270ffffffffffffffffffffffffffffffff00199091161786555b6040805163ffffffff808a1682528e1660208201526001608060020a0387168183015261ffff80871660608301528516608082015290517f24758388bd6bf650dde3bbde100b1056920770025a9f1c5998b4587670d4f3859181900360a00190a16126ac565b6040805163ffffffff808a1682528e16602082015260008183015261ffff80871660608301528516608082015290517f24758388bd6bf650dde3bbde100b1056920770025a9f1c5998b4587670d4f3859181900360a00190a15b611486565b63ffffffff8c166000908152600f602090815260408083204290556009909152902060010154600360e060020a90910460ff16101561272c5763ffffffff8c1660009081526009602052604090206001908101805460ff60e060020a80830482169094011690920260e060020a60ff02199092169190911790555b600b548a54612746918a9161ffff9091169060ff16614fc8565b94506000856001608060020a0316111561277557600b805461ffff19811661ffff918216600019019091161790555b8954601560ff9091161080159061279357508954601a60ff90911611155b156127d657600880546001608060020a03640100000000808304821689019091160273ffffffffffffffffffffffffffffffff0000000019909116179055612808565b89546001608060020a03610100808304821688019091160270ffffffffffffffffffffffffffffffff0019909116178a555b60085460a060020a900463ffffffff161515612826576128266143e4565b6040805163ffffffff808f168252891660208201526001608060020a0387168183015261ffff80871660608301528516608082015290517f24758388bd6bf650dde3bbde100b1056920770025a9f1c5998b4587670d4f3859181900360a00190a1505050505050505050505050565b600154600160a060020a031681565b3332146128f8576040805160e560020a62461bcd02815260206004820152602480820152600080516020615a94833981519152604482015260e260020a631d1a1bd902606482015290519081900360840190fd5b6129023382614517565b50565b600054600160a060020a0316331461291c57600080fd5b600054600160a060020a0316ff5b6000805b600560ff821611610e9a5760ff81166000908152600c602052604090205461ffff16919091019060010161292e565b600054600160a060020a031681565b60035460009081908190819081908190600160a060020a0316331415612ba057612995876156dd565b9550600160009054906101000a9004600160a060020a0316600160a060020a0316636121e5226040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156129ea57600080fd5b505af11580156129fe573d6000803e3d6000fd5b505050506040513d6020811015612a1457600080fd5b505163ffffffff8716600090815260096020526040902054909550600c60ff90911610801590612a5f575063ffffffff8616600090815260096020526040902054601460ff90911611155b15612a6b576002850294505b84891015612ae9576040805160e560020a62461bcd02815260206004820152603860248201527f696e737566666963696e657420616d6f756e74206f6620746f6b656e7320746f60448201527f2074656c65706f72742074686973206368617261637465720000000000000000606482015290519081900360840190fd5b600354604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a038d8116600483015230602483015260448201899052915191909216916323b872dd9160648083019260209291908290030181600087803b158015612b5e57600080fd5b505af1158015612b72573d6000803e3d6000fd5b505050506040513d6020811015612b8857600080fd5b50511515612b9257fe5b612b9b866156e4565b61316a565b600254600160a060020a03163314156130f457612bbc876156dd565b63ffffffff8116600090815260096020908152604080832054600154825160e060020a635e383d2102815260ff909216600483018190529251959b50919850600160a060020a0390911693635e383d2193602480840194938390030190829087803b158015612c2a57600080fd5b505af1158015612c3e573d6000803e3d6000fd5b505050506040513d6020811015612c5457600080fd5b505163ffffffff871660009081526009602052604090205461010090046001608060020a03908116911614612d1f576040805160e560020a62461bcd02815260206004820152605c60248201527f70726f74656374696f6e20636f756c6420626520626f75676874206f6e6c792060448201527f6265666f72652074686520666972737420666967687420616e64206265666f7260648201527f652074686520666972737420766f6c63616e6f206572757074696f6e00000000608482015290519081900360a40190fd5b600b60ff851611612dc257600160009054906101000a9004600160a060020a0316600160a060020a03166319f353bb6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612d7d57600080fd5b505af1158015612d91573d6000803e3d6000fd5b505050506040513d6020811015612da757600080fd5b5051600660ff86160660010160ff1602925060039150612fec565b600c60ff851610801590612dda5750600e60ff851611155b15612e7d57600160009054906101000a9004600160a060020a0316600160a060020a03166319f353bb6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612e3257600080fd5b505af1158015612e46573d6000803e3d6000fd5b505050506040513d6020811015612e5c57600080fd5b505160066003860160ff160660010160ff1602600202925060069150612fec565b600f60ff851610801590612e955750601460ff851611155b15612f3857600160009054906101000a9004600160a060020a0316600160a060020a03166319f353bb6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612eed57600080fd5b505af1158015612f01573d6000803e3d6000fd5b505050506040513d6020811015612f1757600080fd5b505160066003860160ff160660010160ff1602600202925060039150612fec565b601560ff851610801590612f505750601a60ff851611155b15612fec57600160009054906101000a9004600160a060020a0316600160a060020a03166319f353bb6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612fa857600080fd5b505af1158015612fbc573d6000803e3d6000fd5b505050506040513d6020811015612fd257600080fd5b505160066003860160ff160660010160ff16029250600391505b5063ffffffff851660009081526010602052604081205490945060ff165b8160ff168160ff1610801561302957508060010160ff16830285018910155b156130415760010160ff81168302949094019361300a565b600254604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a038d8116600483015230602483015260448201899052915191909216916323b872dd9160648083019260209291908290030181600087803b1580156130b657600080fd5b505af11580156130ca573d6000803e3d6000fd5b505050506040513d60208110156130e057600080fd5b505115156130ea57fe5b612b9b8682615896565b6040805160e560020a62461bcd02815260206004820152603160248201527f53686f756c64206265206569746865722066726f6d204e65766572646965206f60448201527f722054656c65706f727420746f6b656e73000000000000000000000000000000606482015290519081900360840190fd5b50505050505050505050565b600681565b6000808060608181818080803332146131db576040805160e560020a62461bcd02815260206004820152602480820152600080516020615a94833981519152604482015260e260020a631d1a1bd902606482015290519081900360840190fd5b600160009054906101000a9004600160a060020a0316600160a060020a03166399bd59ee6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561322e57600080fd5b505af1158015613242573d6000803e3d6000fd5b505050506040513d602081101561325857600080fd5b5051600e54014210156132db576040805160e560020a62461bcd02815260206004820152603e60248201527f6e6f7420656e6f7567682074696d65207061737365642073696e63652074686560448201527f206c61737420636173746c65206c6f6f7420646973747269627574696f6e0000606482015290519081900360840190fd5b42600e8190556132ef906103e890066158f8565b995060058a6001608060020a0316101561330857600599505b6008546064906001608060020a0364010000000090910481168c021660408051600680825260e08201909252929091049a506020820160c08038833901905050600b546040805161ffff909216808352602080820284010190915291985090801561337d578160200160208202803883390190505b509450600092505b60075460ff841610156135bc576009600060078560ff168154811015156133a857fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190205460ff169350601584108015906133f55750601a60ff851611155b8015613457575060036009600060078660ff1681548110151561341457fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190206001015460e060020a900460ff1610155b80156134c4575062093a806009600060078660ff1681548110151561347857fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190206001015460a060020a900467ffffffffffffffff16420310155b156135b1576001546040805160e060020a635e383d2102815260ff871660048201529051600160a060020a0390921691635e383d21916024808201926020929091908290030181600087803b15801561351c57600080fd5b505af1158015613530573d6000803e3d6000fd5b505050506040513d602081101561354657600080fd5b505160078054999091019860ff851690811061355e57fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff16858761ffff1681518110151561359657fe5b63ffffffff9092166020928302909101909101526001909501945b600190920191613385565b6000886001608060020a0316111561380557600091505b600660ff831610156136b1576001546040805160e060020a635e383d2102815260ff6015860116600482015290516001608060020a038b1692600160a060020a031691635e383d219160248083019260209291908290030181600087803b15801561363d57600080fd5b505af1158015613651573d6000803e3d6000fd5b505050506040513d602081101561366757600080fd5b50518a026001608060020a031681151561367d57fe5b04878360ff1681518110151561368f57fe5b6001608060020a039092166020928302909101909101526001909101906135d3565b5060005b8561ffff168161ffff16101561378f5786601560096000888561ffff168151811015156136de57fe5b602090810290910181015163ffffffff16825281019190915260400160002054825160ff918216929092031690811061371357fe5b9060200190602002015160096000878461ffff1681518110151561373357fe5b602090810290910181015163ffffffff16825281019190915260400160002080546001608060020a0361010080830482169094011690920270ffffffffffffffffffffffffffffffff00199092169190911790556001016136b5565b600880546001608060020a0364010000000080830482168d900382160273ffffffffffffffffffffffffffffffff00000000199092169190911790915560408051918b168252517f2359110bd6bbc405457edff9ea27ed0310d86730da626b57da3ba05cae1ce22d9181900360200190a161316a565b604080516000815290517f2359110bd6bbc405457edff9ea27ed0310d86730da626b57da3ba05cae1ce22d9181900360200190a150505050505050505050565b601481565b6000600f5b601460ff821611610e9a5760ff81166000908152600c602052604090205461ffff16919091019060010161384f565b6000600660ff8416108015906138985750600b60ff841611155b156138ab5750600560ff8216111561396b565b600f60ff8416108015906138c35750601460ff841611155b156138e457600c60ff831610806138dd5750600e60ff8316115b905061396b565b600060ff8416108015906138fc5750600560ff841611155b1561390f5750600f60ff8216101561396b565b601560ff8416108015906139275750601a60ff841611155b1561396757600c60ff8316108015906139445750600e60ff831611155b806138dd5750600660ff8316108015906138dd575050600b60ff8216111561396b565b5060005b92915050565b601581565b600f6020526000908152604090205481565b600f81565b600060065b600b60ff821611610e9a5760ff81166000908152600c602052604090205461ffff169190910190600101613992565b600d5481565b600581565b60008054600160a060020a031633146139e457600080fd5b5060005b600b5461ffff9081169082161015613b8a576009600060078361ffff16815481101515613a1157fe5b6000918252602080832060088304015460079283166004026101000a900463ffffffff16845283019390935260409091018120600101548254600160a060020a03909116926108fc9260099290919061ffff8716908110613a6e57fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002060000160019054906101000a90046001608060020a03166001608060020a03169081150290604051600060405180830381858888f19350505050158015613af9573d6000803e3d6000fd5b506009600060078361ffff16815481101515613b1157fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff1683528201929092526040019020805470ffffffffffffffffffffffffffffffffff19168155600190810180547cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169055016139e8565b613b9660076000615a56565b50600b805461ffff19169055565b601a81565b600e81565b600080805b600b5461ffff9081169082161015613c2a576009600060078361ffff16815481101515613bdc57fe5b60009182526020808320600883040154600790921660040261010090810a90920463ffffffff1684528301939093526040909101902054046001608060020a03169190910190600101613bb3565b50303103919050565b606060008060008060006032604051908082528060200260200182016040528015613c68578160200160208202803883390190505b50600b5490965061ffff169150600090505b8161ffff168161ffff1610156141f05733600160a060020a03166009600060078461ffff16815481101515613cab57fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff168352820192909252604001902060010154600160a060020a0316148015613d5b5750426009600060078461ffff16815481101515613d0a57fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190206001015460a060020a900467ffffffffffffffff908116620151800116105b8015613e0f5750600c60ff166009600060078461ffff16815481101515613d7e57fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190205460ff161080613e0f5750600e60ff166009600060078461ffff16815481101515613dd757fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190205460ff16115b156141e8575b60008261ffff16118015613e89575033600160a060020a03166009600060076001860361ffff16815481101515613e4857fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff168352820192909252604001902060010154600160a060020a0316145b8015613efc5750426009600060076001860361ffff16815481101515613eab57fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190206001015460a060020a900467ffffffffffffffff908116620151800116105b8015613fb05750600c60ff166009600060078461ffff16815481101515613f1f57fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190205460ff161080613fb05750600e60ff166009600060078461ffff16815481101515613f7857fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190205460ff16115b1561410257600780546000199093019261ffff8416908110613fce57fe5b60009182526020808320600883040154600790921660040261010090810a90920463ffffffff1680845260098083526040808620805460ff9081168852600c8652918720805461ffff19811661ffff9182166000190190911617905595839052925292548951939750919091046001608060020a0316949094019385918891881690811061405857fe5b63ffffffff9283166020918202909201015260085460019096019585821660a060020a90910490911614156140a9576008805477ffffffff0000000000000000000000000000000000000000191690555b63ffffffff84166000908152600960205260409020805470ffffffffffffffffffffffffffffffffff1916815560010180547cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169055613e15565b8060010161ffff168261ffff1611156141e8576009600060078361ffff1681548110151561412c57fe5b60009182526020808320600883040154600792831660040261010090810a90910463ffffffff16855290840194909452604090920190205481549290046001608060020a031694909401939061ffff831690811061418657fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff16868660ff168151811015156141bd57fe5b63ffffffff909216602092830290910190910152600190940193600019909101906141e88183614db5565b600101613c7a565b600b805461ffff191661ffff84161790556040805133808252602080830187905260609383018481528a519484019490945289517f1e6d26af567145cb0b46ea7135e21671f1e58e8d1f818dab12b0e10eb5ebb07b94929388938c93919290916080840191858201910280838360005b83811015614278578181015183820152602001614260565b5050505090500194505050505060405180910390a1604051339084156108fc029085906000818181858888f193505050501580156142ba573d6000803e3d6000fd5b5060085460a060020a900463ffffffff1615156142d9576142d96143e4565b505050505050565b600081565b600b5461ffff1681565b600054600160a060020a0316331461430757600080fd5b600160a060020a038116151561431c57600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600054600160a060020a0316331461439b57600080fd5b80600160a060020a0316ff5b601b81565b60078054829081106143ba57fe5b9060005260206000209060089182820401919006600402915054906101000a900463ffffffff1681565b60001960005b600b5461ffff90811690821610156144df578163ffffffff1660078261ffff1681548110151561441657fe5b6000918252602090912060088204015460079091166004026101000a900463ffffffff161080156144975750600560ff166009600060078461ffff1681548110151561445e57fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190205460ff1611155b156144d7576007805461ffff83169081106144ae57fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1691505b6001016143ea565b506008805463ffffffff90921660a060020a0277ffffffff000000000000000000000000000000000000000019909216919091179055565b6000806000806000600160009054906101000a9004600160a060020a0316600160a060020a03166349b3b29f876040518263ffffffff1660e060020a028152600401808260ff168152602001915050602060405180830381600087803b15801561458057600080fd5b505af1158015614594573d6000803e3d6000fd5b505050506040513d60208110156145aa57600080fd5b50516001608060020a0316348115156145bf57fe5b049450600061ffff86161161466a576040805160e560020a62461bcd02815260206004820152604260248201527f696e73756666696369656e7420616d6f756e74206f6620657468657220746f2060448201527f7075726368617365206120676976656e2074797065206f66206368617261637460648201527f6572000000000000000000000000000000000000000000000000000000000000608482015290519081900360a40190fd5b600b54600154604080517f49e77c8b000000000000000000000000000000000000000000000000000000008152600160a060020a038b8116600483015260ff8b166024830152915161ffff90941697509116916349e77c8b916044808201926020929091908290030181600087803b1580156146e557600080fd5b505af11580156146f9573d6000803e3d6000fd5b505050506040513d602081101561470f57600080fd5b505115156147b3576040805160e560020a62461bcd02815260206004820152604360248201527f696e737566666963696e657420616d6f756e74206f6620746f6b656e7320746f60448201527f207075726368617365206120676976656e2074797065206f662063686172616360648201527f7465720000000000000000000000000000000000000000000000000000000000608482015290519081900360a40190fd5b601b60ff87161015806148625750600154604080517f49b3b29f00000000000000000000000000000000000000000000000000000000815260ff891660048201529051600160a060020a03909216916349b3b29f916024808201926020929091908290030181600087803b15801561482a57600080fd5b505af115801561483e573d6000803e3d6000fd5b505050506040513d602081101561485457600080fd5b50516001608060020a031634105b806148f55750600160009054906101000a9004600160a060020a0316600160a060020a0316638882ddc96040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156148bb57600080fd5b505af11580156148cf573d6000803e3d6000fd5b505050506040513d60208110156148e557600080fd5b505161ffff908116858701909116115b156148ff57600080fd5b60085463ffffffff169250600560ff871611614b825760085460a060020a900463ffffffff161580614940575060085460a060020a900463ffffffff908116145b15614975576008805477ffffffff0000000000000000000000000000000000000000191660a060020a63ffffffff8616021790555b600091505b8461ffff168260ff161015614b3f5761499b60ff8316848101908601615980565b6040805160a08101825260ff8816808252600154835160e060020a635e383d21028152600481019290925292519192602080850193600160a060020a0390921692635e383d2192602480830193928290030181600087803b1580156149ff57600080fd5b505af1158015614a13573d6000803e3d6000fd5b505050506040513d6020811015614a2957600080fd5b50516001608060020a039081168252600160a060020a038a81166020808501919091524267ffffffffffffffff9081166040808701919091526000606096870181905260ff8a81168c0163ffffffff168252600985529082902088518154958a015160ff199096169083161770ffffffffffffffffffffffffffffffff0019166101009590971694909402959095178355860151600192830180549688015160809098015173ffffffffffffffffffffffffffffffffffffffff1990971691909416177bffffffffffffffff0000000000000000000000000000000000000000191660a060020a96909116959095029490941760e060020a60ff02191660e060020a93909216929092021790559091019061497a565b60ff86166000908152600c60205260409020805461ffff1980821661ffff9283168901831617909255600b80549283169282168801909116919091179055614d36565b5060005b8461ffff168160ff161015614d36576040805160a08101825260ff8816808252600154835160e060020a635e383d21028152600481019290925292519192602080850193600160a060020a0390921692635e383d2192602480830193928290030181600087803b158015614bf957600080fd5b505af1158015614c0d573d6000803e3d6000fd5b505050506040513d6020811015614c2357600080fd5b50516001608060020a039081168252600160a060020a038a81166020808501919091524267ffffffffffffffff9081166040808701919091526000606096870181905260ff8981168c0163ffffffff168252600985529082902088518154958a015160ff199096169083161770ffffffffffffffffffffffffffffffff0019166101009590971694909402959095178355860151600192830180549688015160809098015173ffffffffffffffffffffffffffffffffffffffff1990971691909416177bffffffffffffffff0000000000000000000000000000000000000000191660a060020a96909116959095029490941760e060020a60ff02191660e060020a939092169290920217905501614b86565b6008805463ffffffff191661ffff871685810163ffffffff9081169290921790925560408051600160a060020a038b16815260ff8a166020820152808201939093529085166060830152517ff7ad76543f114c7bb00ff2cd992ff749d502ed5c0c6f87901ad48f6871fceca1916080908290030190a150505050505050565b600060078361ffff16815481101515614dca57fe5b6000918252602080832060088084049091015460079093166004026101000a90920463ffffffff9081168085526009835260408086205460ff168652600c90935291909320805461ffff19811661ffff91821660001901909116179055905490925060a060020a900416811415614e5d576008805477ffffffff0000000000000000000000000000000000000000191690555b63ffffffff81166000908152600960205260409020805470ffffffffffffffffffffffffffffffffff1916815560010180547cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690556007805461ffff8416908110614ec357fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1660078461ffff16815481101515614efc57fe5b90600052602060002090600891828204019190066004026101000a81548163ffffffff021916908363ffffffff16021790555060078261ffff16815481101515614f4257fe5b90600052602060002090600891828204019190066004026101000a81549063ffffffff0219169055505050565b600b546040805160001943014081524260208201527e0100000000000000000000000000000000000000000000000000000000000061ffff90931692909202828201526042820183905251908190036062019020919050565b600080600060078661ffff16815481101515614fe057fe5b6000918252602090912060088204015460079091166004026101000a900463ffffffff16915060019050600f60ff8516108015906150225750601460ff851611155b1561502b575060025b63ffffffff821660009081526010602052604090205460ff80831691161061507d5763ffffffff82166000908152601060205260408120805460ff8082168590031660ff1990911617905592506150e9565b6009600060078861ffff1681548110151561509457fe5b60009182526020808320600883040154600790921660040261010090810a90920463ffffffff16845283019390935260409091019020546000199690960195046001608060020a031692506150e98686614db5565b50509392505050565b60008060006060600080600080600860149054906101000a900463ffffffff1663ffffffff1660001415615128576151286143e4565b60085460a060020a900463ffffffff908116146151a55760085460a060020a900463ffffffff166000908152600960208190526040909120805470ffffffffffffffffffffffffffffffff00198116600a6001608060020a038e8116919091046101009384900482168101909116909202179091550297506151a9565b8897505b60408051601b8082526103808201909252909650866020820161036080388339019050509450600093505b8560ff168460ff1610156152ac57600c60ff851610806151f75750600e60ff8516115b8015615217575060ff84166000908152600c602052604081205461ffff16115b156152a1576001546040805160e060020a635e383d2102815260ff871660048201529051600160a060020a0390921691635e383d21916024808201926020929091908290030181600087803b15801561526f57600080fd5b505af1158015615283573d6000803e3d6000fd5b505050506040513d602081101561529957600080fd5b505196909601955b6001909301926151d4565b600092505b8560ff168360ff1610156153f557600c60ff851610806152d45750600e60ff8516115b80156152f4575060ff83166000908152600c602052604081205461ffff16115b156153ea5760ff83166000818152600c6020908152604080832054600154825160e060020a635e383d210281526004810196909652915161ffff909116946001608060020a038d1694600160a060020a0390931693635e383d219360248084019492938390030190829087803b15801561536d57600080fd5b505af1158015615381573d6000803e3d6000fd5b505050506040513d602081101561539757600080fd5b50518a026001608060020a03168115156153ad57fe5b046001608060020a03168115156153c057fe5b04858460ff168151811015156153d257fe5b6001608060020a039092166020928302909101909101525b6001909201916152b1565b5060005b600b5461ffff9081169082161015615562576009600060078361ffff1681548110151561542257fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190205460ff169150600c82108061546c5750600e60ff8316115b1561555a57846009600060078461ffff1681548110151561548957fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff168352820192909252604001902054815160ff9091169081106154cc57fe5b906020019060200201516009600060078461ffff168154811015156154ed57fe5b60009182526020808320600883040154600790921660040261010090810a90920463ffffffff16845283019390935260409091019020805470ffffffffffffffffffffffffffffffff00198116908390046001608060020a03908116949094019093169091029190911790555b6001016153f9565b505050505050505050565b600b5460009081908190819061ffff1661558687614f6f565b81151561558f57fe5b600b549190069350600761ffff9182160616156155ad5760076155cb565b600b805461ffff160661ffff166000146155c857600b6155cb565b600d5b60ff1691508290505b61562a856009600060078561ffff168154811015156155ef57fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190205460ff1661387e565b8015615694575033600160a060020a03166009600060078461ffff1681548110151561565257fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff168352820192909252604001902060010154600160a060020a031614155b156156a1578093506156d4565b600b5461ffff90811690828401168115156156b857fe5b06905061ffff808216908416146156ce576155d4565b60001993505b50505092915050565b5060a05190565b63ffffffff81166000908152600a602052604081205460ff1615615752576040805160e560020a62461bcd02815260206004820152601260248201527f616c72656164792074656c65706f727465640000000000000000000000000000604482015290519081900360640190fd5b5063ffffffff81166000908152600a60209081526040808320805460ff19166001179055600990915290208054600560ff9190911611615801576040805160e560020a62461bcd028152602060048201526024808201527f647261676f6e7320646f206e6f74206e65656420746f2062652074656c65706f60448201527f7274656400000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600b5461581390839061ffff16615980565b600b805461ffff8082166001908101821661ffff1993841617909355835460ff166000908152600c6020908152604091829020805480851690960190931694909316939093179055815163ffffffff8516815291517f663f46f5a2fd740de613966ad0391fbc9d840f82898698e6d7f16ba0ed126b3b9281900390910190a15050565b63ffffffff8216600081815260106020908152604091829020805460ff191660ff861690811790915582519384529083015280517f088ba7785fd329abbf01eaa732bad30e14b205b9fc8ab9378f9f5295731135559281900390910190a15050565b600080600160315b60056001608060020a0382161061597357846001608060020a0316836001608060020a0316111561593657806002019350615978565b9181019160286001608060020a0382161480159061595e5750806001608060020a0316600814155b1561596a576001820191505b60001901615900565b600593505b505050919050565b60075461ffff821610156159da578160078261ffff168154811015156159a257fe5b90600052602060002090600891828204019190066004026101000a81548163ffffffff021916908363ffffffff160217905550610b2a565b506007805460018101825560008290527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68860088204018054919092166004026101000a63ffffffff818102199092169390911602919091179055565b61014060405190810160405280600a906020820280388339509192915050565b5080546000825560070160089004906000526020600020908101906129029190615a9091905b80821115610e9a5760008155600101615a7c565b905600636f6e7472616374732063616e6e6f7420657865637574652074686973206d65a165627a7a7230582024fb9ce62e67c061cddce8f77ef450819e570b90c6d1314d8a2445db919382d70029000000000000000000000000c596bd09d652827b0106292d3e378d5938df4b12000000000000000000000000a54ddc7b3cce7fc8b1e3fa0256d0db80d2c10970000000000000000000000000a7bd9d58d22d5e35ec4a08083141e0340ea2ca93000000000000000000000000d28525ad63f337c86843d720dae921228e44f0ac000000000000000000000000ca1c217a2200b60dbd52e33c7cb1758db2b30a0e0000000000000000000000002a06579f0ab0f55995884222d8766ab10e6ac4bd
Deployed Bytecode
0x6080604052600436106102585763ffffffff60e060020a60003504166307da68f5811461025d5780630a3dfba7146102745780630fa6002e1461028e5780631d2a6dcf146102ac5780631e466eee146102d857806320e3dbd4146102ed57806326bdce711461030e57806328acb00214610339578063291ed7731461035a57806329b20bb61461038b57806330aaed53146103a65780633728bec2146103bb5780633c3c22b31461040c5780633ccfd60b1461043a5780634afe49c21461044f5780634f255b8014610464578063603709e31461048257806361b8ce8c1461055b578063726c86411461057057806372ad21c714610597578063773e1e84146105b557806379502c55146105da578063797e2aec1461060b57806383197ef014610619578063851ad4d61461062e5780638da5cb5b146106435780638f4ffcb1146106585780639271a988146106c85780639c73048b146106dd5780639ced242b146106f2578063a050d07d14610707578063a9689b4f146106c8578063ad389d5d1461071c578063ad70ae1a14610751578063b066ef3c14610766578063b0eee8db14610784578063b32dbcd814610799578063c10435cc146107ae578063c1255299146107c3578063c2052403146107d8578063d0f9bad1146107ed578063d39512b814610802578063db8d55f114610817578063dc9bb7db1461082c578063e9fad8ee14610841578063f10e2ec114610856578063f1be42f11461086b578063f2fde38b14610880578063f5074f41146108a1578063f690648d146108c2578063fac333ac146108d7578063fbe6529f146108ef575b600080fd5b34801561026957600080fd5b50610272610904565b005b610272600160a060020a036004351660ff60243516610935565b34801561029a57600080fd5b5061027263ffffffff60043516610b2e565b3480156102b857600080fd5b506102c1610e66565b6040805161ffff9092168252519081900360200190f35b3480156102e457600080fd5b50610272610e9e565b3480156102f957600080fd5b50610272600160a060020a0360043516611494565b34801561031a57600080fd5b506103236114da565b6040805160ff9092168252519081900360200190f35b34801561034557600080fd5b506102726001608060020a03600435166114df565b34801561036657600080fd5b5061036f611564565b604080516001608060020a039092168252519081900360200190f35b34801561039757600080fd5b506102c160ff6004351661157b565b3480156103b257600080fd5b50610323611591565b3480156103c757600080fd5b506103d963ffffffff60043516611596565b6040805160ff90941684526001608060020a039092166020840152600160a060020a031682820152519081900360600190f35b34801561041857600080fd5b506104216115d5565b6040805163ffffffff9092168252519081900360200190f35b34801561044657600080fd5b506102726115e8565b34801561045b57600080fd5b506102c1611818565b34801561047057600080fd5b506102c163ffffffff6004351661181e565b34801561048e57600080fd5b5061049e61ffff6004351661188a565b604051808561014080838360005b838110156104c45781810151838201526020016104ac565b5050505090500184600a60200280838360005b838110156104ef5781810151838201526020016104d7565b5050505090500183600a60200280838360005b8381101561051a578181015183820152602001610502565b5050505090500182600a60200280838360005b8381101561054557818101518382015260200161052d565b5050505090500194505050505060405180910390f35b34801561056757600080fd5b50610421611a31565b34801561057c57600080fd5b50610585611a3d565b60408051918252519081900360200190f35b3480156105a357600080fd5b5061032363ffffffff60043516611a43565b3480156105c157600080fd5b5061027263ffffffff6004351661ffff60243516611a58565b3480156105e657600080fd5b506105ef612895565b60408051600160a060020a039092168252519081900360200190f35b61027260ff600435166128a4565b34801561062557600080fd5b50610272612905565b34801561063a57600080fd5b506102c161292a565b34801561064f57600080fd5b506105ef61295d565b34801561066457600080fd5b50604080516020601f60643560048181013592830184900484028501840190955281845261027294600160a060020a0381358116956024803596604435909316953695608494920191819084018382808284375094975061296c9650505050505050565b3480156106d457600080fd5b50610323613176565b3480156106e957600080fd5b5061027261317b565b3480156106fe57600080fd5b50610323613845565b34801561071357600080fd5b506102c161384a565b34801561072857600080fd5b5061073d60ff6004358116906024351661387e565b604080519115158252519081900360200190f35b34801561075d57600080fd5b50610323613971565b34801561077257600080fd5b5061058563ffffffff60043516613976565b34801561079057600080fd5b50610323613988565b3480156107a557600080fd5b506102c161398d565b3480156107ba57600080fd5b506105856139c1565b3480156107cf57600080fd5b506103236139c7565b3480156107e457600080fd5b506102726139cc565b3480156107f957600080fd5b50610323613ba4565b34801561080e57600080fd5b50610323613ba9565b34801561082357600080fd5b50610585613bae565b34801561083857600080fd5b50610421611818565b34801561084d57600080fd5b50610272613c33565b34801561086257600080fd5b506103236142e1565b34801561087757600080fd5b506102c16142e6565b34801561088c57600080fd5b50610272600160a060020a03600435166142f0565b3480156108ad57600080fd5b50610272600160a060020a0360043516614384565b3480156108ce57600080fd5b506103236143a7565b3480156108e357600080fd5b506104216004356143ac565b3480156108fb57600080fd5b506102726143e4565b600054600160a060020a0316331461091b57600080fd5b6109236115e8565b61092b6139cc565b610933612905565b565b333214610989576040805160e560020a62461bcd02815260206004820152602480820152600080516020615a94833981519152604482015260e260020a631d1a1bd902606482015290519081900360840190fd5b6109938282614517565b600160009054906101000a9004600160a060020a0316600160a060020a0316632091f9556040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156109e657600080fd5b505af11580156109fa573d6000803e3d6000fd5b505050506040513d6020811015610a1057600080fd5b5051600154604080517f5bdaa8e70000000000000000000000000000000000000000000000000000000081529051600160a060020a039384169363a9059cbb938793911691635bdaa8e7916004808201926020929091908290030181600087803b158015610a7d57600080fd5b505af1158015610a91573d6000803e3d6000fd5b505050506040513d6020811015610aa757600080fd5b50516040805160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091525160448083019260209291908290030181600087803b158015610af657600080fd5b505af1158015610b0a573d6000803e3d6000fd5b505050506040513d6020811015610b2057600080fd5b50511515610b2a57fe5b5050565b6000333214610b84576040805160e560020a62461bcd02815260206004820152602480820152600080516020615a94833981519152604482015260e260020a631d1a1bd902606482015290519081900360840190fd5b63ffffffff8216600090815260096020526040902060010154600160a060020a03163314610c22576040805160e560020a62461bcd02815260206004820152602560248201527f6f6e6c79206f776e6572732063616e2073656c6c20746865697220636861726160448201527f6374657273000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b63ffffffff8216600090815260096020526040902054600c60ff9091161080610c65575063ffffffff8216600090815260096020526040902054600e60ff909116115b1515610cbb576040805160e560020a62461bcd02815260206004820152601960248201527f62616c6c6f6f6e7320617265206e6f742073656c6c61626c6500000000000000604482015290519081900360640190fd5b63ffffffff82166000908152600960205260409020600101544260a060020a90910467ffffffffffffffff90811662015180011610610d6a576040805160e560020a62461bcd02815260206004820152603360248201527f6368617261637465722063616e20626520736f6c64206f6e6c7920312064617960448201527f2061667465722074686520707572636861736500000000000000000000000000606482015290519081900360840190fd5b5063ffffffff8116600090815260096020526040902054600b805461ffff19811661ffff9182166000190190911617905561010090046001608060020a0316610dc1610db58361181e565b600b5461ffff16614db5565b60405133906001608060020a03831680156108fc02916000818181858888f19350505050158015610df6573d6000803e3d6000fd5b5060085460a060020a900463ffffffff161515610e1557610e156143e4565b6040805163ffffffff841681523360208201526001608060020a0383168183015290517fe5cc68f68d9672681158062a835b6abc2ff3fba89f8db70f3a227d4ac35da3c39181900360600190a15050565b600060155b601a60ff821611610e9a5760ff81166000908152600c602052604090205461ffff169190910190600101610e6b565b5090565b6000808080808080606080828080333214610f00576040805160e560020a62461bcd02815260206004820152602480820152600080516020615a94833981519152604482015260e260020a631d1a1bd902606482015290519081900360840190fd5b600160009054906101000a9004600160a060020a0316600160a060020a031663afb7e4956040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610f5357600080fd5b505af1158015610f67573d6000803e3d6000fd5b505050506040513d6020811015610f7d57600080fd5b5051600d5401421015611000576040805160e560020a62461bcd02815260206004820152602a60248201527f6e6f7420656e6f7567682074696d65207061737365642073696e6365206c617360448201527f74206572757074696f6e00000000000000000000000000000000000000000000606482015290519081900360840190fd5b600b54600061ffff90911611611086576040805160e560020a62461bcd02815260206004820152602360248201527f746865726520617265206e6f206368617261637465727320696e20746865206760448201527f616d650000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b42600d55600b54600154604080517f11a5a793000000000000000000000000000000000000000000000000000000008152905161ffff9093169a50606492600160a060020a03909216916311a5a793916004808201926020929091908290030181600087803b1580156110f857600080fd5b505af115801561110c573d6000803e3d6000fd5b505050506040513d602081101561112257600080fd5b505160ff16890261ffff1681151561113657fe5b0461ffff1696508761ffff1661271002620138800163ffffffff1695508663ffffffff166000141561116757600196505b8663ffffffff16604051908082528060200260200182016040528015611197578160200160208202803883390190505b506008546040805163ffffffff90921680835260208082028401019091529196509080156111cf578160200160208202803883390190505b50935060009250600091505b8663ffffffff168361ffff1610156112fb5781806001019250508761ffff1661120b8361ffff16600d5401614f6f565b81151561121457fe5b06995060078a61ffff1681548110151561122a57fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff169850838963ffffffff1681518110151561126657fe5b9060200190602002015115156112f6576001848a63ffffffff1681518110151561128c57fe5b91151560209283029091019091015284518990869061ffff86169081106112af57fe5b63ffffffff9092166020928302909101909101526112cf8a896000614fc8565b9a5060008b6001608060020a031611156112eb57600019909701965b9a8a019a6001909201915b6111db565b50600b805461ffff891661ffff199091161790556001608060020a038086163a0290818116908d1611156113e457611334818d036150f2565b7fa06ad7d0261a795ad8f33fdbef7cf65a0f9f9a825353b13358a96a750acd6b3d85828e03836040518080602001846001608060020a03166001608060020a03168152602001836001608060020a03166001608060020a03168152602001828103825285818151815260200191508051906020019060200280838360005b838110156113ca5781810151838201526020016113b2565b5050505090500194505050505060405180910390a1611486565b7fa06ad7d0261a795ad8f33fdbef7cf65a0f9f9a825353b13358a96a750acd6b3d856000836040518080602001846001608060020a03168152602001836001608060020a03166001608060020a03168152602001828103825285818151815260200191508051906020019060200280838360005b83811015611470578181015183820152602001611458565b5050505090500194505050505060405180910390a15b505050505050505050505050565b600054600160a060020a031633146114ab57600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600b81565b60008054600160a060020a031633146114f757600080fd5b6114ff613bae565b9050808267016345785d8a0000016001608060020a03161015610b2a5760008054604051600160a060020a03909116916001608060020a03851680156108fc02929091818181858888f1935050505015801561155f573d6000803e3d6000fd5b505050565b60085464010000000090046001608060020a031681565b600c6020526000908152604090205461ffff1681565b600c81565b63ffffffff166000908152600960205260409020805460019091015460ff8216926101009092046001608060020a031691600160a060020a0390911690565b60085460a060020a900463ffffffff1681565b600080548190600160a060020a0316331461160257600080fd5b6002546040805160e060020a6370a082310281523060048201529051600160a060020a03909216916370a08231916024808201926020929091908290030181600087803b15801561165257600080fd5b505af1158015611666573d6000803e3d6000fd5b505050506040513d602081101561167c57600080fd5b505160025460008054604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015260248101869052905194965092169263a9059cbb926044808201936020939283900390910190829087803b1580156116f357600080fd5b505af1158015611707573d6000803e3d6000fd5b505050506040513d602081101561171d57600080fd5b5051151561172757fe5b6003546040805160e060020a6370a082310281523060048201529051600160a060020a03909216916370a08231916024808201926020929091908290030181600087803b15801561177757600080fd5b505af115801561178b573d6000803e3d6000fd5b505050506040513d60208110156117a157600080fd5b505160035460008054604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015260248101869052905194955092169263a9059cbb926044808201936020939283900390910190829087803b158015610af657600080fd5b60001981565b6000805b60075461ffff82161015610258578263ffffffff1660078261ffff1681548110151561184a57fe5b6000918252602090912060088204015460079091166004026101000a900463ffffffff16141561187c57809150611884565b600101611822565b50919050565b611892615a36565b61189a615a36565b6118a2615a36565b6118aa615a36565b600b5460009081908190819061ffff908116600a8b01909116116118d15788600a016118d9565b600b5461ffff165b61ffff169350600092508890505b8363ffffffff168161ffff161015611a26576007805461ffff831690811061190b57fe5b6000918252602090912060088204015460079091166004026101000a900463ffffffff169150818860ff8516600a811061194157fe5b63ffffffff9283166020918202929092019190915290831660009081526009909152604090205460ff9081169088908516600a811061197c57fe5b60ff9283166020918202929092019190915263ffffffff841660009081526009909152604090205461010090046001608060020a03169087908516600a81106119c157fe5b6001608060020a039092166020928302919091015263ffffffff8316600090815260099091526040902060010154600160a060020a03168560ff8516600a8110611a0757fe5b600160a060020a039092166020929092020152600192830192016118e7565b505050509193509193565b60085463ffffffff1681565b600e5481565b60106020526000908152604090205460ff1681565b6000808080808080808080333214611ab7576040805160e560020a62461bcd02815260206004820152602480820152600080516020615a94833981519152604482015260e260020a631d1a1bd902606482015290519081900360840190fd5b6007805461ffff8d16908110611ac957fe5b6000918252602090912060088204015460079091166004026101000a900463ffffffff908116908d1614611b0357611b008c61181e565b9a505b63ffffffff8c16600090815260096020908152604080832060015482517f4597dc8e0000000000000000000000000000000000000000000000000000000081529251919e504294600160a060020a0390911693634597dc8e936004808201949293918390030190829087803b158015611b7b57600080fd5b505af1158015611b8f573d6000803e3d6000fd5b505050506040513d6020811015611ba557600080fd5b505163ffffffff8e166000908152600f6020526040902054011115611c3a576040805160e560020a62461bcd02815260206004820152603d60248201527f6e6f7420656e6f7567682074696d65207061737365642073696e63652074686560448201527f206c617374206669676874206f66207468697320636861726163746572000000606482015290519081900360840190fd5b60018a0154600160a060020a03163314611cc4576040805160e560020a62461bcd02815260206004820152603260248201527f6f6e6c79206f776e65722063616e20696e69746961746520612066696768742060448201527f666f722074686973206368617261637465720000000000000000000000000000606482015290519081900360840190fd5b895460ff169850600c891080611cdd5750600e60ff8a16115b1515611d33576040805160e560020a62461bcd02815260206004820152601560248201527f62616c6c6f6f6e732063616e6e6f742066696768740000000000000000000000604482015290519081900360640190fd5b611d438c63ffffffff168a61556d565b975061ffff8089161415611d5357fe5b6007805461ffff8a16908110611d6557fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff908116808452600990925260409092209098509650606490611dac908e16614f6f565b811515611db557fe5b069250600160009054906101000a9004600160a060020a0316600160a060020a0316638f7561476040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611e0b57600080fd5b505af1158015611e1f573d6000803e3d6000fd5b505050506040513d6020811015611e3557600080fd5b5051600480546040805160e060020a6370a08231028152339381019390935251600160a060020a03909116916370a082319160248083019260209291908290030181600087803b158015611e8857600080fd5b505af1158015611e9c573d6000803e3d6000fd5b505050506040513d6020811015611eb257600080fd5b505110611eed576064611ec88461ffff16614f6f565b811515611ed157fe5b0693508261ffff168461ffff161015611ee8578392505b600093505b60065460018b01546040805160e060020a6370a08231028152600160a060020a039283166004820152905191909216916370a082319160248083019260209291908290030181600087803b158015611f4457600080fd5b505af1158015611f58573d6000803e3d6000fd5b505050506040513d6020811015611f6e57600080fd5b505160055460018c01546040805160e060020a6370a08231028152600160a060020a039283166004820152905166038d7ea4c680009392909216916370a08231916024808201926020929091908290030181600087803b158015611fd157600080fd5b505af1158015611fe5573d6000803e3d6000fd5b505050506040513d6020811015611ffb57600080fd5b505181151561200657fe5b60065460018a01546040805160e060020a6370a08231028152600160a060020a03928316600482015290519490930494909401955092909216916370a082319160248083019260209291908290030181600087803b15801561206757600080fd5b505af115801561207b573d6000803e3d6000fd5b505050506040513d602081101561209157600080fd5b505160055460018801546040805160e060020a6370a08231028152600160a060020a039283166004820152905166038d7ea4c680009392909216916370a08231916024808201926020929091908290030181600087803b1580156120f457600080fd5b505af1158015612108573d6000803e3d6000fd5b505050506040513d602081101561211e57600080fd5b505181151561212957fe5b88548d5492909104929092019250610100918290046001608060020a039081169290910416141561229d5760329350808211156121fa57600160009054906101000a9004600160a060020a0316600160a060020a0316634ad6e6486040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156121b357600080fd5b505af11580156121c7573d6000803e3d6000fd5b505050506040513d60208110156121dd57600080fd5b505160ff1660648115156121ed57fe5b0460ff1684019350612298565b8181111561229857600160009054906101000a9004600160a060020a0316600160a060020a0316634ad6e6486040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561225557600080fd5b505af1158015612269573d6000803e3d6000fd5b505050506040513d602081101561227f57600080fd5b505160ff16606481151561228f57fe5b0460ff16840393505b612463565b85548a546001608060020a036101009283900481169290910416111561239457606493508181111561229857600160009054906101000a9004600160a060020a0316600160a060020a0316634ad6e6486040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561231c57600080fd5b505af1158015612330573d6000803e3d6000fd5b505050506040513d602081101561234657600080fd5b50518a54875460ff90921691610100918290046001608060020a039081169290910481166064021681151561237757fe5b046001608060020a031681151561238a57fe5b0484039350612463565b8082111561246357600160009054906101000a9004600160a060020a0316600160a060020a0316634ad6e6486040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156123ef57600080fd5b505af1158015612403573d6000803e3d6000fd5b505050506040513d602081101561241957600080fd5b505186548b5460ff90921691610100918290046001608060020a039081169290910481166064021681151561244a57fe5b046001608060020a031681151561245d57fe5b04840193505b61ffff808516908416106126b1578554600c60ff909116108061248c57508554600e60ff909116115b1561265257600b5486546124ab918d9161ffff9091169060ff16614fc8565b94506000856001608060020a031611156124de57600b805461ffff19811661ffff91821660001901909116179055612559565b63ffffffff8c166000908152600f602090815260408083204290556009909152902060010154600360e060020a90910460ff1610156125595763ffffffff8c1660009081526009602052604090206001908101805460ff60e060020a80830482169094011690920260e060020a60ff02199092169190911790555b8554601560ff9091161080159061257757508554601a60ff90911611155b156125ba57600880546001608060020a03640100000000808304821689019091160273ffffffffffffffffffffffffffffffff00000000199091161790556125ec565b85546001608060020a03610100808304821688019091160270ffffffffffffffffffffffffffffffff00199091161786555b6040805163ffffffff808a1682528e1660208201526001608060020a0387168183015261ffff80871660608301528516608082015290517f24758388bd6bf650dde3bbde100b1056920770025a9f1c5998b4587670d4f3859181900360a00190a16126ac565b6040805163ffffffff808a1682528e16602082015260008183015261ffff80871660608301528516608082015290517f24758388bd6bf650dde3bbde100b1056920770025a9f1c5998b4587670d4f3859181900360a00190a15b611486565b63ffffffff8c166000908152600f602090815260408083204290556009909152902060010154600360e060020a90910460ff16101561272c5763ffffffff8c1660009081526009602052604090206001908101805460ff60e060020a80830482169094011690920260e060020a60ff02199092169190911790555b600b548a54612746918a9161ffff9091169060ff16614fc8565b94506000856001608060020a0316111561277557600b805461ffff19811661ffff918216600019019091161790555b8954601560ff9091161080159061279357508954601a60ff90911611155b156127d657600880546001608060020a03640100000000808304821689019091160273ffffffffffffffffffffffffffffffff0000000019909116179055612808565b89546001608060020a03610100808304821688019091160270ffffffffffffffffffffffffffffffff0019909116178a555b60085460a060020a900463ffffffff161515612826576128266143e4565b6040805163ffffffff808f168252891660208201526001608060020a0387168183015261ffff80871660608301528516608082015290517f24758388bd6bf650dde3bbde100b1056920770025a9f1c5998b4587670d4f3859181900360a00190a1505050505050505050505050565b600154600160a060020a031681565b3332146128f8576040805160e560020a62461bcd02815260206004820152602480820152600080516020615a94833981519152604482015260e260020a631d1a1bd902606482015290519081900360840190fd5b6129023382614517565b50565b600054600160a060020a0316331461291c57600080fd5b600054600160a060020a0316ff5b6000805b600560ff821611610e9a5760ff81166000908152600c602052604090205461ffff16919091019060010161292e565b600054600160a060020a031681565b60035460009081908190819081908190600160a060020a0316331415612ba057612995876156dd565b9550600160009054906101000a9004600160a060020a0316600160a060020a0316636121e5226040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156129ea57600080fd5b505af11580156129fe573d6000803e3d6000fd5b505050506040513d6020811015612a1457600080fd5b505163ffffffff8716600090815260096020526040902054909550600c60ff90911610801590612a5f575063ffffffff8616600090815260096020526040902054601460ff90911611155b15612a6b576002850294505b84891015612ae9576040805160e560020a62461bcd02815260206004820152603860248201527f696e737566666963696e657420616d6f756e74206f6620746f6b656e7320746f60448201527f2074656c65706f72742074686973206368617261637465720000000000000000606482015290519081900360840190fd5b600354604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a038d8116600483015230602483015260448201899052915191909216916323b872dd9160648083019260209291908290030181600087803b158015612b5e57600080fd5b505af1158015612b72573d6000803e3d6000fd5b505050506040513d6020811015612b8857600080fd5b50511515612b9257fe5b612b9b866156e4565b61316a565b600254600160a060020a03163314156130f457612bbc876156dd565b63ffffffff8116600090815260096020908152604080832054600154825160e060020a635e383d2102815260ff909216600483018190529251959b50919850600160a060020a0390911693635e383d2193602480840194938390030190829087803b158015612c2a57600080fd5b505af1158015612c3e573d6000803e3d6000fd5b505050506040513d6020811015612c5457600080fd5b505163ffffffff871660009081526009602052604090205461010090046001608060020a03908116911614612d1f576040805160e560020a62461bcd02815260206004820152605c60248201527f70726f74656374696f6e20636f756c6420626520626f75676874206f6e6c792060448201527f6265666f72652074686520666972737420666967687420616e64206265666f7260648201527f652074686520666972737420766f6c63616e6f206572757074696f6e00000000608482015290519081900360a40190fd5b600b60ff851611612dc257600160009054906101000a9004600160a060020a0316600160a060020a03166319f353bb6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612d7d57600080fd5b505af1158015612d91573d6000803e3d6000fd5b505050506040513d6020811015612da757600080fd5b5051600660ff86160660010160ff1602925060039150612fec565b600c60ff851610801590612dda5750600e60ff851611155b15612e7d57600160009054906101000a9004600160a060020a0316600160a060020a03166319f353bb6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612e3257600080fd5b505af1158015612e46573d6000803e3d6000fd5b505050506040513d6020811015612e5c57600080fd5b505160066003860160ff160660010160ff1602600202925060069150612fec565b600f60ff851610801590612e955750601460ff851611155b15612f3857600160009054906101000a9004600160a060020a0316600160a060020a03166319f353bb6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612eed57600080fd5b505af1158015612f01573d6000803e3d6000fd5b505050506040513d6020811015612f1757600080fd5b505160066003860160ff160660010160ff1602600202925060039150612fec565b601560ff851610801590612f505750601a60ff851611155b15612fec57600160009054906101000a9004600160a060020a0316600160a060020a03166319f353bb6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612fa857600080fd5b505af1158015612fbc573d6000803e3d6000fd5b505050506040513d6020811015612fd257600080fd5b505160066003860160ff160660010160ff16029250600391505b5063ffffffff851660009081526010602052604081205490945060ff165b8160ff168160ff1610801561302957508060010160ff16830285018910155b156130415760010160ff81168302949094019361300a565b600254604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a038d8116600483015230602483015260448201899052915191909216916323b872dd9160648083019260209291908290030181600087803b1580156130b657600080fd5b505af11580156130ca573d6000803e3d6000fd5b505050506040513d60208110156130e057600080fd5b505115156130ea57fe5b612b9b8682615896565b6040805160e560020a62461bcd02815260206004820152603160248201527f53686f756c64206265206569746865722066726f6d204e65766572646965206f60448201527f722054656c65706f727420746f6b656e73000000000000000000000000000000606482015290519081900360840190fd5b50505050505050505050565b600681565b6000808060608181818080803332146131db576040805160e560020a62461bcd02815260206004820152602480820152600080516020615a94833981519152604482015260e260020a631d1a1bd902606482015290519081900360840190fd5b600160009054906101000a9004600160a060020a0316600160a060020a03166399bd59ee6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561322e57600080fd5b505af1158015613242573d6000803e3d6000fd5b505050506040513d602081101561325857600080fd5b5051600e54014210156132db576040805160e560020a62461bcd02815260206004820152603e60248201527f6e6f7420656e6f7567682074696d65207061737365642073696e63652074686560448201527f206c61737420636173746c65206c6f6f7420646973747269627574696f6e0000606482015290519081900360840190fd5b42600e8190556132ef906103e890066158f8565b995060058a6001608060020a0316101561330857600599505b6008546064906001608060020a0364010000000090910481168c021660408051600680825260e08201909252929091049a506020820160c08038833901905050600b546040805161ffff909216808352602080820284010190915291985090801561337d578160200160208202803883390190505b509450600092505b60075460ff841610156135bc576009600060078560ff168154811015156133a857fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190205460ff169350601584108015906133f55750601a60ff851611155b8015613457575060036009600060078660ff1681548110151561341457fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190206001015460e060020a900460ff1610155b80156134c4575062093a806009600060078660ff1681548110151561347857fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190206001015460a060020a900467ffffffffffffffff16420310155b156135b1576001546040805160e060020a635e383d2102815260ff871660048201529051600160a060020a0390921691635e383d21916024808201926020929091908290030181600087803b15801561351c57600080fd5b505af1158015613530573d6000803e3d6000fd5b505050506040513d602081101561354657600080fd5b505160078054999091019860ff851690811061355e57fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff16858761ffff1681518110151561359657fe5b63ffffffff9092166020928302909101909101526001909501945b600190920191613385565b6000886001608060020a0316111561380557600091505b600660ff831610156136b1576001546040805160e060020a635e383d2102815260ff6015860116600482015290516001608060020a038b1692600160a060020a031691635e383d219160248083019260209291908290030181600087803b15801561363d57600080fd5b505af1158015613651573d6000803e3d6000fd5b505050506040513d602081101561366757600080fd5b50518a026001608060020a031681151561367d57fe5b04878360ff1681518110151561368f57fe5b6001608060020a039092166020928302909101909101526001909101906135d3565b5060005b8561ffff168161ffff16101561378f5786601560096000888561ffff168151811015156136de57fe5b602090810290910181015163ffffffff16825281019190915260400160002054825160ff918216929092031690811061371357fe5b9060200190602002015160096000878461ffff1681518110151561373357fe5b602090810290910181015163ffffffff16825281019190915260400160002080546001608060020a0361010080830482169094011690920270ffffffffffffffffffffffffffffffff00199092169190911790556001016136b5565b600880546001608060020a0364010000000080830482168d900382160273ffffffffffffffffffffffffffffffff00000000199092169190911790915560408051918b168252517f2359110bd6bbc405457edff9ea27ed0310d86730da626b57da3ba05cae1ce22d9181900360200190a161316a565b604080516000815290517f2359110bd6bbc405457edff9ea27ed0310d86730da626b57da3ba05cae1ce22d9181900360200190a150505050505050505050565b601481565b6000600f5b601460ff821611610e9a5760ff81166000908152600c602052604090205461ffff16919091019060010161384f565b6000600660ff8416108015906138985750600b60ff841611155b156138ab5750600560ff8216111561396b565b600f60ff8416108015906138c35750601460ff841611155b156138e457600c60ff831610806138dd5750600e60ff8316115b905061396b565b600060ff8416108015906138fc5750600560ff841611155b1561390f5750600f60ff8216101561396b565b601560ff8416108015906139275750601a60ff841611155b1561396757600c60ff8316108015906139445750600e60ff831611155b806138dd5750600660ff8316108015906138dd575050600b60ff8216111561396b565b5060005b92915050565b601581565b600f6020526000908152604090205481565b600f81565b600060065b600b60ff821611610e9a5760ff81166000908152600c602052604090205461ffff169190910190600101613992565b600d5481565b600581565b60008054600160a060020a031633146139e457600080fd5b5060005b600b5461ffff9081169082161015613b8a576009600060078361ffff16815481101515613a1157fe5b6000918252602080832060088304015460079283166004026101000a900463ffffffff16845283019390935260409091018120600101548254600160a060020a03909116926108fc9260099290919061ffff8716908110613a6e57fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002060000160019054906101000a90046001608060020a03166001608060020a03169081150290604051600060405180830381858888f19350505050158015613af9573d6000803e3d6000fd5b506009600060078361ffff16815481101515613b1157fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff1683528201929092526040019020805470ffffffffffffffffffffffffffffffffff19168155600190810180547cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169055016139e8565b613b9660076000615a56565b50600b805461ffff19169055565b601a81565b600e81565b600080805b600b5461ffff9081169082161015613c2a576009600060078361ffff16815481101515613bdc57fe5b60009182526020808320600883040154600790921660040261010090810a90920463ffffffff1684528301939093526040909101902054046001608060020a03169190910190600101613bb3565b50303103919050565b606060008060008060006032604051908082528060200260200182016040528015613c68578160200160208202803883390190505b50600b5490965061ffff169150600090505b8161ffff168161ffff1610156141f05733600160a060020a03166009600060078461ffff16815481101515613cab57fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff168352820192909252604001902060010154600160a060020a0316148015613d5b5750426009600060078461ffff16815481101515613d0a57fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190206001015460a060020a900467ffffffffffffffff908116620151800116105b8015613e0f5750600c60ff166009600060078461ffff16815481101515613d7e57fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190205460ff161080613e0f5750600e60ff166009600060078461ffff16815481101515613dd757fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190205460ff16115b156141e8575b60008261ffff16118015613e89575033600160a060020a03166009600060076001860361ffff16815481101515613e4857fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff168352820192909252604001902060010154600160a060020a0316145b8015613efc5750426009600060076001860361ffff16815481101515613eab57fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190206001015460a060020a900467ffffffffffffffff908116620151800116105b8015613fb05750600c60ff166009600060078461ffff16815481101515613f1f57fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190205460ff161080613fb05750600e60ff166009600060078461ffff16815481101515613f7857fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190205460ff16115b1561410257600780546000199093019261ffff8416908110613fce57fe5b60009182526020808320600883040154600790921660040261010090810a90920463ffffffff1680845260098083526040808620805460ff9081168852600c8652918720805461ffff19811661ffff9182166000190190911617905595839052925292548951939750919091046001608060020a0316949094019385918891881690811061405857fe5b63ffffffff9283166020918202909201015260085460019096019585821660a060020a90910490911614156140a9576008805477ffffffff0000000000000000000000000000000000000000191690555b63ffffffff84166000908152600960205260409020805470ffffffffffffffffffffffffffffffffff1916815560010180547cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169055613e15565b8060010161ffff168261ffff1611156141e8576009600060078361ffff1681548110151561412c57fe5b60009182526020808320600883040154600792831660040261010090810a90910463ffffffff16855290840194909452604090920190205481549290046001608060020a031694909401939061ffff831690811061418657fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff16868660ff168151811015156141bd57fe5b63ffffffff909216602092830290910190910152600190940193600019909101906141e88183614db5565b600101613c7a565b600b805461ffff191661ffff84161790556040805133808252602080830187905260609383018481528a519484019490945289517f1e6d26af567145cb0b46ea7135e21671f1e58e8d1f818dab12b0e10eb5ebb07b94929388938c93919290916080840191858201910280838360005b83811015614278578181015183820152602001614260565b5050505090500194505050505060405180910390a1604051339084156108fc029085906000818181858888f193505050501580156142ba573d6000803e3d6000fd5b5060085460a060020a900463ffffffff1615156142d9576142d96143e4565b505050505050565b600081565b600b5461ffff1681565b600054600160a060020a0316331461430757600080fd5b600160a060020a038116151561431c57600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600054600160a060020a0316331461439b57600080fd5b80600160a060020a0316ff5b601b81565b60078054829081106143ba57fe5b9060005260206000209060089182820401919006600402915054906101000a900463ffffffff1681565b60001960005b600b5461ffff90811690821610156144df578163ffffffff1660078261ffff1681548110151561441657fe5b6000918252602090912060088204015460079091166004026101000a900463ffffffff161080156144975750600560ff166009600060078461ffff1681548110151561445e57fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190205460ff1611155b156144d7576007805461ffff83169081106144ae57fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1691505b6001016143ea565b506008805463ffffffff90921660a060020a0277ffffffff000000000000000000000000000000000000000019909216919091179055565b6000806000806000600160009054906101000a9004600160a060020a0316600160a060020a03166349b3b29f876040518263ffffffff1660e060020a028152600401808260ff168152602001915050602060405180830381600087803b15801561458057600080fd5b505af1158015614594573d6000803e3d6000fd5b505050506040513d60208110156145aa57600080fd5b50516001608060020a0316348115156145bf57fe5b049450600061ffff86161161466a576040805160e560020a62461bcd02815260206004820152604260248201527f696e73756666696369656e7420616d6f756e74206f6620657468657220746f2060448201527f7075726368617365206120676976656e2074797065206f66206368617261637460648201527f6572000000000000000000000000000000000000000000000000000000000000608482015290519081900360a40190fd5b600b54600154604080517f49e77c8b000000000000000000000000000000000000000000000000000000008152600160a060020a038b8116600483015260ff8b166024830152915161ffff90941697509116916349e77c8b916044808201926020929091908290030181600087803b1580156146e557600080fd5b505af11580156146f9573d6000803e3d6000fd5b505050506040513d602081101561470f57600080fd5b505115156147b3576040805160e560020a62461bcd02815260206004820152604360248201527f696e737566666963696e657420616d6f756e74206f6620746f6b656e7320746f60448201527f207075726368617365206120676976656e2074797065206f662063686172616360648201527f7465720000000000000000000000000000000000000000000000000000000000608482015290519081900360a40190fd5b601b60ff87161015806148625750600154604080517f49b3b29f00000000000000000000000000000000000000000000000000000000815260ff891660048201529051600160a060020a03909216916349b3b29f916024808201926020929091908290030181600087803b15801561482a57600080fd5b505af115801561483e573d6000803e3d6000fd5b505050506040513d602081101561485457600080fd5b50516001608060020a031634105b806148f55750600160009054906101000a9004600160a060020a0316600160a060020a0316638882ddc96040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156148bb57600080fd5b505af11580156148cf573d6000803e3d6000fd5b505050506040513d60208110156148e557600080fd5b505161ffff908116858701909116115b156148ff57600080fd5b60085463ffffffff169250600560ff871611614b825760085460a060020a900463ffffffff161580614940575060085460a060020a900463ffffffff908116145b15614975576008805477ffffffff0000000000000000000000000000000000000000191660a060020a63ffffffff8616021790555b600091505b8461ffff168260ff161015614b3f5761499b60ff8316848101908601615980565b6040805160a08101825260ff8816808252600154835160e060020a635e383d21028152600481019290925292519192602080850193600160a060020a0390921692635e383d2192602480830193928290030181600087803b1580156149ff57600080fd5b505af1158015614a13573d6000803e3d6000fd5b505050506040513d6020811015614a2957600080fd5b50516001608060020a039081168252600160a060020a038a81166020808501919091524267ffffffffffffffff9081166040808701919091526000606096870181905260ff8a81168c0163ffffffff168252600985529082902088518154958a015160ff199096169083161770ffffffffffffffffffffffffffffffff0019166101009590971694909402959095178355860151600192830180549688015160809098015173ffffffffffffffffffffffffffffffffffffffff1990971691909416177bffffffffffffffff0000000000000000000000000000000000000000191660a060020a96909116959095029490941760e060020a60ff02191660e060020a93909216929092021790559091019061497a565b60ff86166000908152600c60205260409020805461ffff1980821661ffff9283168901831617909255600b80549283169282168801909116919091179055614d36565b5060005b8461ffff168160ff161015614d36576040805160a08101825260ff8816808252600154835160e060020a635e383d21028152600481019290925292519192602080850193600160a060020a0390921692635e383d2192602480830193928290030181600087803b158015614bf957600080fd5b505af1158015614c0d573d6000803e3d6000fd5b505050506040513d6020811015614c2357600080fd5b50516001608060020a039081168252600160a060020a038a81166020808501919091524267ffffffffffffffff9081166040808701919091526000606096870181905260ff8981168c0163ffffffff168252600985529082902088518154958a015160ff199096169083161770ffffffffffffffffffffffffffffffff0019166101009590971694909402959095178355860151600192830180549688015160809098015173ffffffffffffffffffffffffffffffffffffffff1990971691909416177bffffffffffffffff0000000000000000000000000000000000000000191660a060020a96909116959095029490941760e060020a60ff02191660e060020a939092169290920217905501614b86565b6008805463ffffffff191661ffff871685810163ffffffff9081169290921790925560408051600160a060020a038b16815260ff8a166020820152808201939093529085166060830152517ff7ad76543f114c7bb00ff2cd992ff749d502ed5c0c6f87901ad48f6871fceca1916080908290030190a150505050505050565b600060078361ffff16815481101515614dca57fe5b6000918252602080832060088084049091015460079093166004026101000a90920463ffffffff9081168085526009835260408086205460ff168652600c90935291909320805461ffff19811661ffff91821660001901909116179055905490925060a060020a900416811415614e5d576008805477ffffffff0000000000000000000000000000000000000000191690555b63ffffffff81166000908152600960205260409020805470ffffffffffffffffffffffffffffffffff1916815560010180547cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690556007805461ffff8416908110614ec357fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1660078461ffff16815481101515614efc57fe5b90600052602060002090600891828204019190066004026101000a81548163ffffffff021916908363ffffffff16021790555060078261ffff16815481101515614f4257fe5b90600052602060002090600891828204019190066004026101000a81549063ffffffff0219169055505050565b600b546040805160001943014081524260208201527e0100000000000000000000000000000000000000000000000000000000000061ffff90931692909202828201526042820183905251908190036062019020919050565b600080600060078661ffff16815481101515614fe057fe5b6000918252602090912060088204015460079091166004026101000a900463ffffffff16915060019050600f60ff8516108015906150225750601460ff851611155b1561502b575060025b63ffffffff821660009081526010602052604090205460ff80831691161061507d5763ffffffff82166000908152601060205260408120805460ff8082168590031660ff1990911617905592506150e9565b6009600060078861ffff1681548110151561509457fe5b60009182526020808320600883040154600790921660040261010090810a90920463ffffffff16845283019390935260409091019020546000199690960195046001608060020a031692506150e98686614db5565b50509392505050565b60008060006060600080600080600860149054906101000a900463ffffffff1663ffffffff1660001415615128576151286143e4565b60085460a060020a900463ffffffff908116146151a55760085460a060020a900463ffffffff166000908152600960208190526040909120805470ffffffffffffffffffffffffffffffff00198116600a6001608060020a038e8116919091046101009384900482168101909116909202179091550297506151a9565b8897505b60408051601b8082526103808201909252909650866020820161036080388339019050509450600093505b8560ff168460ff1610156152ac57600c60ff851610806151f75750600e60ff8516115b8015615217575060ff84166000908152600c602052604081205461ffff16115b156152a1576001546040805160e060020a635e383d2102815260ff871660048201529051600160a060020a0390921691635e383d21916024808201926020929091908290030181600087803b15801561526f57600080fd5b505af1158015615283573d6000803e3d6000fd5b505050506040513d602081101561529957600080fd5b505196909601955b6001909301926151d4565b600092505b8560ff168360ff1610156153f557600c60ff851610806152d45750600e60ff8516115b80156152f4575060ff83166000908152600c602052604081205461ffff16115b156153ea5760ff83166000818152600c6020908152604080832054600154825160e060020a635e383d210281526004810196909652915161ffff909116946001608060020a038d1694600160a060020a0390931693635e383d219360248084019492938390030190829087803b15801561536d57600080fd5b505af1158015615381573d6000803e3d6000fd5b505050506040513d602081101561539757600080fd5b50518a026001608060020a03168115156153ad57fe5b046001608060020a03168115156153c057fe5b04858460ff168151811015156153d257fe5b6001608060020a039092166020928302909101909101525b6001909201916152b1565b5060005b600b5461ffff9081169082161015615562576009600060078361ffff1681548110151561542257fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190205460ff169150600c82108061546c5750600e60ff8316115b1561555a57846009600060078461ffff1681548110151561548957fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff168352820192909252604001902054815160ff9091169081106154cc57fe5b906020019060200201516009600060078461ffff168154811015156154ed57fe5b60009182526020808320600883040154600790921660040261010090810a90920463ffffffff16845283019390935260409091019020805470ffffffffffffffffffffffffffffffff00198116908390046001608060020a03908116949094019093169091029190911790555b6001016153f9565b505050505050505050565b600b5460009081908190819061ffff1661558687614f6f565b81151561558f57fe5b600b549190069350600761ffff9182160616156155ad5760076155cb565b600b805461ffff160661ffff166000146155c857600b6155cb565b600d5b60ff1691508290505b61562a856009600060078561ffff168154811015156155ef57fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190205460ff1661387e565b8015615694575033600160a060020a03166009600060078461ffff1681548110151561565257fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff168352820192909252604001902060010154600160a060020a031614155b156156a1578093506156d4565b600b5461ffff90811690828401168115156156b857fe5b06905061ffff808216908416146156ce576155d4565b60001993505b50505092915050565b5060a05190565b63ffffffff81166000908152600a602052604081205460ff1615615752576040805160e560020a62461bcd02815260206004820152601260248201527f616c72656164792074656c65706f727465640000000000000000000000000000604482015290519081900360640190fd5b5063ffffffff81166000908152600a60209081526040808320805460ff19166001179055600990915290208054600560ff9190911611615801576040805160e560020a62461bcd028152602060048201526024808201527f647261676f6e7320646f206e6f74206e65656420746f2062652074656c65706f60448201527f7274656400000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600b5461581390839061ffff16615980565b600b805461ffff8082166001908101821661ffff1993841617909355835460ff166000908152600c6020908152604091829020805480851690960190931694909316939093179055815163ffffffff8516815291517f663f46f5a2fd740de613966ad0391fbc9d840f82898698e6d7f16ba0ed126b3b9281900390910190a15050565b63ffffffff8216600081815260106020908152604091829020805460ff191660ff861690811790915582519384529083015280517f088ba7785fd329abbf01eaa732bad30e14b205b9fc8ab9378f9f5295731135559281900390910190a15050565b600080600160315b60056001608060020a0382161061597357846001608060020a0316836001608060020a0316111561593657806002019350615978565b9181019160286001608060020a0382161480159061595e5750806001608060020a0316600814155b1561596a576001820191505b60001901615900565b600593505b505050919050565b60075461ffff821610156159da578160078261ffff168154811015156159a257fe5b90600052602060002090600891828204019190066004026101000a81548163ffffffff021916908363ffffffff160217905550610b2a565b506007805460018101825560008290527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68860088204018054919092166004026101000a63ffffffff818102199092169390911602919091179055565b61014060405190810160405280600a906020820280388339509192915050565b5080546000825560070160089004906000526020600020908101906129029190615a9091905b80821115610e9a5760008155600101615a7c565b905600636f6e7472616374732063616e6e6f7420657865637574652074686973206d65a165627a7a7230582024fb9ce62e67c061cddce8f77ef450819e570b90c6d1314d8a2445db919382d70029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c596bd09d652827b0106292d3e378d5938df4b12000000000000000000000000a54ddc7b3cce7fc8b1e3fa0256d0db80d2c10970000000000000000000000000a7bd9d58d22d5e35ec4a08083141e0340ea2ca93000000000000000000000000d28525ad63f337c86843d720dae921228e44f0ac000000000000000000000000ca1c217a2200b60dbd52e33c7cb1758db2b30a0e0000000000000000000000002a06579f0ab0f55995884222d8766ab10e6ac4bd
-----Decoded View---------------
Arg [0] : tptAddress (address): 0xC596bD09d652827b0106292D3e378D5938df4B12
Arg [1] : ndcAddress (address): 0xA54ddC7B3CcE7FC8b1E3Fa0256D0DB80D2c10970
Arg [2] : sklAddress (address): 0xA7BD9d58d22D5e35ec4a08083141E0340EA2cA93
Arg [3] : xperAddress (address): 0xD28525Ad63F337c86843d720dAE921228e44F0aC
Arg [4] : luckAddress (address): 0xCA1c217a2200b60DBD52e33C7Cb1758db2b30A0e
Arg [5] : _configAddress (address): 0x2A06579F0aB0F55995884222D8766ab10e6ac4bd
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000c596bd09d652827b0106292d3e378d5938df4b12
Arg [1] : 000000000000000000000000a54ddc7b3cce7fc8b1e3fa0256d0db80d2c10970
Arg [2] : 000000000000000000000000a7bd9d58d22d5e35ec4a08083141e0340ea2ca93
Arg [3] : 000000000000000000000000d28525ad63f337c86843d720dae921228e44f0ac
Arg [4] : 000000000000000000000000ca1c217a2200b60dbd52e33c7cb1758db2b30a0e
Arg [5] : 0000000000000000000000002a06579f0ab0f55995884222d8766ab10e6ac4bd
Swarm Source
bzzr://24fb9ce62e67c061cddce8f77ef450819e570b90c6d1314d8a2445db919382d7
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.