ETH Price: $1,949.68 (-1.88%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

TokenTracker

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Approval For...234252912025-09-23 10:59:59152 days ago1758625199IN
0xd6e382aa...29985E65d
0 ETH0.00001750.70772527
Set Approval For...228380852025-07-03 10:24:11234 days ago1751538251IN
0xd6e382aa...29985E65d
0 ETH0.000090043.64019709
Set Approval For...206373372024-08-29 22:51:35541 days ago1724971895IN
0xd6e382aa...29985E65d
0 ETH0.00003611.45961369
Set Approval For...162437372022-12-23 0:09:111157 days ago1671754151IN
0xd6e382aa...29985E65d
0 ETH0.0002729411.03382673
Set Approval For...160944512022-12-02 3:31:351178 days ago1669951895IN
0xd6e382aa...29985E65d
0 ETH0.0003727615.06923036
Set Approval For...159983462022-11-18 17:19:231191 days ago1668791963IN
0xd6e382aa...29985E65d
0 ETH0.0004642618.76814224
Set Approval For...152999502022-08-08 6:22:341294 days ago1659939754IN
0xd6e382aa...29985E65d
0 ETH0.0003271513.22525752
Set Approval For...148826452022-06-01 3:47:241362 days ago1654055244IN
0xd6e382aa...29985E65d
0 ETH0.0009490238.36477198
Set Approval For...144153272022-03-19 6:44:361436 days ago1647672276IN
0xd6e382aa...29985E65d
0 ETH0.0004682418.92903168
Owner Withdraw143847242022-03-14 12:25:581441 days ago1647260758IN
0xd6e382aa...29985E65d
0 ETH0.0006067214.68966084
Confirm Hit142688482022-02-24 12:37:001459 days ago1645706220IN
0xd6e382aa...29985E65d
0 ETH0.0021360468.64560197
Confirm Hit142688472022-02-24 12:36:381459 days ago1645706198IN
0xd6e382aa...29985E65d
0 ETH0.0047582862.01176122
Confirm Hit142682552022-02-24 10:27:171459 days ago1645698437IN
0xd6e382aa...29985E65d
0 ETH0.004572766.74599531
Confirm Hit142678802022-02-24 8:58:411459 days ago1645693121IN
0xd6e382aa...29985E65d
0 ETH0.0034777550.76344006
Confirm Hit142676612022-02-24 8:13:101459 days ago1645690390IN
0xd6e382aa...29985E65d
0 ETH0.00686806100.28276982
Confirm Hit142674002022-02-24 7:18:171459 days ago1645687097IN
0xd6e382aa...29985E65d
0 ETH0.0068065588.69285373
Confirm Hit142657202022-02-24 0:56:491459 days ago1645664209IN
0xd6e382aa...29985E65d
0 ETH0.0057024383.24961049
Confirm Hit142652752022-02-23 23:16:421459 days ago1645658202IN
0xd6e382aa...29985E65d
0 ETH0.00498883138.40197799
Confirm Hit142652412022-02-23 23:07:551459 days ago1645657675IN
0xd6e382aa...29985E65d
0 ETH0.00660768148.34073322
Confirm Hit142648842022-02-23 21:52:041459 days ago1645653124IN
0xd6e382aa...29985E65d
0 ETH0.003174671.26892592
Confirm Hit142632162022-02-23 15:41:191459 days ago1645630879IN
0xd6e382aa...29985E65d
0 ETH0.0038090255.61752091
Confirm Hit142610412022-02-23 7:34:381460 days ago1645601678IN
0xd6e382aa...29985E65d
0 ETH0.0019537854.20265331
Reinforce142609272022-02-23 7:10:351460 days ago1645600235IN
0xd6e382aa...29985E65d
2.56 ETH0.0024010141.59756444
Confirm Hit142609262022-02-23 7:10:141460 days ago1645600214IN
0xd6e382aa...29985E65d
0 ETH0.0026100558.59492767
Confirm Hit142609262022-02-23 7:10:141460 days ago1645600214IN
0xd6e382aa...29985E65d
0 ETH0.0026100558.59492767
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
-143847242022-03-14 12:25:581441 days ago1647260758
0xd6e382aa...29985E65d
25.216 ETH
-142968212022-02-28 20:29:001454 days ago1646080140
0xd6e382aa...29985E65d
254.99157514 ETH
-142688472022-02-24 12:36:381459 days ago1645706198
0xd6e382aa...29985E65d
0.01 ETH
-142682552022-02-24 10:27:171459 days ago1645698437
0xd6e382aa...29985E65d
0.01 ETH
-142678802022-02-24 8:58:411459 days ago1645693121
0xd6e382aa...29985E65d
0.01 ETH
-142676612022-02-24 8:13:101459 days ago1645690390
0xd6e382aa...29985E65d
0.01 ETH
-142674002022-02-24 7:18:171459 days ago1645687097
0xd6e382aa...29985E65d
0.01 ETH
-142657202022-02-24 0:56:491459 days ago1645664209
0xd6e382aa...29985E65d
0.01 ETH
-142652752022-02-23 23:16:421459 days ago1645658202
0xd6e382aa...29985E65d
0.01 ETH
-142652752022-02-23 23:16:421459 days ago1645658202
0xd6e382aa...29985E65d
0.01 ETH
-142652752022-02-23 23:16:421459 days ago1645658202
0xd6e382aa...29985E65d
0.01 ETH
-142652742022-02-23 23:16:021459 days ago1645658162
0xd6e382aa...29985E65d
1.52387046 ETH
-142652402022-02-23 23:07:421459 days ago1645657662
0xd6e382aa...29985E65d
0.01 ETH
-142652402022-02-23 23:07:421459 days ago1645657662
0xd6e382aa...29985E65d
0.01 ETH
-142648842022-02-23 21:52:041459 days ago1645653124
0xd6e382aa...29985E65d
0.01 ETH
-142644742022-02-23 20:27:501459 days ago1645648070
0xd6e382aa...29985E65d
10.24 ETH
-142632162022-02-23 15:41:191459 days ago1645630879
0xd6e382aa...29985E65d
0.01 ETH
-142623352022-02-23 12:33:271460 days ago1645619607
0xd6e382aa...29985E65d
5.12 ETH
-142623272022-02-23 12:32:151460 days ago1645619535
0xd6e382aa...29985E65d
5.12 ETH
-142623062022-02-23 12:28:221460 days ago1645619302
0xd6e382aa...29985E65d
1.40741889 ETH
-142610422022-02-23 7:35:231460 days ago1645601723
0xd6e382aa...29985E65d
0.01 ETH
-142610422022-02-23 7:35:231460 days ago1645601723
0xd6e382aa...29985E65d
0.01 ETH
-142610412022-02-23 7:34:381460 days ago1645601678
0xd6e382aa...29985E65d
0.01 ETH
-142609242022-02-23 7:10:071460 days ago1645600207
0xd6e382aa...29985E65d
0.01 ETH
-142609242022-02-23 7:10:071460 days ago1645600207
0xd6e382aa...29985E65d
0.01 ETH
View All Internal Transactions
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Doomsday

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 6 : Doomsday.sol
//SPDX-License-Identifier: Cool kids only

pragma solidity ^0.8.0;
import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
import "./interfaces/IERC165.sol";
import "./interfaces/IERC721.sol";
import "./interfaces/IERC721Metadata.sol";
import "./interfaces/IERC721TokenReceiver.sol";

contract Doomsday is IERC721, IERC165, IERC721Metadata{


    constructor(bytes32 _cityRoot, address _earlyAccessHolders){
        supportedInterfaces[0x80ac58cd] = true; //ERC721
        supportedInterfaces[0x5b5e139f] = true; //ERC721Metadata
        //        supportedInterfaces[0x780e9d63] = true; //ERC721Enumerable
        supportedInterfaces[0x01ffc9a7] = true; //ERC165

        owner = msg.sender;
        cityRoot = _cityRoot;

        earlyAccessHolders = _earlyAccessHolders;
    }

    address public owner;
    address earlyAccessHolders;

    //////===721 Implementation
    mapping(address => uint256) internal balances;
    mapping (uint256 => address) internal allowance;
    mapping (address => mapping (address => bool)) internal authorised;

    uint16[] tokenIndexToCity;  //Array of all tokens [cityId,cityId,...]
    mapping(uint256 => address) owners;  //Mapping of owners
    //  keep owners mapping
    //  use tokenIndexToCity for isValidToken

    //    METADATA VARS
    string private __name = "Doomsday NFT";
    string private __symbol = "BUNKER";
    bytes private __uriBase = bytes("https://gateway.pinata.cloud/ipfs/QmUwPH9PmTQrT67M633AJRXACsecmRTihf4DUbJZb9y83M/");
    bytes private __uriSuffix = bytes(".json");

    //  Game vars
    uint constant MAX_CITIES = 38611;       //from table

    int64 constant MAP_WIDTH         = 4320000;   //map units
    int64 constant MAP_HEIGHT        = 2588795;   //map units
    int64 constant BASE_BLAST_RADIUS = 100000;   //map units

    uint constant MINT_COST = 0.04 ether;

    uint constant MINT_PERCENT_WINNER       = 50;
    uint constant MINT_PERCENT_CALLER       = 25;
    uint constant MINT_PERCENT_CREATOR      = 25;

    uint constant REINFORCE_PERCENT_WINNER  = 90;
    uint constant REINFORCE_PERCENT_CREATOR = 10;


    uint constant IMPACT_BLOCK_INTERVAL = 120;

    mapping(uint16 => uint) public cityToToken;
    mapping(uint16 => int64[2]) coordinates;
    bytes32 cityRoot;

    event Inhabit(uint16 indexed _cityId, uint256 indexed _tokenId);
    event Reinforce(uint256 indexed _tokenId);
    event Impact(uint256 indexed _tokenId);

    mapping(uint => bytes32) structuralData;

    function getStructuralData(uint _tokenId) public view returns (uint8 reinforcement, uint8 damage, bytes32 lastImpact){
        bytes32 _data = structuralData[_tokenId];

        reinforcement = uint8(uint(((_data << 248) >> 248)));
        damage = uint8(uint(((_data << 240) >> 240) >> 8));
        lastImpact = (_data >> 16);

        return (reinforcement, damage, lastImpact);
    }
    function setStructuralData(uint _tokenId, uint8 reinforcement, uint8 damage, bytes32 lastImpact) internal{
        bytes32 _reinforcement = bytes32(uint(reinforcement));
        bytes32 _damage = bytes32(uint(damage)) << 8;
        bytes32 _lastImpact = encodeImpact(lastImpact) << 16;

        structuralData[_tokenId] = _reinforcement ^ _damage ^ _lastImpact;
    }
    function encodeImpact(bytes32 _impact) internal pure returns(bytes32){
        return (_impact << 16) >> 16;
    }


    uint public reinforcements;
    uint public destroyed;
    uint public evacuatedFunds;

    uint ownerWithdrawn;
    bool winnerWithdrawn;

    function tokenToCity(uint _tokenId) public view returns(uint16){
        return tokenIndexToCity[_tokenId - 1];
    }

    uint public startTime;
    uint SALE_TIME = 7 days;
    uint EARLY_ACCESS_TIME = 1 days;

    function startPreApocalypse() public{
        require(msg.sender == owner,"owner");

        require(startTime == 0,"started");
        startTime = block.timestamp;
    }
    enum Stage {Initial,PreApocalypse,Apocalypse,PostApocalypse}
    function stage() public view returns(Stage){
        if(startTime == 0){
            return Stage.Initial;
        }else if(block.timestamp < startTime + SALE_TIME && tokenIndexToCity.length < MAX_CITIES){
            return Stage.PreApocalypse;
        }else if(destroyed < tokenIndexToCity.length - 1){
            return Stage.Apocalypse;
        }else{
            return Stage.PostApocalypse;
        }
    }

    function inhabit(uint16 _cityId, int64[2] calldata _coordinates, bytes32[] memory proof) public payable{
        require(stage() == Stage.PreApocalypse,"stage");
        if(block.timestamp < startTime + EARLY_ACCESS_TIME){
            //First day is insiders list
            require(IERC721(earlyAccessHolders).balanceOf(msg.sender) > 0,"early");
        }


        bytes32 leaf = keccak256(abi.encodePacked(_cityId,_coordinates[0],_coordinates[1]));

        require(MerkleProof.verify(proof, cityRoot, leaf),"proof");

        require(cityToToken[_cityId] == 0 && coordinates[_cityId][0] == 0 && coordinates[_cityId][1] == 0,"inhabited");

        require(
            _coordinates[0] >= -MAP_WIDTH/2 &&
            _coordinates[0] <= MAP_WIDTH/2 &&

            _coordinates[1] >= -MAP_HEIGHT/2 &&
            _coordinates[1] <= MAP_HEIGHT/2,
            "off map"
        );  //Not strictly necessary but proves the whitelist hasnt been fucked with


        require(msg.value == MINT_COST,"cost");

        coordinates[_cityId] = _coordinates;

        tokenIndexToCity.push(_cityId);

        uint _tokenId = tokenIndexToCity.length;

        balances[msg.sender]++;
        owners[_tokenId] = msg.sender;
        cityToToken[_cityId] = _tokenId;

        emit Inhabit(_cityId, _tokenId);
        emit Transfer(address(0),msg.sender,_tokenId);
    }

    function isUninhabited(uint16 _cityId) public view returns(bool){
        return coordinates[_cityId][0] == 0 && coordinates[_cityId][1] == 0;
    }

    function reinforce(uint _tokenId) public payable{

        Stage _stage = stage();

        require(_stage == Stage.PreApocalypse || _stage == Stage.Apocalypse,"stage");

        require(ownerOf(_tokenId) == msg.sender,"owner");

        //Covered by ownerOf
//        require(isValidToken(_tokenId),"invalid");

        (uint8 _reinforcement, uint8 _damage, bytes32 _lastImpact) = getStructuralData(_tokenId);

        if(_stage == Stage.Apocalypse){
            require(!checkVulnerable(_tokenId,_lastImpact),"vulnerable");
        }

        //   covered by isValidToken
            //require(_damage <= _reinforcement,"eliminated" );

        require(msg.value == (2 ** _reinforcement) *  MINT_COST,"cost");


        setStructuralData(_tokenId,_reinforcement+1,_damage,_lastImpact);

        reinforcements += msg.value - (MINT_COST * MINT_PERCENT_CALLER / 100);

        emit Reinforce(_tokenId);
    }
    function evacuate(uint _tokenId) public{
        Stage _stage = stage();
        require(_stage == Stage.PreApocalypse || _stage == Stage.Apocalypse,"stage");

        require(ownerOf(_tokenId) == msg.sender,"owner");

        // covered by isValidToken in ownerOf
//        require(_damage <= _reinforcement,"eliminated" );

        if(_stage == Stage.Apocalypse){
            require(!isVulnerable(_tokenId),"vulnerable");
        }

        uint cityCount = tokenIndexToCity.length;


        uint fromPool =
            //Winner fee from mints less evacuated funds
                ((MINT_COST * cityCount * MINT_PERCENT_WINNER / 100 - evacuatedFunds)
            //Divided by remaining tokens
                / totalSupply())
            //Divided by two
               / 2;


        //Also give them the admin fee
        uint toWithdraw = fromPool + getEvacuationRebate(_tokenId);

        balances[owners[_tokenId]]--;
        delete cityToToken[tokenToCity(_tokenId)];
        destroyed++;

        //Doesnt' include admin fees in evacedFunds
        evacuatedFunds += fromPool;

        emit Transfer(owners[_tokenId],address(0),_tokenId);


        payable(msg.sender).send(
            toWithdraw
        );
    }


    function getEvacuationRebate(uint _tokenId) public view returns(uint) {
        (uint8 _reinforcement, uint8 _damage, bytes32 _lastImpact) = getStructuralData(_tokenId);
        _lastImpact;
        return MINT_COST * (1 + _reinforcement - _damage) *  MINT_PERCENT_CALLER / 100;
    }

    function confirmHit(uint _tokenId) public{
        require(stage() == Stage.Apocalypse,"stage");
        require(isValidToken(_tokenId),"invalid");

        (uint8 _reinforcement, uint8 _damage, bytes32 _lastImpact) = getStructuralData(_tokenId);

        //  covered by isValidToken
        //      require(_damage <= _reinforcement,"eliminated" );

        require(checkVulnerable(_tokenId,_lastImpact),"vulnerable");

        (int64[2] memory _coordinates, int64 _radius, bytes32 _impactId) = currentImpact();
        _coordinates;_radius;

        _impactId = encodeImpact(_impactId);

        emit Impact(_tokenId);


        if(_damage < _reinforcement){
            _damage++;
            setStructuralData(_tokenId,_reinforcement,_damage,_impactId);
        }else{
            balances[owners[_tokenId]]--;
            delete cityToToken[tokenToCity(_tokenId)];
            destroyed++;

            emit Transfer(owners[_tokenId],address(0),_tokenId);
        }

        payable(msg.sender).send(MINT_COST * MINT_PERCENT_CALLER / 100);
    }


    function winnerWithdraw(uint _winnerTokenId) public{
        require(stage() == Stage.PostApocalypse,"stage");
        require(isValidToken(_winnerTokenId),"invalid");

        // Implicitly makes sure its the right token since all others don't exist
        require(msg.sender == ownerOf(_winnerTokenId),"ownerOf");
        require(!winnerWithdrawn,"withdrawn");

        winnerWithdrawn = true;

        uint toWithdraw = winnerPrize(_winnerTokenId);
        if(toWithdraw > address(this).balance){
            //Catch rounding errors
            toWithdraw = address(this).balance;
        }

        payable(msg.sender).send(toWithdraw);

    }

    function ownerWithdraw() public{
        require(msg.sender == owner,"owner");

        uint cityCount = tokenIndexToCity.length;

        // Dev and creator portion of all mint fees collected
        uint toWithdraw = MINT_COST * cityCount * (MINT_PERCENT_CREATOR) / 100
            //plus reinforcement for creator
            + reinforcements * REINFORCE_PERCENT_CREATOR / 100
            //less what has already been withdrawn;
            - ownerWithdrawn;

        require(toWithdraw > 0,"empty");

        if(toWithdraw > address(this).balance){
            //Catch rounding errors
            toWithdraw = address(this).balance;
        }
        ownerWithdrawn += toWithdraw;

        payable(msg.sender).send(toWithdraw);
    }


    function currentImpact() public view returns (int64[2] memory _coordinates, int64 _radius, bytes32 impactId){
        uint eliminationBlock = block.number - (block.number % IMPACT_BLOCK_INTERVAL) - 5;
        int hash = int(uint(blockhash(eliminationBlock))%uint(type(int).max) );


        //Min radius is half map height divided by num
        int o = MAP_HEIGHT/2/int(totalSupply()+1);

        //Limited in smallness to about 8% of map height
        if(o < BASE_BLAST_RADIUS){
            o = BASE_BLAST_RADIUS;
        }
        //Max radius is twice this
        _coordinates[0] = int64(hash%MAP_WIDTH - MAP_WIDTH/2);
        _coordinates[1] = int64((hash/MAP_WIDTH)%MAP_HEIGHT - MAP_HEIGHT/2);
        _radius = int64((hash/MAP_WIDTH/MAP_HEIGHT)%o + o);

        return(_coordinates,_radius, keccak256(abi.encodePacked(_coordinates,_radius)));
    }

    function checkVulnerable(uint _tokenId, bytes32 _lastImpact) internal view returns(bool){
        (int64[2] memory _coordinates, int64 _radius, bytes32 _impactId) = currentImpact();

        if(_lastImpact == encodeImpact(_impactId)) return false;

        uint16 _cityId = tokenToCity(_tokenId);

        int64 dx = coordinates[_cityId][0] - _coordinates[0];
        int64 dy = coordinates[_cityId][1] - _coordinates[1];

        return (dx**2 + dy**2 < _radius**2) ||
        ((dx + MAP_WIDTH )**2 + dy**2 < _radius**2) ||
        ((dx - MAP_WIDTH )**2 + dy**2 < _radius**2);
    }

    function isVulnerable(uint _tokenId) public  view returns(bool){

        (uint8 _reinforcement, uint8 _damage, bytes32 _lastImpact) = getStructuralData(_tokenId);
        _reinforcement;_damage;

        return checkVulnerable(_tokenId,_lastImpact);
    }


    function getFallen(uint _tokenId) public view returns(uint16 _cityId, address _owner){
        _cityId = tokenToCity(_tokenId);
        _owner = owners[_tokenId];
        require(cityToToken[_cityId] == 0 && _owner != address(0),"survives");
        return (_cityId,owners[_tokenId]);
    }

    function currentPrize() public view returns(uint){
        uint cityCount = tokenIndexToCity.length;
            // 50% of all mint fees collected
            return MINT_COST * cityCount * MINT_PERCENT_WINNER / 100
            //minus fees removed
            - evacuatedFunds
            //plus reinforcement * 90%
            + reinforcements * REINFORCE_PERCENT_WINNER / 100;
    }

    function winnerPrize(uint _tokenId) public view returns(uint){
        return currentPrize() + getEvacuationRebate(_tokenId);
    }



    ///ERC 721:
    function isValidToken(uint256 _tokenId) internal view returns(bool){
        if(_tokenId == 0) return false;
        return cityToToken[tokenToCity(_tokenId)] != 0;
    }


    function balanceOf(address _owner) external override view returns (uint256){
        return balances[_owner];
    }

    function ownerOf(uint256 _tokenId) public override view returns(address){
        require(isValidToken(_tokenId),"invalid");
        return owners[_tokenId];
    }


    function approve(address _approved, uint256 _tokenId) external override {
        address _owner = ownerOf(_tokenId);
        require( _owner == msg.sender                    //Require Sender Owns Token
            || authorised[_owner][msg.sender]                //  or is approved for all.
        ,"permission");
        emit Approval(_owner, _approved, _tokenId);
        allowance[_tokenId] = _approved;
    }

    function getApproved(uint256 _tokenId) external override view returns (address) {
        require(isValidToken(_tokenId),"invalid");
        return allowance[_tokenId];
    }

    function isApprovedForAll(address _owner, address _operator) external override view returns (bool) {
        return authorised[_owner][_operator];
    }


    function setApprovalForAll(address _operator, bool _approved) external override {
        emit ApprovalForAll(msg.sender,_operator, _approved);
        authorised[msg.sender][_operator] = _approved;
    }


    function transferFrom(address _from, address _to, uint256 _tokenId) public override {

        //Check Transferable
        //There is a token validity check in ownerOf
        address _owner = ownerOf(_tokenId);

        require ( _owner == msg.sender             //Require sender owns token
        //Doing the two below manually instead of referring to the external methods saves gas
        || allowance[_tokenId] == msg.sender      //or is approved for this token
            || authorised[_owner][msg.sender]          //or is approved for all
        ,"permission");
        require(_owner == _from,"owner");
        require(_to != address(0),"zero");

        require(!isVulnerable(_tokenId),"vulnerable");

        emit Transfer(_from, _to, _tokenId);


        owners[_tokenId] =_to;

        balances[_from]--;
        balances[_to]++;

        //Reset approved if there is one
        if(allowance[_tokenId] != address(0)){
            delete allowance[_tokenId];
        }

    }

    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory data) public override {
        transferFrom(_from, _to, _tokenId);

        //Get size of "_to" address, if 0 it's a wallet
        uint32 size;
        assembly {
            size := extcodesize(_to)
        }
        if(size > 0){
            IERC721TokenReceiver receiver = IERC721TokenReceiver(_to);
            require(receiver.onERC721Received(msg.sender,_from,_tokenId,data) == bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")),"receiver");
        }

    }

    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external override {
        safeTransferFrom(_from,_to,_tokenId,"");
    }


    // METADATA FUNCTIONS
    function tokenURI(uint256 _tokenId) public override view returns (string memory){
        //Note: changed visibility to public
        require(isValidToken(_tokenId),'tokenId');

        uint _cityId = tokenToCity(_tokenId);

        uint _i = _cityId;
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len;
        while (_i != 0) {
            k = k-1;
            uint8 temp = (48 + uint8(_i - _i / 10 * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }



        return string(abi.encodePacked(__uriBase,bstr,__uriSuffix));


    }



    function name() external override view returns (string memory _name){
        return __name;
    }

    function symbol() external override view returns (string memory _symbol){
        return __symbol;
    }


    // ENUMERABLE FUNCTIONS
    function totalSupply() public view returns (uint256){
        return tokenIndexToCity.length - destroyed;
    }
    // End 721 Implementation

    ///////===165 Implementation
    mapping (bytes4 => bool) internal supportedInterfaces;
    function supportsInterface(bytes4 interfaceID) external override view returns (bool){
        return supportedInterfaces[interfaceID];
    }
    ///==End 165


    //Admin
    function setOwner(address newOwner) public{
        require(msg.sender == owner,"owner");
        owner = newOwner;
    }
    function setUriComponents(string calldata _newBase, string calldata _newSuffix) public{
        require(msg.sender == owner,"owner");

        __uriBase   = bytes(_newBase);
        __uriSuffix = bytes(_newSuffix);
    }
}

File 2 of 6 : MerkleProof.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        bytes32 computedHash = leaf;

        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];

            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }

        // Check if the computed hash (root) is equal to the provided root
        return computedHash == root;
    }
}

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.4;

interface IERC165 {
    /// @notice Query if a contract implements an interface
    /// @param interfaceID The interface identifier, as specified in ERC-165
    /// @dev Interface identification is specified in ERC-165. This function
    ///  uses less than 30,000 gas.
    /// @return `true` if the contract implements `interfaceID` and
    ///  `interfaceID` is not 0xffffffff, `false` otherwise
    function supportsInterface(bytes4 interfaceID) external view returns (bool);
}

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.4;

/// @title ERC-721 Non-Fungible Token Standard
/// @dev See https://eips.ethereum.org/EIPS/eip-721
///  Note: the ERC-165 identifier for this interface is 0x80ac58cd.
interface IERC721 /* is ERC165 */ {
    /// @dev This emits when ownership of any NFT changes by any mechanism.
    ///  This event emits when NFTs are created (`from` == 0) and destroyed
    ///  (`to` == 0). Exception: during contract creation, any number of NFTs
    ///  may be created and assigned without emitting Transfer. At the time of
    ///  any transfer, the approved address for that NFT (if any) is reset to none.
    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);

    /// @dev This emits when the approved address for an NFT is changed or
    ///  reaffirmed. The zero address indicates there is no approved address.
    ///  When a Transfer event emits, this also indicates that the approved
    ///  address for that NFT (if any) is reset to none.
    event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);

    /// @dev This emits when an operator is enabled or disabled for an owner.
    ///  The operator can manage all NFTs of the owner.
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

    /// @notice Count all NFTs assigned to an owner
    /// @dev NFTs assigned to the zero address are considered invalid, and this
    ///  function throws for queries about the zero address.
    /// @param _owner An address for whom to query the balance
    /// @return The number of NFTs owned by `_owner`, possibly zero
    function balanceOf(address _owner) external view returns (uint256);

    /// @notice Find the owner of an NFT
    /// @dev NFTs assigned to zero address are considered invalid, and queries
    ///  about them do throw.
    /// @param _tokenId The identifier for an NFT
    /// @return The address of the owner of the NFT
    function ownerOf(uint256 _tokenId) external view returns (address);

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT. When transfer is complete, this function
    ///  checks if `_to` is a smart contract (code size > 0). If so, it calls
    ///  `onERC721Received` on `_to` and throws if the return value is not
    ///  `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    /// @param data Additional data with no specified format, sent in call to `_to`
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) external;

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev This works identically to the other function with an extra data parameter,
    ///  except this function just sets data to "".
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external;

    /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE
    ///  TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE
    ///  THEY MAY BE PERMANENTLY LOST
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function transferFrom(address _from, address _to, uint256 _tokenId) external;

    /// @notice Change or reaffirm the approved address for an NFT
    /// @dev The zero address indicates there is no approved address.
    ///  Throws unless `msg.sender` is the current NFT owner, or an authorized
    ///  operator of the current owner.
    /// @param _approved The new approved NFT controller
    /// @param _tokenId The NFT to approve
    function approve(address _approved, uint256 _tokenId) external;

    /// @notice Enable or disable approval for a third party ("operator") to manage
    ///  all of `msg.sender`'s assets
    /// @dev Emits the ApprovalForAll event. The contract MUST allow
    ///  multiple operators per owner.
    /// @param _operator Address to add to the set of authorized operators
    /// @param _approved True if the operator is approved, false to revoke approval
    function setApprovalForAll(address _operator, bool _approved) external;

    /// @notice Get the approved address for a single NFT
    /// @dev Throws if `_tokenId` is not a valid NFT.
    /// @param _tokenId The NFT to find the approved address for
    /// @return The approved address for this NFT, or the zero address if there is none
    function getApproved(uint256 _tokenId) external view returns (address);

    /// @notice Query if an address is an authorized operator for another address
    /// @param _owner The address that owns the NFTs
    /// @param _operator The address that acts on behalf of the owner
    /// @return True if `_operator` is an approved operator for `_owner`, false otherwise
    function isApprovedForAll(address _owner, address _operator) external view returns (bool);
}

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.4;

/// @title ERC-721 Non-Fungible Token Standard, optional metadata extension
/// @dev See https://eips.ethereum.org/EIPS/eip-721
///  Note: the ERC-165 identifier for this interface is 0x5b5e139f.
interface IERC721Metadata /* is ERC721 */ {
    /// @notice A descriptive name for a collection of NFTs in this contract
    function name() external view returns (string memory _name);

    /// @notice An abbreviated name for NFTs in this contract
    function symbol() external view returns (string memory _symbol);

    /// @notice A distinct Uniform Resource Identifier (URI) for a given asset.
    /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC
    ///  3986. The URI may point to a JSON file that conforms to the "ERC721
    ///  Metadata JSON Schema".
    function tokenURI(uint256 _tokenId) external view returns (string memory);
}

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.4;

/// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02.
interface IERC721TokenReceiver {
    /// @notice Handle the receipt of an NFT
    /// @dev The ERC721 smart contract calls this function on the recipient
    ///  after a `transfer`. This function MAY throw to revert and reject the
    ///  transfer. Return of other than the magic value MUST result in the
    ///  transaction being reverted.
    ///  Note: the contract address is always the message sender.
    /// @param _operator The address which called `safeTransferFrom` function
    /// @param _from The address which previously owned the token
    /// @param _tokenId The NFT identifier which is being transferred
    /// @param _data Additional data with no specified format
    /// @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    ///  unless throwing
    function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) external returns(bytes4);
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"bytes32","name":"_cityRoot","type":"bytes32"},{"internalType":"address","name":"_earlyAccessHolders","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Impact","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"_cityId","type":"uint16"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Inhabit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Reinforce","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"_approved","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"cityToToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"confirmHit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentImpact","outputs":[{"internalType":"int64[2]","name":"_coordinates","type":"int64[2]"},{"internalType":"int64","name":"_radius","type":"int64"},{"internalType":"bytes32","name":"impactId","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentPrize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"destroyed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"evacuate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"evacuatedFunds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getEvacuationRebate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getFallen","outputs":[{"internalType":"uint16","name":"_cityId","type":"uint16"},{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getStructuralData","outputs":[{"internalType":"uint8","name":"reinforcement","type":"uint8"},{"internalType":"uint8","name":"damage","type":"uint8"},{"internalType":"bytes32","name":"lastImpact","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_cityId","type":"uint16"},{"internalType":"int64[2]","name":"_coordinates","type":"int64[2]"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"inhabit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_cityId","type":"uint16"}],"name":"isUninhabited","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"isVulnerable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"reinforce","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"reinforcements","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBase","type":"string"},{"internalType":"string","name":"_newSuffix","type":"string"}],"name":"setUriComponents","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stage","outputs":[{"internalType":"enum Doomsday.Stage","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startPreApocalypse","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenToCity","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"winnerPrize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_winnerTokenId","type":"uint256"}],"name":"winnerWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280600c81526020017f446f6f6d73646179204e465400000000000000000000000000000000000000008152506007908051906020019062000051929190620002e7565b506040518060400160405280600681526020017f42554e4b45520000000000000000000000000000000000000000000000000000815250600890805190602001906200009f929190620002e7565b50604051806080016040528060518152602001620063746051913960099080519060200190620000d192919062000378565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600a90805190602001906200011f92919062000378565b5062093a80601555620151806016553480156200013b57600080fd5b50604051620063c5380380620063c5833981810160405281019062000161919062000456565b6001601760006380ac58cd60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff021916908315150217905550600160176000635b5e139f60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601760006301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff021916908315150217905550336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600d8190555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506200056e565b828054620002f590620004d5565b90600052602060002090601f01602090048101928262000319576000855562000365565b82601f106200033457805160ff191683800117855562000365565b8280016001018555821562000365579182015b828111156200036457825182559160200191906001019062000347565b5b50905062000374919062000409565b5090565b8280546200038690620004d5565b90600052602060002090601f016020900481019282620003aa5760008555620003f6565b82601f10620003c557805160ff1916838001178555620003f6565b82800160010185558215620003f6579182015b82811115620003f5578251825591602001919060010190620003d8565b5b50905062000405919062000409565b5090565b5b80821115620004245760008160009055506001016200040a565b5090565b60008151905062000439816200053a565b92915050565b600081519050620004508162000554565b92915050565b600080604083850312156200046a57600080fd5b60006200047a858286016200043f565b92505060206200048d8582860162000428565b9150509250929050565b6000620004a482620004b5565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006002820490506001821680620004ee57607f821691505b602082108114156200050557620005046200050b565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b620005458162000497565b81146200055157600080fd5b50565b6200055f81620004ab565b81146200056b57600080fd5b50565b615df6806200057e6000396000f3fe6080604052600436106102305760003560e01c8063766e54ac1161012e578063ad9e8723116100ab578063c60a71bf1161006f578063c60a71bf14610860578063c87b56dd14610889578063d1bec3ad146108c6578063e43333e214610903578063e985e9c51461092c57610230565b8063ad9e87231461079c578063b1bbd453146107b8578063b88d4fde146107e1578063c040e6b81461080a578063c42b42a01461083557610230565b80638da5cb5b116100f25780638da5cb5b146106b557806391f66ce8146106e057806395d89b411461070b5780639c756c0714610736578063a22cb4651461077357610230565b8063766e54ac1461059357806377e54008146105d057806378e979251461060e5780637a11359a1461063957806380b5462d1461067657610230565b806342842e0e116101bc57806358b3753f1161018057806358b3753f146104845780636352211e146104c157806370a08231146104fe578063743f71fe1461053b578063758c91151461056857610230565b806342842e0e146103e85780634311de8f14610411578063440c9bba146104285780634c5361061461043f578063589fb1001461045b57610230565b806313af40351161020357806313af40351461030357806318160ddd1461032c57806323b872dd14610357578063277a8e2514610380578063359cbbc9146103bd57610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190614227565b610969565b6040516102699190614aae565b60405180910390f35b34801561027e57600080fd5b506102876109d1565b6040516102949190614ae4565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf91906143a7565b610a63565b6040516102d19190614a10565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc91906141eb565b610ae8565b005b34801561030f57600080fd5b5061032a60048036038101906103259190614080565b610ca6565b005b34801561033857600080fd5b50610341610d77565b60405161034e9190614d8a565b60405180910390f35b34801561036357600080fd5b5061037e600480360381019061037991906140e5565b610d91565b005b34801561038c57600080fd5b506103a760048036038101906103a29190614317565b611228565b6040516103b49190614aae565b60405180910390f35b3480156103c957600080fd5b506103d261131e565b6040516103df9190614d8a565b60405180910390f35b3480156103f457600080fd5b5061040f600480360381019061040a91906140e5565b611324565b005b34801561041d57600080fd5b50610426611344565b005b34801561043457600080fd5b5061043d6114df565b005b610459600480360381019061045491906143a7565b6115bb565b005b34801561046757600080fd5b50610482600480360381019061047d91906143a7565b611932565b005b34801561049057600080fd5b506104ab60048036038101906104a691906143a7565b611dcd565b6040516104b89190614d8a565b60405180910390f35b3480156104cd57600080fd5b506104e860048036038101906104e391906143a7565b611e31565b6040516104f59190614a10565b60405180910390f35b34801561050a57600080fd5b5061052560048036038101906105209190614080565b611eb6565b6040516105329190614d8a565b60405180910390f35b34801561054757600080fd5b50610550611eff565b60405161055f93929190614a77565b60405180910390f35b34801561057457600080fd5b5061057d61212c565b60405161058a9190614d8a565b60405180910390f35b34801561059f57600080fd5b506105ba60048036038101906105b591906143a7565b612132565b6040516105c79190614d46565b60405180910390f35b3480156105dc57600080fd5b506105f760048036038101906105f291906143a7565b6121a5565b604051610605929190614d61565b60405180910390f35b34801561061a57600080fd5b506106236122be565b6040516106309190614d8a565b60405180910390f35b34801561064557600080fd5b50610660600480360381019061065b91906143a7565b6122c4565b60405161066d9190614aae565b60405180910390f35b34801561068257600080fd5b5061069d600480360381019061069891906143a7565b6122ed565b6040516106ac93929190614da5565b60405180910390f35b3480156106c157600080fd5b506106ca612336565b6040516106d79190614a10565b60405180910390f35b3480156106ec57600080fd5b506106f561235a565b6040516107029190614d8a565b60405180910390f35b34801561071757600080fd5b50610720612360565b60405161072d9190614ae4565b60405180910390f35b34801561074257600080fd5b5061075d600480360381019061075891906143a7565b6123f2565b60405161076a9190614d8a565b60405180910390f35b34801561077f57600080fd5b5061079a600480360381019061079591906141af565b612416565b005b6107b660048036038101906107b19190614340565b612513565b005b3480156107c457600080fd5b506107df60048036038101906107da91906143a7565b612d5a565b005b3480156107ed57600080fd5b5061080860048036038101906108039190614134565b612f8f565b005b34801561081657600080fd5b5061081f6130ed565b60405161082c9190614ac9565b60405180910390f35b34801561084157600080fd5b5061084a613160565b6040516108579190614d8a565b60405180910390f35b34801561086c57600080fd5b50610887600480360381019061088291906142a2565b6131ce565b005b34801561089557600080fd5b506108b060048036038101906108ab91906143a7565b613286565b6040516108bd9190614ae4565b60405180910390f35b3480156108d257600080fd5b506108ed60048036038101906108e89190614317565b613499565b6040516108fa9190614d8a565b60405180910390f35b34801561090f57600080fd5b5061092a600480360381019061092591906143a7565b6134b1565b005b34801561093857600080fd5b50610953600480360381019061094e91906140a9565b61383d565b6040516109609190614aae565b60405180910390f35b600060176000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6060600780546109e090615757565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0c90615757565b8015610a595780601f10610a2e57610100808354040283529160200191610a59565b820191906000526020600020905b815481529060010190602001808311610a3c57829003601f168201915b5050505050905090565b6000610a6e826138d1565b610aad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa490614d26565b60405180910390fd5b6003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610af382611e31565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610bb55750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610bf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610beb90614ba6565b60405180910390fd5b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4826003600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2b90614b06565b60405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000601054600580549050610d8c91906155ae565b905090565b6000610d9c82611e31565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610e3657503373ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80610ec75750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610f06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efd90614ba6565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6b90614b06565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fe4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdb90614b46565b60405180910390fd5b610fed826122c4565b1561102d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102490614b26565b60405180910390fd5b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061112a9061572d565b9190505550600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061117f906157ba565b9190505550600073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611222576003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b50505050565b600080600c60008461ffff1661ffff16815260200190815260200160002060006002811061127f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600491828204019190066008029054906101000a900460070b60070b14801561131757506000600c60008461ffff1661ffff1681526020019081526020016000206001600281106112f9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600491828204019190066008029054906101000a900460070b60070b145b9050919050565b60105481565b61133f83838360405180602001604052806000815250612f8f565b505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c990614b06565b60405180910390fd5b6000600580549050905060006012546064600a600f546113f29190615444565b6113fc919061515f565b6064601985668e1bc9bf0400006114139190615444565b61141d9190615444565b611427919061515f565b6114319190614ffe565b61143b91906155ae565b905060008111611480576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147790614c06565b60405180910390fd5b4781111561148c574790505b806012600082825461149e9190614ffe565b925050819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461156d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156490614b06565b60405180910390fd5b6000601454146115b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a990614ce6565b60405180910390fd5b42601481905550565b60006115c56130ed565b905060016003811115611601577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81600381111561163a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14806116b657506002600381111561167b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160038111156116b4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b145b6116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec90614b66565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff1661171583611e31565b73ffffffffffffffffffffffffffffffffffffffff161461176b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176290614b06565b60405180910390fd5b6000806000611779856122ed565b925092509250600260038111156117b9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8460038111156117f2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611843576118028582613914565b15611842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183990614b26565b60405180910390fd5b5b668e1bc9bf0400008360026118589190615326565b6118629190615444565b34146118a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189a90614c46565b60405180910390fd5b6118bb856001856118b49190615054565b8484613ba6565b60646019668e1bc9bf0400006118d19190615444565b6118db919061515f565b346118e691906155ae565b600f60008282546118f79190614ffe565b92505081905550847f497d25ccff55cdf3b091a4d19054e291083d2a35c8cc511dfbab6b6a972ca29d60405160405180910390a25050505050565b600061193c6130ed565b905060016003811115611978577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160038111156119b1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1480611a2d5750600260038111156119f2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816003811115611a2b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b145b611a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6390614b66565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16611a8c83611e31565b73ffffffffffffffffffffffffffffffffffffffff1614611ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad990614b06565b60405180910390fd5b60026003811115611b1c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816003811115611b55577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611ba557611b64826122c4565b15611ba4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9b90614b26565b60405180910390fd5b5b6000600580549050905060006002611bbb610d77565b6011546064603286668e1bc9bf040000611bd59190615444565b611bdf9190615444565b611be9919061515f565b611bf391906155ae565b611bfd919061515f565b611c07919061515f565b90506000611c1485611dcd565b82611c1f9190614ffe565b9050600260006006600088815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611ca49061572d565b9190505550600b6000611cb687612132565b61ffff1661ffff1681526020019081526020016000206000905560106000815480929190611ce3906157ba565b91905055508160116000828254611cfa9190614ffe565b9250508190555084600073ffffffffffffffffffffffffffffffffffffffff166006600088815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a43373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050505050505050565b600080600080611ddc856122ed565b9250925092506064601983856001611df49190615054565b611dfe91906155e2565b60ff16668e1bc9bf040000611e139190615444565b611e1d9190615444565b611e27919061515f565b9350505050919050565b6000611e3c826138d1565b611e7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7290614d26565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611f07613ce3565b60008060006005607843611f1b919061588c565b43611f2691906155ae565b611f3091906155ae565b905060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff824060001c611f64919061588c565b905060006001611f72610d77565b611f7c9190614ffe565b60026227807b611f8c91906150f5565b60070b611f99919061508b565b9050620186a060070b811215611fb357620186a060070b90505b60026241eb00611fc391906150f5565b60070b6241eb0060070b83611fd8919061585b565b611fe2919061549e565b8660006002811061201c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002019060070b908160070b8152505060026227807b61203d91906150f5565b60070b6227807b60070b6241eb0060070b84612059919061508b565b612063919061585b565b61206d919061549e565b866001600281106120a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002019060070b908160070b8152505080816227807b60070b6241eb0060070b856120d3919061508b565b6120dd919061508b565b6120e7919061585b565b6120f19190614eee565b94508585878760405160200161210892919061494a565b60405160208183030381529060405280519060200120955095509550505050909192565b60115481565b6000600560018361214391906155ae565b8154811061217a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff169050919050565b6000806121b183612132565b91506006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600b60008461ffff1661ffff168152602001908152602001600020541480156122415750600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b612280576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227790614c86565b60405180910390fd5b816006600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691509150915091565b60145481565b6000806000806122d3856122ed565b9250925092506122e38582613914565b9350505050919050565b600080600080600e600086815260200190815260200160002054905060f88082901b901c60001c9350600860f08083901b901c901c60001c9250601081901c9150509193909250565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f5481565b60606008805461236f90615757565b80601f016020809104026020016040519081016040528092919081815260200182805461239b90615757565b80156123e85780601f106123bd576101008083540402835291602001916123e8565b820191906000526020600020905b8154815290600101906020018083116123cb57829003601f168201915b5050505050905090565b60006123fd82611dcd565b612405613160565b61240f9190614ffe565b9050919050565b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124739190614aae565b60405180910390a380600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6001600381111561254d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6125556130ed565b600381111561258d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b146125cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c490614b66565b60405180910390fd5b6016546014546125dd9190614ffe565b4210156126d2576000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016126419190614a10565b60206040518083038186803b15801561265957600080fd5b505afa15801561266d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061269191906143d0565b116126d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c890614c26565b60405180910390fd5b5b6000838360006002811061270f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020160208101906127229190614279565b8460016002811061275c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201602081019061276f9190614279565b604051602001612781939291906149d3565b6040516020818303038152906040528051906020012090506127a682600d5483613bf6565b6127e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127dc90614ca6565b60405180910390fd5b6000600b60008661ffff1661ffff1681526020019081526020016000205414801561287f57506000600c60008661ffff1661ffff168152602001908152602001600020600060028110612861577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600491828204019190066008029054906101000a900460070b60070b145b80156128fa57506000600c60008661ffff1661ffff1681526020019081526020016000206001600281106128dc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600491828204019190066008029054906101000a900460070b60070b145b612939576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293090614cc6565b60405180910390fd5b60026241eb00612948906158bd565b61295291906150f5565b60070b8360006002811061298f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020160208101906129a29190614279565b60070b12158015612a14575060026241eb006129be91906150f5565b60070b836000600281106129fb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002016020810190612a0e9190614279565b60070b13155b8015612a8a575060026227807b612a2a906158bd565b612a3491906150f5565b60070b83600160028110612a71577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002016020810190612a849190614279565b60070b12155b8015612af7575060026227807b612aa191906150f5565b60070b83600160028110612ade577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002016020810190612af19190614279565b60070b13155b612b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2d90614b86565b60405180910390fd5b668e1bc9bf0400003414612b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7690614c46565b60405180910390fd5b82600c60008661ffff1661ffff168152602001908152602001600020906002612ba9929190613d05565b5060058490806001815401808255809150506001900390600052602060002090601091828204019190066002029091909190916101000a81548161ffff021916908361ffff16021790555060006005805490509050600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190612c4e906157ba565b9190505550336006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b60008761ffff1661ffff16815260200190815260200160002081905550808561ffff167fc678d7c6bd4d7281f2061bc3c9d9b0a8126543c59834a0b1a6199947189573e560405160405180910390a3803373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b600380811115612d93577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b612d9b6130ed565b6003811115612dd3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14612e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0a90614b66565b60405180910390fd5b612e1c816138d1565b612e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5290614d26565b60405180910390fd5b612e6481611e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec890614c66565b60405180910390fd5b601360009054906101000a900460ff1615612f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1890614d06565b60405180910390fd5b6001601360006101000a81548160ff0219169083151502179055506000612f47826123f2565b905047811115612f55574790505b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050505050565b612f9a848484610d91565b6000833b905060008163ffffffff1611156130e65760008490507f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168173ffffffffffffffffffffffffffffffffffffffff1663150b7a02338988886040518563ffffffff1660e01b81526004016130339493929190614a2b565b602060405180830381600087803b15801561304d57600080fd5b505af1158015613061573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130859190614250565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146130e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130db90614be6565b60405180910390fd5b505b5050505050565b6000806014541415613102576000905061315d565b6015546014546131129190614ffe565b4210801561312657506196d3600580549050105b15613134576001905061315d565b600160058054905061314691906155ae565b6010541015613158576002905061315d565b600390505b90565b60008060058054905090506064605a600f5461317c9190615444565b613186919061515f565b6011546064603284668e1bc9bf0400006131a09190615444565b6131aa9190615444565b6131b4919061515f565b6131be91906155ae565b6131c89190614ffe565b91505090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461325c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325390614b06565b60405180910390fd5b83836009919061326d929190613dba565b508181600a919061327f929190613dba565b5050505050565b6060613291826138d1565b6132d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132c790614bc6565b60405180910390fd5b60006132db83612132565b61ffff1690506000819050600081905060005b60008214613318578080613301906157ba565b915050600a82613311919061515f565b91506132ee565b60008167ffffffffffffffff81111561335a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561338c5781602001600182028036833780820191505090505b50905060008290505b60008514613466576001816133aa91906155ae565b90506000600a80876133bc919061515f565b6133c69190615444565b866133d191906155ae565b60306133dd9190615054565b905060008160f81b905080848481518110613421577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8761345d919061515f565b96505050613395565b600982600a60405160200161347d939291906149a2565b6040516020818303038152906040529650505050505050919050565b600b6020528060005260406000206000915090505481565b600260038111156134eb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6134f36130ed565b600381111561352b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1461356b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161356290614b66565b60405180910390fd5b613574816138d1565b6135b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135aa90614d26565b60405180910390fd5b60008060006135c1846122ed565b9250925092506135d18482613914565b613610576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360790614b26565b60405180910390fd5b600080600061361d611eff565b92509250925061362c81613cd2565b9050867f287c3b40cb7d7950236aa90ed97e4245eed94845734e1f48ececacf164c16cf260405160405180910390a28560ff168560ff16101561368857848061367490615803565b95505061368387878784613ba6565b6137df565b60026000600660008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061370b9061572d565b9190505550600b600061371d89612132565b61ffff1661ffff168152602001908152602001600020600090556010600081548092919061374a906157ba565b919050555086600073ffffffffffffffffffffffffffffffffffffffff16600660008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b3373ffffffffffffffffffffffffffffffffffffffff166108fc60646019668e1bc9bf04000061380f9190615444565b613819919061515f565b9081150290604051600060405180830381858888f193505050505050505050505050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000808214156138e4576000905061390f565b6000600b60006138f385612132565b61ffff1661ffff16815260200190815260200160002054141590505b919050565b600080600080613922611eff565b92509250925061393181613cd2565b8514156139445760009350505050613ba0565b600061394f87612132565b905060008460006002811061398d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151600c60008461ffff1661ffff1681526020019081526020016000206000600281106139e6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600491828204019190066008029054906101000a900460070b613a099190615532565b9050600085600160028110613a47577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151600c60008561ffff1661ffff168152602001908152602001600020600160028110613aa0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600491828204019190066008029054906101000a900460070b613ac39190615532565b9050600285613ad291906152d2565b60070b600282613ae291906152d2565b600284613aef91906152d2565b613af99190614f82565b60070b1280613b4a5750600285613b1091906152d2565b60070b600282613b2091906152d2565b60026241eb0085613b319190614f82565b613b3b91906152d2565b613b459190614f82565b60070b125b80613b975750600285613b5d91906152d2565b60070b600282613b6d91906152d2565b60026241eb0085613b7e9190615532565b613b8891906152d2565b613b929190614f82565b60070b125b96505050505050505b92915050565b60008360ff1660001b9050600060088460ff1660001b901b905060006010613bcd85613cd2565b901b90508082841818600e60008981526020019081526020016000208190555050505050505050565b60008082905060005b8551811015613cc4576000868281518110613c43577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050808311613c84578281604051602001613c67929190614976565b604051602081830303815290604052805190602001209250613cb0565b8083604051602001613c97929190614976565b6040516020818303038152906040528051906020012092505b508080613cbc906157ba565b915050613bff565b508381149150509392505050565b600060108083901b901c9050919050565b6040518060400160405280600290602082028036833780820191505090505090565b826002600301600490048101928215613da95791602002820160005b83821115613d7357833560070b83826101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055509260200192600801602081600701049283019260010302613d21565b8015613da75782816101000a81549067ffffffffffffffff0219169055600801602081600701049283019260010302613d73565b505b509050613db69190613e40565b5090565b828054613dc690615757565b90600052602060002090601f016020900481019282613de85760008555613e2f565b82601f10613e0157803560ff1916838001178555613e2f565b82800160010185558215613e2f579182015b82811115613e2e578235825591602001919060010190613e13565b5b509050613e3c9190613e40565b5090565b5b80821115613e59576000816000905550600101613e41565b5090565b6000613e70613e6b84614e01565b614ddc565b90508083825260208201905082856020860282011115613e8f57600080fd5b60005b85811015613ebf5781613ea58882613f79565b845260208401935060208301925050600181019050613e92565b5050509392505050565b6000613edc613ed784614e2d565b614ddc565b905082815260208101848484011115613ef457600080fd5b613eff8482856156eb565b509392505050565b600081359050613f1681615d1f565b92915050565b600082601f830112613f2d57600080fd5b8135613f3d848260208601613e5d565b91505092915050565b600081905082602060020282011115613f5e57600080fd5b92915050565b600081359050613f7381615d36565b92915050565b600081359050613f8881615d4d565b92915050565b600081359050613f9d81615d64565b92915050565b600081519050613fb281615d64565b92915050565b600082601f830112613fc957600080fd5b8135613fd9848260208601613ec9565b91505092915050565b600081359050613ff181615d7b565b92915050565b60008083601f84011261400957600080fd5b8235905067ffffffffffffffff81111561402257600080fd5b60208301915083600182028301111561403a57600080fd5b9250929050565b60008135905061405081615d92565b92915050565b60008135905061406581615da9565b92915050565b60008151905061407a81615da9565b92915050565b60006020828403121561409257600080fd5b60006140a084828501613f07565b91505092915050565b600080604083850312156140bc57600080fd5b60006140ca85828601613f07565b92505060206140db85828601613f07565b9150509250929050565b6000806000606084860312156140fa57600080fd5b600061410886828701613f07565b935050602061411986828701613f07565b925050604061412a86828701614056565b9150509250925092565b6000806000806080858703121561414a57600080fd5b600061415887828801613f07565b945050602061416987828801613f07565b935050604061417a87828801614056565b925050606085013567ffffffffffffffff81111561419757600080fd5b6141a387828801613fb8565b91505092959194509250565b600080604083850312156141c257600080fd5b60006141d085828601613f07565b92505060206141e185828601613f64565b9150509250929050565b600080604083850312156141fe57600080fd5b600061420c85828601613f07565b925050602061421d85828601614056565b9150509250929050565b60006020828403121561423957600080fd5b600061424784828501613f8e565b91505092915050565b60006020828403121561426257600080fd5b600061427084828501613fa3565b91505092915050565b60006020828403121561428b57600080fd5b600061429984828501613fe2565b91505092915050565b600080600080604085870312156142b857600080fd5b600085013567ffffffffffffffff8111156142d257600080fd5b6142de87828801613ff7565b9450945050602085013567ffffffffffffffff8111156142fd57600080fd5b61430987828801613ff7565b925092505092959194509250565b60006020828403121561432957600080fd5b600061433784828501614041565b91505092915050565b60008060006080848603121561435557600080fd5b600061436386828701614041565b935050602061437486828701613f46565b925050606084013567ffffffffffffffff81111561439157600080fd5b61439d86828701613f1c565b9150509250925092565b6000602082840312156143b957600080fd5b60006143c784828501614056565b91505092915050565b6000602082840312156143e257600080fd5b60006143f08482850161406b565b91505092915050565b60006144058383614613565b60208301905092915050565b600061441d8383614631565b60208301905092915050565b61443281615616565b82525050565b61444181614e7d565b61444b8184614eab565b925061445682614e5e565b8060005b8381101561448757815161446e87826143f9565b965061447983614e9e565b92505060018101905061445a565b505050505050565b61449881614e7d565b6144a28184614eb6565b92506144ad82614e5e565b8060005b838110156144de5781516144c58782614411565b96506144d083614e9e565b9250506001810190506144b1565b505050505050565b6144ef81615628565b82525050565b6144fe81615634565b82525050565b61451561451082615634565b61582d565b82525050565b600061452682614e88565b6145308185614ec1565b93506145408185602086016156fa565b614549816159f1565b840191505092915050565b600061455f82614e88565b6145698185614ed2565b93506145798185602086016156fa565b80840191505092915050565b6000815461459281615757565b61459c8186614ed2565b945060018216600081146145b757600181146145c8576145fb565b60ff198316865281860193506145fb565b6145d185614e68565b60005b838110156145f3578154818901526001820191506020810190506145d4565b838801955050505b50505092915050565b61460d816156d9565b82525050565b61461c81615687565b82525050565b61462b81615687565b82525050565b61463a81615687565b82525050565b61465161464c82615687565b615837565b82525050565b600061466282614e93565b61466c8185614edd565b935061467c8185602086016156fa565b614685816159f1565b840191505092915050565b600061469d600583614edd565b91506146a882615a29565b602082019050919050565b60006146c0600a83614edd565b91506146cb82615a52565b602082019050919050565b60006146e3600483614edd565b91506146ee82615a7b565b602082019050919050565b6000614706600583614edd565b915061471182615aa4565b602082019050919050565b6000614729600783614edd565b915061473482615acd565b602082019050919050565b600061474c600a83614edd565b915061475782615af6565b602082019050919050565b600061476f600783614edd565b915061477a82615b1f565b602082019050919050565b6000614792600883614edd565b915061479d82615b48565b602082019050919050565b60006147b5600583614edd565b91506147c082615b71565b602082019050919050565b60006147d8600583614edd565b91506147e382615b9a565b602082019050919050565b60006147fb600483614edd565b915061480682615bc3565b602082019050919050565b600061481e600783614edd565b915061482982615bec565b602082019050919050565b6000614841600883614edd565b915061484c82615c15565b602082019050919050565b6000614864600583614edd565b915061486f82615c3e565b602082019050919050565b6000614887600983614edd565b915061489282615c67565b602082019050919050565b60006148aa600783614edd565b91506148b582615c90565b602082019050919050565b60006148cd600983614edd565b91506148d882615cb9565b602082019050919050565b60006148f0600783614edd565b91506148fb82615ce2565b602082019050919050565b61490f81615694565b82525050565b61492661492182615694565b615849565b82525050565b614935816156c2565b82525050565b614944816156cc565b82525050565b6000614956828561448f565b6040820191506149668284614640565b6008820191508190509392505050565b60006149828285614504565b6020820191506149928284614504565b6020820191508190509392505050565b60006149ae8286614585565b91506149ba8285614554565b91506149c68284614585565b9150819050949350505050565b60006149df8286614915565b6002820191506149ef8285614640565b6008820191506149ff8284614640565b600882019150819050949350505050565b6000602082019050614a256000830184614429565b92915050565b6000608082019050614a406000830187614429565b614a4d6020830186614429565b614a5a604083018561492c565b8181036060830152614a6c818461451b565b905095945050505050565b6000608082019050614a8c6000830186614438565b614a996040830185614622565b614aa660608301846144f5565b949350505050565b6000602082019050614ac360008301846144e6565b92915050565b6000602082019050614ade6000830184614604565b92915050565b60006020820190508181036000830152614afe8184614657565b905092915050565b60006020820190508181036000830152614b1f81614690565b9050919050565b60006020820190508181036000830152614b3f816146b3565b9050919050565b60006020820190508181036000830152614b5f816146d6565b9050919050565b60006020820190508181036000830152614b7f816146f9565b9050919050565b60006020820190508181036000830152614b9f8161471c565b9050919050565b60006020820190508181036000830152614bbf8161473f565b9050919050565b60006020820190508181036000830152614bdf81614762565b9050919050565b60006020820190508181036000830152614bff81614785565b9050919050565b60006020820190508181036000830152614c1f816147a8565b9050919050565b60006020820190508181036000830152614c3f816147cb565b9050919050565b60006020820190508181036000830152614c5f816147ee565b9050919050565b60006020820190508181036000830152614c7f81614811565b9050919050565b60006020820190508181036000830152614c9f81614834565b9050919050565b60006020820190508181036000830152614cbf81614857565b9050919050565b60006020820190508181036000830152614cdf8161487a565b9050919050565b60006020820190508181036000830152614cff8161489d565b9050919050565b60006020820190508181036000830152614d1f816148c0565b9050919050565b60006020820190508181036000830152614d3f816148e3565b9050919050565b6000602082019050614d5b6000830184614906565b92915050565b6000604082019050614d766000830185614906565b614d836020830184614429565b9392505050565b6000602082019050614d9f600083018461492c565b92915050565b6000606082019050614dba600083018661493b565b614dc7602083018561493b565b614dd460408301846144f5565b949350505050565b6000614de6614df7565b9050614df28282615789565b919050565b6000604051905090565b600067ffffffffffffffff821115614e1c57614e1b6159c2565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614e4857614e476159c2565b5b614e51826159f1565b9050602081019050919050565b6000819050919050565b60008190508160005260206000209050919050565b600060029050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600081905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000614ef98261567d565b9150614f048361567d565b9250817f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03831360008312151615614f3f57614f3e615906565b5b817f8000000000000000000000000000000000000000000000000000000000000000038312600083121615614f7757614f76615906565b5b828201905092915050565b6000614f8d82615687565b9150614f9883615687565b925081677fffffffffffffff03831360008312151615614fbb57614fba615906565b5b817fffffffffffffffffffffffffffffffffffffffffffffffff8000000000000000038312600083121615614ff357614ff2615906565b5b828201905092915050565b6000615009826156c2565b9150615014836156c2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561504957615048615906565b5b828201905092915050565b600061505f826156cc565b915061506a836156cc565b92508260ff038211156150805761507f615906565b5b828201905092915050565b60006150968261567d565b91506150a18361567d565b9250826150b1576150b0615935565b5b600160000383147f8000000000000000000000000000000000000000000000000000000000000000831416156150ea576150e9615906565b5b828205905092915050565b600061510082615687565b915061510b83615687565b92508261511b5761511a615935565b5b600160000383147fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008314161561515457615153615906565b5b828205905092915050565b600061516a826156c2565b9150615175836156c2565b92508261518557615184615935565b5b828204905092915050565b6000808291508390505b60018511156151da578086048111156151b6576151b5615906565b5b60018516156151c55780820291505b80810290506151d385615a1c565b945061519a565b94509492505050565b600082600081146151fb57600181146152055761520e565b60019150506152ca565b829150506152ca565b508161521d57600090506152ca565b60019050600082136001811461523a576000811461525257615266565b82860483111561524d5761524c615906565b5b615266565b82860583121561526557615264615906565b5b5b506001831615615274578190505b818202915061528283615a1c565b925061529085848484615190565b9250905081850481116000821316156152ac576152ab615906565b5b81840581126000821216156152c4576152c3615906565b5b81810290505b949350505050565b60006152dd82615687565b91506152e8836156cc565b925061531e677fffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffff800000000000000085856151e3565b905092915050565b6000615331826156c2565b915061533c836156cc565b92506153697fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484615371565b905092915050565b600082615381576001905061543d565b8161538f576000905061543d565b81600181146153a557600281146153af576153de565b600191505061543d565b60ff8411156153c1576153c0615906565b5b8360020a9150848211156153d8576153d7615906565b5b5061543d565b5060208310610133831016604e8410600b84101617156154135782820a90508381111561540e5761540d615906565b5b61543d565b6154208484846001615190565b9250905081840481111561543757615436615906565b5b81810290505b9392505050565b600061544f826156c2565b915061545a836156c2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561549357615492615906565b5b828202905092915050565b60006154a98261567d565b91506154b48361567d565b9250827f8000000000000000000000000000000000000000000000000000000000000000018212600084121516156154ef576154ee615906565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01821360008412161561552757615526615906565b5b828203905092915050565b600061553d82615687565b915061554883615687565b9250827fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000000182126000841215161561558357615582615906565b5b82677fffffffffffffff0182136000841216156155a3576155a2615906565b5b828203905092915050565b60006155b9826156c2565b91506155c4836156c2565b9250828210156155d7576155d6615906565b5b828203905092915050565b60006155ed826156cc565b91506155f8836156cc565b92508282101561560b5761560a615906565b5b828203905092915050565b6000615621826156a2565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061567882615d0b565b919050565b6000819050919050565b60008160070b9050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006156e48261566a565b9050919050565b82818337600083830152505050565b60005b838110156157185780820151818401526020810190506156fd565b83811115615727576000848401525b50505050565b6000615738826156c2565b9150600082141561574c5761574b615906565b5b600182039050919050565b6000600282049050600182168061576f57607f821691505b6020821081141561578357615782615993565b5b50919050565b615792826159f1565b810181811067ffffffffffffffff821117156157b1576157b06159c2565b5b80604052505050565b60006157c5826156c2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156157f8576157f7615906565b5b600182019050919050565b600061580e826156cc565b915060ff82141561582257615821615906565b5b600182019050919050565b6000819050919050565b600061584282615a02565b9050919050565b600061585482615a0f565b9050919050565b60006158668261567d565b91506158718361567d565b92508261588157615880615935565b5b828207905092915050565b6000615897826156c2565b91506158a2836156c2565b9250826158b2576158b1615935565b5b828206905092915050565b60006158c882615687565b91507fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008214156158fb576158fa615906565b5b816000039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160c01b9050919050565b60008160f01b9050919050565b60008160011c9050919050565b7f6f776e6572000000000000000000000000000000000000000000000000000000600082015250565b7f76756c6e657261626c6500000000000000000000000000000000000000000000600082015250565b7f7a65726f00000000000000000000000000000000000000000000000000000000600082015250565b7f7374616765000000000000000000000000000000000000000000000000000000600082015250565b7f6f6666206d617000000000000000000000000000000000000000000000000000600082015250565b7f7065726d697373696f6e00000000000000000000000000000000000000000000600082015250565b7f746f6b656e496400000000000000000000000000000000000000000000000000600082015250565b7f7265636569766572000000000000000000000000000000000000000000000000600082015250565b7f656d707479000000000000000000000000000000000000000000000000000000600082015250565b7f6561726c79000000000000000000000000000000000000000000000000000000600082015250565b7f636f737400000000000000000000000000000000000000000000000000000000600082015250565b7f6f776e65724f6600000000000000000000000000000000000000000000000000600082015250565b7f7375727669766573000000000000000000000000000000000000000000000000600082015250565b7f70726f6f66000000000000000000000000000000000000000000000000000000600082015250565b7f696e686162697465640000000000000000000000000000000000000000000000600082015250565b7f7374617274656400000000000000000000000000000000000000000000000000600082015250565b7f77697468647261776e0000000000000000000000000000000000000000000000600082015250565b7f696e76616c696400000000000000000000000000000000000000000000000000600082015250565b60048110615d1c57615d1b615964565b5b50565b615d2881615616565b8114615d3357600080fd5b50565b615d3f81615628565b8114615d4a57600080fd5b50565b615d5681615634565b8114615d6157600080fd5b50565b615d6d8161563e565b8114615d7857600080fd5b50565b615d8481615687565b8114615d8f57600080fd5b50565b615d9b81615694565b8114615da657600080fd5b50565b615db2816156c2565b8114615dbd57600080fd5b5056fea26469706673582212201f87b34436c48c9e3c6e95c6b5aeeca9b09d60f7c84ebf57b204b8b4f4fce38d64736f6c6343000804003368747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d5577504839506d5451725436374d363333414a525841437365636d5254696866344455624a5a62397938334d2f430a7680ca49d499ba2515b1658b7f69e3717b89f68a5f738c35cb01132f961a0000000000000000000000009abb7bddc43fa67c76a62d8c016513827f59be1b

Deployed Bytecode

0x6080604052600436106102305760003560e01c8063766e54ac1161012e578063ad9e8723116100ab578063c60a71bf1161006f578063c60a71bf14610860578063c87b56dd14610889578063d1bec3ad146108c6578063e43333e214610903578063e985e9c51461092c57610230565b8063ad9e87231461079c578063b1bbd453146107b8578063b88d4fde146107e1578063c040e6b81461080a578063c42b42a01461083557610230565b80638da5cb5b116100f25780638da5cb5b146106b557806391f66ce8146106e057806395d89b411461070b5780639c756c0714610736578063a22cb4651461077357610230565b8063766e54ac1461059357806377e54008146105d057806378e979251461060e5780637a11359a1461063957806380b5462d1461067657610230565b806342842e0e116101bc57806358b3753f1161018057806358b3753f146104845780636352211e146104c157806370a08231146104fe578063743f71fe1461053b578063758c91151461056857610230565b806342842e0e146103e85780634311de8f14610411578063440c9bba146104285780634c5361061461043f578063589fb1001461045b57610230565b806313af40351161020357806313af40351461030357806318160ddd1461032c57806323b872dd14610357578063277a8e2514610380578063359cbbc9146103bd57610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190614227565b610969565b6040516102699190614aae565b60405180910390f35b34801561027e57600080fd5b506102876109d1565b6040516102949190614ae4565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf91906143a7565b610a63565b6040516102d19190614a10565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc91906141eb565b610ae8565b005b34801561030f57600080fd5b5061032a60048036038101906103259190614080565b610ca6565b005b34801561033857600080fd5b50610341610d77565b60405161034e9190614d8a565b60405180910390f35b34801561036357600080fd5b5061037e600480360381019061037991906140e5565b610d91565b005b34801561038c57600080fd5b506103a760048036038101906103a29190614317565b611228565b6040516103b49190614aae565b60405180910390f35b3480156103c957600080fd5b506103d261131e565b6040516103df9190614d8a565b60405180910390f35b3480156103f457600080fd5b5061040f600480360381019061040a91906140e5565b611324565b005b34801561041d57600080fd5b50610426611344565b005b34801561043457600080fd5b5061043d6114df565b005b610459600480360381019061045491906143a7565b6115bb565b005b34801561046757600080fd5b50610482600480360381019061047d91906143a7565b611932565b005b34801561049057600080fd5b506104ab60048036038101906104a691906143a7565b611dcd565b6040516104b89190614d8a565b60405180910390f35b3480156104cd57600080fd5b506104e860048036038101906104e391906143a7565b611e31565b6040516104f59190614a10565b60405180910390f35b34801561050a57600080fd5b5061052560048036038101906105209190614080565b611eb6565b6040516105329190614d8a565b60405180910390f35b34801561054757600080fd5b50610550611eff565b60405161055f93929190614a77565b60405180910390f35b34801561057457600080fd5b5061057d61212c565b60405161058a9190614d8a565b60405180910390f35b34801561059f57600080fd5b506105ba60048036038101906105b591906143a7565b612132565b6040516105c79190614d46565b60405180910390f35b3480156105dc57600080fd5b506105f760048036038101906105f291906143a7565b6121a5565b604051610605929190614d61565b60405180910390f35b34801561061a57600080fd5b506106236122be565b6040516106309190614d8a565b60405180910390f35b34801561064557600080fd5b50610660600480360381019061065b91906143a7565b6122c4565b60405161066d9190614aae565b60405180910390f35b34801561068257600080fd5b5061069d600480360381019061069891906143a7565b6122ed565b6040516106ac93929190614da5565b60405180910390f35b3480156106c157600080fd5b506106ca612336565b6040516106d79190614a10565b60405180910390f35b3480156106ec57600080fd5b506106f561235a565b6040516107029190614d8a565b60405180910390f35b34801561071757600080fd5b50610720612360565b60405161072d9190614ae4565b60405180910390f35b34801561074257600080fd5b5061075d600480360381019061075891906143a7565b6123f2565b60405161076a9190614d8a565b60405180910390f35b34801561077f57600080fd5b5061079a600480360381019061079591906141af565b612416565b005b6107b660048036038101906107b19190614340565b612513565b005b3480156107c457600080fd5b506107df60048036038101906107da91906143a7565b612d5a565b005b3480156107ed57600080fd5b5061080860048036038101906108039190614134565b612f8f565b005b34801561081657600080fd5b5061081f6130ed565b60405161082c9190614ac9565b60405180910390f35b34801561084157600080fd5b5061084a613160565b6040516108579190614d8a565b60405180910390f35b34801561086c57600080fd5b50610887600480360381019061088291906142a2565b6131ce565b005b34801561089557600080fd5b506108b060048036038101906108ab91906143a7565b613286565b6040516108bd9190614ae4565b60405180910390f35b3480156108d257600080fd5b506108ed60048036038101906108e89190614317565b613499565b6040516108fa9190614d8a565b60405180910390f35b34801561090f57600080fd5b5061092a600480360381019061092591906143a7565b6134b1565b005b34801561093857600080fd5b50610953600480360381019061094e91906140a9565b61383d565b6040516109609190614aae565b60405180910390f35b600060176000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6060600780546109e090615757565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0c90615757565b8015610a595780601f10610a2e57610100808354040283529160200191610a59565b820191906000526020600020905b815481529060010190602001808311610a3c57829003601f168201915b5050505050905090565b6000610a6e826138d1565b610aad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa490614d26565b60405180910390fd5b6003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610af382611e31565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610bb55750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610bf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610beb90614ba6565b60405180910390fd5b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4826003600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2b90614b06565b60405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000601054600580549050610d8c91906155ae565b905090565b6000610d9c82611e31565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610e3657503373ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80610ec75750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610f06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efd90614ba6565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6b90614b06565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fe4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdb90614b46565b60405180910390fd5b610fed826122c4565b1561102d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102490614b26565b60405180910390fd5b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061112a9061572d565b9190505550600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061117f906157ba565b9190505550600073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611222576003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b50505050565b600080600c60008461ffff1661ffff16815260200190815260200160002060006002811061127f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600491828204019190066008029054906101000a900460070b60070b14801561131757506000600c60008461ffff1661ffff1681526020019081526020016000206001600281106112f9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600491828204019190066008029054906101000a900460070b60070b145b9050919050565b60105481565b61133f83838360405180602001604052806000815250612f8f565b505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c990614b06565b60405180910390fd5b6000600580549050905060006012546064600a600f546113f29190615444565b6113fc919061515f565b6064601985668e1bc9bf0400006114139190615444565b61141d9190615444565b611427919061515f565b6114319190614ffe565b61143b91906155ae565b905060008111611480576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147790614c06565b60405180910390fd5b4781111561148c574790505b806012600082825461149e9190614ffe565b925050819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461156d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156490614b06565b60405180910390fd5b6000601454146115b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a990614ce6565b60405180910390fd5b42601481905550565b60006115c56130ed565b905060016003811115611601577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81600381111561163a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14806116b657506002600381111561167b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160038111156116b4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b145b6116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec90614b66565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff1661171583611e31565b73ffffffffffffffffffffffffffffffffffffffff161461176b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176290614b06565b60405180910390fd5b6000806000611779856122ed565b925092509250600260038111156117b9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8460038111156117f2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611843576118028582613914565b15611842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183990614b26565b60405180910390fd5b5b668e1bc9bf0400008360026118589190615326565b6118629190615444565b34146118a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189a90614c46565b60405180910390fd5b6118bb856001856118b49190615054565b8484613ba6565b60646019668e1bc9bf0400006118d19190615444565b6118db919061515f565b346118e691906155ae565b600f60008282546118f79190614ffe565b92505081905550847f497d25ccff55cdf3b091a4d19054e291083d2a35c8cc511dfbab6b6a972ca29d60405160405180910390a25050505050565b600061193c6130ed565b905060016003811115611978577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160038111156119b1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1480611a2d5750600260038111156119f2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816003811115611a2b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b145b611a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6390614b66565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16611a8c83611e31565b73ffffffffffffffffffffffffffffffffffffffff1614611ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad990614b06565b60405180910390fd5b60026003811115611b1c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816003811115611b55577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611ba557611b64826122c4565b15611ba4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9b90614b26565b60405180910390fd5b5b6000600580549050905060006002611bbb610d77565b6011546064603286668e1bc9bf040000611bd59190615444565b611bdf9190615444565b611be9919061515f565b611bf391906155ae565b611bfd919061515f565b611c07919061515f565b90506000611c1485611dcd565b82611c1f9190614ffe565b9050600260006006600088815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611ca49061572d565b9190505550600b6000611cb687612132565b61ffff1661ffff1681526020019081526020016000206000905560106000815480929190611ce3906157ba565b91905055508160116000828254611cfa9190614ffe565b9250508190555084600073ffffffffffffffffffffffffffffffffffffffff166006600088815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a43373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050505050505050565b600080600080611ddc856122ed565b9250925092506064601983856001611df49190615054565b611dfe91906155e2565b60ff16668e1bc9bf040000611e139190615444565b611e1d9190615444565b611e27919061515f565b9350505050919050565b6000611e3c826138d1565b611e7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7290614d26565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611f07613ce3565b60008060006005607843611f1b919061588c565b43611f2691906155ae565b611f3091906155ae565b905060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff824060001c611f64919061588c565b905060006001611f72610d77565b611f7c9190614ffe565b60026227807b611f8c91906150f5565b60070b611f99919061508b565b9050620186a060070b811215611fb357620186a060070b90505b60026241eb00611fc391906150f5565b60070b6241eb0060070b83611fd8919061585b565b611fe2919061549e565b8660006002811061201c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002019060070b908160070b8152505060026227807b61203d91906150f5565b60070b6227807b60070b6241eb0060070b84612059919061508b565b612063919061585b565b61206d919061549e565b866001600281106120a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002019060070b908160070b8152505080816227807b60070b6241eb0060070b856120d3919061508b565b6120dd919061508b565b6120e7919061585b565b6120f19190614eee565b94508585878760405160200161210892919061494a565b60405160208183030381529060405280519060200120955095509550505050909192565b60115481565b6000600560018361214391906155ae565b8154811061217a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff169050919050565b6000806121b183612132565b91506006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600b60008461ffff1661ffff168152602001908152602001600020541480156122415750600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b612280576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227790614c86565b60405180910390fd5b816006600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691509150915091565b60145481565b6000806000806122d3856122ed565b9250925092506122e38582613914565b9350505050919050565b600080600080600e600086815260200190815260200160002054905060f88082901b901c60001c9350600860f08083901b901c901c60001c9250601081901c9150509193909250565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f5481565b60606008805461236f90615757565b80601f016020809104026020016040519081016040528092919081815260200182805461239b90615757565b80156123e85780601f106123bd576101008083540402835291602001916123e8565b820191906000526020600020905b8154815290600101906020018083116123cb57829003601f168201915b5050505050905090565b60006123fd82611dcd565b612405613160565b61240f9190614ffe565b9050919050565b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124739190614aae565b60405180910390a380600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6001600381111561254d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6125556130ed565b600381111561258d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b146125cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c490614b66565b60405180910390fd5b6016546014546125dd9190614ffe565b4210156126d2576000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016126419190614a10565b60206040518083038186803b15801561265957600080fd5b505afa15801561266d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061269191906143d0565b116126d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c890614c26565b60405180910390fd5b5b6000838360006002811061270f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020160208101906127229190614279565b8460016002811061275c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201602081019061276f9190614279565b604051602001612781939291906149d3565b6040516020818303038152906040528051906020012090506127a682600d5483613bf6565b6127e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127dc90614ca6565b60405180910390fd5b6000600b60008661ffff1661ffff1681526020019081526020016000205414801561287f57506000600c60008661ffff1661ffff168152602001908152602001600020600060028110612861577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600491828204019190066008029054906101000a900460070b60070b145b80156128fa57506000600c60008661ffff1661ffff1681526020019081526020016000206001600281106128dc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600491828204019190066008029054906101000a900460070b60070b145b612939576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293090614cc6565b60405180910390fd5b60026241eb00612948906158bd565b61295291906150f5565b60070b8360006002811061298f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020160208101906129a29190614279565b60070b12158015612a14575060026241eb006129be91906150f5565b60070b836000600281106129fb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002016020810190612a0e9190614279565b60070b13155b8015612a8a575060026227807b612a2a906158bd565b612a3491906150f5565b60070b83600160028110612a71577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002016020810190612a849190614279565b60070b12155b8015612af7575060026227807b612aa191906150f5565b60070b83600160028110612ade577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002016020810190612af19190614279565b60070b13155b612b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2d90614b86565b60405180910390fd5b668e1bc9bf0400003414612b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7690614c46565b60405180910390fd5b82600c60008661ffff1661ffff168152602001908152602001600020906002612ba9929190613d05565b5060058490806001815401808255809150506001900390600052602060002090601091828204019190066002029091909190916101000a81548161ffff021916908361ffff16021790555060006005805490509050600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190612c4e906157ba565b9190505550336006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b60008761ffff1661ffff16815260200190815260200160002081905550808561ffff167fc678d7c6bd4d7281f2061bc3c9d9b0a8126543c59834a0b1a6199947189573e560405160405180910390a3803373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b600380811115612d93577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b612d9b6130ed565b6003811115612dd3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14612e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0a90614b66565b60405180910390fd5b612e1c816138d1565b612e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5290614d26565b60405180910390fd5b612e6481611e31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec890614c66565b60405180910390fd5b601360009054906101000a900460ff1615612f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1890614d06565b60405180910390fd5b6001601360006101000a81548160ff0219169083151502179055506000612f47826123f2565b905047811115612f55574790505b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050505050565b612f9a848484610d91565b6000833b905060008163ffffffff1611156130e65760008490507f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168173ffffffffffffffffffffffffffffffffffffffff1663150b7a02338988886040518563ffffffff1660e01b81526004016130339493929190614a2b565b602060405180830381600087803b15801561304d57600080fd5b505af1158015613061573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130859190614250565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146130e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130db90614be6565b60405180910390fd5b505b5050505050565b6000806014541415613102576000905061315d565b6015546014546131129190614ffe565b4210801561312657506196d3600580549050105b15613134576001905061315d565b600160058054905061314691906155ae565b6010541015613158576002905061315d565b600390505b90565b60008060058054905090506064605a600f5461317c9190615444565b613186919061515f565b6011546064603284668e1bc9bf0400006131a09190615444565b6131aa9190615444565b6131b4919061515f565b6131be91906155ae565b6131c89190614ffe565b91505090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461325c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325390614b06565b60405180910390fd5b83836009919061326d929190613dba565b508181600a919061327f929190613dba565b5050505050565b6060613291826138d1565b6132d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132c790614bc6565b60405180910390fd5b60006132db83612132565b61ffff1690506000819050600081905060005b60008214613318578080613301906157ba565b915050600a82613311919061515f565b91506132ee565b60008167ffffffffffffffff81111561335a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561338c5781602001600182028036833780820191505090505b50905060008290505b60008514613466576001816133aa91906155ae565b90506000600a80876133bc919061515f565b6133c69190615444565b866133d191906155ae565b60306133dd9190615054565b905060008160f81b905080848481518110613421577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8761345d919061515f565b96505050613395565b600982600a60405160200161347d939291906149a2565b6040516020818303038152906040529650505050505050919050565b600b6020528060005260406000206000915090505481565b600260038111156134eb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6134f36130ed565b600381111561352b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1461356b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161356290614b66565b60405180910390fd5b613574816138d1565b6135b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135aa90614d26565b60405180910390fd5b60008060006135c1846122ed565b9250925092506135d18482613914565b613610576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360790614b26565b60405180910390fd5b600080600061361d611eff565b92509250925061362c81613cd2565b9050867f287c3b40cb7d7950236aa90ed97e4245eed94845734e1f48ececacf164c16cf260405160405180910390a28560ff168560ff16101561368857848061367490615803565b95505061368387878784613ba6565b6137df565b60026000600660008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061370b9061572d565b9190505550600b600061371d89612132565b61ffff1661ffff168152602001908152602001600020600090556010600081548092919061374a906157ba565b919050555086600073ffffffffffffffffffffffffffffffffffffffff16600660008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b3373ffffffffffffffffffffffffffffffffffffffff166108fc60646019668e1bc9bf04000061380f9190615444565b613819919061515f565b9081150290604051600060405180830381858888f193505050505050505050505050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000808214156138e4576000905061390f565b6000600b60006138f385612132565b61ffff1661ffff16815260200190815260200160002054141590505b919050565b600080600080613922611eff565b92509250925061393181613cd2565b8514156139445760009350505050613ba0565b600061394f87612132565b905060008460006002811061398d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151600c60008461ffff1661ffff1681526020019081526020016000206000600281106139e6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600491828204019190066008029054906101000a900460070b613a099190615532565b9050600085600160028110613a47577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151600c60008561ffff1661ffff168152602001908152602001600020600160028110613aa0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600491828204019190066008029054906101000a900460070b613ac39190615532565b9050600285613ad291906152d2565b60070b600282613ae291906152d2565b600284613aef91906152d2565b613af99190614f82565b60070b1280613b4a5750600285613b1091906152d2565b60070b600282613b2091906152d2565b60026241eb0085613b319190614f82565b613b3b91906152d2565b613b459190614f82565b60070b125b80613b975750600285613b5d91906152d2565b60070b600282613b6d91906152d2565b60026241eb0085613b7e9190615532565b613b8891906152d2565b613b929190614f82565b60070b125b96505050505050505b92915050565b60008360ff1660001b9050600060088460ff1660001b901b905060006010613bcd85613cd2565b901b90508082841818600e60008981526020019081526020016000208190555050505050505050565b60008082905060005b8551811015613cc4576000868281518110613c43577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050808311613c84578281604051602001613c67929190614976565b604051602081830303815290604052805190602001209250613cb0565b8083604051602001613c97929190614976565b6040516020818303038152906040528051906020012092505b508080613cbc906157ba565b915050613bff565b508381149150509392505050565b600060108083901b901c9050919050565b6040518060400160405280600290602082028036833780820191505090505090565b826002600301600490048101928215613da95791602002820160005b83821115613d7357833560070b83826101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055509260200192600801602081600701049283019260010302613d21565b8015613da75782816101000a81549067ffffffffffffffff0219169055600801602081600701049283019260010302613d73565b505b509050613db69190613e40565b5090565b828054613dc690615757565b90600052602060002090601f016020900481019282613de85760008555613e2f565b82601f10613e0157803560ff1916838001178555613e2f565b82800160010185558215613e2f579182015b82811115613e2e578235825591602001919060010190613e13565b5b509050613e3c9190613e40565b5090565b5b80821115613e59576000816000905550600101613e41565b5090565b6000613e70613e6b84614e01565b614ddc565b90508083825260208201905082856020860282011115613e8f57600080fd5b60005b85811015613ebf5781613ea58882613f79565b845260208401935060208301925050600181019050613e92565b5050509392505050565b6000613edc613ed784614e2d565b614ddc565b905082815260208101848484011115613ef457600080fd5b613eff8482856156eb565b509392505050565b600081359050613f1681615d1f565b92915050565b600082601f830112613f2d57600080fd5b8135613f3d848260208601613e5d565b91505092915050565b600081905082602060020282011115613f5e57600080fd5b92915050565b600081359050613f7381615d36565b92915050565b600081359050613f8881615d4d565b92915050565b600081359050613f9d81615d64565b92915050565b600081519050613fb281615d64565b92915050565b600082601f830112613fc957600080fd5b8135613fd9848260208601613ec9565b91505092915050565b600081359050613ff181615d7b565b92915050565b60008083601f84011261400957600080fd5b8235905067ffffffffffffffff81111561402257600080fd5b60208301915083600182028301111561403a57600080fd5b9250929050565b60008135905061405081615d92565b92915050565b60008135905061406581615da9565b92915050565b60008151905061407a81615da9565b92915050565b60006020828403121561409257600080fd5b60006140a084828501613f07565b91505092915050565b600080604083850312156140bc57600080fd5b60006140ca85828601613f07565b92505060206140db85828601613f07565b9150509250929050565b6000806000606084860312156140fa57600080fd5b600061410886828701613f07565b935050602061411986828701613f07565b925050604061412a86828701614056565b9150509250925092565b6000806000806080858703121561414a57600080fd5b600061415887828801613f07565b945050602061416987828801613f07565b935050604061417a87828801614056565b925050606085013567ffffffffffffffff81111561419757600080fd5b6141a387828801613fb8565b91505092959194509250565b600080604083850312156141c257600080fd5b60006141d085828601613f07565b92505060206141e185828601613f64565b9150509250929050565b600080604083850312156141fe57600080fd5b600061420c85828601613f07565b925050602061421d85828601614056565b9150509250929050565b60006020828403121561423957600080fd5b600061424784828501613f8e565b91505092915050565b60006020828403121561426257600080fd5b600061427084828501613fa3565b91505092915050565b60006020828403121561428b57600080fd5b600061429984828501613fe2565b91505092915050565b600080600080604085870312156142b857600080fd5b600085013567ffffffffffffffff8111156142d257600080fd5b6142de87828801613ff7565b9450945050602085013567ffffffffffffffff8111156142fd57600080fd5b61430987828801613ff7565b925092505092959194509250565b60006020828403121561432957600080fd5b600061433784828501614041565b91505092915050565b60008060006080848603121561435557600080fd5b600061436386828701614041565b935050602061437486828701613f46565b925050606084013567ffffffffffffffff81111561439157600080fd5b61439d86828701613f1c565b9150509250925092565b6000602082840312156143b957600080fd5b60006143c784828501614056565b91505092915050565b6000602082840312156143e257600080fd5b60006143f08482850161406b565b91505092915050565b60006144058383614613565b60208301905092915050565b600061441d8383614631565b60208301905092915050565b61443281615616565b82525050565b61444181614e7d565b61444b8184614eab565b925061445682614e5e565b8060005b8381101561448757815161446e87826143f9565b965061447983614e9e565b92505060018101905061445a565b505050505050565b61449881614e7d565b6144a28184614eb6565b92506144ad82614e5e565b8060005b838110156144de5781516144c58782614411565b96506144d083614e9e565b9250506001810190506144b1565b505050505050565b6144ef81615628565b82525050565b6144fe81615634565b82525050565b61451561451082615634565b61582d565b82525050565b600061452682614e88565b6145308185614ec1565b93506145408185602086016156fa565b614549816159f1565b840191505092915050565b600061455f82614e88565b6145698185614ed2565b93506145798185602086016156fa565b80840191505092915050565b6000815461459281615757565b61459c8186614ed2565b945060018216600081146145b757600181146145c8576145fb565b60ff198316865281860193506145fb565b6145d185614e68565b60005b838110156145f3578154818901526001820191506020810190506145d4565b838801955050505b50505092915050565b61460d816156d9565b82525050565b61461c81615687565b82525050565b61462b81615687565b82525050565b61463a81615687565b82525050565b61465161464c82615687565b615837565b82525050565b600061466282614e93565b61466c8185614edd565b935061467c8185602086016156fa565b614685816159f1565b840191505092915050565b600061469d600583614edd565b91506146a882615a29565b602082019050919050565b60006146c0600a83614edd565b91506146cb82615a52565b602082019050919050565b60006146e3600483614edd565b91506146ee82615a7b565b602082019050919050565b6000614706600583614edd565b915061471182615aa4565b602082019050919050565b6000614729600783614edd565b915061473482615acd565b602082019050919050565b600061474c600a83614edd565b915061475782615af6565b602082019050919050565b600061476f600783614edd565b915061477a82615b1f565b602082019050919050565b6000614792600883614edd565b915061479d82615b48565b602082019050919050565b60006147b5600583614edd565b91506147c082615b71565b602082019050919050565b60006147d8600583614edd565b91506147e382615b9a565b602082019050919050565b60006147fb600483614edd565b915061480682615bc3565b602082019050919050565b600061481e600783614edd565b915061482982615bec565b602082019050919050565b6000614841600883614edd565b915061484c82615c15565b602082019050919050565b6000614864600583614edd565b915061486f82615c3e565b602082019050919050565b6000614887600983614edd565b915061489282615c67565b602082019050919050565b60006148aa600783614edd565b91506148b582615c90565b602082019050919050565b60006148cd600983614edd565b91506148d882615cb9565b602082019050919050565b60006148f0600783614edd565b91506148fb82615ce2565b602082019050919050565b61490f81615694565b82525050565b61492661492182615694565b615849565b82525050565b614935816156c2565b82525050565b614944816156cc565b82525050565b6000614956828561448f565b6040820191506149668284614640565b6008820191508190509392505050565b60006149828285614504565b6020820191506149928284614504565b6020820191508190509392505050565b60006149ae8286614585565b91506149ba8285614554565b91506149c68284614585565b9150819050949350505050565b60006149df8286614915565b6002820191506149ef8285614640565b6008820191506149ff8284614640565b600882019150819050949350505050565b6000602082019050614a256000830184614429565b92915050565b6000608082019050614a406000830187614429565b614a4d6020830186614429565b614a5a604083018561492c565b8181036060830152614a6c818461451b565b905095945050505050565b6000608082019050614a8c6000830186614438565b614a996040830185614622565b614aa660608301846144f5565b949350505050565b6000602082019050614ac360008301846144e6565b92915050565b6000602082019050614ade6000830184614604565b92915050565b60006020820190508181036000830152614afe8184614657565b905092915050565b60006020820190508181036000830152614b1f81614690565b9050919050565b60006020820190508181036000830152614b3f816146b3565b9050919050565b60006020820190508181036000830152614b5f816146d6565b9050919050565b60006020820190508181036000830152614b7f816146f9565b9050919050565b60006020820190508181036000830152614b9f8161471c565b9050919050565b60006020820190508181036000830152614bbf8161473f565b9050919050565b60006020820190508181036000830152614bdf81614762565b9050919050565b60006020820190508181036000830152614bff81614785565b9050919050565b60006020820190508181036000830152614c1f816147a8565b9050919050565b60006020820190508181036000830152614c3f816147cb565b9050919050565b60006020820190508181036000830152614c5f816147ee565b9050919050565b60006020820190508181036000830152614c7f81614811565b9050919050565b60006020820190508181036000830152614c9f81614834565b9050919050565b60006020820190508181036000830152614cbf81614857565b9050919050565b60006020820190508181036000830152614cdf8161487a565b9050919050565b60006020820190508181036000830152614cff8161489d565b9050919050565b60006020820190508181036000830152614d1f816148c0565b9050919050565b60006020820190508181036000830152614d3f816148e3565b9050919050565b6000602082019050614d5b6000830184614906565b92915050565b6000604082019050614d766000830185614906565b614d836020830184614429565b9392505050565b6000602082019050614d9f600083018461492c565b92915050565b6000606082019050614dba600083018661493b565b614dc7602083018561493b565b614dd460408301846144f5565b949350505050565b6000614de6614df7565b9050614df28282615789565b919050565b6000604051905090565b600067ffffffffffffffff821115614e1c57614e1b6159c2565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614e4857614e476159c2565b5b614e51826159f1565b9050602081019050919050565b6000819050919050565b60008190508160005260206000209050919050565b600060029050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600081905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000614ef98261567d565b9150614f048361567d565b9250817f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03831360008312151615614f3f57614f3e615906565b5b817f8000000000000000000000000000000000000000000000000000000000000000038312600083121615614f7757614f76615906565b5b828201905092915050565b6000614f8d82615687565b9150614f9883615687565b925081677fffffffffffffff03831360008312151615614fbb57614fba615906565b5b817fffffffffffffffffffffffffffffffffffffffffffffffff8000000000000000038312600083121615614ff357614ff2615906565b5b828201905092915050565b6000615009826156c2565b9150615014836156c2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561504957615048615906565b5b828201905092915050565b600061505f826156cc565b915061506a836156cc565b92508260ff038211156150805761507f615906565b5b828201905092915050565b60006150968261567d565b91506150a18361567d565b9250826150b1576150b0615935565b5b600160000383147f8000000000000000000000000000000000000000000000000000000000000000831416156150ea576150e9615906565b5b828205905092915050565b600061510082615687565b915061510b83615687565b92508261511b5761511a615935565b5b600160000383147fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008314161561515457615153615906565b5b828205905092915050565b600061516a826156c2565b9150615175836156c2565b92508261518557615184615935565b5b828204905092915050565b6000808291508390505b60018511156151da578086048111156151b6576151b5615906565b5b60018516156151c55780820291505b80810290506151d385615a1c565b945061519a565b94509492505050565b600082600081146151fb57600181146152055761520e565b60019150506152ca565b829150506152ca565b508161521d57600090506152ca565b60019050600082136001811461523a576000811461525257615266565b82860483111561524d5761524c615906565b5b615266565b82860583121561526557615264615906565b5b5b506001831615615274578190505b818202915061528283615a1c565b925061529085848484615190565b9250905081850481116000821316156152ac576152ab615906565b5b81840581126000821216156152c4576152c3615906565b5b81810290505b949350505050565b60006152dd82615687565b91506152e8836156cc565b925061531e677fffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffff800000000000000085856151e3565b905092915050565b6000615331826156c2565b915061533c836156cc565b92506153697fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484615371565b905092915050565b600082615381576001905061543d565b8161538f576000905061543d565b81600181146153a557600281146153af576153de565b600191505061543d565b60ff8411156153c1576153c0615906565b5b8360020a9150848211156153d8576153d7615906565b5b5061543d565b5060208310610133831016604e8410600b84101617156154135782820a90508381111561540e5761540d615906565b5b61543d565b6154208484846001615190565b9250905081840481111561543757615436615906565b5b81810290505b9392505050565b600061544f826156c2565b915061545a836156c2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561549357615492615906565b5b828202905092915050565b60006154a98261567d565b91506154b48361567d565b9250827f8000000000000000000000000000000000000000000000000000000000000000018212600084121516156154ef576154ee615906565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01821360008412161561552757615526615906565b5b828203905092915050565b600061553d82615687565b915061554883615687565b9250827fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000000182126000841215161561558357615582615906565b5b82677fffffffffffffff0182136000841216156155a3576155a2615906565b5b828203905092915050565b60006155b9826156c2565b91506155c4836156c2565b9250828210156155d7576155d6615906565b5b828203905092915050565b60006155ed826156cc565b91506155f8836156cc565b92508282101561560b5761560a615906565b5b828203905092915050565b6000615621826156a2565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061567882615d0b565b919050565b6000819050919050565b60008160070b9050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006156e48261566a565b9050919050565b82818337600083830152505050565b60005b838110156157185780820151818401526020810190506156fd565b83811115615727576000848401525b50505050565b6000615738826156c2565b9150600082141561574c5761574b615906565b5b600182039050919050565b6000600282049050600182168061576f57607f821691505b6020821081141561578357615782615993565b5b50919050565b615792826159f1565b810181811067ffffffffffffffff821117156157b1576157b06159c2565b5b80604052505050565b60006157c5826156c2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156157f8576157f7615906565b5b600182019050919050565b600061580e826156cc565b915060ff82141561582257615821615906565b5b600182019050919050565b6000819050919050565b600061584282615a02565b9050919050565b600061585482615a0f565b9050919050565b60006158668261567d565b91506158718361567d565b92508261588157615880615935565b5b828207905092915050565b6000615897826156c2565b91506158a2836156c2565b9250826158b2576158b1615935565b5b828206905092915050565b60006158c882615687565b91507fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008214156158fb576158fa615906565b5b816000039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160c01b9050919050565b60008160f01b9050919050565b60008160011c9050919050565b7f6f776e6572000000000000000000000000000000000000000000000000000000600082015250565b7f76756c6e657261626c6500000000000000000000000000000000000000000000600082015250565b7f7a65726f00000000000000000000000000000000000000000000000000000000600082015250565b7f7374616765000000000000000000000000000000000000000000000000000000600082015250565b7f6f6666206d617000000000000000000000000000000000000000000000000000600082015250565b7f7065726d697373696f6e00000000000000000000000000000000000000000000600082015250565b7f746f6b656e496400000000000000000000000000000000000000000000000000600082015250565b7f7265636569766572000000000000000000000000000000000000000000000000600082015250565b7f656d707479000000000000000000000000000000000000000000000000000000600082015250565b7f6561726c79000000000000000000000000000000000000000000000000000000600082015250565b7f636f737400000000000000000000000000000000000000000000000000000000600082015250565b7f6f776e65724f6600000000000000000000000000000000000000000000000000600082015250565b7f7375727669766573000000000000000000000000000000000000000000000000600082015250565b7f70726f6f66000000000000000000000000000000000000000000000000000000600082015250565b7f696e686162697465640000000000000000000000000000000000000000000000600082015250565b7f7374617274656400000000000000000000000000000000000000000000000000600082015250565b7f77697468647261776e0000000000000000000000000000000000000000000000600082015250565b7f696e76616c696400000000000000000000000000000000000000000000000000600082015250565b60048110615d1c57615d1b615964565b5b50565b615d2881615616565b8114615d3357600080fd5b50565b615d3f81615628565b8114615d4a57600080fd5b50565b615d5681615634565b8114615d6157600080fd5b50565b615d6d8161563e565b8114615d7857600080fd5b50565b615d8481615687565b8114615d8f57600080fd5b50565b615d9b81615694565b8114615da657600080fd5b50565b615db2816156c2565b8114615dbd57600080fd5b5056fea26469706673582212201f87b34436c48c9e3c6e95c6b5aeeca9b09d60f7c84ebf57b204b8b4f4fce38d64736f6c63430008040033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

430a7680ca49d499ba2515b1658b7f69e3717b89f68a5f738c35cb01132f961a0000000000000000000000009abb7bddc43fa67c76a62d8c016513827f59be1b

-----Decoded View---------------
Arg [0] : _cityRoot (bytes32): 0x430a7680ca49d499ba2515b1658b7f69e3717b89f68a5f738c35cb01132f961a
Arg [1] : _earlyAccessHolders (address): 0x9Abb7BdDc43FA67c76a62d8C016513827f59bE1b

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 430a7680ca49d499ba2515b1658b7f69e3717b89f68a5f738c35cb01132f961a
Arg [1] : 0000000000000000000000009abb7bddc43fa67c76a62d8c016513827f59be1b


Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.