ETH Price: $2,988.72 (-2.19%)
Gas: 2 Gwei

Contract

0xe673B87E84A207aA49078564bCaa537d25c84a6F
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Set Approval For...202139132024-07-01 19:59:235 days ago1719863963IN
0xe673B87E...d25c84a6F
0 ETH0.0005965713
Set Approval For...199155492024-05-21 3:18:4747 days ago1716261527IN
0xe673B87E...d25c84a6F
0 ETH0.000514911.22042955
Set Approval For...198863892024-05-17 1:22:4751 days ago1715908967IN
0xe673B87E...d25c84a6F
0 ETH0.000134492.93088442
Set Approval For...197769362024-05-01 18:00:5967 days ago1714586459IN
0xe673B87E...d25c84a6F
0 ETH0.0004900810.67958316
Set Approval For...197533312024-04-28 10:50:2370 days ago1714301423IN
0xe673B87E...d25c84a6F
0 ETH0.000323787.05558832
Set Approval For...197420382024-04-26 20:55:2371 days ago1714164923IN
0xe673B87E...d25c84a6F
0 ETH0.0005400411.76818744
Set Approval For...197416512024-04-26 19:37:2371 days ago1714160243IN
0xe673B87E...d25c84a6F
0 ETH0.000262675.72391311
Set Approval For...196974652024-04-20 15:17:5978 days ago1713626279IN
0xe673B87E...d25c84a6F
0 ETH0.00034837.59001674
Set Approval For...196761152024-04-17 15:33:4781 days ago1713368027IN
0xe673B87E...d25c84a6F
0 ETH0.0016502935.96190182
Set Approval For...196096362024-04-08 8:03:1190 days ago1712563391IN
0xe673B87E...d25c84a6F
0 ETH0.0007353616.02450433
Set Approval For...196053032024-04-07 17:28:2391 days ago1712510903IN
0xe673B87E...d25c84a6F
0 ETH0.0010058721.91919141
Safe Transfer Fr...195989522024-04-06 20:06:1191 days ago1712433971IN
0xe673B87E...d25c84a6F
0 ETH0.0012894117.32509224
Set Approval For...195675182024-04-02 10:27:2396 days ago1712053643IN
0xe673B87E...d25c84a6F
0 ETH0.0012499627.23838891
Set Approval For...195548472024-03-31 15:45:2398 days ago1711899923IN
0xe673B87E...d25c84a6F
0 ETH0.0011485725.02882672
Set Approval For...195468542024-03-30 12:45:3599 days ago1711802735IN
0xe673B87E...d25c84a6F
0 ETH0.0009579120.87411601
Set Approval For...194493962024-03-16 19:01:47112 days ago1710615707IN
0xe673B87E...d25c84a6F
0 ETH0.0023349550.88160623
Set Approval For...194413742024-03-15 15:55:23114 days ago1710518123IN
0xe673B87E...d25c84a6F
0 ETH0.0020276944.18605131
Set Approval For...194259102024-03-13 11:39:47116 days ago1710329987IN
0xe673B87E...d25c84a6F
0 ETH0.0028369661.82099377
Set Approval For...192289082024-02-14 21:35:11143 days ago1707946511IN
0xe673B87E...d25c84a6F
0 ETH0.0006050225.23238136
Set Approval For...190862062024-01-25 21:06:47163 days ago1706216807IN
0xe673B87E...d25c84a6F
0 ETH0.0011267124.55258141
Set Approval For...190363512024-01-18 21:12:47170 days ago1705612367IN
0xe673B87E...d25c84a6F
0 ETH0.0008817636.64537357
Set Approval For...190226652024-01-16 23:14:59172 days ago1705446899IN
0xe673B87E...d25c84a6F
0 ETH0.0012494727.22753234
Set Approval For...190092412024-01-15 2:15:59174 days ago1705284959IN
0xe673B87E...d25c84a6F
0 ETH0.0009274520.2104998
Set Approval For...190021742024-01-14 2:34:35175 days ago1705199675IN
0xe673B87E...d25c84a6F
0 ETH0.000740216.12996966
Set Approval For...188025842023-12-17 1:48:35203 days ago1702777715IN
0xe673B87E...d25c84a6F
0 ETH0.000828934.44884553
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To Value
130149422021-08-13 5:36:381059 days ago1628832998
0xe673B87E...d25c84a6F
0.2 ETH
130149412021-08-13 5:36:291059 days ago1628832989
0xe673B87E...d25c84a6F
0.2 ETH
130149412021-08-13 5:36:291059 days ago1628832989
0xe673B87E...d25c84a6F
0.2 ETH
130149412021-08-13 5:36:291059 days ago1628832989
0xe673B87E...d25c84a6F
0.2 ETH
130149412021-08-13 5:36:291059 days ago1628832989
0xe673B87E...d25c84a6F
0.2 ETH
130149402021-08-13 5:36:241059 days ago1628832984
0xe673B87E...d25c84a6F
0.2 ETH
130149402021-08-13 5:36:241059 days ago1628832984
0xe673B87E...d25c84a6F
0.2 ETH
130149402021-08-13 5:36:241059 days ago1628832984
0xe673B87E...d25c84a6F
0.2 ETH
130149392021-08-13 5:36:201059 days ago1628832980
0xe673B87E...d25c84a6F
0.2 ETH
130149392021-08-13 5:36:201059 days ago1628832980
0xe673B87E...d25c84a6F
0.2 ETH
130149382021-08-13 5:35:581059 days ago1628832958
0xe673B87E...d25c84a6F
0.2 ETH
130149372021-08-13 5:35:351059 days ago1628832935
0xe673B87E...d25c84a6F
0.2 ETH
130149372021-08-13 5:35:351059 days ago1628832935
0xe673B87E...d25c84a6F
0.2 ETH
130149372021-08-13 5:35:351059 days ago1628832935
0xe673B87E...d25c84a6F
0.2 ETH
130149372021-08-13 5:35:351059 days ago1628832935
0xe673B87E...d25c84a6F
0.2 ETH
130149372021-08-13 5:35:351059 days ago1628832935
0xe673B87E...d25c84a6F
0.2 ETH
130149362021-08-13 5:35:271059 days ago1628832927
0xe673B87E...d25c84a6F
0.2 ETH
130149362021-08-13 5:35:271059 days ago1628832927
0xe673B87E...d25c84a6F
0.2 ETH
130149352021-08-13 5:35:201059 days ago1628832920
0xe673B87E...d25c84a6F
0.2 ETH
130149352021-08-13 5:35:201059 days ago1628832920
0xe673B87E...d25c84a6F
0.2 ETH
130149342021-08-13 5:35:051059 days ago1628832905
0xe673B87E...d25c84a6F
0.2 ETH
130149342021-08-13 5:35:051059 days ago1628832905
0xe673B87E...d25c84a6F
0.2 ETH
130149342021-08-13 5:35:051059 days ago1628832905
0xe673B87E...d25c84a6F
0.2 ETH
130149342021-08-13 5:35:051059 days ago1628832905
0xe673B87E...d25c84a6F
0.2 ETH
130149332021-08-13 5:34:381059 days ago1628832878
0xe673B87E...d25c84a6F
0.2 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Repaintedglyphs

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-08-14
*/

pragma solidity ^0.5.17;

interface paintglyphsV1Contract {
    function ownerOf(uint256 tokenId) external view returns (address owner);
    function transferFrom(address _from, address _to, uint256 _tokenId) external;
}

interface ERC721TokenReceiver
{
    function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) external returns(bytes4);
}

contract Repaintedglyphs {

    event Generated(uint indexed index, address indexed a, string value);

    /// @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);

    event ColorChanged(uint id, uint symbolToUpdate, uint newColor);
    
    bytes4 internal constant MAGIC_ON_ERC721_RECEIVED = 0x150b7a02;

    uint public constant TOKEN_LIMIT = 512;
    uint public constant ARTIST_PRINTS = 0;

    uint public constant PRICE = 200 finney;

    address payable public constant BENEFICIARY = 0x8C9eEEcaeb226f1B8C1385abE0960754e08EC285;

    mapping (uint => address) private idToCreator;
    mapping (uint => uint8) private idToSymbolScheme;
    mapping (uint => uint256) private idToBackgroundColor;
    mapping (uint => uint256[8]) private idToColorScheme;
    mapping (uint => string) private processingCode;

    // ERC 165
    mapping(bytes4 => bool) internal supportedInterfaces;

    /**
     * @dev A mapping from NFT ID to the address that owns it.
     */
    mapping (uint256 => address) internal idToOwner;

    /**
     * @dev A mapping from NFT ID to the seed used to make it.
     */
    mapping (uint256 => uint256) internal idToSeed;
    mapping (uint256 => uint256) internal seedToId;

    /**
     * @dev Mapping from NFT ID to approved address.
     */
    mapping (uint256 => address) internal idToApproval;

    /**
     * @dev Mapping from owner address to mapping of operator addresses.
     */
    mapping (address => mapping (address => bool)) internal ownerToOperators;

    /**
     * @dev Mapping from owner to list of owned NFT IDs.
     */
    mapping(address => uint256[]) internal ownerToIds;

    /**
     * @dev Mapping from NFT ID to its index in the owner tokens list.
     */
    mapping(uint256 => uint256) internal idToOwnerIndex;

    /**
     * @dev Total number of tokens.
     */
    uint internal numTokens = 102; //start index at 102 (# of paintglyphs v1)

    /**
     * @dev Guarantees that the msg.sender is an owner or operator of the given NFT.
     * @param _tokenId ID of the NFT to validate.
     */
    modifier canOperate(uint256 _tokenId) {
        address tokenOwner = idToOwner[_tokenId];
        require(tokenOwner == msg.sender || ownerToOperators[tokenOwner][msg.sender]);
        _;
    }

    /**
     * @dev Guarantees that the msg.sender is allowed to transfer NFT.
     * @param _tokenId ID of the NFT to transfer.
     */
    modifier canTransfer(uint256 _tokenId) {
        address tokenOwner = idToOwner[_tokenId];
        require(
            tokenOwner == msg.sender
            || idToApproval[_tokenId] == msg.sender
            || ownerToOperators[tokenOwner][msg.sender]
        );
        _;
    }

    /**
     * @dev Guarantees that _tokenId is a valid Token.
     * @param _tokenId ID of the NFT to validate.
     */
    modifier validNFToken(uint256 _tokenId) {
        require(idToOwner[_tokenId] != address(0));
        _;
    }
    
        
    modifier isOwner() {
        require(msg.sender == owner, "Must be deployer of contract");
        _;
    }

    /**
     * @dev Contract constructor.
     */
    constructor() public {
        supportedInterfaces[0x01ffc9a7] = true; // ERC165
        supportedInterfaces[0x80ac58cd] = true; // ERC721
        supportedInterfaces[0x780e9d63] = true; // ERC721 Enumerable
        supportedInterfaces[0x5b5e139f] = true; // ERC721 Metadata
        paintglyphsV1 = paintglyphsV1Contract(paintglyphsAddress);
        owner = msg.sender;
        setURI("https://paintglyphsV2.azurewebsites.net/api/HttpTrigger?id=");
    }

    ///////////////////
    //// GENERATOR ////
    ///////////////////

    int constant ONE = int(0x100000000);
    uint constant USIZE = 32;
    int constant SIZE = int(USIZE);
    int constant HALF_SIZE = SIZE / int(2);
    address public owner;
    string URI;

    int constant SCALE = int(0x1b81a81ab1a81a823);
    int constant HALF_SCALE = SCALE / int(2);

    bytes prefix = "data:text/plain;charset=utf-8,";

    string internal nftName = "Paintglyphs V2";
    string internal nftSymbol = "p☵2";
    address public paintglyphsAddress = 0x2E8b45D550E4bb8c7986EE98879C1740519E0A1A;
    string public allSymbols = "0 - ░; 1 - ▒; 2 - ■; 3 - ┼; 4 - ▓; 5 - ▄; 6 - ▀; 7 - ≡";
    
    paintglyphsV1Contract paintglyphsV1;

    function abs(int n) internal pure returns (int) {
        if (n >= 0) return n;
        return -n;
    }
    
    function getStartColor(uint a) internal pure returns (uint256) {
        uint256 xxxxff = a % 96;
        uint256 xxffxx = xxxxff*256;
        uint256 ffxxxx = xxffxx*256;
        uint256 randomColor = xxxxff + xxffxx + ffxxxx;
        return randomColor;
    }

    function getBackgroundColor(uint a) internal pure returns (uint256) {
        uint256 xxxxff = (a % 128) + 128;
        uint256 xxffxx = xxxxff*256;
        uint256 ffxxxx = xxffxx*256;
        uint256 randomColor = xxxxff + xxffxx + ffxxxx;
        return randomColor;
    }
    
    function getScheme(uint a) internal pure returns (uint8) {
        uint index = a % 100;
        uint8 scheme;
        if (index < 22) {
            scheme = 1;
        } else if (index < 41) {
            scheme = 2;
        } else if (index < 58) {
            scheme = 3;
        } else if (index < 72) {
            scheme = 4;
        } else if (index < 84) {
            scheme = 5;
        } else if (index < 93) {
            scheme = 6;
        }else {
            scheme = 7;
        }
        return scheme;
    }

    /* * ** *** ***** ******** ************* ******** ***** *** ** * */

    // The following code generates art.

    function draw(uint id) public view returns (string memory) {
        uint a = uint((keccak256(abi.encodePacked(idToSeed[id]))));
        bytes memory output = new bytes(USIZE * (USIZE + 3) + 30);
        uint c;
        for (c = 0; c < 30; c++) {
            output[c] = prefix[c];
        }
        int x = 0;
        int y = 0;
        uint v = 0;
        uint value = 0;
        uint mod = (a % 11) + 10;
        bytes10 symbols;
        if (idToSymbolScheme[id] == 0) {
            revert();
        } else if (idToSymbolScheme[id] == 1) {
            symbols = 0x3030302E2E2E2E2E2E2E; // ░
        } else if (idToSymbolScheme[id] == 2) { 
            symbols = 0x303130312E2E2E2E2E2E; // ░▒
        } else if (idToSymbolScheme[id] == 3) {
            symbols = 0x323332332E2E2E2E2E2E; // ■┼
        } else if (idToSymbolScheme[id] == 4) {
            symbols = 0x303134302E2E2E2E2E2E; // ░▒▓
        } else if (idToSymbolScheme[id] == 5) {
            symbols = 0x3035362E2E2E2E2E2E2E; // ░▄▀
        } else if (idToSymbolScheme[id] == 6) {
            symbols = 0x313731332E2E2E2E2E2E; // ▒┼≡
        } else {
            symbols = 0x30313233342E2E2E2E2E; // ░▒■┼▓
        }
        for (int i = int(0); i < SIZE; i++) {
            y = (2 * (i - HALF_SIZE) + 1);
            if (a % 3 == 1) {
                y = -y;
            } else if (a % 3 == 2) {
                y = abs(y);
            }
            y = y * int(a);
            for (int j = int(0); j < SIZE; j++) {
                x = (2 * (j - HALF_SIZE) + 1);
                if (a % 2 == 1) {
                    x = abs(x);
                }
                x = x * int(a);
                v = uint(x * y / ONE) % mod;
                if (v < 10) {
                    value = uint(uint8(symbols[v]));
                } else {
                    value = 0x2E;
                }
                output[c] = byte(bytes32(value << 248));
                c++;
            }
            output[c] = byte(0x25);
            c++;
            output[c] = byte(0x30);
            c++;
            output[c] = byte(0x41);
            c++;
        }
        string memory result = string(output);
        return result;
    }

    /* * ** *** ***** ******** ************* ******** ***** *** ** * */
    
    function creator(uint _id) external view returns (address) {
        return idToCreator[_id];
    }

    function symbolScheme(uint _id) external view returns (uint8) {
        return idToSymbolScheme[_id];
    }

    function backgroundScheme(uint _id) external view returns (uint256) {
        return idToBackgroundColor[_id];
    }

    function colorScheme(uint _id) external view returns (uint256 color0, uint256 color1, uint color2, uint color3, uint color4, uint color5, uint color6, uint color7) {
        color0 = idToColorScheme[_id][0];
        color1 = idToColorScheme[_id][1];
        color2 = idToColorScheme[_id][2];
        color3 = idToColorScheme[_id][3];
        color4 = idToColorScheme[_id][4];
        color5 = idToColorScheme[_id][5];
        color6 = idToColorScheme[_id][6];
        color7 = idToColorScheme[_id][7];
    }
    
    function updateProcessingCode(string memory newProcessingCode, uint256 version) public {
        processingCode[version] = newProcessingCode;
    }
    
    function showProcessingCode(uint version) external view returns (string memory) {
        return processingCode[version];
    }

    //////////////////////////
    //// ERC 721 and 165  ////
    //////////////////////////

    /**
     * @dev Returns whether the target address is a contract.
     * @param _addr Address to check.
     */
    function isContract(address _addr) internal view returns (bool addressCheck) {
        uint256 size;
        assembly { size := extcodesize(_addr) } // solhint-disable-line
        addressCheck = size > 0;
    }

    /**
     * @dev Function to check which interfaces are suported by this contract.
     * @param _interfaceID Id of the interface.
     * @return True if _interfaceID is supported, false otherwise.
     */
    function supportsInterface(bytes4 _interfaceID) external view returns (bool) {
        return supportedInterfaces[_interfaceID];
    }

    /**
     * @dev Transfers the ownership of an NFT from one address to another address. This function can
     * be changed to payable.
     * @notice 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,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 {
        _safeTransferFrom(_from, _to, _tokenId, _data);
    }

    /**
     * @dev Transfers the ownership of an NFT from one address to another address. This function can
     * be changed to payable.
     * @notice 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 {
        _safeTransferFrom(_from, _to, _tokenId, "");
    }

    /**
     * @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. This function can be changed to payable.
     * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else
     * they maybe be permanently lost.
     * @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 canTransfer(_tokenId) validNFToken(_tokenId) {
        address tokenOwner = idToOwner[_tokenId];
        require(tokenOwner == _from);
        require(_to != address(0));
        _transfer(_to, _tokenId);
    }

    /**
     * @dev Set or reaffirm the approved address for an NFT. This function can be changed to payable.
     * @notice 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 Address to be approved for the given NFT ID.
     * @param _tokenId ID of the token to be approved.
     */
    function approve(address _approved, uint256 _tokenId) external canOperate(_tokenId) validNFToken(_tokenId) {
        address tokenOwner = idToOwner[_tokenId];
        require(_approved != tokenOwner);
        idToApproval[_tokenId] = _approved;
        emit Approval(tokenOwner, _approved, _tokenId);
    }

    /**
     * @dev Enables or disables approval for a third party ("operator") to manage all of
     * `msg.sender`'s assets. It also emits the ApprovalForAll event.
     * @notice This works even if sender doesn't own any tokens at the time.
     * @param _operator Address to add to the set of authorized operators.
     * @param _approved True if the operators is approved, false to revoke approval.
     */
    function setApprovalForAll(address _operator, bool _approved) external {
        ownerToOperators[msg.sender][_operator] = _approved;
        emit ApprovalForAll(msg.sender, _operator, _approved);
    }

    /**
     * @dev Returns the number of NFTs owned by `_owner`. NFTs assigned to the zero address are
     * considered invalid, and this function throws for queries about the zero address.
     * @param _owner Address for whom to query the balance.
     * @return Balance of _owner.
     */
    function balanceOf(address _owner) external view returns (uint256) {
        require(_owner != address(0));
        return _getOwnerNFTCount(_owner);
    }

    /**
     * @dev Returns the address of the owner of the NFT. NFTs assigned to zero address are considered
     * invalid, and queries about them do throw.
     */
    function ownerOf(uint256 _tokenId) public view returns (address _owner) {
        _owner = idToOwner[_tokenId];
        require(_owner != address(0));
    }

    /**
     * @dev Get the approved address for a single NFT.
     * @notice Throws if `_tokenId` is not a valid NFT.
     * @param _tokenId ID of the NFT to query the approval of.
     * @return Address that _tokenId is approved for.
     */
    function getApproved(uint256 _tokenId) external view validNFToken(_tokenId) returns (address) {
        return idToApproval[_tokenId];
    }

    /**
     * @dev Checks if `_operator` is an approved operator for `_owner`.
     * @param _owner The address that owns the NFTs.
     * @param _operator The address that acts on behalf of the owner.
     * @return True if approved for all, false otherwise.
     */
    function isApprovedForAll(address _owner, address _operator) external view returns (bool) {
        return ownerToOperators[_owner][_operator];
    }

    /**
     * @dev Actually preforms the transfer.
     * @notice Does NO checks.
     * @param _to Address of a new owner.
     * @param _tokenId The NFT that is being transferred.
     */
    function _transfer(address _to, uint256 _tokenId) internal {
        address from = idToOwner[_tokenId];
        _clearApproval(_tokenId);

        _removeNFToken(from, _tokenId);
        _addNFToken(_to, _tokenId);

        emit Transfer(from, _to, _tokenId);
}


    function createPiece(uint seed) external payable {
        return _mint(msg.sender, seed);
    }


    /**
     * @dev Mints a new NFT.
     * @notice This is an internal function which should be called from user-implemented external
     * mint function. Its purpose is to show and properly initialize data structures when using this
     * implementation.
     * @param _to The address that will own the minted NFT.
     */
    function _mint(address _to, uint seed) internal {
        require(_to != address(0));
        require(numTokens < TOKEN_LIMIT);
        uint amount = 0;
        if (numTokens >= ARTIST_PRINTS) {
            amount = PRICE;
            require(msg.value >= amount);
        }
        require(seedToId[seed] == 0);
        uint id = numTokens + 1;

        idToCreator[id] = _to;
        idToSeed[id] = seed;
        seedToId[seed] = id;
        uint a = uint((keccak256(abi.encodePacked(seed,id))));
        idToBackgroundColor[id] = getBackgroundColor(a);
        idToSymbolScheme[id] = getScheme(a);
        uint randomColor;
        
        for (uint i = 0; i<8; i = i+1) {
            randomColor = getStartColor(uint(keccak256(abi.encodePacked(a,id,i))));
            idToColorScheme[id][i] = randomColor;
        }

        numTokens = numTokens + 1;
        _addNFToken(_to, id);

        if (msg.value > amount) {
            msg.sender.transfer(msg.value - amount);
        }
        if (amount > 0) {
            BENEFICIARY.transfer(address(this).balance);
        }

        emit Transfer(address(0), _to, id);
        
        feelingLuckyColor(id);
    }

    function createWithV1(uint seed, uint v1GlyphID) external {
        require(v1GlyphID < 103);
        require(address(uint160(paintglyphsV1.ownerOf(v1GlyphID))) == msg.sender);
        
        paintglyphsV1.transferFrom(msg.sender,address(this),v1GlyphID);
        
        return _mintWithV1(msg.sender, seed, v1GlyphID);
    }
    
    function _mintWithV1(address _to, uint seed, uint v1GlyphID) internal {
        require(_to != address(0));
        require(numTokens <= TOKEN_LIMIT);
        
        require(seedToId[seed] == 0);

        uint id = v1GlyphID;
        
        idToCreator[id] = _to;
        idToSeed[id] = seed;
        seedToId[seed] = id;
        uint a = uint((keccak256(abi.encodePacked(seed,id))));
        idToBackgroundColor[id] = getBackgroundColor(a);
        idToSymbolScheme[id] = getScheme(a);
        uint randomColor;
        
        for (uint i = 0; i<8; i = i+1) {
            randomColor = getStartColor(uint(keccak256(abi.encodePacked(a,id,i))));
            idToColorScheme[id][i] = randomColor;
        }

        _addNFToken(_to, id);

        emit Transfer(address(0), _to, id);
        
        feelingLuckyColor(id);
    }
    
    function updateColor(uint id, uint symbolToUpdate, uint newColor) public {
        require(msg.sender == ownerOf(id));
        require(newColor < 16777216);
        require(checkValidSymbol(id,symbolToUpdate) == true);
        
        idToColorScheme[id][symbolToUpdate] = newColor;
        emit ColorChanged(id, symbolToUpdate, newColor);
    }
    
    function feelingLuckyColor(uint id) public {
        require(msg.sender == ownerOf(id));
        
        uint256 symbolToUpdate;
        uint256 seed = uint(keccak256(abi.encodePacked(id,block.number)));
        
        if (idToSymbolScheme[id] == 1) { //if scheme 1, then update symbol 0
            symbolToUpdate == 0;
            }
        else if (idToSymbolScheme[id] == 2) { //if scheme 2, then update symbol 0 or 1
            symbolToUpdate = seed % 2;
        }
        else if (idToSymbolScheme[id] == 3) { //if scheme 3, then update symbol 2 or 3
            symbolToUpdate = (seed % 2) + 2;
        }
        else if (idToSymbolScheme[id] == 4) { //if scheme 4, then update symbol 0, 1, or 4
            symbolToUpdate = (seed % 3);
            if (symbolToUpdate == 2) {
                symbolToUpdate = 4;
            }
        }
        else if (idToSymbolScheme[id] == 5) { //if scheme 5, then update symbol 0, 5, or 6
            symbolToUpdate = (seed % 3);
            if (symbolToUpdate == 1) {
                symbolToUpdate = 5;
            }
            else if (symbolToUpdate == 2) {
                symbolToUpdate = 6;
            }
        }
        else if (idToSymbolScheme[id] == 6) { //if scheme 6, then update symbol 1, 3, or 7
            symbolToUpdate = (seed % 3);
            if (symbolToUpdate == 0) {
                symbolToUpdate = 3;
            }
            else if (symbolToUpdate == 2) {
                symbolToUpdate = 7;
            }
        }
        else {
            symbolToUpdate = seed % 5; // if scheme 7, then update symbol 0, 1, 2, 3, or 4
        }        
        
        uint256 newColor = seed % 16777216;
        
        idToColorScheme[id][symbolToUpdate] = newColor;
        emit ColorChanged(id, symbolToUpdate, newColor);
    }
    
    function checkValidSymbol(uint id, uint symbolToCheck) public view returns (bool isValid){
        if (idToSymbolScheme[id] == 1) {
            if (symbolToCheck == 0) {
                isValid = true;
            }
        }
        else if (idToSymbolScheme[id] == 2) {
            if (symbolToCheck == 0 || symbolToCheck == 1) {
                isValid = true;
            }
        }
        else if (idToSymbolScheme[id] == 3) {
            if (symbolToCheck == 2 || symbolToCheck == 3) {
                isValid = true;
            }
        }
        else if (idToSymbolScheme[id] == 4) {
            if (symbolToCheck == 0 || symbolToCheck == 1 || symbolToCheck == 4) {
                isValid = true;
            }
        }
        else if (idToSymbolScheme[id] == 5) {
            if (symbolToCheck == 0 || symbolToCheck == 5 || symbolToCheck == 6) {
                isValid = true;
            }
        }
        else if (idToSymbolScheme[id] == 6) {
            if (symbolToCheck == 1 || symbolToCheck == 3 || symbolToCheck == 7) {
                isValid = true;
            }
        } 
        else {
            if (symbolToCheck == 0 || symbolToCheck == 1 || symbolToCheck == 2 || symbolToCheck == 3 || symbolToCheck == 4) {
                isValid = true;
            }
        } 
    }

    /**
     * @dev Assigns a new NFT to an address.
     * @notice Use and override this function with caution. Wrong usage can have serious consequences.
     * @param _to Address to which we want to add the NFT.
     * @param _tokenId Which NFT we want to add.
     */
    function _addNFToken(address _to, uint256 _tokenId) internal {
        require(idToOwner[_tokenId] == address(0));
        idToOwner[_tokenId] = _to;

        uint256 length = ownerToIds[_to].push(_tokenId);
        idToOwnerIndex[_tokenId] = length - 1;
    }

    /**
     * @dev Removes a NFT from an address.
     * @notice Use and override this function with caution. Wrong usage can have serious consequences.
     * @param _from Address from wich we want to remove the NFT.
     * @param _tokenId Which NFT we want to remove.
     */
    function _removeNFToken(address _from, uint256 _tokenId) internal {
        require(idToOwner[_tokenId] == _from);
        delete idToOwner[_tokenId];

        uint256 tokenToRemoveIndex = idToOwnerIndex[_tokenId];
        uint256 lastTokenIndex = ownerToIds[_from].length - 1;

        if (lastTokenIndex != tokenToRemoveIndex) {
            uint256 lastToken = ownerToIds[_from][lastTokenIndex];
            ownerToIds[_from][tokenToRemoveIndex] = lastToken;
            idToOwnerIndex[lastToken] = tokenToRemoveIndex;
        }

        ownerToIds[_from].length--;
    }

    /**
     * @dev Helper function that gets NFT count of owner. This is needed for overriding in enumerable
     * extension to remove double storage (gas optimization) of owner nft count.
     * @param _owner Address for whom to query the count.
     * @return Number of _owner NFTs.
     */
    function _getOwnerNFTCount(address _owner) internal view returns (uint256) {
        return ownerToIds[_owner].length;
    }

    /**
     * @dev Actually perform the safeTransferFrom.
     * @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 memory _data) private canTransfer(_tokenId) validNFToken(_tokenId) {
        address tokenOwner = idToOwner[_tokenId];
        require(tokenOwner == _from);
        require(_to != address(0));

        _transfer(_to, _tokenId);

        if (isContract(_to)) {
            bytes4 retval = ERC721TokenReceiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data);
            require(retval == MAGIC_ON_ERC721_RECEIVED);
        }
    }

    /**
     * @dev Clears the current approval of a given NFT ID.
     * @param _tokenId ID of the NFT to be transferred.
     */
    function _clearApproval(uint256 _tokenId) private {
        if (idToApproval[_tokenId] != address(0)) {
            delete idToApproval[_tokenId];
        }
    }

    //// Enumerable

    function totalSupply() public view returns (uint256) {
        return numTokens;
    }

    function tokenByIndex(uint256 index) public view returns (uint256) {
        require(index < numTokens);
        return index;
    }

    /**
     * @dev returns the n-th NFT ID from a list of owner's tokens.
     * @param _owner Token owner's address.
     * @param _index Index number representing n-th token in owner's list of tokens.
     * @return Token id.
     */
    function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256) {
        require(_index < ownerToIds[_owner].length);
        return ownerToIds[_owner][_index];
    }

    //// Metadata

    /**
      * @dev Returns a descriptive name for a collection of NFTokens.
      */
    function name() external view returns (string memory _name) {
        _name = nftName;
    }

    /**
     * @dev Returns an abbreviated name for NFTokens.
     */
    function symbol() external view returns (string memory _symbol) {
        _symbol = nftSymbol;
    }

    /**
     * @dev A distinct URI (RFC 3986) for a given NFT.
     */
    function tokenURI(uint256 id) external view returns (string memory) {
        return string(abi.encodePacked(URI, integerToString(uint256(id))));
    }
    
    function setURI(string memory newURI) public isOwner {
        URI = newURI;
    }

    function integerToString(uint _i) internal pure returns (string memory) {
      if (_i == 0) {
         return "0";
      }
      uint j = _i;
      uint len;
      
      while (j != 0) {
         len++;
         j /= 10;
      }
      bytes memory bstr = new bytes(len);
      uint k = len - 1;
      
      while (_i != 0) {
         bstr[k--] = byte(uint8(48 + _i % 10));
         _i /= 10;
      }
      return string(bstr);
   }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"payable":false,"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":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"symbolToUpdate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newColor","type":"uint256"}],"name":"ColorChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":true,"internalType":"address","name":"a","type":"address"},{"indexed":false,"internalType":"string","name":"value","type":"string"}],"name":"Generated","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"},{"constant":true,"inputs":[],"name":"ARTIST_PRINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BENEFICIARY","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"allSymbols","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_approved","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"backgroundScheme","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"symbolToCheck","type":"uint256"}],"name":"checkValidSymbol","outputs":[{"internalType":"bool","name":"isValid","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"colorScheme","outputs":[{"internalType":"uint256","name":"color0","type":"uint256"},{"internalType":"uint256","name":"color1","type":"uint256"},{"internalType":"uint256","name":"color2","type":"uint256"},{"internalType":"uint256","name":"color3","type":"uint256"},{"internalType":"uint256","name":"color4","type":"uint256"},{"internalType":"uint256","name":"color5","type":"uint256"},{"internalType":"uint256","name":"color6","type":"uint256"},{"internalType":"uint256","name":"color7","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"seed","type":"uint256"}],"name":"createPiece","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint256","name":"v1GlyphID","type":"uint256"}],"name":"createWithV1","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"creator","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"draw","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"feelingLuckyColor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"_owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paintglyphsAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"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":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"newURI","type":"string"}],"name":"setURI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"version","type":"uint256"}],"name":"showProcessingCode","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"_symbol","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"symbolScheme","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"symbolToUpdate","type":"uint256"},{"internalType":"uint256","name":"newColor","type":"uint256"}],"name":"updateColor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"newProcessingCode","type":"string"},{"internalType":"uint256","name":"version","type":"uint256"}],"name":"updateProcessingCode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

6066600d5560c0604052601e60808190527f646174613a746578742f706c61696e3b636861727365743d7574662d382c000060a0908152620000459160109190620002a9565b5060408051808201909152600e8082526d2830b4b73a33b63cb83439902b1960911b60209092019182526200007d91601191620002a9565b506040805180820190915260058082526438714c5a9960d91b6020909201918252620000ac91601291620002a9565b50601380546001600160a01b031916732e8b45d550e4bb8c7986ee98879c1740519e0a1a17905560408051608081019091526046808252620029db602083013980516200010291601491602090910190620002a9565b503480156200011057600080fd5b50600560209081527fc01909ce2b517f8cd3a46ae0cfde9179f9b675cf633d3d84c8226585cc73c1568054600160ff1991821681179092557f072ad3113145b5af48d301e3b9fc3bd1c97c3f26a14f5d44904b71469875631e80548216831790557f32dafcc0428d2ef4307d6da1e032ab9698665546cb7ff0633ca92092b13651e18054821683179055635b5e139f60e01b6000527f3b767bd59d7164fff7ec5b80ca1165d9d6e12ee8656896fac4159b0760bfd9f780549091169091179055601354601580546001600160a01b039092166001600160a01b0319928316179055600e80543392169190911790556040805160608101909152603b8082526200022a9262002a21908301396001600160e01b036200023016565b6200034e565b600e546001600160a01b0316331462000290576040805162461bcd60e51b815260206004820152601c60248201527f4d757374206265206465706c6f796572206f6620636f6e747261637400000000604482015290519081900360640190fd5b8051620002a590600f906020840190620002a9565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002ec57805160ff19168380011785556200031c565b828001600101855582156200031c579182015b828111156200031c578251825591602001919060010190620002ff565b506200032a9291506200032e565b5090565b6200034b91905b808211156200032a576000815560010162000335565b90565b61267d806200035e6000396000f3fe60806040526004361061020f5760003560e01c8063510b515811610118578063a22cb465116100a0578063c3e7d1231161006f578063c3e7d1231461096f578063c87b56dd1461099f578063d54b3779146109c9578063e985e9c5146109f3578063ea86395f14610a2e5761020f565b8063a22cb46514610804578063a87b0f911461083f578063b88d4fde146108aa578063c3cda50f146109455761020f565b806388214ee5116100e757806388214ee5146106e85780638d859f3e146107125780638da5cb5b1461072757806395d89b411461073c5780639c6da3ce146107515761020f565b8063510b51581461062b5780636352211e146106555780636edb093d1461067f57806370a08231146106b55761020f565b806323b872dd1161019b578063397490641161016a57806339749064146105245780633b304147146105645780634106dffb1461058e57806342842e0e146105be5780634f6ccce7146106015761020f565b806323b872dd1461047e5780632b025c59146104c15780632f745c59146104d65780632f99c6cc1461050f5761020f565b8063081812fc116101e2578063081812fc146103c0578063095ea7b31461040657806316ad94781461043f578063180f0afd1461045457806318160ddd146104695761020f565b806301ffc9a71461021457806302fe53051461025c578063031bd4c41461030f57806306fdde0314610336575b600080fd5b34801561022057600080fd5b506102486004803603602081101561023757600080fd5b50356001600160e01b031916610a4b565b604080519115158252519081900360200190f35b34801561026857600080fd5b5061030d6004803603602081101561027f57600080fd5b810190602081018135600160201b81111561029957600080fd5b8201836020820111156102ab57600080fd5b803590602001918460018302840111600160201b831117156102cc57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610a6e945050505050565b005b34801561031b57600080fd5b50610324610ae4565b60408051918252519081900360200190f35b34801561034257600080fd5b5061034b610aea565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561038557818101518382015260200161036d565b50505050905090810190601f1680156103b25780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103cc57600080fd5b506103ea600480360360208110156103e357600080fd5b5035610b80565b604080516001600160a01b039092168252519081900360200190f35b34801561041257600080fd5b5061030d6004803603604081101561042957600080fd5b506001600160a01b038135169060200135610bc0565b34801561044b57600080fd5b506103ea610cbf565b34801561046057600080fd5b50610324610cce565b34801561047557600080fd5b50610324610cd3565b34801561048a57600080fd5b5061030d600480360360608110156104a157600080fd5b506001600160a01b03813581169160208101359091169060400135610cda565b3480156104cd57600080fd5b5061034b610dc0565b3480156104e257600080fd5b50610324600480360360408110156104f957600080fd5b506001600160a01b038135169060200135610e4e565b34801561051b57600080fd5b506103ea610eaa565b34801561053057600080fd5b5061054e6004803603602081101561054757600080fd5b5035610ec2565b6040805160ff9092168252519081900360200190f35b34801561057057600080fd5b5061034b6004803603602081101561058757600080fd5b5035610ed7565b34801561059a57600080fd5b5061030d600480360360408110156105b157600080fd5b5080359060200135611299565b3480156105ca57600080fd5b5061030d600480360360608110156105e157600080fd5b506001600160a01b038135811691602081013590911690604001356113ac565b34801561060d57600080fd5b506103246004803603602081101561062457600080fd5b50356113cc565b34801561063757600080fd5b506103ea6004803603602081101561064e57600080fd5b50356113e0565b34801561066157600080fd5b506103ea6004803603602081101561067857600080fd5b50356113fb565b34801561068b57600080fd5b5061030d600480360360608110156106a257600080fd5b508035906020810135906040013561141d565b3480156106c157600080fd5b50610324600480360360208110156106d857600080fd5b50356001600160a01b03166114cd565b3480156106f457600080fd5b5061034b6004803603602081101561070b57600080fd5b50356114eb565b34801561071e57600080fd5b5061032461158c565b34801561073357600080fd5b506103ea611598565b34801561074857600080fd5b5061034b6115a7565b34801561075d57600080fd5b5061030d6004803603604081101561077457600080fd5b810190602081018135600160201b81111561078e57600080fd5b8201836020820111156107a057600080fd5b803590602001918460018302840111600160201b831117156107c157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505091359250611608915050565b34801561081057600080fd5b5061030d6004803603604081101561082757600080fd5b506001600160a01b0381351690602001351515611627565b34801561084b57600080fd5b506108696004803603602081101561086257600080fd5b5035611695565b604080519889526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b3480156108b657600080fd5b5061030d600480360360808110156108cd57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b81111561090757600080fd5b82018360208201111561091957600080fd5b803590602001918460018302840111600160201b8311171561093a57600080fd5b5090925090506116da565b34801561095157600080fd5b5061030d6004803603602081101561096857600080fd5b5035611723565b34801561097b57600080fd5b506102486004803603604081101561099257600080fd5b5080359060200135611909565b3480156109ab57600080fd5b5061034b600480360360208110156109c257600080fd5b5035611a92565b3480156109d557600080fd5b50610324600480360360208110156109ec57600080fd5b5035611b65565b3480156109ff57600080fd5b5061024860048036036040811015610a1657600080fd5b506001600160a01b0381358116916020013516611b77565b61030d60048036036020811015610a4457600080fd5b5035611ba5565b6001600160e01b0319811660009081526005602052604090205460ff165b919050565b600e546001600160a01b03163314610acd576040805162461bcd60e51b815260206004820152601c60248201527f4d757374206265206465706c6f796572206f6620636f6e747261637400000000604482015290519081900360640190fd5b8051610ae090600f906020840190612594565b5050565b61020081565b60118054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610b765780601f10610b4b57610100808354040283529160200191610b76565b820191906000526020600020905b815481529060010190602001808311610b5957829003601f168201915b5050505050905090565b60008181526006602052604081205482906001600160a01b0316610ba357600080fd5b50506000908152600960205260409020546001600160a01b031690565b60008181526006602052604090205481906001600160a01b031633811480610c0b57506001600160a01b0381166000908152600a6020908152604080832033845290915290205460ff165b610c1457600080fd5b60008381526006602052604090205483906001600160a01b0316610c3757600080fd5b6000848152600660205260409020546001600160a01b03908116908616811415610c6057600080fd5b60008581526009602052604080822080546001600160a01b0319166001600160a01b038a811691821790925591518893918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050505050565b6013546001600160a01b031681565b600081565b600d545b90565b60008181526006602052604090205481906001600160a01b031633811480610d1857506000828152600960205260409020546001600160a01b031633145b80610d4657506001600160a01b0381166000908152600a6020908152604080832033845290915290205460ff165b610d4f57600080fd5b60008381526006602052604090205483906001600160a01b0316610d7257600080fd5b6000848152600660205260409020546001600160a01b039081169087168114610d9a57600080fd5b6001600160a01b038616610dad57600080fd5b610db78686611bb2565b50505050505050565b6014805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610e465780601f10610e1b57610100808354040283529160200191610e46565b820191906000526020600020905b815481529060010190602001808311610e2957829003601f168201915b505050505081565b6001600160a01b0382166000908152600b60205260408120548210610e7257600080fd5b6001600160a01b0383166000908152600b60205260409020805483908110610e9657fe5b906000526020600020015490505b92915050565b738c9eeecaeb226f1b8c1385abe0960754e08ec28581565b60009081526001602052604090205460ff1690565b600081815260076020908152604091829020548251808301919091528251808203830181528184018085528151919093012061047e8084526104e090920190935260609291839160208201818038833901905050905060005b601e811015610fab57601081815460018160011615610100020316600290048110610f5757fe5b815460011615610f765790600052602060002090602091828204019190065b9054901a600160f81b02828281518110610f8c57fe5b60200101906001600160f81b031916908160001a905350600101610f30565b600085815260016020526040812054819081908190600a600b89060190829060ff16610fd657600080fd5b60008b81526001602081905260409091205460ff1614156110055750691818181717171717171760b11b6110fb565b60008b81526001602052604090205460ff16600214156110335750691818981897171717171760b11b6110fb565b60008b81526001602052604090205460ff16600314156110615750691919991997171717171760b11b6110fb565b60008b81526001602052604090205460ff166004141561108f57506918189a1817171717171760b11b6110fb565b60008b81526001602052604090205460ff16600514156110bd575069181a9b1717171717171760b11b6110fb565b60008b81526001602052604090205460ff16600614156110eb575069189b989997171717171760b11b6110fb565b5069181899199a171717171760b11b5b60005b6020811215611289576001600f19820160020201955060038a066001141561112b57856000039550611143565b60038a06600214156111435761114086611c2d565b95505b9489029460005b60208112156111f25760026020058103600202600101975060028b8161116c57fe5b06600114156111815761117e88611c2d565b97505b968a029683600160201b888a02058161119657fe5b069550600a8610156111b6578286600a81106111ae57fe5b1a94506111bb565b602e94505b60f885901b60001b8a8a815181106111cf57fe5b60200101906001600160f81b031916908160001a9053506001988901980161114a565b50602560f81b89898151811061120457fe5b60200101906001600160f81b031916908160001a9053508851600190980197600360fc1b908a908a90811061123557fe5b60200101906001600160f81b031916908160001a9053508851600190980197604160f81b908a908a90811061126657fe5b60200101906001600160f81b031916908160001a905350600197880197016110fe565b50969a9950505050505050505050565b606781106112a657600080fd5b601554604080516331a9108f60e11b815260048101849052905133926001600160a01b031691636352211e916024808301926020929190829003018186803b1580156112f157600080fd5b505afa158015611305573d6000803e3d6000fd5b505050506040513d602081101561131b57600080fd5b50516001600160a01b03161461133057600080fd5b601554604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b03909216916323b872dd9160648082019260009290919082900301818387803b15801561138957600080fd5b505af115801561139d573d6000803e3d6000fd5b50505050610ae0338383611c44565b6113c783838360405180602001604052806000815250611dea565b505050565b6000600d5482106113dc57600080fd5b5090565b6000908152602081905260409020546001600160a01b031690565b6000818152600660205260409020546001600160a01b031680610a6957600080fd5b611426836113fb565b6001600160a01b0316336001600160a01b03161461144357600080fd5b6301000000811061145357600080fd5b61145d8383611909565b151560011461146b57600080fd5b60008381526003602052604090208190836008811061148657fe5b0155604080518481526020810184905280820183905290517fe4384a54d93bde17f0f7edd5f7fe637b041a848a60262f9a1bf36c4747e36c199181900360600190a1505050565b60006001600160a01b0382166114e257600080fd5b610ea482611ff5565b60008181526004602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452606093928301828280156115805780601f1061155557610100808354040283529160200191611580565b820191906000526020600020905b81548152906001019060200180831161156357829003601f168201915b50505050509050919050565b6702c68af0bb14000081565b600e546001600160a01b031681565b60128054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610b765780601f10610b4b57610100808354040283529160200191610b76565b600081815260046020908152604090912083516113c792850190612594565b336000818152600a602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b60009081526003602081905260409091208054600182015460028301549383015460048401546005850154600686015460079096015494979396959294919390929190565b61171c85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611dea92505050565b5050505050565b61172c816113fb565b6001600160a01b0316336001600160a01b03161461174957600080fd5b604080516020808201849052438284015282518083038401815260609092018352815191810191909120600084815260019283905292832054909160ff90911614156117945761189f565b60008381526001602052604090205460ff16600214156117b95760028106915061189f565b60008381526001602052604090205460ff16600314156117e15760028106600201915061189f565b60008381526001602052604090205460ff166004141561181457600381069150816002141561180f57600491505b61189f565b60008381526001602052604090205460ff1660051415611858576003810691508160011415611846576005915061180f565b816002141561180f576006915061189f565b60008381526001602052604090205460ff16600614156118985760038106915081611886576003915061180f565b816002141561180f576007915061189f565b6005810691505b600083815260036020526040902062ffffff821690819084600881106118c157fe5b0155604080518581526020810185905280820183905290517fe4384a54d93bde17f0f7edd5f7fe637b041a848a60262f9a1bf36c4747e36c199181900360600190a150505050565b600082815260016020819052604082205460ff161415611931578161192c575060015b610ea4565b60008381526001602052604090205460ff1660021415611965578115806119585750816001145b1561192c57506001610ea4565b60008381526001602052604090205460ff166003141561199a5781600214806119585750816003141561192c57506001610ea4565b60008381526001602052604090205460ff16600414156119d8578115806119c15750816001145b806119585750816004141561192c57506001610ea4565b60008381526001602052604090205460ff1660051415611a16578115806119ff5750816005145b806119585750816006141561192c57506001610ea4565b60008381526001602052604090205460ff1660061415611a56578160011480611a3f5750816003145b806119585750816007141561192c57506001610ea4565b811580611a635750816001145b80611a6e5750816002145b80611a795750816003145b80611a845750816004145b15610ea45750600192915050565b6060600f611a9f83612010565b6040516020018083805460018160011615610100020316600290048015611afd5780601f10611adb576101008083540402835291820191611afd565b820191906000526020600020905b815481529060010190602001808311611ae9575b5050825160208401908083835b60208310611b295780518252601f199092019160209182019101611b0a565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040529050919050565b60009081526002602052604090205490565b6001600160a01b039182166000908152600a6020908152604080832093909416825291909152205460ff1690565b611baf33826120d1565b50565b6000818152600660205260409020546001600160a01b0316611bd382612311565b611bdd818361234c565b611be78383612464565b81836001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000808212611c3d575080610a69565b5060000390565b6001600160a01b038316611c5757600080fd5b610200600d541115611c6857600080fd5b60008281526008602052604090205415611c8157600080fd5b60008181526020818152604080832080546001600160a01b0319166001600160a01b0388161790556007825280832085905584835260088252918290208390558151808201859052808301849052825180820384018152606090910190925281519101208190611cf0816124df565b600083815260026020526040902055611d08816124fe565b6000838152600160205260408120805460ff191660ff9390931692909217909155805b6008811015611d965760408051602080820186905281830187905260608083018590528351808403909101815260809092019092528051910120611d6e90612576565b600085815260036020526040902090925082908260088110611d8c57fe5b0155600101611d2b565b50611da18684612464565b60405183906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611de283611723565b505050505050565b60008281526006602052604090205482906001600160a01b031633811480611e2857506000828152600960205260409020546001600160a01b031633145b80611e5657506001600160a01b0381166000908152600a6020908152604080832033845290915290205460ff165b611e5f57600080fd5b60008481526006602052604090205484906001600160a01b0316611e8257600080fd5b6000858152600660205260409020546001600160a01b039081169088168114611eaa57600080fd5b6001600160a01b038716611ebd57600080fd5b611ec78787611bb2565b611ed08761258e565b15611feb57604051630a85bd0160e11b815233600482018181526001600160a01b038b81166024850152604484018a9052608060648501908152895160848601528951600095928d169463150b7a029490938f938e938e939260a4019060208501908083838e5b83811015611f4f578181015183820152602001611f37565b50505050905090810190601f168015611f7c5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015611f9e57600080fd5b505af1158015611fb2573d6000803e3d6000fd5b505050506040513d6020811015611fc857600080fd5b505190506001600160e01b03198116630a85bd0160e11b14611fe957600080fd5b505b5050505050505050565b6001600160a01b03166000908152600b602052604090205490565b60608161203557506040805180820190915260018152600360fc1b6020820152610a69565b8160005b811561204d57600101600a82049150612039565b6060816040519080825280601f01601f19166020018201604052801561207a576020820181803883390190505b50905060001982015b85156120c857600a860660300160f81b828280600190039350815181106120a657fe5b60200101906001600160f81b031916908160001a905350600a86049550612083565b50949350505050565b6001600160a01b0382166120e457600080fd5b610200600d54106120f457600080fd5b6702c68af0bb1400003481111561210a57600080fd5b6000828152600860205260409020541561212357600080fd5b600d5460010160008181526020818152604080832080546001600160a01b0319166001600160a01b038916179055600782528083208690558583526008825291829020839055815180820186905280830184905282518082038401815260609091019092528151910120612196816124df565b6000838152600260205260409020556121ae816124fe565b6000838152600160205260408120805460ff191660ff9390931692909217909155805b600881101561223c576040805160208082018690528183018790526060808301859052835180840390910181526080909201909252805191012061221490612576565b60008581526003602052604090209092508290826008811061223257fe5b01556001016121d1565b50600d805460010190556122508684612464565b833411156122895760405133903486900380156108fc02916000818181858888f19350505050158015612287573d6000803e3d6000fd5b505b8315611da157604051738c9eeecaeb226f1b8c1385abe0960754e08ec285904780156108fc02916000818181858888f193505050501580156122cf573d6000803e3d6000fd5b5060405183906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611de283611723565b6000818152600960205260409020546001600160a01b031615611baf57600090815260096020526040902080546001600160a01b0319169055565b6000818152600660205260409020546001600160a01b0383811691161461237257600080fd5b600081815260066020908152604080832080546001600160a01b0319169055600c8252808320546001600160a01b0386168452600b909252909120546000190180821461243b576001600160a01b0384166000908152600b602052604081208054839081106123dd57fe5b9060005260206000200154905080600b6000876001600160a01b03166001600160a01b03168152602001908152602001600020848154811061241b57fe5b6000918252602080832090910192909255918252600c9052604090208290555b6001600160a01b0384166000908152600b6020526040902080549061171c90600019830161260e565b6000818152600660205260409020546001600160a01b03161561248657600080fd5b600081815260066020908152604080832080546001600160a01b039096166001600160a01b031990961686179055938252600b815283822080546001810182559083528183208101849055928252600c90529190912055565b6101006080607f92909216828101918202016201000091909102010190565b6000606482068160168210156125165750600161256f565b60298210156125275750600261256f565b603a8210156125385750600361256f565b60488210156125495750600461256f565b605482101561255a5750600561256f565b605d82101561256b5750600661256f565b5060075b9392505050565b62010000606090910690810261010082029091010190565b3b151590565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106125d557805160ff1916838001178555612602565b82800160010185558215612602579182015b828111156126025782518255916020019190600101906125e7565b506113dc92915061262e565b8154818355818111156113c7576000838152602090206113c79181019083015b610cd791905b808211156113dc576000815560010161263456fea265627a7a723158208847ca3b51547460fd12b0b4e3a5822043337593ba9395624973f7a1bfb6b1ab64736f6c6343000511003230202d20e296913b2031202d20e296923b2032202d20e296a03b2033202d20e294bc3b2034202d20e296933b2035202d20e296843b2036202d20e296803b2037202d20e289a168747470733a2f2f7061696e74676c7970687356322e617a75726577656273697465732e6e65742f6170692f48747470547269676765723f69643d

Deployed Bytecode

0x60806040526004361061020f5760003560e01c8063510b515811610118578063a22cb465116100a0578063c3e7d1231161006f578063c3e7d1231461096f578063c87b56dd1461099f578063d54b3779146109c9578063e985e9c5146109f3578063ea86395f14610a2e5761020f565b8063a22cb46514610804578063a87b0f911461083f578063b88d4fde146108aa578063c3cda50f146109455761020f565b806388214ee5116100e757806388214ee5146106e85780638d859f3e146107125780638da5cb5b1461072757806395d89b411461073c5780639c6da3ce146107515761020f565b8063510b51581461062b5780636352211e146106555780636edb093d1461067f57806370a08231146106b55761020f565b806323b872dd1161019b578063397490641161016a57806339749064146105245780633b304147146105645780634106dffb1461058e57806342842e0e146105be5780634f6ccce7146106015761020f565b806323b872dd1461047e5780632b025c59146104c15780632f745c59146104d65780632f99c6cc1461050f5761020f565b8063081812fc116101e2578063081812fc146103c0578063095ea7b31461040657806316ad94781461043f578063180f0afd1461045457806318160ddd146104695761020f565b806301ffc9a71461021457806302fe53051461025c578063031bd4c41461030f57806306fdde0314610336575b600080fd5b34801561022057600080fd5b506102486004803603602081101561023757600080fd5b50356001600160e01b031916610a4b565b604080519115158252519081900360200190f35b34801561026857600080fd5b5061030d6004803603602081101561027f57600080fd5b810190602081018135600160201b81111561029957600080fd5b8201836020820111156102ab57600080fd5b803590602001918460018302840111600160201b831117156102cc57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610a6e945050505050565b005b34801561031b57600080fd5b50610324610ae4565b60408051918252519081900360200190f35b34801561034257600080fd5b5061034b610aea565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561038557818101518382015260200161036d565b50505050905090810190601f1680156103b25780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103cc57600080fd5b506103ea600480360360208110156103e357600080fd5b5035610b80565b604080516001600160a01b039092168252519081900360200190f35b34801561041257600080fd5b5061030d6004803603604081101561042957600080fd5b506001600160a01b038135169060200135610bc0565b34801561044b57600080fd5b506103ea610cbf565b34801561046057600080fd5b50610324610cce565b34801561047557600080fd5b50610324610cd3565b34801561048a57600080fd5b5061030d600480360360608110156104a157600080fd5b506001600160a01b03813581169160208101359091169060400135610cda565b3480156104cd57600080fd5b5061034b610dc0565b3480156104e257600080fd5b50610324600480360360408110156104f957600080fd5b506001600160a01b038135169060200135610e4e565b34801561051b57600080fd5b506103ea610eaa565b34801561053057600080fd5b5061054e6004803603602081101561054757600080fd5b5035610ec2565b6040805160ff9092168252519081900360200190f35b34801561057057600080fd5b5061034b6004803603602081101561058757600080fd5b5035610ed7565b34801561059a57600080fd5b5061030d600480360360408110156105b157600080fd5b5080359060200135611299565b3480156105ca57600080fd5b5061030d600480360360608110156105e157600080fd5b506001600160a01b038135811691602081013590911690604001356113ac565b34801561060d57600080fd5b506103246004803603602081101561062457600080fd5b50356113cc565b34801561063757600080fd5b506103ea6004803603602081101561064e57600080fd5b50356113e0565b34801561066157600080fd5b506103ea6004803603602081101561067857600080fd5b50356113fb565b34801561068b57600080fd5b5061030d600480360360608110156106a257600080fd5b508035906020810135906040013561141d565b3480156106c157600080fd5b50610324600480360360208110156106d857600080fd5b50356001600160a01b03166114cd565b3480156106f457600080fd5b5061034b6004803603602081101561070b57600080fd5b50356114eb565b34801561071e57600080fd5b5061032461158c565b34801561073357600080fd5b506103ea611598565b34801561074857600080fd5b5061034b6115a7565b34801561075d57600080fd5b5061030d6004803603604081101561077457600080fd5b810190602081018135600160201b81111561078e57600080fd5b8201836020820111156107a057600080fd5b803590602001918460018302840111600160201b831117156107c157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505091359250611608915050565b34801561081057600080fd5b5061030d6004803603604081101561082757600080fd5b506001600160a01b0381351690602001351515611627565b34801561084b57600080fd5b506108696004803603602081101561086257600080fd5b5035611695565b604080519889526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b3480156108b657600080fd5b5061030d600480360360808110156108cd57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b81111561090757600080fd5b82018360208201111561091957600080fd5b803590602001918460018302840111600160201b8311171561093a57600080fd5b5090925090506116da565b34801561095157600080fd5b5061030d6004803603602081101561096857600080fd5b5035611723565b34801561097b57600080fd5b506102486004803603604081101561099257600080fd5b5080359060200135611909565b3480156109ab57600080fd5b5061034b600480360360208110156109c257600080fd5b5035611a92565b3480156109d557600080fd5b50610324600480360360208110156109ec57600080fd5b5035611b65565b3480156109ff57600080fd5b5061024860048036036040811015610a1657600080fd5b506001600160a01b0381358116916020013516611b77565b61030d60048036036020811015610a4457600080fd5b5035611ba5565b6001600160e01b0319811660009081526005602052604090205460ff165b919050565b600e546001600160a01b03163314610acd576040805162461bcd60e51b815260206004820152601c60248201527f4d757374206265206465706c6f796572206f6620636f6e747261637400000000604482015290519081900360640190fd5b8051610ae090600f906020840190612594565b5050565b61020081565b60118054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610b765780601f10610b4b57610100808354040283529160200191610b76565b820191906000526020600020905b815481529060010190602001808311610b5957829003601f168201915b5050505050905090565b60008181526006602052604081205482906001600160a01b0316610ba357600080fd5b50506000908152600960205260409020546001600160a01b031690565b60008181526006602052604090205481906001600160a01b031633811480610c0b57506001600160a01b0381166000908152600a6020908152604080832033845290915290205460ff165b610c1457600080fd5b60008381526006602052604090205483906001600160a01b0316610c3757600080fd5b6000848152600660205260409020546001600160a01b03908116908616811415610c6057600080fd5b60008581526009602052604080822080546001600160a01b0319166001600160a01b038a811691821790925591518893918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050505050565b6013546001600160a01b031681565b600081565b600d545b90565b60008181526006602052604090205481906001600160a01b031633811480610d1857506000828152600960205260409020546001600160a01b031633145b80610d4657506001600160a01b0381166000908152600a6020908152604080832033845290915290205460ff165b610d4f57600080fd5b60008381526006602052604090205483906001600160a01b0316610d7257600080fd5b6000848152600660205260409020546001600160a01b039081169087168114610d9a57600080fd5b6001600160a01b038616610dad57600080fd5b610db78686611bb2565b50505050505050565b6014805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610e465780601f10610e1b57610100808354040283529160200191610e46565b820191906000526020600020905b815481529060010190602001808311610e2957829003601f168201915b505050505081565b6001600160a01b0382166000908152600b60205260408120548210610e7257600080fd5b6001600160a01b0383166000908152600b60205260409020805483908110610e9657fe5b906000526020600020015490505b92915050565b738c9eeecaeb226f1b8c1385abe0960754e08ec28581565b60009081526001602052604090205460ff1690565b600081815260076020908152604091829020548251808301919091528251808203830181528184018085528151919093012061047e8084526104e090920190935260609291839160208201818038833901905050905060005b601e811015610fab57601081815460018160011615610100020316600290048110610f5757fe5b815460011615610f765790600052602060002090602091828204019190065b9054901a600160f81b02828281518110610f8c57fe5b60200101906001600160f81b031916908160001a905350600101610f30565b600085815260016020526040812054819081908190600a600b89060190829060ff16610fd657600080fd5b60008b81526001602081905260409091205460ff1614156110055750691818181717171717171760b11b6110fb565b60008b81526001602052604090205460ff16600214156110335750691818981897171717171760b11b6110fb565b60008b81526001602052604090205460ff16600314156110615750691919991997171717171760b11b6110fb565b60008b81526001602052604090205460ff166004141561108f57506918189a1817171717171760b11b6110fb565b60008b81526001602052604090205460ff16600514156110bd575069181a9b1717171717171760b11b6110fb565b60008b81526001602052604090205460ff16600614156110eb575069189b989997171717171760b11b6110fb565b5069181899199a171717171760b11b5b60005b6020811215611289576001600f19820160020201955060038a066001141561112b57856000039550611143565b60038a06600214156111435761114086611c2d565b95505b9489029460005b60208112156111f25760026020058103600202600101975060028b8161116c57fe5b06600114156111815761117e88611c2d565b97505b968a029683600160201b888a02058161119657fe5b069550600a8610156111b6578286600a81106111ae57fe5b1a94506111bb565b602e94505b60f885901b60001b8a8a815181106111cf57fe5b60200101906001600160f81b031916908160001a9053506001988901980161114a565b50602560f81b89898151811061120457fe5b60200101906001600160f81b031916908160001a9053508851600190980197600360fc1b908a908a90811061123557fe5b60200101906001600160f81b031916908160001a9053508851600190980197604160f81b908a908a90811061126657fe5b60200101906001600160f81b031916908160001a905350600197880197016110fe565b50969a9950505050505050505050565b606781106112a657600080fd5b601554604080516331a9108f60e11b815260048101849052905133926001600160a01b031691636352211e916024808301926020929190829003018186803b1580156112f157600080fd5b505afa158015611305573d6000803e3d6000fd5b505050506040513d602081101561131b57600080fd5b50516001600160a01b03161461133057600080fd5b601554604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b03909216916323b872dd9160648082019260009290919082900301818387803b15801561138957600080fd5b505af115801561139d573d6000803e3d6000fd5b50505050610ae0338383611c44565b6113c783838360405180602001604052806000815250611dea565b505050565b6000600d5482106113dc57600080fd5b5090565b6000908152602081905260409020546001600160a01b031690565b6000818152600660205260409020546001600160a01b031680610a6957600080fd5b611426836113fb565b6001600160a01b0316336001600160a01b03161461144357600080fd5b6301000000811061145357600080fd5b61145d8383611909565b151560011461146b57600080fd5b60008381526003602052604090208190836008811061148657fe5b0155604080518481526020810184905280820183905290517fe4384a54d93bde17f0f7edd5f7fe637b041a848a60262f9a1bf36c4747e36c199181900360600190a1505050565b60006001600160a01b0382166114e257600080fd5b610ea482611ff5565b60008181526004602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452606093928301828280156115805780601f1061155557610100808354040283529160200191611580565b820191906000526020600020905b81548152906001019060200180831161156357829003601f168201915b50505050509050919050565b6702c68af0bb14000081565b600e546001600160a01b031681565b60128054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610b765780601f10610b4b57610100808354040283529160200191610b76565b600081815260046020908152604090912083516113c792850190612594565b336000818152600a602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b60009081526003602081905260409091208054600182015460028301549383015460048401546005850154600686015460079096015494979396959294919390929190565b61171c85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611dea92505050565b5050505050565b61172c816113fb565b6001600160a01b0316336001600160a01b03161461174957600080fd5b604080516020808201849052438284015282518083038401815260609092018352815191810191909120600084815260019283905292832054909160ff90911614156117945761189f565b60008381526001602052604090205460ff16600214156117b95760028106915061189f565b60008381526001602052604090205460ff16600314156117e15760028106600201915061189f565b60008381526001602052604090205460ff166004141561181457600381069150816002141561180f57600491505b61189f565b60008381526001602052604090205460ff1660051415611858576003810691508160011415611846576005915061180f565b816002141561180f576006915061189f565b60008381526001602052604090205460ff16600614156118985760038106915081611886576003915061180f565b816002141561180f576007915061189f565b6005810691505b600083815260036020526040902062ffffff821690819084600881106118c157fe5b0155604080518581526020810185905280820183905290517fe4384a54d93bde17f0f7edd5f7fe637b041a848a60262f9a1bf36c4747e36c199181900360600190a150505050565b600082815260016020819052604082205460ff161415611931578161192c575060015b610ea4565b60008381526001602052604090205460ff1660021415611965578115806119585750816001145b1561192c57506001610ea4565b60008381526001602052604090205460ff166003141561199a5781600214806119585750816003141561192c57506001610ea4565b60008381526001602052604090205460ff16600414156119d8578115806119c15750816001145b806119585750816004141561192c57506001610ea4565b60008381526001602052604090205460ff1660051415611a16578115806119ff5750816005145b806119585750816006141561192c57506001610ea4565b60008381526001602052604090205460ff1660061415611a56578160011480611a3f5750816003145b806119585750816007141561192c57506001610ea4565b811580611a635750816001145b80611a6e5750816002145b80611a795750816003145b80611a845750816004145b15610ea45750600192915050565b6060600f611a9f83612010565b6040516020018083805460018160011615610100020316600290048015611afd5780601f10611adb576101008083540402835291820191611afd565b820191906000526020600020905b815481529060010190602001808311611ae9575b5050825160208401908083835b60208310611b295780518252601f199092019160209182019101611b0a565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040529050919050565b60009081526002602052604090205490565b6001600160a01b039182166000908152600a6020908152604080832093909416825291909152205460ff1690565b611baf33826120d1565b50565b6000818152600660205260409020546001600160a01b0316611bd382612311565b611bdd818361234c565b611be78383612464565b81836001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000808212611c3d575080610a69565b5060000390565b6001600160a01b038316611c5757600080fd5b610200600d541115611c6857600080fd5b60008281526008602052604090205415611c8157600080fd5b60008181526020818152604080832080546001600160a01b0319166001600160a01b0388161790556007825280832085905584835260088252918290208390558151808201859052808301849052825180820384018152606090910190925281519101208190611cf0816124df565b600083815260026020526040902055611d08816124fe565b6000838152600160205260408120805460ff191660ff9390931692909217909155805b6008811015611d965760408051602080820186905281830187905260608083018590528351808403909101815260809092019092528051910120611d6e90612576565b600085815260036020526040902090925082908260088110611d8c57fe5b0155600101611d2b565b50611da18684612464565b60405183906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611de283611723565b505050505050565b60008281526006602052604090205482906001600160a01b031633811480611e2857506000828152600960205260409020546001600160a01b031633145b80611e5657506001600160a01b0381166000908152600a6020908152604080832033845290915290205460ff165b611e5f57600080fd5b60008481526006602052604090205484906001600160a01b0316611e8257600080fd5b6000858152600660205260409020546001600160a01b039081169088168114611eaa57600080fd5b6001600160a01b038716611ebd57600080fd5b611ec78787611bb2565b611ed08761258e565b15611feb57604051630a85bd0160e11b815233600482018181526001600160a01b038b81166024850152604484018a9052608060648501908152895160848601528951600095928d169463150b7a029490938f938e938e939260a4019060208501908083838e5b83811015611f4f578181015183820152602001611f37565b50505050905090810190601f168015611f7c5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015611f9e57600080fd5b505af1158015611fb2573d6000803e3d6000fd5b505050506040513d6020811015611fc857600080fd5b505190506001600160e01b03198116630a85bd0160e11b14611fe957600080fd5b505b5050505050505050565b6001600160a01b03166000908152600b602052604090205490565b60608161203557506040805180820190915260018152600360fc1b6020820152610a69565b8160005b811561204d57600101600a82049150612039565b6060816040519080825280601f01601f19166020018201604052801561207a576020820181803883390190505b50905060001982015b85156120c857600a860660300160f81b828280600190039350815181106120a657fe5b60200101906001600160f81b031916908160001a905350600a86049550612083565b50949350505050565b6001600160a01b0382166120e457600080fd5b610200600d54106120f457600080fd5b6702c68af0bb1400003481111561210a57600080fd5b6000828152600860205260409020541561212357600080fd5b600d5460010160008181526020818152604080832080546001600160a01b0319166001600160a01b038916179055600782528083208690558583526008825291829020839055815180820186905280830184905282518082038401815260609091019092528151910120612196816124df565b6000838152600260205260409020556121ae816124fe565b6000838152600160205260408120805460ff191660ff9390931692909217909155805b600881101561223c576040805160208082018690528183018790526060808301859052835180840390910181526080909201909252805191012061221490612576565b60008581526003602052604090209092508290826008811061223257fe5b01556001016121d1565b50600d805460010190556122508684612464565b833411156122895760405133903486900380156108fc02916000818181858888f19350505050158015612287573d6000803e3d6000fd5b505b8315611da157604051738c9eeecaeb226f1b8c1385abe0960754e08ec285904780156108fc02916000818181858888f193505050501580156122cf573d6000803e3d6000fd5b5060405183906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611de283611723565b6000818152600960205260409020546001600160a01b031615611baf57600090815260096020526040902080546001600160a01b0319169055565b6000818152600660205260409020546001600160a01b0383811691161461237257600080fd5b600081815260066020908152604080832080546001600160a01b0319169055600c8252808320546001600160a01b0386168452600b909252909120546000190180821461243b576001600160a01b0384166000908152600b602052604081208054839081106123dd57fe5b9060005260206000200154905080600b6000876001600160a01b03166001600160a01b03168152602001908152602001600020848154811061241b57fe5b6000918252602080832090910192909255918252600c9052604090208290555b6001600160a01b0384166000908152600b6020526040902080549061171c90600019830161260e565b6000818152600660205260409020546001600160a01b03161561248657600080fd5b600081815260066020908152604080832080546001600160a01b039096166001600160a01b031990961686179055938252600b815283822080546001810182559083528183208101849055928252600c90529190912055565b6101006080607f92909216828101918202016201000091909102010190565b6000606482068160168210156125165750600161256f565b60298210156125275750600261256f565b603a8210156125385750600361256f565b60488210156125495750600461256f565b605482101561255a5750600561256f565b605d82101561256b5750600661256f565b5060075b9392505050565b62010000606090910690810261010082029091010190565b3b151590565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106125d557805160ff1916838001178555612602565b82800160010185558215612602579182015b828111156126025782518255916020019190600101906125e7565b506113dc92915061262e565b8154818355818111156113c7576000838152602090206113c79181019083015b610cd791905b808211156113dc576000815560010161263456fea265627a7a723158208847ca3b51547460fd12b0b4e3a5822043337593ba9395624973f7a1bfb6b1ab64736f6c63430005110032

Deployed Bytecode Sourcemap

399:28569:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11445:136;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11445:136:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11445:136:0;-1:-1:-1;;;;;;11445:136:0;;:::i;:::-;;;;;;;;;;;;;;;;;;28418:84;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28418:84:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28418:84:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;28418:84:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;28418:84:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;28418:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;28418:84:0;;-1:-1:-1;28418:84:0;;-1:-1:-1;;;;;28418:84:0:i;:::-;;1770:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1770:38:0;;;:::i;:::-;;;;;;;;;;;;;;;;27894:94;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27894:94:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;27894:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16560:142;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16560:142:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16560:142:0;;:::i;:::-;;;;-1:-1:-1;;;;;16560:142:0;;;;;;;;;;;;;;14555:311;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14555:311:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14555:311:0;;;;;;;;:::i;5642:78::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5642:78:0;;;:::i;1815:38::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1815:38:0;;;:::i;27094:88::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27094:88:0;;;:::i;13826:292::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13826:292:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;13826:292:0;;;;;;;;;;;;;;;;;:::i;5727:99::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5727:99:0;;;:::i;27576:199::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27576:199:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;27576:199:0;;;;;;;;:::i;1910:88::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1910:88:0;;;:::i;9721:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9721:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9721:109:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;7240:2285;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7240:2285:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7240:2285:0;;:::i;19276:336::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19276:336:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19276:336:0;;;;;;;:::i;13083:143::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13083:143:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;13083:143:0;;;;;;;;;;;;;;;;;:::i;27190:135::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27190:135:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27190:135:0;;:::i;9612:101::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9612:101:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9612:101:0;;:::i;16143:159::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16143:159:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16143:159:0;;:::i;20494:353::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20494:353:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20494:353:0;;;;;;;;;;;;:::i;15806:158::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15806:158:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15806:158:0;-1:-1:-1;;;;;15806:158:0;;:::i;10653:129::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10653:129:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10653:129:0;;:::i;1862:39::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1862:39:0;;;:::i;5348:20::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5348:20:0;;;:::i;28069:102::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28069:102:0;;;:::i;10492:149::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10492:149:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10492:149:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;10492:149:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;10492:149:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;10492:149:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;10492:149:0;;-1:-1:-1;;10492:149:0;;;-1:-1:-1;10492:149:0;;-1:-1:-1;;10492:149:0:i;15293:205::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15293:205:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;15293:205:0;;;;;;;;;;:::i;9964:516::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9964:516:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9964:516:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12485:168;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12485:168:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;12485:168:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;12485:168:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;12485:168:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;12485:168:0;;-1:-1:-1;12485:168:0;-1:-1:-1;12485:168:0;:::i;20859:1848::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20859:1848:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20859:1848:0;;:::i;22719:1342::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22719:1342:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22719:1342:0;;;;;;;:::i;28253:153::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28253:153:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28253:153:0;;:::i;9838:118::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9838:118:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9838:118:0;;:::i;16985:151::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16985:151:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;16985:151:0;;;;;;;;;;:::i;17621:98::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17621:98:0;;:::i;11445:136::-;-1:-1:-1;;;;;;11540:33:0;;11516:4;11540:33;;;:19;:33;;;;;;;;11445:136;;;;:::o;28418:84::-;4527:5;;-1:-1:-1;;;;;4527:5:0;4513:10;:19;4505:60;;;;;-1:-1:-1;;;4505:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;28482:12;;;;:3;;:12;;;;;:::i;:::-;;28418:84;:::o;1770:38::-;1805:3;1770:38;:::o;27894:94::-;27973:7;27965:15;;;;;;;;-1:-1:-1;;27965:15:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27933:19;;27965:15;;27973:7;;27965:15;;27973:7;27965:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27894:94;:::o;16560:142::-;16645:7;4399:19;;;:9;:19;;;;;;16626:8;;-1:-1:-1;;;;;4399:19:0;4391:42;;;;;;-1:-1:-1;;16672:22:0;;;;:12;:22;;;;;;-1:-1:-1;;;;;16672:22:0;;16560:142::o;14555:311::-;3622:18;3643:19;;;:9;:19;;;;;;14629:8;;-1:-1:-1;;;;;3643:19:0;3695:10;3681:24;;;:68;;-1:-1:-1;;;;;;3709:28:0;;;;;;:16;:28;;;;;;;;3738:10;3709:40;;;;;;;;;;3681:68;3673:77;;;;;;4430:1;4399:19;;;:9;:19;;;;;;14652:8;;-1:-1:-1;;;;;4399:19:0;4391:42;;;;;;14673:18;14694:19;;;:9;:19;;;;;;-1:-1:-1;;;;;14694:19:0;;;;14732:23;;;;;14724:32;;;;;;14767:22;;;;:12;:22;;;;;;:34;;-1:-1:-1;;;;;;14767:34:0;-1:-1:-1;;;;;14767:34:0;;;;;;;;;14817:41;;14767:22;;14817:41;;;;;;;4444:1;3761;14555:311;;;;:::o;5642:78::-;;;-1:-1:-1;;;;;5642:78:0;;:::o;1815:38::-;1852:1;1815:38;:::o;27094:88::-;27165:9;;27094:88;;:::o;13826:292::-;3969:18;3990:19;;;:9;:19;;;;;;13915:8;;-1:-1:-1;;;;;3990:19:0;4056:10;4042:24;;;:77;;-1:-1:-1;4083:22:0;;;;:12;:22;;;;;;-1:-1:-1;;;;;4083:22:0;4109:10;4083:36;4042:77;:134;;;-1:-1:-1;;;;;;4136:28:0;;;;;;:16;:28;;;;;;;;4165:10;4136:40;;;;;;;;;;4042:134;4020:167;;;;;;4430:1;4399:19;;;:9;:19;;;;;;13938:8;;-1:-1:-1;;;;;4399:19:0;4391:42;;;;;;13959:18;13980:19;;;:9;:19;;;;;;-1:-1:-1;;;;;13980:19:0;;;;14018;;;;14010:28;;;;;;-1:-1:-1;;;;;14057:17:0;;14049:26;;;;;;14086:24;14096:3;14101:8;14086:9;:24::i;:::-;4444:1;4198;13826:292;;;;;:::o;5727:99::-;;;;;;;;;;;;;;;-1:-1:-1;;5727:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27576:199::-;-1:-1:-1;;;;;27697:18:0;;27660:7;27697:18;;;:10;:18;;;;;:25;27688:34;;27680:43;;;;;;-1:-1:-1;;;;;27741:18:0;;;;;;:10;:18;;;;;:26;;27760:6;;27741:26;;;;;;;;;;;;;;27734:33;;27576:199;;;;;:::o;1910:88::-;1956:42;1910:88;:::o;9721:109::-;9776:5;9801:21;;;:16;:21;;;;;;;;;9721:109::o;7240:2285::-;7310:6;7352:12;;;:8;:12;;;;;;;;;;7335:30;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;7335:30:0;;;;;;7325:41;;;;;;;7411:24;7401:35;;;;;;;;;;7284:13;;7325:41;7284:13;;7401:35;;;21:6:-1;;104:10;7401:35:0;87:34:-1;135:17;;-1:-1;;7379:57:0;-1:-1:-1;7447:6:0;7464:73;7480:2;7476:1;:6;7464:73;;;7516:6;7523:1;7516:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7516:9:0;7504:6;7511:1;7504:9;;;;;;;;;;;:21;-1:-1:-1;;;;;7504:21:0;;;;;;;;-1:-1:-1;7484:3:0;;7464:73;;;7547:5;7698:20;;;:16;:20;;;;;;7547:5;;;;;;7655:2;7649;7645:6;;7644:13;;7547:5;;7698:20;;7694:793;;7740:8;;;7694:793;7770:20;;;;:16;:20;;;;;;;;;;;:25;7766:721;;;-1:-1:-1;;;;7766:721:0;;;7873:20;;;;:16;:20;;;;;;;;7897:1;7873:25;7869:618;;;-1:-1:-1;;;;7869:618:0;;;7980:20;;;;:16;:20;;;;;;;;8004:1;7980:25;7976:511;;;-1:-1:-1;;;;7976:511:0;;;8086:20;;;;:16;:20;;;;;;;;8110:1;8086:25;8082:405;;;-1:-1:-1;;;;8082:405:0;;;8195:20;;;;:16;:20;;;;;;;;8219:1;8195:25;8191:296;;;-1:-1:-1;;;;8191:296:0;;;8304:20;;;;:16;:20;;;;;;;;8328:1;8304:25;8300:187;;;-1:-1:-1;;;;8300:187:0;;;-1:-1:-1;;;;8300:187:0;8502:5;8497:949;5257:2;8518:1;:8;8497:949;;;8575:1;-1:-1:-1;;8558:13:0;;5339:1;8553:19;:23;;-1:-1:-1;8600:1:0;8596;:5;8605:1;8596:10;8592:124;;;8632:1;8631:2;;8627:6;;8592:124;;;8663:1;8659;:5;8668:1;8659:10;8655:61;;;8694:6;8698:1;8694:3;:6::i;:::-;8690:10;;8655:61;8734:10;;;;8764:5;8759:511;5257:2;8780:1;:8;8759:511;;;5339:1;5257:2;5328:13;8824:1;:13;8819:1;:19;8841:1;8819:23;8814:29;;8870:1;8866;:5;;;;;;8875:1;8866:10;8862:69;;;8905:6;8909:1;8905:3;:6::i;:::-;8901:10;;8862:69;8953:10;;;;9006:3;-1:-1:-1;;;8991:5:0;;;:11;8986:23;;;;;;8982:27;;9036:2;9032:1;:6;9028:147;;;9082:7;9090:1;9082:10;;;;;;;;;-1:-1:-1;9028:147:0;;;9151:4;9143:12;;9028:147;9227:3;9218:5;:12;;9210:21;;9193:6;9200:1;9193:9;;;;;;;;;;;:39;-1:-1:-1;;;;;9193:39:0;;;;;;;;-1:-1:-1;9251:3:0;;;;;8790;8759:511;;;;9301:4;9296:10;;9284:6;9291:1;9284:9;;;;;;;;;;;:22;-1:-1:-1;;;;;9284:22:0;;;;;;;;-1:-1:-1;9339:9:0;;9321:3;;;;;-1:-1:-1;;;9351:10:0;9339:6;;9321:3;;9339:9;;;;;;;;;:22;-1:-1:-1;;;;;9339:22:0;;;;;;;;-1:-1:-1;9394:9:0;;9376:3;;;;;-1:-1:-1;;;9406:10:0;9394:6;;9376:3;;9394:9;;;;;;;;;:22;-1:-1:-1;;;;;9394:22:0;;;;;;;;-1:-1:-1;9431:3:0;;;;;8528;8497:949;;;-1:-1:-1;9486:6:0;;7240:2285;-1:-1:-1;;;;;;;;;;7240:2285:0:o;19276:336::-;19365:3;19353:9;:15;19345:24;;;;;;19404:13;;:32;;;-1:-1:-1;;;19404:32:0;;;;;;;;;;19442:10;;-1:-1:-1;;;;;19404:13:0;;:21;;:32;;;;;;;;;;;;;;:13;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;19404:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19404:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19404:32:0;-1:-1:-1;;;;;19388:64:0;;19380:73;;;;;;19474:13;;:62;;;-1:-1:-1;;;19474:62:0;;19501:10;19474:62;;;;19520:4;19474:62;;;;;;;;;;;;-1:-1:-1;;;;;19474:13:0;;;;:26;;:62;;;;;:13;;:62;;;;;;;;:13;;:62;;;5:2:-1;;;;30:1;27;20:12;5:2;19474:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19474:62:0;;;;19564:40;19576:10;19588:4;19594:9;19564:11;:40::i;13083:143::-;13175:43;13193:5;13200:3;13205:8;13175:43;;;;;;;;;;;;:17;:43::i;:::-;13083:143;;;:::o;27190:135::-;27248:7;27284:9;;27276:5;:17;27268:26;;;;;;-1:-1:-1;27312:5:0;27190:135::o;9612:101::-;9662:7;9689:16;;;;;;;;;;;-1:-1:-1;;;;;9689:16:0;;9612:101::o;16143:159::-;16199:14;16235:19;;;:9;:19;;;;;;-1:-1:-1;;;;;16235:19:0;16273:20;16265:29;;;;;20494:353;20600:11;20608:2;20600:7;:11::i;:::-;-1:-1:-1;;;;;20586:25:0;:10;-1:-1:-1;;;;;20586:25:0;;20578:34;;;;;;20642:8;20631;:19;20623:28;;;;;;20670:35;20687:2;20690:14;20670:16;:35::i;:::-;:43;;20709:4;20670:43;20662:52;;;;;;20735:19;;;;:15;:19;;;;;20773:8;;20755:14;20735:35;;;;;;;;:46;20797:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20494:353;;;:::o;15806:158::-;15864:7;-1:-1:-1;;;;;15892:20:0;;15884:29;;;;;;15931:25;15949:6;15931:17;:25::i;10653:129::-;10751:23;;;;:14;:23;;;;;;;;;10744:30;;;;;;-1:-1:-1;;10744:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10718:13;;10744:30;;;10751:23;10744:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10653:129;;;:::o;1862:39::-;1891:10;1862:39;:::o;5348:20::-;;;-1:-1:-1;;;;;5348:20:0;;:::o;28069:102::-;28154:9;28144:19;;;;;;;;-1:-1:-1;;28144:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28110:21;;28144:19;;28154:9;;28144:19;;28154:9;28144:19;;;;;;;;;;;;;;;;;;;;;;;;10492:149;10590:23;;;;:14;:23;;;;;;;;:43;;;;;;;;:::i;15293:205::-;15392:10;15375:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;15375:39:0;;;;;;;;;;;;:51;;-1:-1:-1;;15375:51:0;;;;;;;;;;15442:48;;;;;;;15375:39;;15392:10;15442:48;;;;;;;;;;;15293:205;;:::o;9964:516::-;10018:14;10148:20;;;:15;:20;;;;;;;;:23;;10212:1;10191:23;;;10255:1;10234:23;;;10277;;;;10341:1;10320:23;;;10384:1;10363:23;;;10427:1;10406:23;;;10470:1;10449:23;;;;10148;;10191;;10234;10277;;10320;;10363;;10406;10449;9964:516::o;12485:168::-;12599:46;12617:5;12624:3;12629:8;12639:5;;12599:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;12599:17:0;;-1:-1:-1;;;12599:46:0:i;:::-;12485:168;;;;;:::o;20859:1848::-;20935:11;20943:2;20935:7;:11::i;:::-;-1:-1:-1;;;;;20921:25:0;:10;-1:-1:-1;;;;;20921:25:0;;20913:34;;;;;;21031:33;;;;;;;;;;21051:12;21031:33;;;;;;26:21:-1;;;22:32;;6:49;;21031:33:0;;;;;;21021:44;;;;;;;;;20968:22;21091:20;;;:16;:20;;;;;;;;21021:44;;21091:20;;;;:25;21087:1425;;;;;;21223:20;;;;:16;:20;;;;;;;;21247:1;21223:25;21219:1293;;;21330:1;21323:4;:8;21306:25;;21219:1293;;;21362:20;;;;:16;:20;;;;;;;;21386:1;21362:25;21358:1154;;;21470:1;21463:4;:8;21475:1;21462:14;21445:31;;21358:1154;;;21507:20;;;;:16;:20;;;;;;;;21531:1;21507:25;21503:1009;;;21619:1;21612:4;:8;21594:27;;21640:14;21658:1;21640:19;21636:78;;;21697:1;21680:18;;21636:78;21503:1009;;;21744:20;;;;:16;:20;;;;;;;;21768:1;21744:25;21740:772;;;21856:1;21849:4;:8;21831:27;;21877:14;21895:1;21877:19;21873:175;;;21934:1;21917:18;;21873:175;;;21974:14;21992:1;21974:19;21970:78;;;22031:1;22014:18;;21740:772;;;22078:20;;;;:16;:20;;;;;;;;22102:1;22078:25;22074:438;;;22190:1;22183:4;:8;;-1:-1:-1;22211:19:0;22207:175;;22268:1;22251:18;;22207:175;;;22308:14;22326:1;22308:19;22304:78;;;22365:1;22348:18;;22074:438;;;22447:1;22440:4;:8;22423:25;;22074:438;22540:16;22595:19;;;:15;:19;;;;;22559:15;;;;;;22615:14;22595:35;;;;;;;;:46;22657:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20859:1848;;;;:::o;22719:1342::-;22795:12;22823:20;;;:16;:20;;;;;;;;;;:25;22819:1234;;;22869:18;22865:73;;-1:-1:-1;22918:4:0;22865:73;22819:1234;;;22968:20;;;;:16;:20;;;;;;;;22992:1;22968:25;22964:1089;;;23014:18;;;:40;;;23036:13;23053:1;23036:18;23014:40;23010:95;;;-1:-1:-1;23085:4:0;22964:1089;;;23135:20;;;;:16;:20;;;;;;;;23159:1;23135:25;23131:922;;;23181:13;23198:1;23181:18;:40;;;;23203:13;23220:1;23203:18;23177:95;;;-1:-1:-1;23252:4:0;23131:922;;;23302:20;;;;:16;:20;;;;;;;;23326:1;23302:25;23298:755;;;23348:18;;;:40;;;23370:13;23387:1;23370:18;23348:40;:62;;;;23392:13;23409:1;23392:18;23344:117;;;-1:-1:-1;23441:4:0;23298:755;;;23491:20;;;;:16;:20;;;;;;;;23515:1;23491:25;23487:566;;;23537:18;;;:40;;;23559:13;23576:1;23559:18;23537:40;:62;;;;23581:13;23598:1;23581:18;23533:117;;;-1:-1:-1;23630:4:0;23487:566;;;23680:20;;;;:16;:20;;;;;;;;23704:1;23680:25;23676:377;;;23726:13;23743:1;23726:18;:40;;;;23748:13;23765:1;23748:18;23726:40;:62;;;;23770:13;23787:1;23770:18;23722:117;;;-1:-1:-1;23819:4:0;23676:377;;;23885:18;;;:40;;;23907:13;23924:1;23907:18;23885:40;:62;;;;23929:13;23946:1;23929:18;23885:62;:84;;;;23951:13;23968:1;23951:18;23885:84;:106;;;;23973:13;23990:1;23973:18;23885:106;23881:161;;;-1:-1:-1;24022:4:0;22719:1342;;;;:::o;28253:153::-;28306:13;28363:3;28368:28;28392:2;28368:15;:28::i;:::-;28346:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28346:51:0;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;28346:51:0;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;28346:51:0;;;28332:66;;28253:153;;;:::o;9838:118::-;9897:7;9924:24;;;:19;:24;;;;;;;9838:118::o;16985:151::-;-1:-1:-1;;;;;17093:24:0;;;17069:4;17093:24;;;:16;:24;;;;;;;;:35;;;;;;;;;;;;;;;16985:151::o;17621:98::-;17688:23;17694:10;17706:4;17688:5;:23::i;:::-;17621:98;:::o;17341:270::-;17411:12;17426:19;;;:9;:19;;;;;;-1:-1:-1;;;;;17426:19:0;17456:24;17436:8;17456:14;:24::i;:::-;17493:30;17508:4;17514:8;17493:14;:30::i;:::-;17534:26;17546:3;17551:8;17534:11;:26::i;:::-;17598:8;17593:3;-1:-1:-1;;;;;17578:29:0;17587:4;-1:-1:-1;;;;;17578:29:0;;;;;;;;;;;17341:270;;;:::o;5883:107::-;5926:3;5951:1;5946;:6;5942:20;;-1:-1:-1;5961:1:0;5954:8;;5942:20;-1:-1:-1;5980:2:0;;;5883:107::o;19624:858::-;-1:-1:-1;;;;;19713:17:0;;19705:26;;;;;;1805:3;19750:9;;:24;;19742:33;;;;;;19804:14;;;;:8;:14;;;;;;:19;19796:28;;;;;;19837:7;19877:15;;;;;;;;;;;:21;;-1:-1:-1;;;;;;19877:21:0;-1:-1:-1;;;;;19877:21:0;;;;;19909:8;:12;;;;;:19;;;19939:14;;;:8;:14;;;;;;:19;;;19994:25;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;19994:25:0;;;;;;;19984:36;;;;;19877:15;;20059:21;19984:36;20059:18;:21::i;:::-;20033:23;;;;:19;:23;;;;;:47;20114:12;20124:1;20114:9;:12::i;:::-;20091:20;;;;:16;:20;;;;;:35;;-1:-1:-1;;20091:35:0;;;;;;;;;;;;;:20;20174:179;20193:1;20191;:3;20174:179;;;20263:24;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;20263:24:0;;;;;;;20253:35;;;;;20234:56;;:13;:56::i;:::-;20305:19;;;;:15;:19;;;;;20220:70;;-1:-1:-1;20220:70:0;;20325:1;20305:22;;;;;;;;:36;20202:1;20200:3;20174:179;;;;20365:20;20377:3;20382:2;20365:11;:20::i;:::-;20403:29;;20429:2;;-1:-1:-1;;;;;20403:29:0;;;20420:1;;20403:29;;20420:1;;20403:29;20453:21;20471:2;20453:17;:21::i;:::-;19624:858;;;;;;:::o;26222:532::-;3969:18;3990:19;;;:9;:19;;;;;;26338:8;;-1:-1:-1;;;;;3990:19:0;4056:10;4042:24;;;:77;;-1:-1:-1;4083:22:0;;;;:12;:22;;;;;;-1:-1:-1;;;;;4083:22:0;4109:10;4083:36;4042:77;:134;;;-1:-1:-1;;;;;;4136:28:0;;;;;;:16;:28;;;;;;;;4165:10;4136:40;;;;;;;;;;4042:134;4020:167;;;;;;4430:1;4399:19;;;:9;:19;;;;;;26361:8;;-1:-1:-1;;;;;4399:19:0;4391:42;;;;;;26382:18;26403:19;;;:9;:19;;;;;;-1:-1:-1;;;;;26403:19:0;;;;26441;;;;26433:28;;;;;;-1:-1:-1;;;;;26480:17:0;;26472:26;;;;;;26511:24;26521:3;26526:8;26511:9;:24::i;:::-;26552:15;26563:3;26552:10;:15::i;:::-;26548:199;;;26600:77;;-1:-1:-1;;;26600:77:0;;26642:10;26600:77;;;;;;-1:-1:-1;;;;;26600:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26584:13;;26600:41;;;;;;26642:10;;26654:5;;26661:8;;26671:5;;26600:77;;;;;;;;;;;26584:13;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;26600:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26600:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26600:77:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26600:77:0;;-1:-1:-1;;;;;;;26700:34:0;;-1:-1:-1;;;26700:34:0;26692:43;;;;;;26548:199;;4444:1;4198;26222:532;;;;;;:::o;25802:126::-;-1:-1:-1;;;;;25895:18:0;25868:7;25895:18;;;:10;:18;;;;;:25;;25802:126::o;28510:453::-;28567:13;28595:7;28591:45;;-1:-1:-1;28616:10:0;;;;;;;;;;;;-1:-1:-1;;;28616:10:0;;;;;;28591:45;28653:2;28644:6;28689:61;28696:6;;28689:61;;28716:5;;28738:2;28733:7;;;;28689:61;;;28758:17;28788:3;28778:14;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;28778:14:0;87:34:-1;135:17;;-1:-1;28778:14:0;-1:-1:-1;28758:34:0;-1:-1:-1;;;28810:7:0;;28834:95;28841:7;;28834:95;;28895:2;28890;:7;28885:2;:12;28874:25;;28862:4;28867:3;;;;;;;28862:9;;;;;;;;;;;:37;-1:-1:-1;;;;;28862:37:0;;;;;;;;-1:-1:-1;28917:2:0;28911:8;;;;28834:95;;;-1:-1:-1;28951:4:0;28510:453;-1:-1:-1;;;;28510:453:0:o;18063:1205::-;-1:-1:-1;;;;;18130:17:0;;18122:26;;;;;;1805:3;18167:9;;:23;18159:32;;;;;;1891:10;18312:9;:19;-1:-1:-1;18312:19:0;18304:28;;;;;;18362:14;;;;:8;:14;;;;;;:19;18354:28;;;;;;18403:9;;18415:1;18403:13;18393:7;18429:15;;;;;;;;;;;:21;;-1:-1:-1;;;;;;18429:21:0;-1:-1:-1;;;;;18429:21:0;;;;;18461:8;:12;;;;;:19;;;18491:14;;;:8;:14;;;;;;:19;;;18546:25;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;18546:25:0;;;;;;;18536:36;;;;;18611:21;18536:36;18611:18;:21::i;:::-;18585:23;;;;:19;:23;;;;;:47;18666:12;18676:1;18666:9;:12::i;:::-;18643:20;;;;:16;:20;;;;;:35;;-1:-1:-1;;18643:35:0;;;;;;;;;;;;;:20;18726:179;18745:1;18743;:3;18726:179;;;18815:24;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;18815:24:0;;;;;;;18805:35;;;;;18786:56;;:13;:56::i;:::-;18857:19;;;;:15;:19;;;;;18772:70;;-1:-1:-1;18772:70:0;;18877:1;18857:22;;;;;;;;:36;18754:1;18752:3;18726:179;;;-1:-1:-1;18929:9:0;;;18941:1;18929:13;18917:25;;18953:20;18965:3;18970:2;18953:11;:20::i;:::-;19002:6;18990:9;:18;18986:90;;;19025:39;;:10;;19045:9;:18;;;19025:39;;;;;;;;;19045:18;19025:10;:39;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19025:39:0;18986:90;19090:10;;19086:86;;19117:43;;1956:42;;19138:21;19117:43;;;;;;;;;19138:21;1956:42;19117:43;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19117:43:0;19189:29;;19215:2;;-1:-1:-1;;;;;19189:29:0;;;19206:1;;19189:29;;19206:1;;19189:29;19239:21;19257:2;19239:17;:21::i;26897:166::-;26996:1;26962:22;;;:12;:22;;;;;;-1:-1:-1;;;;;26962:22:0;:36;26958:98;;27022:22;;;;:12;:22;;;;;27015:29;;-1:-1:-1;;;;;;27015:29:0;;;26897:166::o;24906:587::-;24991:19;;;;:9;:19;;;;;;-1:-1:-1;;;;;24991:28:0;;;:19;;:28;24983:37;;;;;;25038:19;;;;:9;:19;;;;;;;;25031:26;;-1:-1:-1;;;;;;25031:26:0;;;25099:14;:24;;;;;;-1:-1:-1;;;;;25159:17:0;;;;:10;:17;;;;;;:24;-1:-1:-1;;25159:28:0;25204:36;;;25200:247;;-1:-1:-1;;;;;25277:17:0;;25257;25277;;;:10;:17;;;;;:33;;25295:14;;25277:33;;;;;;;;;;;;;;25257:53;;25365:9;25325:10;:17;25336:5;-1:-1:-1;;;;;25325:17:0;-1:-1:-1;;;;;25325:17:0;;;;;;;;;;;;25343:18;25325:37;;;;;;;;;;;;;;;;;;;:49;;;;25389:25;;;:14;:25;;;;;:46;;;25200:247;-1:-1:-1;;;;;25459:17:0;;;;;;:10;:17;;;;;:26;;;;;-1:-1:-1;;25459:26:0;;;:::i;24347:266::-;24458:1;24427:19;;;:9;:19;;;;;;-1:-1:-1;;;;;24427:19:0;:33;24419:42;;;;;;24472:19;;;;:9;:19;;;;;;;;:25;;-1:-1:-1;;;;;24472:25:0;;;-1:-1:-1;;;;;;24472:25:0;;;;;;;24527:15;;;:10;:15;;;;;27:10:-1;;24472:25:0;23:18:-1;;45:23;;24527:30:0;;;;;;;;;;;24568:24;;;:14;:24;;;;;;:37;24347:266::o;6277:281::-;6423:3;6378;6374:7;;;;;6373:15;;;6416:10;;;6497:15;6454:10;;;;;6497:24;;;6277:281::o;6570:543::-;6620:5;6655:3;6651:7;;6620:5;6704:2;6696:10;;6692:390;;;-1:-1:-1;6732:1:0;6692:390;;;6763:2;6755:5;:10;6751:331;;;-1:-1:-1;6791:1:0;6751:331;;;6822:2;6814:5;:10;6810:272;;;-1:-1:-1;6850:1:0;6810:272;;;6881:2;6873:5;:10;6869:213;;;-1:-1:-1;6909:1:0;6869:213;;;6940:2;6932:5;:10;6928:154;;;-1:-1:-1;6968:1:0;6928:154;;;6999:2;6991:5;:10;6987:95;;;-1:-1:-1;7027:1:0;6987:95;;;-1:-1:-1;7069:1:0;6987:95;7099:6;6570:543;-1:-1:-1;;;6570:543:0:o;6002:267::-;6165:10;6097:2;6093:6;;;6165:10;;;6134:3;6127:10;;6208:15;;;:24;;6002:267::o;11008:215::-;11138:18;11207:8;;;11008:215::o;399:28569::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;399:28569:0;;;-1:-1:-1;399:28569:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://8847ca3b51547460fd12b0b4e3a5822043337593ba9395624973f7a1bfb6b1ab

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.