ETH Price: $2,408.95 (-2.94%)
Gas: 4.32 Gwei
 

Overview

Max Total Supply

292 DCN

Holders

206

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
vibbin.eth
Balance
1 DCN
0x116ec70ca00d6be6940eabcd838a6f1ced66af74
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Decentralists

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 2000 runs

Other Settings:
default evmVersion, MIT license
File 1 of 16 : Decentralists.sol
// SPDX-License-Identifier: MIT

/**
                                                                                               
                                       THE DECENTRALISTS                                       
                                                                                               
                                ·.::::iiiiiiiiiiiiiiiiiii::::.·                                
                           .:::iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii::.·                          
                       .::iiiiiiiii:::::..···      ··..:::::iiiiiiiiii::·                      
                   .::iiiiiii:::.·                            .:::iiiiiii::.                   
                .:iiiiiii::                                         .:iiiiiii:.                
             ·:iiiiii::·                                                ::iiiiii:·             
            :iiiiii:·                 ·.::::::::::::::..                   :iiiiii:·           
          :iiiii::               .:::iiiii:::::::::::iiiii:::.               .:iiiii:·         
        :iiiii:·            ·::iii:::·                   .:::iii::·             :iiiii:·       
      ·iiiii:·            ::iii:·                             .::ii::            ·:iiiii:      
     :iiiii:           ·:ii::·                                   ·:iii:·           .iiiii:     
    :iiiii·          ·:ii:.                                         ·:ii:           ·:iiii:    
   :iiii:          ·:ii:              ·.:::::::i:::::::.·             ·:ii:           :iiiii   
  :iiii:          ·iii:            .::iiiiiiiiiiiiiiiiii:::·            .ii:           .iiii:  
 ·iiiii          ·iii            .:ii:::::::iiiiiiiiiiiiiii::.           ·:i:·          :iiii: 
 :iiii:         ·:i:·          .:iii:      .:iiiiiiiiiiiiiiiii:.           iii           iiiii 
:iiii:          :ii           :iiiii:·     ::iiiiiiiiiiiiiiiiiii:          ·ii:          :iiii:
iiiii·         ·ii:          ::iiiiii::::::iiiiiiiiiiiiiiiiiiiiii.          :ii.         ·iiiii
iiiii          :ii           :iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii:·         .ii:          :iiii
iiiii          :ii          .iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii.          ii:          :iiii
iiiii          :ii          .iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii:.          ii:          :iiii
iiiii          :ii           :iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii:·         .ii:          :iiii
iiiii·         ·ii:          ::iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii:.          :ii.         ·iiiii
:iiii:          :ii           .:iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii:          ·ii:          :iiii:
 :iiii:         ·:i:·          ·::iiiiiiiiiiiiiiiiiiiiiiiiiiii:·           ii:           iiiii 
 ·iiiii           iii·           ·::iiiiiiiiiiiiiiiiiiiiiii::.           .ii:·          :iiii: 
  :iiii:           iii:            ·:::iiiiiiiiiiiiiiiii:::·            :ii:           .iiii:  
   :iiii:           :ii:·              .::::::::::::::..              .:ii:           :iiii:   
    :iiiii·           :iii:                                         .:ii:           ·:iiii:    
     :iiiii:            :iii:·                                   .:iii:·           .iiiii:     
      ·iiiii:·            .:iii:.·                            ::iii::            ·:iiiii:      
        :iiiii:·             .:iiii::.·                 ·:::iiii:.              :iiiii:·       
          :iiiii::               ·:::iiiiiii:::::::iiiiiii:::·               .:iiiii:·         
            :iiiiii:·                   ..:::::::::::..·                   :iiiiii:·           
             ·:iiiiii::·                                                ::iiiiii:·             
                .:iiiiiii::                                         .:iiiiiii:.                
                   .::iiiiiii:::.·                            .:::iiiiiii::.                   
                       .::iiiiiiiii:::::..···      ··..:::::iiiiiiiiii::·                      
                           .:::iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii::.·                          
                                ·.::::iiiiiiiiiiiiiiiiiii::::.·                                


A Decentralist is represented by a set of eight traits:
  0 - Base
    [0] Human Male Black       [8] Vampire Male       [10] Metahuman Male       [12] Ape Male
    [1] Human Female Black     [9] Vampire Female     [11] Metahuman Female
    [2] Human Male Dark
    [3] Human Female Dark
    [4] Human Male Pale
    [5] Human Female Pale
    [6] Human Male White
    [7] Human Female White
  1 - Necklace
    [0] None        [2] Golden
    [1] Diamond     [3] Silver
  2 - Facial Male
    [0] None             [10] Long Gray           [20] Sideburns Blonde
    [1] Chivo Black      [11] Long Red            [21] Sideburns Brown
    [2] Chivo Blonde     [12] Long White          [22] Sideburns Gray
    [3] Chivo Brown      [13] Regular Black       [23] Sideburns Red
    [4] Chivo Gray       [14] Regular Blonde      [24] Sideburns White
    [5] Chivo Red        [15] Regular Brown
    [6] Chivo White      [16] Regular Gray
    [7] Long Black       [17] Regular Red
    [8] Long Blonde      [18] Regular White
    [9] Long Brown       [19] Sideburns Black
  2 - Facial Female
    [0]  None
  3 - Earring
    [0]  None      [2]  Diamond     [4]  Silver
    [1]  Cross     [3]  Golden
  4 - Head Male
    [0] None                [10] CapFront Red     [20] Punky Brown      [30] Short White
    [1] Afro                [11] Hat Black        [21] Punky Gray       [31] Trapper
    [2] CapUp Green         [12] Long Black       [22] Punky Purple     [32] Wool Blue
    [3] CapUp Red           [13] Long Blonde      [23] Punky Red        [33] Wool Green
    [4] Kangaroo Black      [14] Long Brown       [24] Punky White      [34] Wool Red
    [5] CapBack Blue        [15] Long Gray        [25] Short Black
    [6] CapBack Orange      [16] Long Red         [26] Short Blonde
    [7] Conspiracist        [17] Long White       [27] Short Brown
    [8] Cop                 [18] Punky Black      [28] Short Gray
    [9] CapFront Purple     [19] Punky Blonde     [29] Short Red
  4 - Head Female
    [0] None                [10] CapFront Red     [20] Punky Brown      [30] Short White           [40] Trapper
    [1] Afro                [11] Hat Black        [21] Punky Gray       [31] Straight Black        [41] Wool Blue
    [2] CapUp Green         [12] Long Black       [22] Punky Purple     [32] Straight Blonde       [42] Wool Green
    [3] CapUp Red           [13] Long Blonde      [23] Punky Red        [33] Straight Brown        [43] Wool Red
    [4] Kangaroo Black      [14] Long Brown       [24] Punky White      [34] Straight Gray
    [5] CapBack Blue        [15] Long Gray        [25] Short Black      [35] Straight Orange
    [6] CapBack Orange      [16] Long Red         [26] Short Blonde     [36] Straight Platinum
    [7] Conspiracist        [17] Long White       [27] Short Brown      [37] Straight Purple
    [8] Cop                 [18] Punky Black      [28] Short Gray       [38] Straight Red
    [9] CapFront Purple     [19] Punky Blonde     [29] Short Red        [39] Straight White
  5 - Glasses
    [0] None       [2] Nerd      [4] Pilot     [6] VR
    [1] Beetle     [3] Patch     [5] Surf
  6 - Lipstick Male
    [0] None
  6 - Lipstick Female
    [0] None      [2] Orange     [4] Purple
    [1] Green     [3] Pink       [5] Red
  7 - Smoking
    [0] None      [2] Cigarette
    [1] Cigar     [3] E-Cigarette

 */

pragma solidity 0.8.10;

import {ERC721Enumerable} from '../openzeppelin/ERC721Enumerable.sol';
import {ERC721} from '../openzeppelin/ERC721.sol';
import {IERC20} from '../openzeppelin/IERC20.sol';
import {IERC2981} from '../openzeppelin/IERC2981.sol';
import {IERC165} from '../openzeppelin/IERC165.sol';
import {SafeERC20} from '../openzeppelin/SafeERC20.sol';
import {IDescriptor} from './IDescriptor.sol';

contract Decentralists is IERC2981, ERC721Enumerable {
  using SafeERC20 for IERC20;

  // Minting price of each breed
  uint256 public constant MINT_PRICE_HUMAN = 0 ether;
  uint256 public constant MINT_PRICE_VAMPIRE = 0.15 ether;
  uint256 public constant MINT_PRICE_METAHUMAN = 0.05 ether;
  uint256 public constant MINT_PRICE_APE = 0.25 ether;

  // Minting price of each breed during presale
  uint256 private constant MINT_PRICE_PRESALE_VAMPIRE = 0.12 ether;
  uint256 private constant MINT_PRICE_PRESALE_METAHUMAN = 0.04 ether;
  uint256 private constant MINT_PRICE_PRESALE_APE = 0.2 ether;

  // Maximum total supply during presale
  uint24 private constant MAXIMUM_PRESALE_SUPPLY_VAMPIRE = 31;
  uint24 private constant MAXIMUM_PRESALE_SUPPLY_METAHUMAN = 21;
  uint24 private constant MAXIMUM_PRESALE_SUPPLY_APE = 53;

  // Maximum total supply of the collection
  uint24 public constant MAXIMUM_TOTAL_SUPPLY = 1000000;
  uint24 public constant MAXIMUM_TOTAL_SUPPLY_OF_MALE_HUMAN = 495000;
  uint24 public constant MAXIMUM_TOTAL_SUPPLY_OF_FEMALE_HUMAN = 495000;
  uint24 public constant MAXIMUM_TOTAL_SUPPLY_OF_MALE_VAMPIRE = 1500;
  uint24 public constant MAXIMUM_TOTAL_SUPPLY_OF_FEMALE_VAMPIRE = 1500;
  uint24 public constant MAXIMUM_TOTAL_SUPPLY_OF_MALE_METAHUMAN = 3000;
  uint24 public constant MAXIMUM_TOTAL_SUPPLY_OF_FEMALE_METAHUMAN = 3000;
  uint24 public constant MAXIMUM_TOTAL_SUPPLY_OF_APE = 1000;

  // Trait sizes
  uint256 private constant TRAIT_BASE_SIZE = 13;
  uint256 private constant TRAIT_NECKLACE_SIZE = 4;
  uint256 private constant TRAIT_FACIAL_MALE_SIZE = 25;
  uint256 private constant TRAIT_FACIAL_FEMALE_SIZE = 1;
  uint256 private constant TRAIT_EARRING_SIZE = 5;
  uint256 private constant TRAIT_HEAD_MALE_SIZE = 35;
  uint256 private constant TRAIT_HEAD_FEMALE_SIZE = 44;
  uint256 private constant TRAIT_GLASSES_SIZE = 7;
  uint256 private constant TRAIT_LIPSTICK_MALE_SIZE = 1;
  uint256 private constant TRAIT_LIPSTICK_FEMALE_SIZE = 6;
  uint256 private constant TRAIT_SMOKING_SIZE = 4;

  // Base trait separator for each breed
  uint256 private constant TRAIT_BASE_HUMAN_SEPARATOR = 8;
  uint256 private constant TRAIT_BASE_VAMPIRE_SEPARATOR = 10;
  uint256 private constant TRAIT_BASE_METAHUMAN_SEPARATOR = 12;
  uint256 private constant TRAIT_BASE_APE_SEPARATOR = 13;

  // Governance
  address public governance;
  address public emergencyAdmin;

  // Descriptor
  IDescriptor public descriptor;
  bool public isDescriptorLocked;

  // Royalties
  uint256 public royaltyBps;
  address public royaltyReceiver;

  struct Data {
    // Presale ends after 1 week
    uint40 presaleStartTime;
    // Emergency stop of the claiming process
    bool isStopped;
    // Decremental counters, from maximum total supply to zero
    uint24 count;
    uint24 femaleHumans;
    uint24 maleHumans;
    uint24 femaleVampires;
    uint24 maleVampires;
    uint24 femaleMetahumans;
    uint24 maleMetahumans;
    uint24 apes;
  }
  Data private data;

  // Combination of traits
  struct Combination {
    uint8 base;
    uint8 necklace;
    uint8 facial;
    uint8 earring;
    uint8 head;
    uint8 glasses;
    uint8 lipstick;
    uint8 smoking;
  }
  // Combinations: keccak256(combination) => tokenId
  mapping(bytes32 => uint256) private _combinationToId;
  // Combinations: tokenId => Combination
  mapping(uint256 => Combination) private _idToCombination;

  // Mapping of human minters
  mapping(address => bool) private _hasMintedHuman;

  /**
   * @dev Constructor
   * @param governance_ address of the governance
   * @param emergencyAdmin_ address of the emergency admin
   * @param descriptor_ address of the token descriptor
   * @param royaltyBps_ value of bps for royalties (e.g. 150 corresponds to 1.50%)
   * @param royaltyReceiver_ address of the royalties receiver
   * @param initialMintingRecipients_ array of recipients for the initial minting
   * @param initialMintingCombinations_ array of combinations for the initial minting
   */
  constructor(
    address governance_,
    address emergencyAdmin_,
    address descriptor_,
    uint256 royaltyBps_,
    address royaltyReceiver_,
    address[] memory initialMintingRecipients_,
    uint256[8][] memory initialMintingCombinations_
  ) ERC721('Decentralists', 'DCN') {
    governance = governance_;
    emergencyAdmin = emergencyAdmin_;
    descriptor = IDescriptor(descriptor_);
    royaltyBps = royaltyBps_;
    royaltyReceiver = royaltyReceiver_;

    // Decremental counters
    data.count = MAXIMUM_TOTAL_SUPPLY;
    data.femaleHumans = MAXIMUM_TOTAL_SUPPLY_OF_FEMALE_HUMAN;
    data.maleHumans = MAXIMUM_TOTAL_SUPPLY_OF_MALE_HUMAN;
    data.femaleVampires = MAXIMUM_TOTAL_SUPPLY_OF_FEMALE_VAMPIRE;
    data.maleVampires = MAXIMUM_TOTAL_SUPPLY_OF_MALE_VAMPIRE;
    data.femaleMetahumans = MAXIMUM_TOTAL_SUPPLY_OF_FEMALE_METAHUMAN;
    data.maleMetahumans = MAXIMUM_TOTAL_SUPPLY_OF_MALE_METAHUMAN;
    data.apes = MAXIMUM_TOTAL_SUPPLY_OF_APE;

    // Initial minting
    unchecked {
      uint256 size = initialMintingRecipients_.length;
      for (uint256 i = 0; i < size; i++) {
        _claim(initialMintingCombinations_[i], initialMintingRecipients_[i]);
      }
    }
  }

  /**
   * @notice Mint a token with given traits (array of 8 values)
   * @param traits set of traits of the token
   */
  function claim(uint256[8] calldata traits) external payable {
    require(!data.isStopped, 'CLAIM_STOPPED');
    require(!isPresale() && data.presaleStartTime != 0, 'SALE_NOT_ACTIVE');
    require(_validateCombination(traits), 'INVALID_COMBINATION');
    require(_checkValue(traits[0], false), 'INCORRECT_VALUE');

    _claim(traits, msg.sender);
  }

  /**
   * @notice Mint a token with given traits (array of 8 values) during presale
   * @param traits set of traits of the token
   */
  function presaleClaim(uint256[8] calldata traits) external payable {
    require(!data.isStopped, 'CLAIM_STOPPED');
    require(isPresale() && data.presaleStartTime != 0, 'PRESALE_NOT_ACTIVE');
    require(_validateCombination(traits), 'INVALID_COMBINATION');
    require(!_humanBase(traits[0]), 'HUMANS_NOT_AVAILABLE');
    require(_checkValue(traits[0], true), 'INCORRECT_VALUE');

    // Check breed counter during presale
    if (_vampireBase(traits[0])) {
      require(
        totalFemaleVampiresSupply() + totalMaleVampiresSupply() < MAXIMUM_PRESALE_SUPPLY_VAMPIRE,
        'NO_CLAIMS_AVAILABLE'
      );
    } else if (_metahumanBase(traits[0])) {
      require(
        totalFemaleMetahumansSupply() + totalMaleMetahumansSupply() <
          MAXIMUM_PRESALE_SUPPLY_METAHUMAN,
        'NO_CLAIMS_AVAILABLE'
      );
    } else {
      require(totalApesSupply() < MAXIMUM_PRESALE_SUPPLY_APE, 'NO_CLAIMS_AVAILABLE');
    }

    _claim(traits, msg.sender);
  }

  /**
   * @notice Returns whether the combination given is available or not
   * @param traits set of traits of the combination
   * @return true if the combination is available, false otherwise
   */
  function isCombinationAvailable(uint256[8] calldata traits) external view returns (bool) {
    require(_validateCombination(traits), 'INVALID_COMBINATION');
    bytes32 hashedCombination = keccak256(
      abi.encodePacked(
        traits[0], // base
        traits[1], // necklace
        traits[2], // facial
        traits[3], // earring
        traits[4], // head
        traits[5], // glasses
        traits[6], // lipstick
        traits[7] // smoking
      )
    );
    return _combinationToId[hashedCombination] == 0;
  }

  /**
   * @notice Returns whether the combination given is valid or not
   * @param traits set of traits of the combination to validate
   * @return true if the combination is valid, false otherwise
   */
  function isCombinationValid(uint256[8] calldata traits) external pure returns (bool) {
    return _validateCombination(traits);
  }

  /**
   * @notice Returns whether the presale is active or not (1 week duration)
   * @return true if the presale is active, false otherwise
   */
  function isPresale() public view returns (bool) {
    return block.timestamp <= data.presaleStartTime + 1 weeks;
  }

  /**
   * @notice Returns whether the claiming process is stopped or not
   * @return true if the claiming process is stop, false otherwise
   */
  function isEmergencyStopped() external view returns (bool) {
    return data.isStopped;
  }

  /**
   * @notice Returns the token id of a given set of traits
   * @param traits set of traits of the token
   * @return token id
   */
  function getTokenId(uint256[8] calldata traits) external view returns (uint256) {
    bytes32 hashedCombination = keccak256(
      abi.encodePacked(
        traits[0], // base
        traits[1], // necklace
        traits[2], // facial
        traits[3], // earring
        traits[4], // head
        traits[5], // glasses
        traits[6], // lipstick
        traits[7] // smoking
      )
    );
    require(_combinationToId[hashedCombination] != 0, 'NOT_EXISTS');
    return _combinationToId[hashedCombination];
  }

  /**
   * @notice Returns the set of traits given a token id
   * @param tokenId the id of the token
   * @return traits array
   */
  function getTraits(uint256 tokenId) external view returns (uint256[8] memory) {
    require(_exists(tokenId), 'NOT_EXISTS');
    return _getTraits(tokenId);
  }

  /**
   * @notice Returns the set of traits given a token id
   * @param tokenId the id of the token
   * @return traits array
   */
  function _getTraits(uint256 tokenId) internal view returns (uint256[8] memory traits) {
    Combination memory c = _idToCombination[tokenId];
    traits[0] = c.base;
    traits[1] = c.necklace;
    traits[2] = c.facial;
    traits[3] = c.earring;
    traits[4] = c.head;
    traits[5] = c.glasses;
    traits[6] = c.lipstick;
    traits[7] = c.smoking;
  }

  /**
   * @notice Returns the Uniform Resource Identifier (URI) for `tokenId` token
   * @param tokenId token id
   * @return uri of the given `tokenId`
   */
  function tokenURI(uint256 tokenId) public view override(ERC721) returns (string memory) {
    require(_exists(tokenId), 'NOT_EXISTS');
    return descriptor.tokenURI(_getTraits(tokenId));
  }

  /**
   * @notice Returns whether the given address of the user has already minted a human or not
   * @param user address of the user
   * @return true if `user` has minted a human, false otherwise
   */
  function hasMintedHuman(address user) external view returns (bool) {
    return _hasMintedHuman[user];
  }

  /**
   * @notice Returns the total amount of female human tokens
   * @return total supply of female humans
   */
  function totalFemaleHumansSupply() public view returns (uint256) {
    return MAXIMUM_TOTAL_SUPPLY_OF_FEMALE_HUMAN - data.femaleHumans;
  }

  /**
   * @notice Returns the total amount of male human tokens
   * @return total supply of male humans
   */
  function totalMaleHumansSupply() public view returns (uint256) {
    return MAXIMUM_TOTAL_SUPPLY_OF_MALE_HUMAN - data.maleHumans;
  }

  /**
   * @notice Returns the total amount of female vampire tokens
   * @return total supply of female vampires
   */
  function totalFemaleVampiresSupply() public view returns (uint256) {
    return MAXIMUM_TOTAL_SUPPLY_OF_FEMALE_VAMPIRE - data.femaleVampires;
  }

  /**
   * @notice Returns the total amount of male vampire tokens
   * @return total supply of male vampires
   */
  function totalMaleVampiresSupply() public view returns (uint256) {
    return MAXIMUM_TOTAL_SUPPLY_OF_MALE_VAMPIRE - data.maleVampires;
  }

  /**
   * @notice Returns the total amount of female metahuman tokens
   * @return total supply of female metahumans
   */
  function totalFemaleMetahumansSupply() public view returns (uint256) {
    return MAXIMUM_TOTAL_SUPPLY_OF_FEMALE_METAHUMAN - data.femaleMetahumans;
  }

  /**
   * @notice Returns the total amount of male metahuman tokens
   * @return total supply of male metahumans
   */
  function totalMaleMetahumansSupply() public view returns (uint256) {
    return MAXIMUM_TOTAL_SUPPLY_OF_MALE_METAHUMAN - data.maleMetahumans;
  }

  /**
   * @notice Returns the total amount of ape tokens
   * @return total supply of apes
   */
  function totalApesSupply() public view returns (uint256) {
    return MAXIMUM_TOTAL_SUPPLY_OF_APE - data.apes;
  }

  /**
   * @notice Returns the starting time of the presale (0 if it did not start yet)
   * @return starting time of the presale
   */
  function presaleStartTime() external view returns (uint256) {
    return uint256(data.presaleStartTime);
  }

  /**
   * @notice Returns how much royalty is owed and to whom, based on the sale price
   * @param tokenId token id of the NFT asset queried for royalty information
   * @param salePrice sale price of the NFT asset specified by `tokenId`
   * @return receiver address of the royalty payment
   * @return amount of the royalty payment for `salePrice`
   */
  function royaltyInfo(uint256 tokenId, uint256 salePrice)
    external
    view
    override(IERC2981)
    returns (address, uint256)
  {
    require(_exists(tokenId), 'NOT_EXISTS');
    return (royaltyReceiver, (salePrice * royaltyBps) / 10000);
  }

  /**
   * @dev Checks if the contract supports the given interface
   * @param interfaceId The identifier of the interface
   * @return True if the interface is supported, false otherwise
   */
  function supportsInterface(bytes4 interfaceId)
    public
    view
    virtual
    override(ERC721Enumerable, IERC165)
    returns (bool)
  {
    return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);
  }

  /**
   * @notice Activate the presale
   * @dev Only callable by governance
   */
  function startPresale() external onlyGovernance {
    require(data.presaleStartTime == 0, 'PRESALE_ALREADY_STARTED');
    data.presaleStartTime = uint40(block.timestamp);
    emit PresaleStart();
  }

  /**
   * @notice Pull ETH funds from the contract to the given recipient
   * @dev Only callable by governance
   * @param recipient address to transfer the funds to
   * @param amount amount of funds to transfer
   */
  function pullFunds(address recipient, uint256 amount) external onlyGovernance {
    (bool success, ) = recipient.call{value: amount}('');
    require(success, 'UNABLE_TO_PULL');
    emit FundsWithdrawal(recipient, amount);
  }

  /**
   * @notice Pull ERC20 token funds from the contract to the given recipient
   * @dev Only callable by governance
   * @param asset address of the ERC20 token to transfer
   * @param recipient address to transfer the funds to
   * @param amount amount of funds to transfer
   */
  function pullTokens(
    address asset,
    address recipient,
    uint256 amount
  ) external onlyGovernance {
    IERC20(asset).safeTransfer(recipient, amount);
  }

  /**
   * @notice Update the governance address
   * @dev Only callable by governance
   * @param newGovernance address of the new governance
   */
  function setGovernance(address newGovernance) external onlyGovernance {
    address oldGovernance = governance;
    governance = newGovernance;

    emit GovernanceUpdate(oldGovernance, newGovernance);
  }

  /**
   * @notice Update the descriptor address
   * @dev Only callable by governance when descriptor is not locked
   * @param newDescriptor address of the new descriptor
   */
  function setDescriptor(address newDescriptor) external onlyGovernance whenDescriptorNotLocked {
    address oldDescriptor = address(descriptor);
    descriptor = IDescriptor(newDescriptor);

    emit DescriptorUpdate(oldDescriptor, newDescriptor);
  }

  /**
   * @notice Lock the ability to update the descriptor address
   * @dev Only callable by governance when descriptor is not locked
   */
  function lockDescriptor() external onlyGovernance whenDescriptorNotLocked {
    isDescriptorLocked = true;

    emit DescriptorLock(address(descriptor));
  }

  /**
   * @notice Update the royalty basis points (e.g. a value of 150 corresponds to 1.50%)
   * @dev Only callable by governance
   * @param newRoyaltyBps value of the new royalty bps
   */
  function setRoyaltyBps(uint256 newRoyaltyBps) external onlyGovernance {
    uint256 oldRoyaltyBps = royaltyBps;
    royaltyBps = newRoyaltyBps;

    emit RoyaltyBpsUpdate(oldRoyaltyBps, newRoyaltyBps);
  }

  /**
   * @notice Update the royalty receiver
   * @dev Only callable by governance
   * @param newRoyaltyReceiver address of the new royalty receiver
   */
  function setRoyaltyReceiver(address newRoyaltyReceiver) external onlyGovernance {
    address oldRoyaltyReceiver = royaltyReceiver;
    royaltyReceiver = newRoyaltyReceiver;

    emit RoyaltyReceiverUpdate(oldRoyaltyReceiver, newRoyaltyReceiver);
  }

  /**
   * @notice Stops the claiming process of the contract in case of emergency
   * @dev Only callable by emergency admin
   * @param isStopped true to stop the claiming process, false otherwise
   */
  function emergencyStop(bool isStopped) external {
    require(msg.sender == emergencyAdmin, 'ONLY_BY_EMERGENCY_ADMIN');
    data.isStopped = isStopped;

    emit EmergencyStop(isStopped);
  }

  /**
   * @notice Update the emergency admin address
   * @dev Only callable by emergency admin
   * @param newEmergencyAdmin address of the new emergency admin
   */
  function setEmergencyAdmin(address newEmergencyAdmin) external {
    require(msg.sender == emergencyAdmin, 'ONLY_BY_EMERGENCY_ADMIN');

    address oldEmergencyAdmin = emergencyAdmin;
    emergencyAdmin = newEmergencyAdmin;

    emit EmergencyAdminUpdate(oldEmergencyAdmin, newEmergencyAdmin);
  }

  /**
   * @notice Mint a token to the receiver
   * @param traits set of traits of the token
   * @param receiver receiver address
   */
  function _claim(uint256[8] memory traits, address receiver) internal {
    require(msg.sender == tx.origin, 'ONLY_EOA');
    require(data.count > 0, 'NO_CLAIMS_AVAILABLE');

    uint256 base = traits[0];
    bytes32 hashedCombination = keccak256(
      abi.encodePacked(
        base, // base
        traits[1], // necklace
        traits[2], // facial
        traits[3], // earring
        traits[4], // head
        traits[5], // glasses
        traits[6], // lipstick
        traits[7] // smoking
      )
    );
    require(_combinationToId[hashedCombination] == 0, 'ALREADY_EXISTS');
    if (_humanBase(base)) {
      require(!_hasMintedHuman[msg.sender], 'INVALID_HUMAN_MINTER');
      _hasMintedHuman[msg.sender] = true;
    }

    // TokenId (0 is reserved)
    uint256 tokenId = MAXIMUM_TOTAL_SUPPLY - data.count + 1;

    // Update breed counter
    if (_humanBase(base)) {
      if (_isMale(base)) {
        data.maleHumans--;
      } else {
        data.femaleHumans--;
      }
    } else if (_vampireBase(base)) {
      if (_isMale(base)) {
        data.maleVampires--;
      } else {
        data.femaleVampires--;
      }
    } else if (_metahumanBase(base)) {
      if (_isMale(base)) {
        data.maleMetahumans--;
      } else {
        data.femaleMetahumans--;
      }
    } else {
      data.apes--;
    }
    data.count--;

    // Traits
    _combinationToId[hashedCombination] = tokenId;
    _idToCombination[tokenId] = Combination({
      base: uint8(base),
      necklace: uint8(traits[1]),
      facial: uint8(traits[2]),
      earring: uint8(traits[3]),
      head: uint8(traits[4]),
      glasses: uint8(traits[5]),
      lipstick: uint8(traits[6]),
      smoking: uint8(traits[7])
    });

    _mint(receiver, tokenId);

    emit DecentralistMint(tokenId, receiver, traits);
  }

  /**
   * @notice Check the transaction value is correct given a base and whether the presale is active
   * @param base value of the base trait
   * @param inPresale true if presale is active, false otherwise
   * @return true if the transaction value is correct, false otherwise
   */
  function _checkValue(uint256 base, bool inPresale) internal view returns (bool) {
    if (_humanBase(base)) {
      return msg.value == MINT_PRICE_HUMAN;
    } else if (_vampireBase(base)) {
      return inPresale ? msg.value == MINT_PRICE_PRESALE_VAMPIRE : msg.value == MINT_PRICE_VAMPIRE;
    } else if (_metahumanBase(base)) {
      return
        inPresale ? msg.value == MINT_PRICE_PRESALE_METAHUMAN : msg.value == MINT_PRICE_METAHUMAN;
    } else if (_apeBase(base)) {
      return inPresale ? msg.value == MINT_PRICE_PRESALE_APE : msg.value == MINT_PRICE_APE;
    } else {
      return false;
    }
  }

  /**
   * @notice Check whether a set of traits is a valid combination or not
   * @dev Even numbers of base trait corresponds to male
   * @param traits set of traits of the token
   * @return true if it is a valid combination, false otherwise
   */
  function _validateCombination(uint256[8] calldata traits) internal pure returns (bool) {
    bool isMale = _isMale(traits[0]);
    if (
      isMale &&
      traits[0] < TRAIT_BASE_SIZE &&
      traits[1] < TRAIT_NECKLACE_SIZE &&
      traits[2] < TRAIT_FACIAL_MALE_SIZE &&
      traits[3] < TRAIT_EARRING_SIZE &&
      traits[4] < TRAIT_HEAD_MALE_SIZE &&
      traits[5] < TRAIT_GLASSES_SIZE &&
      traits[6] < TRAIT_LIPSTICK_MALE_SIZE &&
      traits[7] < TRAIT_SMOKING_SIZE
    ) {
      return true;
    } else if (
      !isMale &&
      traits[0] < TRAIT_BASE_SIZE &&
      traits[1] < TRAIT_NECKLACE_SIZE &&
      traits[2] < TRAIT_FACIAL_FEMALE_SIZE &&
      traits[3] < TRAIT_EARRING_SIZE &&
      traits[4] < TRAIT_HEAD_FEMALE_SIZE &&
      traits[5] < TRAIT_GLASSES_SIZE &&
      traits[6] < TRAIT_LIPSTICK_FEMALE_SIZE &&
      traits[7] < TRAIT_SMOKING_SIZE
    ) {
      return true;
    } else {
      return false;
    }
  }

  /**
   * @notice Returns true if the base trait corresponds to human breed
   * @param base value of the base trait
   * @return True if the base corresponds to human breed, false otherwise
   */
  function _humanBase(uint256 base) internal pure returns (bool) {
    return base < TRAIT_BASE_HUMAN_SEPARATOR;
  }

  /**
   * @notice Returns true if the base trait corresponds to vampire breed
   * @param base value of the base trait
   * @return True if the base corresponds to vampire breed, false otherwise
   */
  function _vampireBase(uint256 base) internal pure returns (bool) {
    return base >= TRAIT_BASE_HUMAN_SEPARATOR && base < TRAIT_BASE_VAMPIRE_SEPARATOR;
  }

  /**
   * @notice Returns true if the base trait corresponds to metahuman breed
   * @param base value of the base trait
   * @return True if the base corresponds to metahuman breed, false otherwise
   */
  function _metahumanBase(uint256 base) internal pure returns (bool) {
    return base >= TRAIT_BASE_VAMPIRE_SEPARATOR && base < TRAIT_BASE_METAHUMAN_SEPARATOR;
  }

  /**
   * @notice Returns true if the base trait corresponds to ape breed
   * @param base value of the base trait
   * @return True if the base corresponds to ape breed, false otherwise
   */
  function _apeBase(uint256 base) internal pure returns (bool) {
    return base >= TRAIT_BASE_METAHUMAN_SEPARATOR && base < TRAIT_BASE_APE_SEPARATOR;
  }

  /**
   * @notice Returns true if the base trait corresponds to male sex
   * @param base value of the base trait
   * @return True if the base corresponds to male sex, false otherwise
   */
  function _isMale(uint256 base) internal pure returns (bool) {
    return base % 2 == 0;
  }

  /**
   * @dev Hook that is called before any transfer of tokens
   * @param from origin address of the transfer
   * @param to recipient address of the transfer
   * @param tokenId id of the token to transfer
   */
  function _beforeTokenTransfer(
    address from,
    address to,
    uint256 tokenId
  ) internal override(ERC721Enumerable) {
    super._beforeTokenTransfer(from, to, tokenId);
  }

  /**
   * @dev Functions marked by this modifier can only be called when descriptor is not locked
   **/
  modifier whenDescriptorNotLocked() {
    require(!isDescriptorLocked, 'DESCRIPTOR_LOCKED');
    _;
  }

  /**
   * @dev Functions marked by this modifier can only be called by governance
   **/
  modifier onlyGovernance() {
    require(msg.sender == governance, 'ONLY_BY_GOVERNANCE');
    _;
  }

  /**
   * @dev Emitted when a new token is minted
   * @param tokenId token id
   * @param recipient address of the recipient of the token
   * @param traits set of traits of the token
   */
  event DecentralistMint(uint256 indexed tokenId, address indexed recipient, uint256[8] traits);

  /**
   * @dev Emitted when the presale starts
   */
  event PresaleStart();

  /**
   * @dev Emitted when funds are withdraw
   * @param recipient address of the recipient of the funds
   * @param amount amount of the funds withdraw
   */
  event FundsWithdrawal(address indexed recipient, uint256 amount);

  /**
   * @dev Emitted when the governance address is updated
   * @param oldGovernance address of the old governance
   * @param newGovernance address of the new governance
   */
  event GovernanceUpdate(address indexed oldGovernance, address indexed newGovernance);

  /**
   * @dev Emitted when the emergency admin stops the claiming process
   * @param isStopped true if it is stopped, false otherwise
   */
  event EmergencyStop(bool isStopped);

  /**
   * @dev Emitted when the emergency admin address is updated
   * @param oldEmergencyAdmin address of the old emergency admin
   * @param newEmergencyAdmin address of the new emergency admin
   */
  event EmergencyAdminUpdate(address indexed oldEmergencyAdmin, address indexed newEmergencyAdmin);

  /**
   * @dev Emitted when the descriptor address is updated
   * @param oldDescriptor address of the old descriptor
   * @param newDescriptor address of the new descriptor
   */
  event DescriptorUpdate(address indexed oldDescriptor, address indexed newDescriptor);

  /**
   * @dev Emitted when the descriptor is locked
   * @param descriptor address of the descriptor
   */
  event DescriptorLock(address indexed descriptor);

  /**
   * @dev Emitted when the royalty bps value is updated
   * @param oldRoyaltyBps old value of the royalty bps
   * @param newRoyaltyBps new value of the royalty bps
   */
  event RoyaltyBpsUpdate(uint256 oldRoyaltyBps, uint256 newRoyaltyBps);

  /**
   * @dev Emitted when the royalty receiver is updated
   * @param oldRoyaltyReceiver address of the old royalty receiver
   * @param newRoyaltyReceiver address of the new royalty receiver
   */
  event RoyaltyReceiverUpdate(
    address indexed oldRoyaltyReceiver,
    address indexed newRoyaltyReceiver
  );
}

File 2 of 16 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 3 of 16 : SafeERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

File 4 of 16 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 5 of 16 : ERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./IERC721Enumerable.sol";

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

File 6 of 16 : ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

File 7 of 16 : IERC2981.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be payed in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

File 8 of 16 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 9 of 16 : IDescriptor.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;

interface IDescriptor {
  function tokenURI(uint256[8] calldata) external view returns (string memory);
}

File 10 of 16 : IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

File 11 of 16 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

File 12 of 16 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 13 of 16 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

File 14 of 16 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 15 of 16 : Strings.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

File 16 of 16 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 2000
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"governance_","type":"address"},{"internalType":"address","name":"emergencyAdmin_","type":"address"},{"internalType":"address","name":"descriptor_","type":"address"},{"internalType":"uint256","name":"royaltyBps_","type":"uint256"},{"internalType":"address","name":"royaltyReceiver_","type":"address"},{"internalType":"address[]","name":"initialMintingRecipients_","type":"address[]"},{"internalType":"uint256[8][]","name":"initialMintingCombinations_","type":"uint256[8][]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256[8]","name":"traits","type":"uint256[8]"}],"name":"DecentralistMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"descriptor","type":"address"}],"name":"DescriptorLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldDescriptor","type":"address"},{"indexed":true,"internalType":"address","name":"newDescriptor","type":"address"}],"name":"DescriptorUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldEmergencyAdmin","type":"address"},{"indexed":true,"internalType":"address","name":"newEmergencyAdmin","type":"address"}],"name":"EmergencyAdminUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isStopped","type":"bool"}],"name":"EmergencyStop","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FundsWithdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldGovernance","type":"address"},{"indexed":true,"internalType":"address","name":"newGovernance","type":"address"}],"name":"GovernanceUpdate","type":"event"},{"anonymous":false,"inputs":[],"name":"PresaleStart","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldRoyaltyBps","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRoyaltyBps","type":"uint256"}],"name":"RoyaltyBpsUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldRoyaltyReceiver","type":"address"},{"indexed":true,"internalType":"address","name":"newRoyaltyReceiver","type":"address"}],"name":"RoyaltyReceiverUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAXIMUM_TOTAL_SUPPLY","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_TOTAL_SUPPLY_OF_APE","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_TOTAL_SUPPLY_OF_FEMALE_HUMAN","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_TOTAL_SUPPLY_OF_FEMALE_METAHUMAN","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_TOTAL_SUPPLY_OF_FEMALE_VAMPIRE","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_TOTAL_SUPPLY_OF_MALE_HUMAN","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_TOTAL_SUPPLY_OF_MALE_METAHUMAN","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_TOTAL_SUPPLY_OF_MALE_VAMPIRE","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE_APE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE_HUMAN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE_METAHUMAN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE_VAMPIRE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[8]","name":"traits","type":"uint256[8]"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"descriptor","outputs":[{"internalType":"contract IDescriptor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"isStopped","type":"bool"}],"name":"emergencyStop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[8]","name":"traits","type":"uint256[8]"}],"name":"getTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTraits","outputs":[{"internalType":"uint256[8]","name":"","type":"uint256[8]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"hasMintedHuman","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[8]","name":"traits","type":"uint256[8]"}],"name":"isCombinationAvailable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[8]","name":"traits","type":"uint256[8]"}],"name":"isCombinationValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"isDescriptorLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isEmergencyStopped","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockDescriptor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[8]","name":"traits","type":"uint256[8]"}],"name":"presaleClaim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presaleStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"pullFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"pullTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltyBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newDescriptor","type":"address"}],"name":"setDescriptor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newEmergencyAdmin","type":"address"}],"name":"setEmergencyAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newGovernance","type":"address"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRoyaltyBps","type":"uint256"}],"name":"setRoyaltyBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRoyaltyReceiver","type":"address"}],"name":"setRoyaltyReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalApesSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFemaleHumansSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFemaleMetahumansSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFemaleVampiresSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMaleHumansSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMaleMetahumansSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMaleVampiresSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604051620052d0380380620052d0833981016040819052620000349162000ec8565b604080518082018252600d81526c446563656e7472616c6973747360981b6020808301918252835180850190945260038452622221a760e91b908401528151919291620000849160009162000ca8565b5080516200009a90600190602084019062000ca8565b5050600a80546001600160a01b03199081166001600160a01b038b811691909117909255600b805482168a8416179055600c80548216898416179055600d879055600e805490911691861691909117905550600f8054600160301b600160f01b0319167c03e8000bb8000bb80005dc0005dc078d98078d980f4240000000000000179055815160005b818110156200017f576200017683828151811062000145576200014562000fed565b602002602001015185838151811062000162576200016262000fed565b60200260200101516200018e60201b60201c565b60010162000123565b5050505050505050506200116b565b333214620001ce5760405162461bcd60e51b81526020600482015260086024820152674f4e4c595f454f4160c01b60448201526064015b60405180910390fd5b600f546601000000000000900462ffffff166200022e5760405162461bcd60e51b815260206004820152601360248201527f4e4f5f434c41494d535f415641494c41424c45000000000000000000000000006044820152606401620001c5565b60008281602002015190506000818460016020020151856002602002015186600360200201518760046020020151886005602002015189600660200201518a60076020020151604051602001620002bd989796959493929190978852602088019690965260408701949094526060860192909252608085015260a084015260c083015260e08201526101000190565b60408051601f1981840301815291815281516020928301206000818152601090935291205490915015620003255760405162461bcd60e51b815260206004820152600e60248201526d414c52454144595f45584953545360901b6044820152606401620001c5565b620003308260081190565b15620003b3573360009081526012602052604090205460ff1615620003985760405162461bcd60e51b815260206004820152601460248201527f494e56414c49445f48554d414e5f4d494e5445520000000000000000000000006044820152606401620001c5565b336000908152601260205260409020805460ff191660011790555b600f54600090620003d7906601000000000000900462ffffff16620f424062001019565b620003e490600162001040565b62ffffff169050620003f68360081190565b156200047b576200040783620007d2565b156200045757600f80546c01000000000000000000000000900462ffffff1690600c62000434836200106a565b91906101000a81548162ffffff021916908362ffffff1602179055505062000572565b600f80546901000000000000000000900462ffffff1690600962000434836200106a565b6200048683620007e8565b15620004d8576200049783620007d2565b15620004bb57600f8054600160901b900462ffffff1690601262000434836200106a565b600f8054600160781b900462ffffff16908062000434836200106a565b620004e38362000802565b156200053657620004f483620007d2565b156200051857600f8054600160c01b900462ffffff1690601862000434836200106a565b600f8054600160a81b900462ffffff1690601562000434836200106a565b600f8054600160d81b900462ffffff1690601b62000554836200106a565b91906101000a81548162ffffff021916908362ffffff160217905550505b600f80546601000000000000900462ffffff1690600662000593836200106a565b825462ffffff91821661010093840a90810292021916179091556000848152601060209081526040918290208590558151928301825260ff87811684528982015116908301529091508101866002602002015160ff1681526020018660036008811062000604576200060462000fed565b602002015160ff1681526020018660046008811062000627576200062762000fed565b602002015160ff168152602001866005600881106200064a576200064a62000fed565b602002015160ff168152602001866006600881106200066d576200066d62000fed565b602002015160ff1681526020018660076008811062000690576200069062000fed565b6020908102919091015160ff9081169092526000848152601182526040908190208451815493860151928601516060870151608088015160a089015160c08a015160e0909a015189166701000000000000000260ff60381b199a8a166601000000000000029a909a1661ffff60301b19918a16650100000000000260ff60281b19938b16640100000000029390931661ffff60201b19948b1663010000000263ff00000019968c1662010000029690961663ffff000019998c166101000261ffff19909b1697909b169690961798909817969096169790971791909117161793909317161791909117905562000787848262000818565b836001600160a01b0316817f885092d8762b8ab8b1c1704d518d67f575dd67b734ba8817d34c885e7e3964c887604051620007c391906200108c565b60405180910390a35050505050565b6000620007e1600283620010c0565b1592915050565b600060088210158015620007fc5750600a82105b92915050565b6000600a8210158015620007fc575050600c1190565b6001600160a01b038216620008705760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401620001c5565b6000818152600260205260409020546001600160a01b031615620008d75760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401620001c5565b620008e5600083836200096e565b6001600160a01b038216600090815260036020526040812080546001929062000910908490620010e3565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b620009868383836200098b60201b620022bd1760201c565b505050565b620009a38383836200098660201b62000f991760201c565b6001600160a01b03831662000a0157620009fb81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b62000a27565b816001600160a01b0316836001600160a01b03161462000a275762000a27838262000a67565b6001600160a01b03821662000a4157620009868162000b14565b826001600160a01b0316826001600160a01b031614620009865762000986828262000bce565b6000600162000a818462000c1f60201b620019d51760201c565b62000a8d9190620010fe565b60008381526007602052604090205490915080821462000ae1576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009062000b2890600190620010fe565b6000838152600960205260408120546008805493945090928490811062000b535762000b5362000fed565b90600052602060002001549050806008838154811062000b775762000b7762000fed565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548062000bb25762000bb262001118565b6001900381819060005260206000200160009055905550505050565b600062000be68362000c1f60201b620019d51760201c565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60006001600160a01b03821662000c8c5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401620001c5565b506001600160a01b031660009081526003602052604090205490565b82805462000cb6906200112e565b90600052602060002090601f01602090048101928262000cda576000855562000d25565b82601f1062000cf557805160ff191683800117855562000d25565b8280016001018555821562000d25579182015b8281111562000d2557825182559160200191906001019062000d08565b5062000d3392915062000d37565b5090565b5b8082111562000d33576000815560010162000d38565b80516001600160a01b038116811462000d6657600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60405161010081016001600160401b038111828210171562000da75762000da762000d6b565b60405290565b604051601f8201601f191681016001600160401b038111828210171562000dd85762000dd862000d6b565b604052919050565b60006001600160401b0382111562000dfc5762000dfc62000d6b565b5060051b60200190565b6000601f838184011262000e1957600080fd5b8251602062000e3262000e2c8362000de0565b62000dad565b82815260089290921b8501810191818101908784111562000e5257600080fd5b8287015b8481101562000ebc57888682011262000e6f5760008081fd5b62000e7962000d81565b8061010083018b81111562000e8e5760008081fd5b835b8181101562000ea9578051845292870192870162000e90565b5050845250918301916101000162000e56565b50979650505050505050565b600080600080600080600060e0888a03121562000ee457600080fd5b62000eef8862000d4e565b9650602062000f00818a0162000d4e565b965062000f1060408a0162000d4e565b95506060890151945062000f2760808a0162000d4e565b60a08a01519094506001600160401b038082111562000f4557600080fd5b818b0191508b601f83011262000f5a57600080fd5b815162000f6b62000e2c8262000de0565b81815260059190911b8301840190848101908e83111562000f8b57600080fd5b938501935b8285101562000fb45762000fa48562000d4e565b8252938501939085019062000f90565b60c08e0151909750945050508083111562000fce57600080fd5b505062000fde8a828b0162000e06565b91505092959891949750929550565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600062ffffff8381169083168181101562001038576200103862001003565b039392505050565b600062ffffff80831681851680830382111562001061576200106162001003565b01949350505050565b600062ffffff82168062001082576200108262001003565b6000190192915050565b6101008101818360005b6008811015620010b757815183526020928301929091019060010162001096565b50505092915050565b600082620010de57634e487b7160e01b600052601260045260246000fd5b500690565b60008219821115620010f957620010f962001003565b500190565b60008282101562001113576200111362001003565b500390565b634e487b7160e01b600052603160045260246000fd5b600181811c908216806200114357607f821691505b602082108114156200116557634e487b7160e01b600052602260045260246000fd5b50919050565b614155806200117b6000396000f3fe6080604052600436106103ad5760003560e01c806395364a84116101e7578063c87b56dd1161010d578063dd6f34c3116100a0578063f4b2e3771161006f578063f4b2e37714610a76578063fa4496fa14610a8b578063fc19be1814610aa0578063fddd483714610ac057600080fd5b8063dd6f34c3146109d8578063e1dc0761146109eb578063e985e9c514610a18578063ee6106e314610a6157600080fd5b8063cf8d81bf116100dc578063cf8d81bf146105cf578063d793d8dc1461098e578063dbc5fd71146109ae578063dbd31b9b146109c357600080fd5b8063c87b56dd14610919578063c8c5353e14610939578063c8dc4f711461069f578063c9c05c251461097257600080fd5b8063a8c5b9e211610185578063b88d4fde11610154578063b88d4fde146108a2578063c1b8e4e1146108c2578063c63adb2b146108e3578063c6cdbcbb146108f957600080fd5b8063a8c5b9e2146106b5578063ab033ea91461084b578063ac85dca71461086b578063b0aa593d1461088b57600080fd5b8063a22cb465116101c1578063a22cb465146107de578063a3ebfdbe146107fe578063a51ee4071461081a578063a82524b21461082f57600080fd5b806395364a841461079457806395d89b41146107a95780639fbc8713146107be57600080fd5b806335d2b2ae116102d75780635557ba591161026a5780636352211e116102395780636352211e1461071457806370905dce1461073457806370a08231146107545780638dc251e31461077457600080fd5b80635557ba59146106b55780635573a623146106cc5780635aa6e675146106df578063602ddd8b146106ff57600080fd5b806348ab665b116102a657806348ab665b1461064e5780634a171a14146106695780634f6ccce71461067f578063520be0e81461069f57600080fd5b806335d2b2ae146105cf57806335da3394146105f957806341b5d0de1461061957806342842e0e1461062e57600080fd5b806312389cbe1161034f5780632a55205a1161031e5780632a55205a1461053b5780632e0d9f6b1461057a5780632f745c591461058f578063303e74df146105af57600080fd5b806312389cbe146104b857806318160ddd146104e65780631f72d831146104fb57806323b872dd1461051b57600080fd5b806306fdde031161038b57806306fdde031461041e578063081812fc14610440578063095ea7b3146104785780630ac62e021461049857600080fd5b806301b9a397146103b257806301ffc9a7146103d457806304c98b2b14610409575b600080fd5b3480156103be57600080fd5b506103d26103cd366004613b23565b610ae1565b005b3480156103e057600080fd5b506103f46103ef366004613b54565b610bee565b60405190151581526020015b60405180910390f35b34801561041557600080fd5b506103d2610c32565b34801561042a57600080fd5b50610433610d34565b6040516104009190613bc9565b34801561044c57600080fd5b5061046061045b366004613bdc565b610dc6565b6040516001600160a01b039091168152602001610400565b34801561048457600080fd5b506103d2610493366004613bf5565b610e6c565b3480156104a457600080fd5b506103d26104b3366004613c2d565b610f9e565b3480156104c457600080fd5b506104d86104d3366004613c4a565b611054565b604051908152602001610400565b3480156104f257600080fd5b506008546104d8565b34801561050757600080fd5b506103d2610516366004613bdc565b61112f565b34801561052757600080fd5b506103d2610536366004613c75565b6111c3565b34801561054757600080fd5b5061055b610556366004613cb1565b61124a565b604080516001600160a01b039093168352602083019190915201610400565b34801561058657600080fd5b506104d86112d2565b34801561059b57600080fd5b506104d86105aa366004613bf5565b611306565b3480156105bb57600080fd5b50600c54610460906001600160a01b031681565b3480156105db57600080fd5b506105e56105dc81565b60405162ffffff9091168152602001610400565b34801561060557600080fd5b506103d2610614366004613b23565b6113ae565b34801561062557600080fd5b506103d2611467565b34801561063a57600080fd5b506103d2610649366004613c75565b611577565b34801561065a57600080fd5b506104d866b1a2bc2ec5000081565b34801561067557600080fd5b506105e56103e881565b34801561068b57600080fd5b506104d861069a366004613bdc565b611592565b3480156106ab57600080fd5b506105e5610bb881565b3480156106c157600080fd5b506105e562078d9881565b6103d26106da366004613c4a565b611636565b3480156106eb57600080fd5b50600a54610460906001600160a01b031681565b34801561070b57600080fd5b506104d8611922565b34801561072057600080fd5b5061046061072f366004613bdc565b61194a565b34801561074057600080fd5b50600b54610460906001600160a01b031681565b34801561076057600080fd5b506104d861076f366004613b23565b6119d5565b34801561078057600080fd5b506103d261078f366004613b23565b611a6f565b3480156107a057600080fd5b506103f4611b1d565b3480156107b557600080fd5b50610433611b46565b3480156107ca57600080fd5b50600e54610460906001600160a01b031681565b3480156107ea57600080fd5b506103d26107f9366004613cd3565b611b55565b34801561080a57600080fd5b506104d8670214e8348c4f000081565b34801561082657600080fd5b506104d8611b64565b34801561083b57600080fd5b50600f5464ffffffffff166104d8565b34801561085757600080fd5b506103d2610866366004613b23565b611b97565b34801561087757600080fd5b506103d2610886366004613c75565b611c45565b34801561089757600080fd5b506105e5620f424081565b3480156108ae57600080fd5b506103d26108bd366004613d79565b611ca8565b3480156108ce57600080fd5b50600c546103f490600160a01b900460ff1681565b3480156108ef57600080fd5b506104d8600d5481565b34801561090557600080fd5b506103d2610914366004613bf5565b611d36565b34801561092557600080fd5b50610433610934366004613bdc565b611e70565b34801561094557600080fd5b506103f4610954366004613b23565b6001600160a01b031660009081526012602052604090205460ff1690565b34801561097e57600080fd5b506104d86703782dace9d9000081565b34801561099a57600080fd5b506103f46109a9366004613c4a565b611f3f565b3480156109ba57600080fd5b506104d8611f4a565b3480156109cf57600080fd5b506104d8611f7a565b6103d26109e6366004613c4a565b611fa7565b3480156109f757600080fd5b50610a0b610a06366004613bdc565b612119565b6040516104009190613e24565b348015610a2457600080fd5b506103f4610a33366004613e56565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610a6d57600080fd5b506104d861217b565b348015610a8257600080fd5b506104d86121b1565b348015610a9757600080fd5b506104d8600081565b348015610aac57600080fd5b506103f4610abb366004613c4a565b6121d6565b348015610acc57600080fd5b50600f5465010000000000900460ff166103f4565b600a546001600160a01b03163314610b355760405162461bcd60e51b81526020600482015260126024820152714f4e4c595f42595f474f5645524e414e434560701b60448201526064015b60405180910390fd5b600c54600160a01b900460ff1615610b8f5760405162461bcd60e51b815260206004820152601160248201527f44455343524950544f525f4c4f434b45440000000000000000000000000000006044820152606401610b2c565b600c80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f0b4633e1a5ef35d9f85b37127e7ab104f9f20c4e73f8ecb3662e56b6d01ff91590600090a35050565b60006001600160e01b031982167f2a55205a000000000000000000000000000000000000000000000000000000001480610c2c5750610c2c82612375565b92915050565b600a546001600160a01b03163314610c815760405162461bcd60e51b81526020600482015260126024820152714f4e4c595f42595f474f5645524e414e434560701b6044820152606401610b2c565b600f5464ffffffffff1615610cd85760405162461bcd60e51b815260206004820152601760248201527f50524553414c455f414c52454144595f535441525445440000000000000000006044820152606401610b2c565b600f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000164264ffffffffff161790556040517fefb7e4f585efb36e860cd765163862d1b8a52d76fa7e574edd08d982b51cd61190600090a1565b606060008054610d4390613e89565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6f90613e89565b8015610dbc5780601f10610d9157610100808354040283529160200191610dbc565b820191906000526020600020905b815481529060010190602001808311610d9f57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610e505760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610b2c565b506000908152600460205260409020546001600160a01b031690565b6000610e778261194a565b9050806001600160a01b0316836001600160a01b03161415610f015760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610b2c565b336001600160a01b0382161480610f1d5750610f1d8133610a33565b610f8f5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b2c565b610f9983836123b3565b505050565b600b546001600160a01b03163314610ff85760405162461bcd60e51b815260206004820152601760248201527f4f4e4c595f42595f454d455247454e43595f41444d494e0000000000000000006044820152606401610b2c565b600f8054821515650100000000000265ff0000000000199091161790556040517fcbe1b789cda412d9e1c647ed03d0c71e2f71484be36f9ca2b2a346b29edf1b709061104990831515815260200190565b60405180910390a150565b604080518235602082810191909152830135818301529082013560608281019190915282013560808281019190915282013560a08281019190915282013560c08281019190915282013560e08281019190915282013561010082015260009081906101200160408051601f1981840301815291815281516020928301206000818152601090935291205490915061111a5760405162461bcd60e51b815260206004820152600a6024820152694e4f545f45584953545360b01b6044820152606401610b2c565b60009081526010602052604090205492915050565b600a546001600160a01b0316331461117e5760405162461bcd60e51b81526020600482015260126024820152714f4e4c595f42595f474f5645524e414e434560701b6044820152606401610b2c565b600d80549082905560408051828152602081018490527fb7b16e3cfa4362e0f875e9a926d91f5e5573f73e1f6772c8d9b56fa14301f818910160405180910390a15050565b6111cd338261242e565b61123f5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610b2c565b610f99838383612536565b60008281526002602052604081205481906001600160a01b031661129d5760405162461bcd60e51b815260206004820152600a6024820152694e4f545f45584953545360b01b6044820152606401610b2c565b600e54600d546001600160a01b0390911690612710906112bd9086613eea565b6112c79190613f1f565b915091509250929050565b600f546000906112fc906f01000000000000000000000000000000900462ffffff166105dc613f33565b62ffffff16905090565b6000611311836119d5565b82106113855760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610b2c565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600b546001600160a01b031633146114085760405162461bcd60e51b815260206004820152601760248201527f4f4e4c595f42595f454d455247454e43595f41444d494e0000000000000000006044820152606401610b2c565b600b80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8a23c111263e77d29475540620a027de6c49a7927c3f36de78795cf71e65931590600090a35050565b600a546001600160a01b031633146114b65760405162461bcd60e51b81526020600482015260126024820152714f4e4c595f42595f474f5645524e414e434560701b6044820152606401610b2c565b600c54600160a01b900460ff16156115105760405162461bcd60e51b815260206004820152601160248201527f44455343524950544f525f4c4f434b45440000000000000000000000000000006044820152606401610b2c565b600c80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff8116600160a01b179091556040516001600160a01b03909116907fdf95f996a76c155818ca91fc8acf07233468b4d64d8a58d031aba0ae77425b9790600090a2565b610f9983838360405180602001604052806000815250611ca8565b600061159d60085490565b82106116115760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610b2c565b6008828154811061162457611624613ebe565b90600052602060002001549050919050565b600f5465010000000000900460ff16156116925760405162461bcd60e51b815260206004820152600d60248201527f434c41494d5f53544f50504544000000000000000000000000000000000000006044820152606401610b2c565b61169a611b1d565b80156116ae5750600f5464ffffffffff1615155b6116fa5760405162461bcd60e51b815260206004820152601260248201527f50524553414c455f4e4f545f41435449564500000000000000000000000000006044820152606401610b2c565b6117038161271b565b61174f5760405162461bcd60e51b815260206004820152601360248201527f494e56414c49445f434f4d42494e4154494f4e000000000000000000000000006044820152606401610b2c565b8035600811156117a15760405162461bcd60e51b815260206004820152601460248201527f48554d414e535f4e4f545f415641494c41424c450000000000000000000000006044820152606401610b2c565b6117ad81356001612852565b6117f95760405162461bcd60e51b815260206004820152600f60248201527f494e434f52524543545f56414c554500000000000000000000000000000000006044820152606401610b2c565b611803813561290f565b1561187657601f611812611f7a565b61181a6112d2565b6118249190613f57565b106118715760405162461bcd60e51b815260206004820152601360248201527f4e4f5f434c41494d535f415641494c41424c45000000000000000000000000006044820152606401610b2c565b6118ee565b6118808135612924565b1561189757601561188f611b64565b61181a611f4a565b60356118a161217b565b106118ee5760405162461bcd60e51b815260206004820152601360248201527f4e4f5f434c41494d535f415641494c41424c45000000000000000000000000006044820152606401610b2c565b6040805161010081810190925261191f91839060089083908390808284376000920191909152503391506129399050565b50565b600f546000906112fc906c01000000000000000000000000900462ffffff1662078d98613f33565b6000818152600260205260408120546001600160a01b031680610c2c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610b2c565b60006001600160a01b038216611a535760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610b2c565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314611abe5760405162461bcd60e51b81526020600482015260126024820152714f4e4c595f42595f474f5645524e414e434560701b6044820152606401610b2c565b600e80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907fc8f5d38942aec138f6ab6e1ccff96d5114329d3b33fa8d3fac47724c90590ec190600090a35050565b600f54600090611b379064ffffffffff1662093a80613f6f565b64ffffffffff16421115905090565b606060018054610d4390613e89565b611b60338383613057565b5050565b600f546000906112fc907801000000000000000000000000000000000000000000000000900462ffffff16610bb8613f33565b600a546001600160a01b03163314611be65760405162461bcd60e51b81526020600482015260126024820152714f4e4c595f42595f474f5645524e414e434560701b6044820152606401610b2c565b600a80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907fdccb90b244d54b3bb9e633ea2b02f93367526ac8a78357788764295d8949ee6490600090a35050565b600a546001600160a01b03163314611c945760405162461bcd60e51b81526020600482015260126024820152714f4e4c595f42595f474f5645524e414e434560701b6044820152606401610b2c565b610f996001600160a01b0384168383613126565b611cb2338361242e565b611d245760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610b2c565b611d30848484846131a6565b50505050565b600a546001600160a01b03163314611d855760405162461bcd60e51b81526020600482015260126024820152714f4e4c595f42595f474f5645524e414e434560701b6044820152606401610b2c565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611dd2576040519150601f19603f3d011682016040523d82523d6000602084013e611dd7565b606091505b5050905080611e285760405162461bcd60e51b815260206004820152600e60248201527f554e41424c455f544f5f50554c4c0000000000000000000000000000000000006044820152606401610b2c565b826001600160a01b03167f99a7b857d177a9f5962228b830aa679ade0f8465fbb4fef3a472a060c6d8f8e883604051611e6391815260200190565b60405180910390a2505050565b6000818152600260205260409020546060906001600160a01b0316611ec45760405162461bcd60e51b815260206004820152600a6024820152694e4f545f45584953545360b01b6044820152606401610b2c565b600c546001600160a01b03166334f4d1a9611ede8461322f565b6040518263ffffffff1660e01b8152600401611efa9190613e24565b600060405180830381865afa158015611f17573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c2c9190810190613f98565b6000610c2c8261271b565b600f546000906112fc907501000000000000000000000000000000000000000000900462ffffff16610bb8613f33565b600f546000906112fc907201000000000000000000000000000000000000900462ffffff166105dc613f33565b600f5465010000000000900460ff16156120035760405162461bcd60e51b815260206004820152600d60248201527f434c41494d5f53544f50504544000000000000000000000000000000000000006044820152606401610b2c565b61200b611b1d565b1580156120205750600f5464ffffffffff1615155b61206c5760405162461bcd60e51b815260206004820152600f60248201527f53414c455f4e4f545f41435449564500000000000000000000000000000000006044820152606401610b2c565b6120758161271b565b6120c15760405162461bcd60e51b815260206004820152601360248201527f494e56414c49445f434f4d42494e4154494f4e000000000000000000000000006044820152606401610b2c565b6120cd81356000612852565b6118ee5760405162461bcd60e51b815260206004820152600f60248201527f494e434f52524543545f56414c554500000000000000000000000000000000006044820152606401610b2c565b612121613ae8565b6000828152600260205260409020546001600160a01b03166121725760405162461bcd60e51b815260206004820152600a6024820152694e4f545f45584953545360b01b6044820152606401610b2c565b610c2c8261322f565b600f546000906112fc907b01000000000000000000000000000000000000000000000000000000900462ffffff166103e8613f33565b600f546000906112fc906901000000000000000000900462ffffff1662078d98613f33565b60006121e18261271b565b61222d5760405162461bcd60e51b815260206004820152601360248201527f494e56414c49445f434f4d42494e4154494f4e000000000000000000000000006044820152606401610b2c565b604080518335602082810191909152840135818301529083013560608281019190915283013560808281019190915283013560a08281019190915283013560c08281019190915283013560e0828101919091528301356101008201526000906101200160408051601f19818403018152918152815160209283012060009081526010909252902054159392505050565b6001600160a01b0383166123185761231381600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61233b565b816001600160a01b0316836001600160a01b03161461233b5761233b8382613329565b6001600160a01b03821661235257610f99816133c6565b826001600160a01b0316826001600160a01b031614610f9957610f998282613475565b60006001600160e01b031982167f780e9d63000000000000000000000000000000000000000000000000000000001480610c2c5750610c2c826134b9565b6000818152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03841690811790915581906123f58261194a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166124b85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610b2c565b60006124c38361194a565b9050806001600160a01b0316846001600160a01b031614806124fe5750836001600160a01b03166124f384610dc6565b6001600160a01b0316145b8061252e57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166125498261194a565b6001600160a01b0316146125c55760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610b2c565b6001600160a01b0382166126405760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610b2c565b61264b838383613554565b6126566000826123b3565b6001600160a01b038316600090815260036020526040812080546001929061267f90849061400f565b90915550506001600160a01b03821660009081526003602052604081208054600192906126ad908490613f57565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080612728833561355f565b90508080156127385750600d8335105b8015612748575060046020840135105b8015612758575060196040840135105b8015612768575060056060840135105b8015612778575060236080840135105b80156127885750600760a0840135105b80156127985750600160c0840135105b80156127a85750600460e0840135105b156127b65750600192915050565b801580156127c55750600d8335105b80156127d5575060046020840135105b80156127e5575060016040840135105b80156127f5575060056060840135105b80156128055750602c6080840135105b80156128155750600760a0840135105b80156128255750600660c0840135105b80156128355750600460e0840135105b156128435750600192915050565b50600092915050565b50919050565b600061285e8360081190565b1561286b57503415610c2c565b6128748361290f565b156128a1578161288e57670214e8348c4f0000341461289a565b6701aa535d3d0c000034145b9050610c2c565b6128aa83612924565b156128d357816128c35766b1a2bc2ec50000341461289a565b5034668e1bc9bf04000014610c2c565b6128dc83613573565b1561290757816128f6576703782dace9d90000341461289a565b50346702c68af0bb14000014610c2c565b506000610c2c565b600060088210158015610c2c575050600a1190565b6000600a8210158015610c2c575050600c1190565b3332146129885760405162461bcd60e51b815260206004820152600860248201527f4f4e4c595f454f410000000000000000000000000000000000000000000000006044820152606401610b2c565b600f546601000000000000900462ffffff166129e65760405162461bcd60e51b815260206004820152601360248201527f4e4f5f434c41494d535f415641494c41424c45000000000000000000000000006044820152606401610b2c565b60008281602002015190506000818460016020020151856002602002015186600360200201518760046020020151886005602002015189600660200201518a60076020020151604051602001612a74989796959493929190978852602088019690965260408701949094526060860192909252608085015260a084015260c083015260e08201526101000190565b60408051601f1981840301815291815281516020928301206000818152601090935291205490915015612ae95760405162461bcd60e51b815260206004820152600e60248201527f414c52454144595f4558495354530000000000000000000000000000000000006044820152606401610b2c565b612af38260081190565b15612b73573360009081526012602052604090205460ff1615612b585760405162461bcd60e51b815260206004820152601460248201527f494e56414c49445f48554d414e5f4d494e5445520000000000000000000000006044820152606401610b2c565b336000908152601260205260409020805460ff191660011790555b600f54600090612b95906601000000000000900462ffffff16620f4240613f33565b612ba0906001614026565b62ffffff169050612bb18360081190565b15612c2d57612bbf8361355f565b15612c0b57600f80546c01000000000000000000000000900462ffffff1690600c612be983614044565b91906101000a81548162ffffff021916908362ffffff16021790555050612d68565b600f80546901000000000000000000900462ffffff16906009612be983614044565b612c368361290f565b15612c9b57612c448361355f565b15612c7457600f80547201000000000000000000000000000000000000900462ffffff16906012612be983614044565b600f80546f01000000000000000000000000000000900462ffffff169080612be983614044565b612ca483612924565b15612d1657612cb28361355f565b15612ce857600f80547801000000000000000000000000000000000000000000000000900462ffffff16906018612be983614044565b600f80547501000000000000000000000000000000000000000000900462ffffff16906015612be983614044565b600f80547b01000000000000000000000000000000000000000000000000000000900462ffffff1690601b612d4a83614044565b91906101000a81548162ffffff021916908362ffffff160217905550505b600f80546601000000000000900462ffffff16906006612d8783614044565b825462ffffff91821661010093840a90810292021916179091556000848152601060209081526040918290208590558151928301825260ff87811684528982015116908301529091508101866002602002015160ff16815260200186600360088110612df557612df5613ebe565b602002015160ff16815260200186600460088110612e1557612e15613ebe565b602002015160ff16815260200186600560088110612e3557612e35613ebe565b602002015160ff16815260200186600660088110612e5557612e55613ebe565b602002015160ff16815260200186600760088110612e7557612e75613ebe565b6020908102919091015160ff9081169092526000848152601182526040908190208451815493860151928601516060870151608088015160a089015160c08a015160e0909a01518916670100000000000000027fffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff9a8a166601000000000000029a909a167fffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffff918a16650100000000000265ff000000000019938b1664010000000002939093167fffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff948b166301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff968c166201000002969096167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff998c16610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909b1697909b169690961798909817969096169790971791909117161793909317161791909117905561300e8482613588565b836001600160a01b0316817f885092d8762b8ab8b1c1704d518d67f575dd67b734ba8817d34c885e7e3964c8876040516130489190613e24565b60405180910390a35050505050565b816001600160a01b0316836001600160a01b031614156130b95760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b2c565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610f999084906136e3565b6131b1848484612536565b6131bd848484846137c8565b611d305760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610b2c565b613237613ae8565b60008281526011602090815260409182902082516101008082018552915460ff80821680845293820481169483019485526201000082048116958301959095526301000000810485166060830152640100000000810485166080830152650100000000008104851660a083015266010000000000008104851660c08301526701000000000000009004841660e08201529084529051909116826001602002015260408181015160ff9081169184019190915260608083015182169084015260808083015182169084015260a08083015182169084015260c08083015182169084015260e0918201511690820152919050565b60006001613336846119d5565b613340919061400f565b600083815260076020526040902054909150808214613393576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906133d89060019061400f565b6000838152600960205260408120546008805493945090928490811061340057613400613ebe565b90600052602060002001549050806008838154811061342157613421613ebe565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061345957613459614063565b6001900381819060005260206000200160009055905550505050565b6000613480836119d5565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061351c57506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610c2c57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610c2c565b610f998383836122bd565b600061356c600283614079565b1592915050565b6000600c8210158015610c2c575050600d1190565b6001600160a01b0382166135de5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b2c565b6000818152600260205260409020546001600160a01b0316156136435760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b2c565b61364f60008383613554565b6001600160a01b0382166000908152600360205260408120805460019290613678908490613f57565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000613738826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661394e9092919063ffffffff16565b805190915015610f995780806020019051810190613756919061408d565b610f995760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b2c565b60006001600160a01b0384163b15613943576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a02906138259033908990889088906004016140aa565b6020604051808303816000875af1925050508015613860575060408051601f3d908101601f1916820190925261385d918101906140e6565b60015b613910573d80801561388e576040519150601f19603f3d011682016040523d82523d6000602084013e613893565b606091505b5080516139085760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610b2c565b805181602001fd5b6001600160e01b0319167f150b7a020000000000000000000000000000000000000000000000000000000014905061252e565b506001949350505050565b606061395d8484600085613967565b90505b9392505050565b6060824710156139df5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b2c565b6001600160a01b0385163b613a365760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b2c565b600080866001600160a01b03168587604051613a529190614103565b60006040518083038185875af1925050503d8060008114613a8f576040519150601f19603f3d011682016040523d82523d6000602084013e613a94565b606091505b5091509150613aa4828286613aaf565b979650505050505050565b60608315613abe575081613960565b825115613ace5782518084602001fd5b8160405162461bcd60e51b8152600401610b2c9190613bc9565b6040518061010001604052806008906020820280368337509192915050565b80356001600160a01b0381168114613b1e57600080fd5b919050565b600060208284031215613b3557600080fd5b61396082613b07565b6001600160e01b03198116811461191f57600080fd5b600060208284031215613b6657600080fd5b813561396081613b3e565b60005b83811015613b8c578181015183820152602001613b74565b83811115611d305750506000910152565b60008151808452613bb5816020860160208601613b71565b601f01601f19169290920160200192915050565b6020815260006139606020830184613b9d565b600060208284031215613bee57600080fd5b5035919050565b60008060408385031215613c0857600080fd5b613c1183613b07565b946020939093013593505050565b801515811461191f57600080fd5b600060208284031215613c3f57600080fd5b813561396081613c1f565b6000610100808385031215613c5e57600080fd5b838184011115613c6d57600080fd5b509092915050565b600080600060608486031215613c8a57600080fd5b613c9384613b07565b9250613ca160208501613b07565b9150604084013590509250925092565b60008060408385031215613cc457600080fd5b50508035926020909101359150565b60008060408385031215613ce657600080fd5b613cef83613b07565b91506020830135613cff81613c1f565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613d4957613d49613d0a565b604052919050565b600067ffffffffffffffff821115613d6b57613d6b613d0a565b50601f01601f191660200190565b60008060008060808587031215613d8f57600080fd5b613d9885613b07565b9350613da660208601613b07565b925060408501359150606085013567ffffffffffffffff811115613dc957600080fd5b8501601f81018713613dda57600080fd5b8035613ded613de882613d51565b613d20565b818152886020838501011115613e0257600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b6101008101818360005b6008811015613e4d578151835260209283019290910190600101613e2e565b50505092915050565b60008060408385031215613e6957600080fd5b613e7283613b07565b9150613e8060208401613b07565b90509250929050565b600181811c90821680613e9d57607f821691505b6020821081141561284c57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613f0457613f04613ed4565b500290565b634e487b7160e01b600052601260045260246000fd5b600082613f2e57613f2e613f09565b500490565b600062ffffff83811690831681811015613f4f57613f4f613ed4565b039392505050565b60008219821115613f6a57613f6a613ed4565b500190565b600064ffffffffff808316818516808303821115613f8f57613f8f613ed4565b01949350505050565b600060208284031215613faa57600080fd5b815167ffffffffffffffff811115613fc157600080fd5b8201601f81018413613fd257600080fd5b8051613fe0613de882613d51565b818152856020838501011115613ff557600080fd5b614006826020830160208601613b71565b95945050505050565b60008282101561402157614021613ed4565b500390565b600062ffffff808316818516808303821115613f8f57613f8f613ed4565b600062ffffff82168061405957614059613ed4565b6000190192915050565b634e487b7160e01b600052603160045260246000fd5b60008261408857614088613f09565b500690565b60006020828403121561409f57600080fd5b815161396081613c1f565b60006001600160a01b038087168352808616602084015250836040830152608060608301526140dc6080830184613b9d565b9695505050505050565b6000602082840312156140f857600080fd5b815161396081613b3e565b60008251614115818460208701613b71565b919091019291505056fea26469706673582212202b731cdfee9ce9e9bacffec2c13aafc647231678bbf2ccecbdc7480fe212835d64736f6c634300080a00330000000000000000000000005f4019a1ee01d566d3168a0d21076e7cda5391d90000000000000000000000005f4019a1ee01d566d3168a0d21076e7cda5391d9000000000000000000000000397d9761b4b2dac9a061d89647ae6e50a97916e800000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000749f584ff934d1abee7c16003d6dff8fd64cf04100000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000001400000000000000000000000031aec3f4a6f465e6e662f10fa4487a1e8294a66900000000000000000000000031aec3f4a6f465e6e662f10fa4487a1e8294a66900000000000000000000000031aec3f4a6f465e6e662f10fa4487a1e8294a66900000000000000000000000031aec3f4a6f465e6e662f10fa4487a1e8294a66900000000000000000000000031aec3f4a6f465e6e662f10fa4487a1e8294a669000000000000000000000000c5d93a52252694266e2c681288954f0c1f2e4f89000000000000000000000000c5d93a52252694266e2c681288954f0c1f2e4f89000000000000000000000000c5d93a52252694266e2c681288954f0c1f2e4f89000000000000000000000000c5d93a52252694266e2c681288954f0c1f2e4f89000000000000000000000000c5d93a52252694266e2c681288954f0c1f2e4f890000000000000000000000003701e0e1434e129cb424b44f66ef8f32de4330050000000000000000000000003701e0e1434e129cb424b44f66ef8f32de4330050000000000000000000000003701e0e1434e129cb424b44f66ef8f32de4330050000000000000000000000003701e0e1434e129cb424b44f66ef8f32de4330050000000000000000000000003701e0e1434e129cb424b44f66ef8f32de43300500000000000000000000000095b9bbc3a8c0de0695d727c3b79b44f3721232c90000000000000000000000009717fa37a1296d241dbb17646beaaa719bec1d35000000000000000000000000943b71dd451daa8097bc2ad6d4afb7517cb4cf3f0000000000000000000000007fd931f9cee222289e7669270d55e9c9868070170000000000000000000000005f4019a1ee01d566d3168a0d21076e7cda5391d900000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000f00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000027000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000029000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003

Deployed Bytecode

0x6080604052600436106103ad5760003560e01c806395364a84116101e7578063c87b56dd1161010d578063dd6f34c3116100a0578063f4b2e3771161006f578063f4b2e37714610a76578063fa4496fa14610a8b578063fc19be1814610aa0578063fddd483714610ac057600080fd5b8063dd6f34c3146109d8578063e1dc0761146109eb578063e985e9c514610a18578063ee6106e314610a6157600080fd5b8063cf8d81bf116100dc578063cf8d81bf146105cf578063d793d8dc1461098e578063dbc5fd71146109ae578063dbd31b9b146109c357600080fd5b8063c87b56dd14610919578063c8c5353e14610939578063c8dc4f711461069f578063c9c05c251461097257600080fd5b8063a8c5b9e211610185578063b88d4fde11610154578063b88d4fde146108a2578063c1b8e4e1146108c2578063c63adb2b146108e3578063c6cdbcbb146108f957600080fd5b8063a8c5b9e2146106b5578063ab033ea91461084b578063ac85dca71461086b578063b0aa593d1461088b57600080fd5b8063a22cb465116101c1578063a22cb465146107de578063a3ebfdbe146107fe578063a51ee4071461081a578063a82524b21461082f57600080fd5b806395364a841461079457806395d89b41146107a95780639fbc8713146107be57600080fd5b806335d2b2ae116102d75780635557ba591161026a5780636352211e116102395780636352211e1461071457806370905dce1461073457806370a08231146107545780638dc251e31461077457600080fd5b80635557ba59146106b55780635573a623146106cc5780635aa6e675146106df578063602ddd8b146106ff57600080fd5b806348ab665b116102a657806348ab665b1461064e5780634a171a14146106695780634f6ccce71461067f578063520be0e81461069f57600080fd5b806335d2b2ae146105cf57806335da3394146105f957806341b5d0de1461061957806342842e0e1461062e57600080fd5b806312389cbe1161034f5780632a55205a1161031e5780632a55205a1461053b5780632e0d9f6b1461057a5780632f745c591461058f578063303e74df146105af57600080fd5b806312389cbe146104b857806318160ddd146104e65780631f72d831146104fb57806323b872dd1461051b57600080fd5b806306fdde031161038b57806306fdde031461041e578063081812fc14610440578063095ea7b3146104785780630ac62e021461049857600080fd5b806301b9a397146103b257806301ffc9a7146103d457806304c98b2b14610409575b600080fd5b3480156103be57600080fd5b506103d26103cd366004613b23565b610ae1565b005b3480156103e057600080fd5b506103f46103ef366004613b54565b610bee565b60405190151581526020015b60405180910390f35b34801561041557600080fd5b506103d2610c32565b34801561042a57600080fd5b50610433610d34565b6040516104009190613bc9565b34801561044c57600080fd5b5061046061045b366004613bdc565b610dc6565b6040516001600160a01b039091168152602001610400565b34801561048457600080fd5b506103d2610493366004613bf5565b610e6c565b3480156104a457600080fd5b506103d26104b3366004613c2d565b610f9e565b3480156104c457600080fd5b506104d86104d3366004613c4a565b611054565b604051908152602001610400565b3480156104f257600080fd5b506008546104d8565b34801561050757600080fd5b506103d2610516366004613bdc565b61112f565b34801561052757600080fd5b506103d2610536366004613c75565b6111c3565b34801561054757600080fd5b5061055b610556366004613cb1565b61124a565b604080516001600160a01b039093168352602083019190915201610400565b34801561058657600080fd5b506104d86112d2565b34801561059b57600080fd5b506104d86105aa366004613bf5565b611306565b3480156105bb57600080fd5b50600c54610460906001600160a01b031681565b3480156105db57600080fd5b506105e56105dc81565b60405162ffffff9091168152602001610400565b34801561060557600080fd5b506103d2610614366004613b23565b6113ae565b34801561062557600080fd5b506103d2611467565b34801561063a57600080fd5b506103d2610649366004613c75565b611577565b34801561065a57600080fd5b506104d866b1a2bc2ec5000081565b34801561067557600080fd5b506105e56103e881565b34801561068b57600080fd5b506104d861069a366004613bdc565b611592565b3480156106ab57600080fd5b506105e5610bb881565b3480156106c157600080fd5b506105e562078d9881565b6103d26106da366004613c4a565b611636565b3480156106eb57600080fd5b50600a54610460906001600160a01b031681565b34801561070b57600080fd5b506104d8611922565b34801561072057600080fd5b5061046061072f366004613bdc565b61194a565b34801561074057600080fd5b50600b54610460906001600160a01b031681565b34801561076057600080fd5b506104d861076f366004613b23565b6119d5565b34801561078057600080fd5b506103d261078f366004613b23565b611a6f565b3480156107a057600080fd5b506103f4611b1d565b3480156107b557600080fd5b50610433611b46565b3480156107ca57600080fd5b50600e54610460906001600160a01b031681565b3480156107ea57600080fd5b506103d26107f9366004613cd3565b611b55565b34801561080a57600080fd5b506104d8670214e8348c4f000081565b34801561082657600080fd5b506104d8611b64565b34801561083b57600080fd5b50600f5464ffffffffff166104d8565b34801561085757600080fd5b506103d2610866366004613b23565b611b97565b34801561087757600080fd5b506103d2610886366004613c75565b611c45565b34801561089757600080fd5b506105e5620f424081565b3480156108ae57600080fd5b506103d26108bd366004613d79565b611ca8565b3480156108ce57600080fd5b50600c546103f490600160a01b900460ff1681565b3480156108ef57600080fd5b506104d8600d5481565b34801561090557600080fd5b506103d2610914366004613bf5565b611d36565b34801561092557600080fd5b50610433610934366004613bdc565b611e70565b34801561094557600080fd5b506103f4610954366004613b23565b6001600160a01b031660009081526012602052604090205460ff1690565b34801561097e57600080fd5b506104d86703782dace9d9000081565b34801561099a57600080fd5b506103f46109a9366004613c4a565b611f3f565b3480156109ba57600080fd5b506104d8611f4a565b3480156109cf57600080fd5b506104d8611f7a565b6103d26109e6366004613c4a565b611fa7565b3480156109f757600080fd5b50610a0b610a06366004613bdc565b612119565b6040516104009190613e24565b348015610a2457600080fd5b506103f4610a33366004613e56565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610a6d57600080fd5b506104d861217b565b348015610a8257600080fd5b506104d86121b1565b348015610a9757600080fd5b506104d8600081565b348015610aac57600080fd5b506103f4610abb366004613c4a565b6121d6565b348015610acc57600080fd5b50600f5465010000000000900460ff166103f4565b600a546001600160a01b03163314610b355760405162461bcd60e51b81526020600482015260126024820152714f4e4c595f42595f474f5645524e414e434560701b60448201526064015b60405180910390fd5b600c54600160a01b900460ff1615610b8f5760405162461bcd60e51b815260206004820152601160248201527f44455343524950544f525f4c4f434b45440000000000000000000000000000006044820152606401610b2c565b600c80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f0b4633e1a5ef35d9f85b37127e7ab104f9f20c4e73f8ecb3662e56b6d01ff91590600090a35050565b60006001600160e01b031982167f2a55205a000000000000000000000000000000000000000000000000000000001480610c2c5750610c2c82612375565b92915050565b600a546001600160a01b03163314610c815760405162461bcd60e51b81526020600482015260126024820152714f4e4c595f42595f474f5645524e414e434560701b6044820152606401610b2c565b600f5464ffffffffff1615610cd85760405162461bcd60e51b815260206004820152601760248201527f50524553414c455f414c52454144595f535441525445440000000000000000006044820152606401610b2c565b600f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000164264ffffffffff161790556040517fefb7e4f585efb36e860cd765163862d1b8a52d76fa7e574edd08d982b51cd61190600090a1565b606060008054610d4390613e89565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6f90613e89565b8015610dbc5780601f10610d9157610100808354040283529160200191610dbc565b820191906000526020600020905b815481529060010190602001808311610d9f57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610e505760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610b2c565b506000908152600460205260409020546001600160a01b031690565b6000610e778261194a565b9050806001600160a01b0316836001600160a01b03161415610f015760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610b2c565b336001600160a01b0382161480610f1d5750610f1d8133610a33565b610f8f5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b2c565b610f9983836123b3565b505050565b600b546001600160a01b03163314610ff85760405162461bcd60e51b815260206004820152601760248201527f4f4e4c595f42595f454d455247454e43595f41444d494e0000000000000000006044820152606401610b2c565b600f8054821515650100000000000265ff0000000000199091161790556040517fcbe1b789cda412d9e1c647ed03d0c71e2f71484be36f9ca2b2a346b29edf1b709061104990831515815260200190565b60405180910390a150565b604080518235602082810191909152830135818301529082013560608281019190915282013560808281019190915282013560a08281019190915282013560c08281019190915282013560e08281019190915282013561010082015260009081906101200160408051601f1981840301815291815281516020928301206000818152601090935291205490915061111a5760405162461bcd60e51b815260206004820152600a6024820152694e4f545f45584953545360b01b6044820152606401610b2c565b60009081526010602052604090205492915050565b600a546001600160a01b0316331461117e5760405162461bcd60e51b81526020600482015260126024820152714f4e4c595f42595f474f5645524e414e434560701b6044820152606401610b2c565b600d80549082905560408051828152602081018490527fb7b16e3cfa4362e0f875e9a926d91f5e5573f73e1f6772c8d9b56fa14301f818910160405180910390a15050565b6111cd338261242e565b61123f5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610b2c565b610f99838383612536565b60008281526002602052604081205481906001600160a01b031661129d5760405162461bcd60e51b815260206004820152600a6024820152694e4f545f45584953545360b01b6044820152606401610b2c565b600e54600d546001600160a01b0390911690612710906112bd9086613eea565b6112c79190613f1f565b915091509250929050565b600f546000906112fc906f01000000000000000000000000000000900462ffffff166105dc613f33565b62ffffff16905090565b6000611311836119d5565b82106113855760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610b2c565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600b546001600160a01b031633146114085760405162461bcd60e51b815260206004820152601760248201527f4f4e4c595f42595f454d455247454e43595f41444d494e0000000000000000006044820152606401610b2c565b600b80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8a23c111263e77d29475540620a027de6c49a7927c3f36de78795cf71e65931590600090a35050565b600a546001600160a01b031633146114b65760405162461bcd60e51b81526020600482015260126024820152714f4e4c595f42595f474f5645524e414e434560701b6044820152606401610b2c565b600c54600160a01b900460ff16156115105760405162461bcd60e51b815260206004820152601160248201527f44455343524950544f525f4c4f434b45440000000000000000000000000000006044820152606401610b2c565b600c80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff8116600160a01b179091556040516001600160a01b03909116907fdf95f996a76c155818ca91fc8acf07233468b4d64d8a58d031aba0ae77425b9790600090a2565b610f9983838360405180602001604052806000815250611ca8565b600061159d60085490565b82106116115760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610b2c565b6008828154811061162457611624613ebe565b90600052602060002001549050919050565b600f5465010000000000900460ff16156116925760405162461bcd60e51b815260206004820152600d60248201527f434c41494d5f53544f50504544000000000000000000000000000000000000006044820152606401610b2c565b61169a611b1d565b80156116ae5750600f5464ffffffffff1615155b6116fa5760405162461bcd60e51b815260206004820152601260248201527f50524553414c455f4e4f545f41435449564500000000000000000000000000006044820152606401610b2c565b6117038161271b565b61174f5760405162461bcd60e51b815260206004820152601360248201527f494e56414c49445f434f4d42494e4154494f4e000000000000000000000000006044820152606401610b2c565b8035600811156117a15760405162461bcd60e51b815260206004820152601460248201527f48554d414e535f4e4f545f415641494c41424c450000000000000000000000006044820152606401610b2c565b6117ad81356001612852565b6117f95760405162461bcd60e51b815260206004820152600f60248201527f494e434f52524543545f56414c554500000000000000000000000000000000006044820152606401610b2c565b611803813561290f565b1561187657601f611812611f7a565b61181a6112d2565b6118249190613f57565b106118715760405162461bcd60e51b815260206004820152601360248201527f4e4f5f434c41494d535f415641494c41424c45000000000000000000000000006044820152606401610b2c565b6118ee565b6118808135612924565b1561189757601561188f611b64565b61181a611f4a565b60356118a161217b565b106118ee5760405162461bcd60e51b815260206004820152601360248201527f4e4f5f434c41494d535f415641494c41424c45000000000000000000000000006044820152606401610b2c565b6040805161010081810190925261191f91839060089083908390808284376000920191909152503391506129399050565b50565b600f546000906112fc906c01000000000000000000000000900462ffffff1662078d98613f33565b6000818152600260205260408120546001600160a01b031680610c2c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610b2c565b60006001600160a01b038216611a535760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610b2c565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314611abe5760405162461bcd60e51b81526020600482015260126024820152714f4e4c595f42595f474f5645524e414e434560701b6044820152606401610b2c565b600e80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907fc8f5d38942aec138f6ab6e1ccff96d5114329d3b33fa8d3fac47724c90590ec190600090a35050565b600f54600090611b379064ffffffffff1662093a80613f6f565b64ffffffffff16421115905090565b606060018054610d4390613e89565b611b60338383613057565b5050565b600f546000906112fc907801000000000000000000000000000000000000000000000000900462ffffff16610bb8613f33565b600a546001600160a01b03163314611be65760405162461bcd60e51b81526020600482015260126024820152714f4e4c595f42595f474f5645524e414e434560701b6044820152606401610b2c565b600a80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907fdccb90b244d54b3bb9e633ea2b02f93367526ac8a78357788764295d8949ee6490600090a35050565b600a546001600160a01b03163314611c945760405162461bcd60e51b81526020600482015260126024820152714f4e4c595f42595f474f5645524e414e434560701b6044820152606401610b2c565b610f996001600160a01b0384168383613126565b611cb2338361242e565b611d245760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610b2c565b611d30848484846131a6565b50505050565b600a546001600160a01b03163314611d855760405162461bcd60e51b81526020600482015260126024820152714f4e4c595f42595f474f5645524e414e434560701b6044820152606401610b2c565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611dd2576040519150601f19603f3d011682016040523d82523d6000602084013e611dd7565b606091505b5050905080611e285760405162461bcd60e51b815260206004820152600e60248201527f554e41424c455f544f5f50554c4c0000000000000000000000000000000000006044820152606401610b2c565b826001600160a01b03167f99a7b857d177a9f5962228b830aa679ade0f8465fbb4fef3a472a060c6d8f8e883604051611e6391815260200190565b60405180910390a2505050565b6000818152600260205260409020546060906001600160a01b0316611ec45760405162461bcd60e51b815260206004820152600a6024820152694e4f545f45584953545360b01b6044820152606401610b2c565b600c546001600160a01b03166334f4d1a9611ede8461322f565b6040518263ffffffff1660e01b8152600401611efa9190613e24565b600060405180830381865afa158015611f17573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c2c9190810190613f98565b6000610c2c8261271b565b600f546000906112fc907501000000000000000000000000000000000000000000900462ffffff16610bb8613f33565b600f546000906112fc907201000000000000000000000000000000000000900462ffffff166105dc613f33565b600f5465010000000000900460ff16156120035760405162461bcd60e51b815260206004820152600d60248201527f434c41494d5f53544f50504544000000000000000000000000000000000000006044820152606401610b2c565b61200b611b1d565b1580156120205750600f5464ffffffffff1615155b61206c5760405162461bcd60e51b815260206004820152600f60248201527f53414c455f4e4f545f41435449564500000000000000000000000000000000006044820152606401610b2c565b6120758161271b565b6120c15760405162461bcd60e51b815260206004820152601360248201527f494e56414c49445f434f4d42494e4154494f4e000000000000000000000000006044820152606401610b2c565b6120cd81356000612852565b6118ee5760405162461bcd60e51b815260206004820152600f60248201527f494e434f52524543545f56414c554500000000000000000000000000000000006044820152606401610b2c565b612121613ae8565b6000828152600260205260409020546001600160a01b03166121725760405162461bcd60e51b815260206004820152600a6024820152694e4f545f45584953545360b01b6044820152606401610b2c565b610c2c8261322f565b600f546000906112fc907b01000000000000000000000000000000000000000000000000000000900462ffffff166103e8613f33565b600f546000906112fc906901000000000000000000900462ffffff1662078d98613f33565b60006121e18261271b565b61222d5760405162461bcd60e51b815260206004820152601360248201527f494e56414c49445f434f4d42494e4154494f4e000000000000000000000000006044820152606401610b2c565b604080518335602082810191909152840135818301529083013560608281019190915283013560808281019190915283013560a08281019190915283013560c08281019190915283013560e0828101919091528301356101008201526000906101200160408051601f19818403018152918152815160209283012060009081526010909252902054159392505050565b6001600160a01b0383166123185761231381600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61233b565b816001600160a01b0316836001600160a01b03161461233b5761233b8382613329565b6001600160a01b03821661235257610f99816133c6565b826001600160a01b0316826001600160a01b031614610f9957610f998282613475565b60006001600160e01b031982167f780e9d63000000000000000000000000000000000000000000000000000000001480610c2c5750610c2c826134b9565b6000818152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03841690811790915581906123f58261194a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166124b85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610b2c565b60006124c38361194a565b9050806001600160a01b0316846001600160a01b031614806124fe5750836001600160a01b03166124f384610dc6565b6001600160a01b0316145b8061252e57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166125498261194a565b6001600160a01b0316146125c55760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610b2c565b6001600160a01b0382166126405760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610b2c565b61264b838383613554565b6126566000826123b3565b6001600160a01b038316600090815260036020526040812080546001929061267f90849061400f565b90915550506001600160a01b03821660009081526003602052604081208054600192906126ad908490613f57565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080612728833561355f565b90508080156127385750600d8335105b8015612748575060046020840135105b8015612758575060196040840135105b8015612768575060056060840135105b8015612778575060236080840135105b80156127885750600760a0840135105b80156127985750600160c0840135105b80156127a85750600460e0840135105b156127b65750600192915050565b801580156127c55750600d8335105b80156127d5575060046020840135105b80156127e5575060016040840135105b80156127f5575060056060840135105b80156128055750602c6080840135105b80156128155750600760a0840135105b80156128255750600660c0840135105b80156128355750600460e0840135105b156128435750600192915050565b50600092915050565b50919050565b600061285e8360081190565b1561286b57503415610c2c565b6128748361290f565b156128a1578161288e57670214e8348c4f0000341461289a565b6701aa535d3d0c000034145b9050610c2c565b6128aa83612924565b156128d357816128c35766b1a2bc2ec50000341461289a565b5034668e1bc9bf04000014610c2c565b6128dc83613573565b1561290757816128f6576703782dace9d90000341461289a565b50346702c68af0bb14000014610c2c565b506000610c2c565b600060088210158015610c2c575050600a1190565b6000600a8210158015610c2c575050600c1190565b3332146129885760405162461bcd60e51b815260206004820152600860248201527f4f4e4c595f454f410000000000000000000000000000000000000000000000006044820152606401610b2c565b600f546601000000000000900462ffffff166129e65760405162461bcd60e51b815260206004820152601360248201527f4e4f5f434c41494d535f415641494c41424c45000000000000000000000000006044820152606401610b2c565b60008281602002015190506000818460016020020151856002602002015186600360200201518760046020020151886005602002015189600660200201518a60076020020151604051602001612a74989796959493929190978852602088019690965260408701949094526060860192909252608085015260a084015260c083015260e08201526101000190565b60408051601f1981840301815291815281516020928301206000818152601090935291205490915015612ae95760405162461bcd60e51b815260206004820152600e60248201527f414c52454144595f4558495354530000000000000000000000000000000000006044820152606401610b2c565b612af38260081190565b15612b73573360009081526012602052604090205460ff1615612b585760405162461bcd60e51b815260206004820152601460248201527f494e56414c49445f48554d414e5f4d494e5445520000000000000000000000006044820152606401610b2c565b336000908152601260205260409020805460ff191660011790555b600f54600090612b95906601000000000000900462ffffff16620f4240613f33565b612ba0906001614026565b62ffffff169050612bb18360081190565b15612c2d57612bbf8361355f565b15612c0b57600f80546c01000000000000000000000000900462ffffff1690600c612be983614044565b91906101000a81548162ffffff021916908362ffffff16021790555050612d68565b600f80546901000000000000000000900462ffffff16906009612be983614044565b612c368361290f565b15612c9b57612c448361355f565b15612c7457600f80547201000000000000000000000000000000000000900462ffffff16906012612be983614044565b600f80546f01000000000000000000000000000000900462ffffff169080612be983614044565b612ca483612924565b15612d1657612cb28361355f565b15612ce857600f80547801000000000000000000000000000000000000000000000000900462ffffff16906018612be983614044565b600f80547501000000000000000000000000000000000000000000900462ffffff16906015612be983614044565b600f80547b01000000000000000000000000000000000000000000000000000000900462ffffff1690601b612d4a83614044565b91906101000a81548162ffffff021916908362ffffff160217905550505b600f80546601000000000000900462ffffff16906006612d8783614044565b825462ffffff91821661010093840a90810292021916179091556000848152601060209081526040918290208590558151928301825260ff87811684528982015116908301529091508101866002602002015160ff16815260200186600360088110612df557612df5613ebe565b602002015160ff16815260200186600460088110612e1557612e15613ebe565b602002015160ff16815260200186600560088110612e3557612e35613ebe565b602002015160ff16815260200186600660088110612e5557612e55613ebe565b602002015160ff16815260200186600760088110612e7557612e75613ebe565b6020908102919091015160ff9081169092526000848152601182526040908190208451815493860151928601516060870151608088015160a089015160c08a015160e0909a01518916670100000000000000027fffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff9a8a166601000000000000029a909a167fffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffff918a16650100000000000265ff000000000019938b1664010000000002939093167fffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff948b166301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff968c166201000002969096167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff998c16610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909b1697909b169690961798909817969096169790971791909117161793909317161791909117905561300e8482613588565b836001600160a01b0316817f885092d8762b8ab8b1c1704d518d67f575dd67b734ba8817d34c885e7e3964c8876040516130489190613e24565b60405180910390a35050505050565b816001600160a01b0316836001600160a01b031614156130b95760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b2c565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610f999084906136e3565b6131b1848484612536565b6131bd848484846137c8565b611d305760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610b2c565b613237613ae8565b60008281526011602090815260409182902082516101008082018552915460ff80821680845293820481169483019485526201000082048116958301959095526301000000810485166060830152640100000000810485166080830152650100000000008104851660a083015266010000000000008104851660c08301526701000000000000009004841660e08201529084529051909116826001602002015260408181015160ff9081169184019190915260608083015182169084015260808083015182169084015260a08083015182169084015260c08083015182169084015260e0918201511690820152919050565b60006001613336846119d5565b613340919061400f565b600083815260076020526040902054909150808214613393576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906133d89060019061400f565b6000838152600960205260408120546008805493945090928490811061340057613400613ebe565b90600052602060002001549050806008838154811061342157613421613ebe565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061345957613459614063565b6001900381819060005260206000200160009055905550505050565b6000613480836119d5565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061351c57506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610c2c57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610c2c565b610f998383836122bd565b600061356c600283614079565b1592915050565b6000600c8210158015610c2c575050600d1190565b6001600160a01b0382166135de5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b2c565b6000818152600260205260409020546001600160a01b0316156136435760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b2c565b61364f60008383613554565b6001600160a01b0382166000908152600360205260408120805460019290613678908490613f57565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000613738826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661394e9092919063ffffffff16565b805190915015610f995780806020019051810190613756919061408d565b610f995760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b2c565b60006001600160a01b0384163b15613943576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a02906138259033908990889088906004016140aa565b6020604051808303816000875af1925050508015613860575060408051601f3d908101601f1916820190925261385d918101906140e6565b60015b613910573d80801561388e576040519150601f19603f3d011682016040523d82523d6000602084013e613893565b606091505b5080516139085760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610b2c565b805181602001fd5b6001600160e01b0319167f150b7a020000000000000000000000000000000000000000000000000000000014905061252e565b506001949350505050565b606061395d8484600085613967565b90505b9392505050565b6060824710156139df5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b2c565b6001600160a01b0385163b613a365760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b2c565b600080866001600160a01b03168587604051613a529190614103565b60006040518083038185875af1925050503d8060008114613a8f576040519150601f19603f3d011682016040523d82523d6000602084013e613a94565b606091505b5091509150613aa4828286613aaf565b979650505050505050565b60608315613abe575081613960565b825115613ace5782518084602001fd5b8160405162461bcd60e51b8152600401610b2c9190613bc9565b6040518061010001604052806008906020820280368337509192915050565b80356001600160a01b0381168114613b1e57600080fd5b919050565b600060208284031215613b3557600080fd5b61396082613b07565b6001600160e01b03198116811461191f57600080fd5b600060208284031215613b6657600080fd5b813561396081613b3e565b60005b83811015613b8c578181015183820152602001613b74565b83811115611d305750506000910152565b60008151808452613bb5816020860160208601613b71565b601f01601f19169290920160200192915050565b6020815260006139606020830184613b9d565b600060208284031215613bee57600080fd5b5035919050565b60008060408385031215613c0857600080fd5b613c1183613b07565b946020939093013593505050565b801515811461191f57600080fd5b600060208284031215613c3f57600080fd5b813561396081613c1f565b6000610100808385031215613c5e57600080fd5b838184011115613c6d57600080fd5b509092915050565b600080600060608486031215613c8a57600080fd5b613c9384613b07565b9250613ca160208501613b07565b9150604084013590509250925092565b60008060408385031215613cc457600080fd5b50508035926020909101359150565b60008060408385031215613ce657600080fd5b613cef83613b07565b91506020830135613cff81613c1f565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613d4957613d49613d0a565b604052919050565b600067ffffffffffffffff821115613d6b57613d6b613d0a565b50601f01601f191660200190565b60008060008060808587031215613d8f57600080fd5b613d9885613b07565b9350613da660208601613b07565b925060408501359150606085013567ffffffffffffffff811115613dc957600080fd5b8501601f81018713613dda57600080fd5b8035613ded613de882613d51565b613d20565b818152886020838501011115613e0257600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b6101008101818360005b6008811015613e4d578151835260209283019290910190600101613e2e565b50505092915050565b60008060408385031215613e6957600080fd5b613e7283613b07565b9150613e8060208401613b07565b90509250929050565b600181811c90821680613e9d57607f821691505b6020821081141561284c57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613f0457613f04613ed4565b500290565b634e487b7160e01b600052601260045260246000fd5b600082613f2e57613f2e613f09565b500490565b600062ffffff83811690831681811015613f4f57613f4f613ed4565b039392505050565b60008219821115613f6a57613f6a613ed4565b500190565b600064ffffffffff808316818516808303821115613f8f57613f8f613ed4565b01949350505050565b600060208284031215613faa57600080fd5b815167ffffffffffffffff811115613fc157600080fd5b8201601f81018413613fd257600080fd5b8051613fe0613de882613d51565b818152856020838501011115613ff557600080fd5b614006826020830160208601613b71565b95945050505050565b60008282101561402157614021613ed4565b500390565b600062ffffff808316818516808303821115613f8f57613f8f613ed4565b600062ffffff82168061405957614059613ed4565b6000190192915050565b634e487b7160e01b600052603160045260246000fd5b60008261408857614088613f09565b500690565b60006020828403121561409f57600080fd5b815161396081613c1f565b60006001600160a01b038087168352808616602084015250836040830152608060608301526140dc6080830184613b9d565b9695505050505050565b6000602082840312156140f857600080fd5b815161396081613b3e565b60008251614115818460208701613b71565b919091019291505056fea26469706673582212202b731cdfee9ce9e9bacffec2c13aafc647231678bbf2ccecbdc7480fe212835d64736f6c634300080a0033

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

0000000000000000000000005f4019a1ee01d566d3168a0d21076e7cda5391d90000000000000000000000005f4019a1ee01d566d3168a0d21076e7cda5391d9000000000000000000000000397d9761b4b2dac9a061d89647ae6e50a97916e800000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000749f584ff934d1abee7c16003d6dff8fd64cf04100000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000001400000000000000000000000031aec3f4a6f465e6e662f10fa4487a1e8294a66900000000000000000000000031aec3f4a6f465e6e662f10fa4487a1e8294a66900000000000000000000000031aec3f4a6f465e6e662f10fa4487a1e8294a66900000000000000000000000031aec3f4a6f465e6e662f10fa4487a1e8294a66900000000000000000000000031aec3f4a6f465e6e662f10fa4487a1e8294a669000000000000000000000000c5d93a52252694266e2c681288954f0c1f2e4f89000000000000000000000000c5d93a52252694266e2c681288954f0c1f2e4f89000000000000000000000000c5d93a52252694266e2c681288954f0c1f2e4f89000000000000000000000000c5d93a52252694266e2c681288954f0c1f2e4f89000000000000000000000000c5d93a52252694266e2c681288954f0c1f2e4f890000000000000000000000003701e0e1434e129cb424b44f66ef8f32de4330050000000000000000000000003701e0e1434e129cb424b44f66ef8f32de4330050000000000000000000000003701e0e1434e129cb424b44f66ef8f32de4330050000000000000000000000003701e0e1434e129cb424b44f66ef8f32de4330050000000000000000000000003701e0e1434e129cb424b44f66ef8f32de43300500000000000000000000000095b9bbc3a8c0de0695d727c3b79b44f3721232c90000000000000000000000009717fa37a1296d241dbb17646beaaa719bec1d35000000000000000000000000943b71dd451daa8097bc2ad6d4afb7517cb4cf3f0000000000000000000000007fd931f9cee222289e7669270d55e9c9868070170000000000000000000000005f4019a1ee01d566d3168a0d21076e7cda5391d900000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000f00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000027000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000029000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003

-----Decoded View---------------
Arg [0] : governance_ (address): 0x5f4019a1Ee01D566d3168a0D21076E7CDa5391d9
Arg [1] : emergencyAdmin_ (address): 0x5f4019a1Ee01D566d3168a0D21076E7CDa5391d9
Arg [2] : descriptor_ (address): 0x397d9761b4B2DaC9A061d89647AE6e50A97916E8
Arg [3] : royaltyBps_ (uint256): 200
Arg [4] : royaltyReceiver_ (address): 0x749F584Ff934d1Abee7C16003d6DfF8fD64Cf041
Arg [5] : initialMintingRecipients_ (address[]): 0x31AeC3F4a6f465E6e662f10fA4487a1e8294A669,0x31AeC3F4a6f465E6e662f10fA4487a1e8294A669,0x31AeC3F4a6f465E6e662f10fA4487a1e8294A669,0x31AeC3F4a6f465E6e662f10fA4487a1e8294A669,0x31AeC3F4a6f465E6e662f10fA4487a1e8294A669,0xc5D93a52252694266E2C681288954f0C1f2E4f89,0xc5D93a52252694266E2C681288954f0C1f2E4f89,0xc5D93a52252694266E2C681288954f0C1f2E4f89,0xc5D93a52252694266E2C681288954f0C1f2E4f89,0xc5D93a52252694266E2C681288954f0C1f2E4f89,0x3701E0e1434E129cb424b44f66Ef8f32de433005,0x3701E0e1434E129cb424b44f66Ef8f32de433005,0x3701E0e1434E129cb424b44f66Ef8f32de433005,0x3701E0e1434E129cb424b44f66Ef8f32de433005,0x3701E0e1434E129cb424b44f66Ef8f32de433005,0x95b9bbC3A8c0dE0695d727c3B79b44f3721232c9,0x9717FA37a1296D241Dbb17646Beaaa719beC1D35,0x943B71Dd451dAA8097bC2aD6d4afb7517cB4Cf3f,0x7FD931F9cEe222289E7669270D55E9C986807017,0x5f4019a1Ee01D566d3168a0D21076E7CDa5391d9
Arg [6] : initialMintingCombinations_ (uint256[8][]): System.Collections.Generic.List`1[System.Numerics.BigInteger],System.Collections.Generic.List`1[System.Numerics.BigInteger],System.Collections.Generic.List`1[System.Numerics.BigInteger],System.Collections.Generic.List`1[System.Numerics.BigInteger],System.Collections.Generic.List`1[System.Numerics.BigInteger],System.Collections.Generic.List`1[System.Numerics.BigInteger],System.Collections.Generic.List`1[System.Numerics.BigInteger],System.Collections.Generic.List`1[System.Numerics.BigInteger],System.Collections.Generic.List`1[System.Numerics.BigInteger],System.Collections.Generic.List`1[System.Numerics.BigInteger],System.Collections.Generic.List`1[System.Numerics.BigInteger],System.Collections.Generic.List`1[System.Numerics.BigInteger],System.Collections.Generic.List`1[System.Numerics.BigInteger],System.Collections.Generic.List`1[System.Numerics.BigInteger],System.Collections.Generic.List`1[System.Numerics.BigInteger],System.Collections.Generic.List`1[System.Numerics.BigInteger],System.Collections.Generic.List`1[System.Numerics.BigInteger],System.Collections.Generic.List`1[System.Numerics.BigInteger],System.Collections.Generic.List`1[System.Numerics.BigInteger],System.Collections.Generic.List`1[System.Numerics.BigInteger]

-----Encoded View---------------
189 Constructor Arguments found :
Arg [0] : 0000000000000000000000005f4019a1ee01d566d3168a0d21076e7cda5391d9
Arg [1] : 0000000000000000000000005f4019a1ee01d566d3168a0d21076e7cda5391d9
Arg [2] : 000000000000000000000000397d9761b4b2dac9a061d89647ae6e50a97916e8
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [4] : 000000000000000000000000749f584ff934d1abee7c16003d6dff8fd64cf041
Arg [5] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000380
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [8] : 00000000000000000000000031aec3f4a6f465e6e662f10fa4487a1e8294a669
Arg [9] : 00000000000000000000000031aec3f4a6f465e6e662f10fa4487a1e8294a669
Arg [10] : 00000000000000000000000031aec3f4a6f465e6e662f10fa4487a1e8294a669
Arg [11] : 00000000000000000000000031aec3f4a6f465e6e662f10fa4487a1e8294a669
Arg [12] : 00000000000000000000000031aec3f4a6f465e6e662f10fa4487a1e8294a669
Arg [13] : 000000000000000000000000c5d93a52252694266e2c681288954f0c1f2e4f89
Arg [14] : 000000000000000000000000c5d93a52252694266e2c681288954f0c1f2e4f89
Arg [15] : 000000000000000000000000c5d93a52252694266e2c681288954f0c1f2e4f89
Arg [16] : 000000000000000000000000c5d93a52252694266e2c681288954f0c1f2e4f89
Arg [17] : 000000000000000000000000c5d93a52252694266e2c681288954f0c1f2e4f89
Arg [18] : 0000000000000000000000003701e0e1434e129cb424b44f66ef8f32de433005
Arg [19] : 0000000000000000000000003701e0e1434e129cb424b44f66ef8f32de433005
Arg [20] : 0000000000000000000000003701e0e1434e129cb424b44f66ef8f32de433005
Arg [21] : 0000000000000000000000003701e0e1434e129cb424b44f66ef8f32de433005
Arg [22] : 0000000000000000000000003701e0e1434e129cb424b44f66ef8f32de433005
Arg [23] : 00000000000000000000000095b9bbc3a8c0de0695d727c3b79b44f3721232c9
Arg [24] : 0000000000000000000000009717fa37a1296d241dbb17646beaaa719bec1d35
Arg [25] : 000000000000000000000000943b71dd451daa8097bc2ad6d4afb7517cb4cf3f
Arg [26] : 0000000000000000000000007fd931f9cee222289e7669270d55e9c986807017
Arg [27] : 0000000000000000000000005f4019a1ee01d566d3168a0d21076e7cda5391d9
Arg [28] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [29] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [30] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [31] : 0000000000000000000000000000000000000000000000000000000000000010
Arg [32] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [33] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [34] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [35] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [36] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [37] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [38] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [39] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [40] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [41] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [42] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [43] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [44] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [45] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [46] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [47] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [48] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [49] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [50] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [51] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [52] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [53] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [54] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [55] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [56] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [57] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [58] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [59] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [60] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [61] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [62] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [63] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [64] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [65] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [66] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [67] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [68] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [69] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [70] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [71] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [72] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [73] : 0000000000000000000000000000000000000000000000000000000000000022
Arg [74] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [75] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [76] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [77] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [78] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [79] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [80] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [81] : 0000000000000000000000000000000000000000000000000000000000000016
Arg [82] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [83] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [84] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [85] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [86] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [87] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [88] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [89] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [90] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [91] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [92] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [93] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [94] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [95] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [96] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [97] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [98] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [99] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [100] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [101] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [102] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [103] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [104] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [105] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [106] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [107] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [108] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [109] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [110] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [111] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [112] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [113] : 0000000000000000000000000000000000000000000000000000000000000017
Arg [114] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [115] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [116] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [117] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [118] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [119] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [120] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [121] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [122] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [123] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [124] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [125] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [126] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [127] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [128] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [129] : 0000000000000000000000000000000000000000000000000000000000000018
Arg [130] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [131] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [132] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [133] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [134] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [135] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [136] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [137] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [138] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [139] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [140] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [141] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [142] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [143] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [144] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [145] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [146] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [147] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [148] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [149] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [150] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [151] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [152] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [153] : 0000000000000000000000000000000000000000000000000000000000000010
Arg [154] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [155] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [156] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [157] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [158] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [159] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [160] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [161] : 000000000000000000000000000000000000000000000000000000000000001f
Arg [162] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [163] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [164] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [165] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [166] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [167] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [168] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [169] : 0000000000000000000000000000000000000000000000000000000000000027
Arg [170] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [171] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [172] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [173] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [174] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [175] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [176] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [177] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [178] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [179] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [180] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [181] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [182] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [183] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [184] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [185] : 0000000000000000000000000000000000000000000000000000000000000029
Arg [186] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [187] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [188] : 0000000000000000000000000000000000000000000000000000000000000003


Deployed Bytecode Sourcemap

8006:26453:14:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23320:251;;;;;;;;;;-1:-1:-1;23320:251:14;;;;;:::i;:::-;;:::i;:::-;;21346:239;;;;;;;;;;-1:-1:-1;21346:239:14;;;;;:::i;:::-;;:::i;:::-;;;1003:14:16;;996:22;978:41;;966:2;951:18;21346:239:14;;;;;;;;21673:199;;;;;;;;;;;;;:::i;2408:98:3:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3919:217::-;;;;;;;;;;-1:-1:-1;3919:217:3;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2189:55:16;;;2171:74;;2159:2;2144:18;3919:217:3;2025:226:16;3457:401:3;;;;;;;;;;-1:-1:-1;3457:401:3;;;;;:::i;:::-;;:::i;24898:191:14:-;;;;;;;;;;-1:-1:-1;24898:191:14;;;;;:::i;:::-;;:::i;16507:518::-;;;;;;;;;;-1:-1:-1;16507:518:14;;;;;:::i;:::-;;:::i;:::-;;;3308:25:16;;;3296:2;3281:18;16507:518:14;3162:177:16;1614:111:4;;;;;;;;;;-1:-1:-1;1701:10:4;:17;1614:111;;24072:205:14;;;;;;;;;;-1:-1:-1;24072:205:14;;;;;:::i;:::-;;:::i;4646:330:3:-;;;;;;;;;;-1:-1:-1;4646:330:3;;;;;:::i;:::-;;:::i;20898:249:14:-;;;;;;;;;;-1:-1:-1;20898:249:14;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4122:55:16;;;4104:74;;4209:2;4194:18;;4187:34;;;;4077:18;20898:249:14;3930:297:16;19120:145:14;;;;;;;;;;;;;:::i;1290:253:4:-;;;;;;;;;;-1:-1:-1;1290:253:4;;;;;:::i;:::-;;:::i;10420:29:14:-;;;;;;;;;;-1:-1:-1;10420:29:14;;;;-1:-1:-1;;;;;10420:29:14;;;9149:68;;;;;;;;;;;;9213:4;9149:68;;;;;4657:8:16;4645:21;;;4627:40;;4615:2;4600:18;9149:68:14;4483:190:16;25261:297:14;;;;;;;;;;-1:-1:-1;25261:297:14;;;;;:::i;:::-;;:::i;23718:157::-;;;;;;;;;;;;;:::i;5042:179:3:-;;;;;;;;;;-1:-1:-1;5042:179:3;;;;;:::i;:::-;;:::i;8240:57:14:-;;;;;;;;;;;;8287:10;8240:57;;9367;;;;;;;;;;;;9420:4;9367:57;;1797:230:4;;;;;;;;;;-1:-1:-1;1797:230:4;;;;;:::i;:::-;;:::i;9293:70:14:-;;;;;;;;;;;;9359:4;9293:70;;9007:68;;;;;;;;;;;;9069:6;9007:68;;13812:966;;;;;;:::i;:::-;;:::i;10341:25::-;;;;;;;;;;-1:-1:-1;10341:25:14;;;;-1:-1:-1;;;;;10341:25:14;;;18863:133;;;;;;;;;;;;;:::i;2111:235:3:-;;;;;;;;;;-1:-1:-1;2111:235:3;;;;;:::i;:::-;;:::i;10370:29:14:-;;;;;;;;;;-1:-1:-1;10370:29:14;;;;-1:-1:-1;;;;;10370:29:14;;;1849:205:3;;;;;;;;;;-1:-1:-1;1849:205:3;;;;;:::i;:::-;;:::i;24439:250:14:-;;;;;;;;;;-1:-1:-1;24439:250:14;;;;;:::i;:::-;;:::i;16006:116::-;;;;;;;;;;;;;:::i;2570:102:3:-;;;;;;;;;;;;;:::i;10532:30:14:-;;;;;;;;;;-1:-1:-1;10532:30:14;;;;-1:-1:-1;;;;;10532:30:14;;;4203:153:3;;;;;;;;;;-1:-1:-1;4203:153:3;;;;;:::i;:::-;;:::i;8181:55:14:-;;;;;;;;;;;;8226:10;8181:55;;19927:145;;;;;;;;;;;;;:::i;20428:108::-;;;;;;;;;;-1:-1:-1;20509:4:14;:21;;;20428:108;;22932:205;;;;;;;;;;-1:-1:-1;22932:205:14;;;;;:::i;:::-;;:::i;22613:166::-;;;;;;;;;;-1:-1:-1;22613:166:14;;;;;:::i;:::-;;:::i;8880:53::-;;;;;;;;;;;;8926:7;8880:53;;5287:320:3;;;;;;;;;;-1:-1:-1;5287:320:3;;;;;:::i;:::-;;:::i;10453:30:14:-;;;;;;;;;;-1:-1:-1;10453:30:14;;;;-1:-1:-1;;;10453:30:14;;;;;;10503:25;;;;;;;;;;;;;;;;22097:226;;;;;;;;;;-1:-1:-1;22097:226:14;;;;;:::i;:::-;;:::i;17981:191::-;;;;;;;;;;-1:-1:-1;17981:191:14;;;;;:::i;:::-;;:::i;18382:106::-;;;;;;;;;;-1:-1:-1;18382:106:14;;;;;:::i;:::-;-1:-1:-1;;;;;18462:21:14;18443:4;18462:21;;;:15;:21;;;;;;;;;18382:106;8301:51;;;;;;;;;;;;8342:10;8301:51;;15723:131;;;;;;;;;;-1:-1:-1;15723:131:14;;;;;:::i;:::-;;:::i;19652:151::-;;;;;;;;;;;;;:::i;19385:139::-;;;;;;;;;;;;;:::i;13321:350::-;;;;;;:::i;:::-;;:::i;17163:160::-;;;;;;;;;;-1:-1:-1;17163:160:14;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;4422:162:3:-;;;;;;;;;;-1:-1:-1;4422:162:3;;;;;:::i;:::-;-1:-1:-1;;;;;4542:25:3;;;4519:4;4542:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4422:162;20174:114:14;;;;;;;;;;;;;:::i;18608:139::-;;;;;;;;;;;;;:::i;8127:50::-;;;;;;;;;;;;8170:7;8127:50;;14984:529;;;;;;;;;;-1:-1:-1;14984:529:14;;;;;:::i;:::-;;:::i;16273:91::-;;;;;;;;;;-1:-1:-1;16345:4:14;:14;;;;;;16273:91;;23320:251;32054:10;;-1:-1:-1;;;;;32054:10:14;32040;:24;32032:55;;;;-1:-1:-1;;;32032:55:14;;7636:2:16;32032:55:14;;;7618:21:16;7675:2;7655:18;;;7648:30;-1:-1:-1;;;7694:18:16;;;7687:48;7752:18;;32032:55:14;;;;;;;;;31854:18:::1;::::0;-1:-1:-1;;;31854:18:14;::::1;;;31853:19;31845:49;;;::::0;-1:-1:-1;;;31845:49:14;;7983:2:16;31845:49:14::1;::::0;::::1;7965:21:16::0;8022:2;8002:18;;;7995:30;8061:19;8041:18;;;8034:47;8098:18;;31845:49:14::1;7781:341:16::0;31845:49:14::1;23452:10:::2;::::0;;-1:-1:-1;;;;;23469:39:14;;::::2;-1:-1:-1::0;;23469:39:14;::::2;::::0;::::2;::::0;;;23520:46:::2;::::0;23452:10;::::2;::::0;23469:39;23452:10;;23520:46:::2;::::0;23420:21:::2;::::0;23520:46:::2;23414:157;23320:251:::0;:::o;21346:239::-;21478:4;-1:-1:-1;;;;;;21499:41:14;;21514:26;21499:41;;:81;;;21544:36;21568:11;21544:23;:36::i;:::-;21492:88;21346:239;-1:-1:-1;;21346:239:14:o;21673:199::-;32054:10;;-1:-1:-1;;;;;32054:10:14;32040;:24;32032:55;;;;-1:-1:-1;;;32032:55:14;;7636:2:16;32032:55:14;;;7618:21:16;7675:2;7655:18;;;7648:30;-1:-1:-1;;;7694:18:16;;;7687:48;7752:18;;32032:55:14;7434:342:16;32032:55:14;21735:4:::1;:21:::0;::::1;;:26:::0;21727:62:::1;;;::::0;-1:-1:-1;;;21727:62:14;;8329:2:16;21727:62:14::1;::::0;::::1;8311:21:16::0;8368:2;8348:18;;;8341:30;8407:25;8387:18;;;8380:53;8450:18;;21727:62:14::1;8127:347:16::0;21727:62:14::1;21795:4;:47:::0;;;::::1;21826:15;21795:47;;;::::0;;21853:14:::1;::::0;::::1;::::0;-1:-1:-1;;21853:14:14::1;21673:199::o:0;2408:98:3:-;2462:13;2494:5;2487:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2408:98;:::o;3919:217::-;3995:7;7167:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7167:16:3;4014:73;;;;-1:-1:-1;;;4014:73:3;;9123:2:16;4014:73:3;;;9105:21:16;9162:2;9142:18;;;9135:30;9201:34;9181:18;;;9174:62;9272:14;9252:18;;;9245:42;9304:19;;4014:73:3;8921:408:16;4014:73:3;-1:-1:-1;4105:24:3;;;;:15;:24;;;;;;-1:-1:-1;;;;;4105:24:3;;3919:217::o;3457:401::-;3537:13;3553:23;3568:7;3553:14;:23::i;:::-;3537:39;;3600:5;-1:-1:-1;;;;;3594:11:3;:2;-1:-1:-1;;;;;3594:11:3;;;3586:57;;;;-1:-1:-1;;;3586:57:3;;9536:2:16;3586:57:3;;;9518:21:16;9575:2;9555:18;;;9548:30;9614:34;9594:18;;;9587:62;9685:3;9665:18;;;9658:31;9706:19;;3586:57:3;9334:397:16;3586:57:3;719:10:1;-1:-1:-1;;;;;3675:21:3;;;;:62;;-1:-1:-1;3700:37:3;3717:5;719:10:1;4422:162:3;:::i;3700:37::-;3654:165;;;;-1:-1:-1;;;3654:165:3;;9938:2:16;3654:165:3;;;9920:21:16;9977:2;9957:18;;;9950:30;10016:34;9996:18;;;9989:62;10087:26;10067:18;;;10060:54;10131:19;;3654:165:3;9736:420:16;3654:165:3;3830:21;3839:2;3843:7;3830:8;:21::i;:::-;3527:331;3457:401;;:::o;24898:191:14:-;24974:14;;-1:-1:-1;;;;;24974:14:14;24960:10;:28;24952:64;;;;-1:-1:-1;;;24952:64:14;;10363:2:16;24952:64:14;;;10345:21:16;10402:2;10382:18;;;10375:30;10441:25;10421:18;;;10414:53;10484:18;;24952:64:14;10161:347:16;24952:64:14;25022:4;:26;;;;;;;-1:-1:-1;;25022:26:14;;;;;;25060:24;;;;;;25039:9;1003:14:16;996:22;978:41;;966:2;951:18;;838:187;25060:24:14;;;;;;;;24898:191;:::o;16507:518::-;16722:9;16638:259;;16664:9;;;16638:259;;;11027:19:16;;;;16691:9:14;;;11062:12:16;;;11055:28;16722:9:14;;;;16751;11099:12:16;;;11092:28;;;;16751:9:14;;;16781;11136:12:16;;;11129:28;;;;16781:9:14;;;16808;11173:13:16;;;11166:29;;;;16808:9:14;;;16838;11211:13:16;;;11204:29;;;;16838:9:14;;;16869;11249:13:16;;;11242:29;;;;16869:9:14;;;11287:13:16;;;11280:29;16578:7:14;;;;11325:13:16;;16638:259:14;;;-1:-1:-1;;16638:259:14;;;;;;;;;16621:282;;16638:259;16621:282;;;;16917:35;;;;:16;:35;;;;;;16621:282;;-1:-1:-1;16909:63:14;;;;-1:-1:-1;;;16909:63:14;;11551:2:16;16909:63:14;;;11533:21:16;11590:2;11570:18;;;11563:30;-1:-1:-1;;;11609:18:16;;;11602:40;11659:18;;16909:63:14;11349:334:16;16909:63:14;16985:35;;;;:16;:35;;;;;;;16507:518;-1:-1:-1;;16507:518:14:o;24072:205::-;32054:10;;-1:-1:-1;;;;;32054:10:14;32040;:24;32032:55;;;;-1:-1:-1;;;32032:55:14;;7636:2:16;32032:55:14;;;7618:21:16;7675:2;7655:18;;;7648:30;-1:-1:-1;;;7694:18:16;;;7687:48;7752:18;;32032:55:14;7434:342:16;32032:55:14;24172:10:::1;::::0;;24188:26;;;;24226:46:::1;::::0;;11862:25:16;;;11918:2;11903:18;;11896:34;;;24226:46:14::1;::::0;11835:18:16;24226:46:14::1;;;;;;;24142:135;24072:205:::0;:::o;4646:330:3:-;4835:41;719:10:1;4868:7:3;4835:18;:41::i;:::-;4827:103;;;;-1:-1:-1;;;4827:103:3;;12143:2:16;4827:103:3;;;12125:21:16;12182:2;12162:18;;;12155:30;12221:34;12201:18;;;12194:62;12292:19;12272:18;;;12265:47;12329:19;;4827:103:3;11941:413:16;4827:103:3;4941:28;4951:4;4957:2;4961:7;4941:9;:28::i;20898:249:14:-;21013:7;7167:16:3;;;:7;:16;;;;;;21013:7:14;;-1:-1:-1;;;;;7167:16:3;21039:39:14;;;;-1:-1:-1;;;21039:39:14;;11551:2:16;21039:39:14;;;11533:21:16;11590:2;11570:18;;;11563:30;-1:-1:-1;;;11609:18:16;;;11602:40;11659:18;;21039:39:14;11349:334:16;21039:39:14;21092:15;;21122:10;;-1:-1:-1;;;;;21092:15:14;;;;21136:5;;21110:22;;:9;:22;:::i;:::-;21109:32;;;;:::i;:::-;21084:58;;;;20898:249;;;;;:::o;19120:145::-;19241:4;:19;19178:7;;19200:60;;19241:19;;;;;9213:4;19200:60;:::i;:::-;19193:67;;;;19120:145;:::o;1290:253:4:-;1387:7;1422:23;1439:5;1422:16;:23::i;:::-;1414:5;:31;1406:87;;;;-1:-1:-1;;;1406:87:4;;13521:2:16;1406:87:4;;;13503:21:16;13560:2;13540:18;;;13533:30;13599:34;13579:18;;;13572:62;13670:13;13650:18;;;13643:41;13701:19;;1406:87:4;13319:407:16;1406:87:4;-1:-1:-1;;;;;;1510:19:4;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1290:253::o;25261:297:14:-;25352:14;;-1:-1:-1;;;;;25352:14:14;25338:10;:28;25330:64;;;;-1:-1:-1;;;25330:64:14;;10363:2:16;25330:64:14;;;10345:21:16;10402:2;10382:18;;;10375:30;10441:25;10421:18;;;10414:53;10484:18;;25330:64:14;10161:347:16;25330:64:14;25429:14;;;-1:-1:-1;;;;;25449:34:14;;;-1:-1:-1;;25449:34:14;;;;;;;25495:58;;25429:14;;;25449:34;25429:14;;25495:58;;25401:25;;25495:58;25324:234;25261:297;:::o;23718:157::-;32054:10;;-1:-1:-1;;;;;32054:10:14;32040;:24;32032:55;;;;-1:-1:-1;;;32032:55:14;;7636:2:16;32032:55:14;;;7618:21:16;7675:2;7655:18;;;7648:30;-1:-1:-1;;;7694:18:16;;;7687:48;7752:18;;32032:55:14;7434:342:16;32032:55:14;31854:18:::1;::::0;-1:-1:-1;;;31854:18:14;::::1;;;31853:19;31845:49;;;::::0;-1:-1:-1;;;31845:49:14;;7983:2:16;31845:49:14::1;::::0;::::1;7965:21:16::0;8022:2;8002:18;;;7995:30;8061:19;8041:18;;;8034:47;8098:18;;31845:49:14::1;7781:341:16::0;31845:49:14::1;23798:18:::2;:25:::0;;;;::::2;-1:-1:-1::0;;;23798:25:14::2;::::0;;;23835:35:::2;::::0;-1:-1:-1;;;;;23858:10:14;;;;23835:35:::2;::::0;23798:25;;23835:35:::2;23718:157::o:0;5042:179:3:-;5175:39;5192:4;5198:2;5202:7;5175:39;;;;;;;;;;;;:16;:39::i;1797:230:4:-;1872:7;1907:30;1701:10;:17;;1614:111;1907:30;1899:5;:38;1891:95;;;;-1:-1:-1;;;1891:95:4;;13933:2:16;1891:95:4;;;13915:21:16;13972:2;13952:18;;;13945:30;14011:34;13991:18;;;13984:62;14082:14;14062:18;;;14055:42;14114:19;;1891:95:4;13731:408:16;1891:95:4;2003:10;2014:5;2003:17;;;;;;;;:::i;:::-;;;;;;;;;1996:24;;1797:230;;;:::o;13812:966:14:-;13894:4;:14;;;;;;13893:15;13885:41;;;;-1:-1:-1;;;13885:41:14;;14346:2:16;13885:41:14;;;14328:21:16;14385:2;14365:18;;;14358:30;14424:15;14404:18;;;14397:43;14457:18;;13885:41:14;14144:337:16;13885:41:14;13940:11;:9;:11::i;:::-;:41;;;;-1:-1:-1;13955:4:14;:21;;;:26;;13940:41;13932:72;;;;-1:-1:-1;;;13932:72:14;;14688:2:16;13932:72:14;;;14670:21:16;14727:2;14707:18;;;14700:30;14766:20;14746:18;;;14739:48;14804:18;;13932:72:14;14486:342:16;13932:72:14;14018:28;14039:6;14018:20;:28::i;:::-;14010:60;;;;-1:-1:-1;;;14010:60:14;;15035:2:16;14010:60:14;;;15017:21:16;15074:2;15054:18;;;15047:30;15113:21;15093:18;;;15086:49;15152:18;;14010:60:14;14833:343:16;14010:60:14;14096:9;;10135:1;-1:-1:-1;14084:22:14;14076:55;;;;-1:-1:-1;;;14076:55:14;;15383:2:16;14076:55:14;;;15365:21:16;15422:2;15402:18;;;15395:30;15461:22;15441:18;;;15434:50;15501:18;;14076:55:14;15181:344:16;14076:55:14;14145:28;14157:9;;14168:4;14145:11;:28::i;:::-;14137:56;;;;-1:-1:-1;;;14137:56:14;;15732:2:16;14137:56:14;;;15714:21:16;15771:2;15751:18;;;15744:30;15810:17;15790:18;;;15783:45;15845:18;;14137:56:14;15530:339:16;14137:56:14;14246:23;14259:9;;14246:12;:23::i;:::-;14242:499;;;8705:2;14326:25;:23;:25::i;:::-;14296:27;:25;:27::i;:::-;:55;;;;:::i;:::-;:88;14279:144;;;;-1:-1:-1;;;14279:144:14;;16209:2:16;14279:144:14;;;16191:21:16;16248:2;16228:18;;;16221:30;16287:21;16267:18;;;16260:49;16326:18;;14279:144:14;16007:343:16;14279:144:14;14242:499;;;14440:25;14455:9;;14440:14;:25::i;:::-;14436:305;;;8770:2;14524:27;:25;:27::i;:::-;14492:29;:27;:29::i;14436:305::-;8829:2;14664:17;:15;:17::i;:::-;:46;14656:78;;;;-1:-1:-1;;;14656:78:14;;16209:2:16;14656:78:14;;;16191:21:16;16248:2;16228:18;;;16221:30;16287:21;16267:18;;;16260:49;16326:18;;14656:78:14;16007:343:16;14656:78:14;14747:26;;;;;;;;;;;;14754:6;;14747:26;;;;14754:6;;14747:26;14754:6;14747:26;;;;;;;;;-1:-1:-1;14762:10:14;;-1:-1:-1;14747:6:14;;-1:-1:-1;14747:26:14:i;:::-;13812:966;:::o;18863:133::-;18976:4;:15;18917:7;;18939:52;;18976:15;;;;;8997:6;18939:52;:::i;2111:235:3:-;2183:7;2218:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2218:16:3;2252:19;2244:73;;;;-1:-1:-1;;;2244:73:3;;16557:2:16;2244:73:3;;;16539:21:16;16596:2;16576:18;;;16569:30;16635:34;16615:18;;;16608:62;16706:11;16686:18;;;16679:39;16735:19;;2244:73:3;16355:405:16;1849:205:3;1921:7;-1:-1:-1;;;;;1948:19:3;;1940:74;;;;-1:-1:-1;;;1940:74:3;;16967:2:16;1940:74:3;;;16949:21:16;17006:2;16986:18;;;16979:30;17045:34;17025:18;;;17018:62;17116:12;17096:18;;;17089:40;17146:19;;1940:74:3;16765:406:16;1940:74:3;-1:-1:-1;;;;;;2031:16:3;;;;;:9;:16;;;;;;;1849:205::o;24439:250:14:-;32054:10;;-1:-1:-1;;;;;32054:10:14;32040;:24;32032:55;;;;-1:-1:-1;;;32032:55:14;;7636:2:16;32032:55:14;;;7618:21:16;7675:2;7655:18;;;7648:30;-1:-1:-1;;;7694:18:16;;;7687:48;7752:18;;32032:55:14;7434:342:16;32032:55:14;24554:15:::1;::::0;;-1:-1:-1;;;;;24575:36:14;;::::1;-1:-1:-1::0;;24575:36:14;::::1;::::0;::::1;::::0;;;24623:61:::1;::::0;24554:15;::::1;::::0;24575:36;24554:15;;24623:61:::1;::::0;24525:26:::1;::::0;24623:61:::1;24519:170;24439:250:::0;:::o;16006:116::-;16086:4;:21;16048:4;;16086:31;;:21;;16110:7;16086:31;:::i;:::-;16067:50;;:15;:50;;16060:57;;16006:116;:::o;2570:102:3:-;2626:13;2658:7;2651:14;;;;;:::i;4203:153::-;4297:52;719:10:1;4330:8:3;4340;4297:18;:52::i;:::-;4203:153;;:::o;19927:145:14:-;20048:4;:19;19985:7;;20007:60;;20048:19;;;;;9285:4;20007:60;:::i;22932:205::-;32054:10;;-1:-1:-1;;;;;32054:10:14;32040;:24;32032:55;;;;-1:-1:-1;;;32032:55:14;;7636:2:16;32032:55:14;;;7618:21:16;7675:2;7655:18;;;7648:30;-1:-1:-1;;;7694:18:16;;;7687:48;7752:18;;32032:55:14;7434:342:16;32032:55:14;23032:10:::1;::::0;;-1:-1:-1;;;;;23048:26:14;;::::1;-1:-1:-1::0;;23048:26:14;::::1;::::0;::::1;::::0;;;23086:46:::1;::::0;23032:10;::::1;::::0;23048:26;23032:10;;23086:46:::1;::::0;23008:21:::1;::::0;23086:46:::1;23002:135;22932:205:::0;:::o;22613:166::-;32054:10;;-1:-1:-1;;;;;32054:10:14;32040;:24;32032:55;;;;-1:-1:-1;;;32032:55:14;;7636:2:16;32032:55:14;;;7618:21:16;7675:2;7655:18;;;7648:30;-1:-1:-1;;;7694:18:16;;;7687:48;7752:18;;32032:55:14;7434:342:16;32032:55:14;22729:45:::1;-1:-1:-1::0;;;;;22729:26:14;::::1;22756:9:::0;22767:6;22729:26:::1;:45::i;5287:320:3:-:0;5456:41;719:10:1;5489:7:3;5456:18;:41::i;:::-;5448:103;;;;-1:-1:-1;;;5448:103:3;;12143:2:16;5448:103:3;;;12125:21:16;12182:2;12162:18;;;12155:30;12221:34;12201:18;;;12194:62;12292:19;12272:18;;;12265:47;12329:19;;5448:103:3;11941:413:16;5448:103:3;5561:39;5575:4;5581:2;5585:7;5594:5;5561:13;:39::i;:::-;5287:320;;;;:::o;22097:226:14:-;32054:10;;-1:-1:-1;;;;;32054:10:14;32040;:24;32032:55;;;;-1:-1:-1;;;32032:55:14;;7636:2:16;32032:55:14;;;7618:21:16;7675:2;7655:18;;;7648:30;-1:-1:-1;;;7694:18:16;;;7687:48;7752:18;;32032:55:14;7434:342:16;32032:55:14;22182:12:::1;22200:9;-1:-1:-1::0;;;;;22200:14:14::1;22222:6;22200:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22181:52;;;22247:7;22239:34;;;::::0;-1:-1:-1;;;22239:34:14;;17823:2:16;22239:34:14::1;::::0;::::1;17805:21:16::0;17862:2;17842:18;;;17835:30;17901:16;17881:18;;;17874:44;17935:18;;22239:34:14::1;17621:338:16::0;22239:34:14::1;22300:9;-1:-1:-1::0;;;;;22284:34:14::1;;22311:6;22284:34;;;;3308:25:16::0;;3296:2;3281:18;;3162:177;22284:34:14::1;;;;;;;;22175:148;22097:226:::0;;:::o;17981:191::-;7144:4:3;7167:16;;;:7;:16;;;;;;18054:13:14;;-1:-1:-1;;;;;7167:16:3;18075:39:14;;;;-1:-1:-1;;;18075:39:14;;11551:2:16;18075:39:14;;;11533:21:16;11590:2;11570:18;;;11563:30;-1:-1:-1;;;11609:18:16;;;11602:40;11659:18;;18075:39:14;11349:334:16;18075:39:14;18127:10;;-1:-1:-1;;;;;18127:10:14;:19;18147;18158:7;18147:10;:19::i;:::-;18127:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;18127:40:14;;;;;;;;;;;;:::i;15723:131::-;15802:4;15821:28;15842:6;15821:20;:28::i;19652:151::-;19777:4;:21;19712:7;;19734:64;;19777:21;;;;;9359:4;19734:64;:::i;19385:139::-;19502:4;:17;19441:7;;19463:56;;19502:17;;;;;9141:4;19463:56;:::i;13321:350::-;13396:4;:14;;;;;;13395:15;13387:41;;;;-1:-1:-1;;;13387:41:14;;14346:2:16;13387:41:14;;;14328:21:16;14385:2;14365:18;;;14358:30;14424:15;14404:18;;;14397:43;14457:18;;13387:41:14;14144:337:16;13387:41:14;13443:11;:9;:11::i;:::-;13442:12;:42;;;;-1:-1:-1;13458:4:14;:21;;;:26;;13442:42;13434:70;;;;-1:-1:-1;;;13434:70:14;;18806:2:16;13434:70:14;;;18788:21:16;18845:2;18825:18;;;18818:30;18884:17;18864:18;;;18857:45;18919:18;;13434:70:14;18604:339:16;13434:70:14;13518:28;13539:6;13518:20;:28::i;:::-;13510:60;;;;-1:-1:-1;;;13510:60:14;;15035:2:16;13510:60:14;;;15017:21:16;15074:2;15054:18;;;15047:30;15113:21;15093:18;;;15086:49;15152:18;;13510:60:14;14833:343:16;13510:60:14;13584:29;13596:9;;13603:1;13584:11;:29::i;:::-;13576:57;;;;-1:-1:-1;;;13576:57:14;;15732:2:16;13576:57:14;;;15714:21:16;15771:2;15751:18;;;15744:30;15810:17;15790:18;;;15783:45;15845:18;;13576:57:14;15530:339:16;17163:160:14;17222:17;;:::i;:::-;7144:4:3;7167:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7167:16:3;17247:39:14;;;;-1:-1:-1;;;17247:39:14;;11551:2:16;17247:39:14;;;11533:21:16;11590:2;11570:18;;;11563:30;-1:-1:-1;;;11609:18:16;;;11602:40;11659:18;;17247:39:14;11349:334:16;17247:39:14;17299:19;17310:7;17299:10;:19::i;20174:114::-;20274:4;:9;20222:7;;20244:39;;20274:9;;;;;9420:4;20244:39;:::i;18608:139::-;18725:4;:17;18664:7;;18686:56;;18725:17;;;;;9069:6;18686:56;:::i;14984:529::-;15067:4;15087:28;15108:6;15087:20;:28::i;:::-;15079:60;;;;-1:-1:-1;;;15079:60:14;;15035:2:16;15079:60:14;;;15017:21:16;15074:2;15054:18;;;15047:30;15113:21;15093:18;;;15086:49;15152:18;;15079:60:14;14833:343:16;15079:60:14;15274:9;15190:259;;15216:9;;;15190:259;;;11027:19:16;;;;15243:9:14;;;11062:12:16;;;11055:28;15274:9:14;;;;15303;11099:12:16;;;11092:28;;;;15303:9:14;;;15333;11136:12:16;;;11129:28;;;;15333:9:14;;;15360;11173:13:16;;;11166:29;;;;15360:9:14;;;15390;11211:13:16;;;11204:29;;;;15390:9:14;;;15421;11249:13:16;;;11242:29;;;;15421:9:14;;;11287:13:16;;;11280:29;15145:25:14;;11325:13:16;;15190:259:14;;;-1:-1:-1;;15190:259:14;;;;;;;;;15173:282;;15190:259;15173:282;;;;15468:35;;;;:16;:35;;;;;;:40;;14984:529;-1:-1:-1;;;14984:529:14:o;2623:572:4:-;-1:-1:-1;;;;;2822:18:4;;2818:183;;2856:40;2888:7;4004:10;:17;;3977:24;;;;:15;:24;;;;;:44;;;4031:24;;;;;;;;;;;;3901:161;2856:40;2818:183;;;2925:2;-1:-1:-1;;;;;2917:10:4;:4;-1:-1:-1;;;;;2917:10:4;;2913:88;;2943:47;2976:4;2982:7;2943:32;:47::i;:::-;-1:-1:-1;;;;;3014:16:4;;3010:179;;3046:45;3083:7;3046:36;:45::i;3010:179::-;3118:4;-1:-1:-1;;;;;3112:10:4;:2;-1:-1:-1;;;;;3112:10:4;;3108:81;;3138:40;3166:2;3170:7;3138:27;:40::i;989:222::-;1091:4;-1:-1:-1;;;;;;1114:50:4;;1129:35;1114:50;;:90;;;1168:36;1192:11;1168:23;:36::i;11088:171:3:-;11162:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;11162:29:3;-1:-1:-1;;;;;11162:29:3;;;;;;;;:24;;11215:23;11162:24;11215:14;:23::i;:::-;-1:-1:-1;;;;;11206:46:3;;;;;;;;;;;11088:171;;:::o;7362:344::-;7455:4;7167:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7167:16:3;7471:73;;;;-1:-1:-1;;;7471:73:3;;19150:2:16;7471:73:3;;;19132:21:16;19189:2;19169:18;;;19162:30;19228:34;19208:18;;;19201:62;19299:14;19279:18;;;19272:42;19331:19;;7471:73:3;18948:408:16;7471:73:3;7554:13;7570:23;7585:7;7570:14;:23::i;:::-;7554:39;;7622:5;-1:-1:-1;;;;;7611:16:3;:7;-1:-1:-1;;;;;7611:16:3;;:51;;;;7655:7;-1:-1:-1;;;;;7631:31:3;:20;7643:7;7631:11;:20::i;:::-;-1:-1:-1;;;;;7631:31:3;;7611:51;:87;;;-1:-1:-1;;;;;;4542:25:3;;;4519:4;4542:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;7666:32;7603:96;7362:344;-1:-1:-1;;;;7362:344:3:o;10372:605::-;10526:4;-1:-1:-1;;;;;10499:31:3;:23;10514:7;10499:14;:23::i;:::-;-1:-1:-1;;;;;10499:31:3;;10491:81;;;;-1:-1:-1;;;10491:81:3;;19563:2:16;10491:81:3;;;19545:21:16;19602:2;19582:18;;;19575:30;19641:34;19621:18;;;19614:62;19712:7;19692:18;;;19685:35;19737:19;;10491:81:3;19361:401:16;10491:81:3;-1:-1:-1;;;;;10590:16:3;;10582:65;;;;-1:-1:-1;;;10582:65:3;;19969:2:16;10582:65:3;;;19951:21:16;20008:2;19988:18;;;19981:30;20047:34;20027:18;;;20020:62;20118:6;20098:18;;;20091:34;20142:19;;10582:65:3;19767:400:16;10582:65:3;10658:39;10679:4;10685:2;10689:7;10658:20;:39::i;:::-;10759:29;10776:1;10780:7;10759:8;:29::i;:::-;-1:-1:-1;;;;;10799:15:3;;;;;;:9;:15;;;;;:20;;10818:1;;10799:15;:20;;10818:1;;10799:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10829:13:3;;;;;;:9;:13;;;;;:18;;10846:1;;10829:13;:18;;10846:1;;10829:18;:::i;:::-;;;;-1:-1:-1;;10857:16:3;;;;:7;:16;;;;;;:21;;-1:-1:-1;;10857:21:3;-1:-1:-1;;;;;10857:21:3;;;;;;;;;10894:27;;10857:16;;10894:27;;;;;;;3527:331;3457:401;;:::o;28664:941:14:-;28745:4;;28771:18;28779:9;;28771:7;:18::i;:::-;28757:32;;28806:6;:43;;;;-1:-1:-1;9489:2:14;28822:9;;:27;28806:43;:84;;;;-1:-1:-1;9542:1:14;28859:9;;;;:31;28806:84;:128;;;;-1:-1:-1;9597:2:14;28900:9;;;;:34;28806:128;:168;;;;-1:-1:-1;9706:1:14;28944:9;;;;:30;28806:168;:210;;;;-1:-1:-1;9759:2:14;28984:9;;;;:32;28806:210;:250;;;;-1:-1:-1;9867:1:14;29026:9;;;;:30;28806:250;:296;;;;-1:-1:-1;9924:1:14;29066:9;;;;:36;28806:296;:336;;;;-1:-1:-1;10034:1:14;29112:9;;;;:30;28806:336;28795:806;;;-1:-1:-1;29164:4:14;;28664:941;-1:-1:-1;;28664:941:14:o;28795:806::-;29193:6;29192:7;:44;;;;-1:-1:-1;9489:2:14;29209:9;;:27;29192:44;:85;;;;-1:-1:-1;9542:1:14;29246:9;;;;:31;29192:85;:131;;;;-1:-1:-1;9655:1:14;29287:9;;;;:36;29192:131;:171;;;;-1:-1:-1;9706:1:14;29333:9;;;;:30;29192:171;:215;;;;-1:-1:-1;9815:2:14;29373:9;;;;:34;29192:215;:255;;;;-1:-1:-1;9867:1:14;29417:9;;;;:30;29192:255;:303;;;;-1:-1:-1;9983:1:14;29457:9;;;;:38;29192:303;:343;;;;-1:-1:-1;10034:1:14;29505:9;;;;:30;29192:343;29181:420;;;-1:-1:-1;29557:4:14;;28664:941;-1:-1:-1;;28664:941:14:o;29181:420::-;-1:-1:-1;29589:5:14;;28664:941;-1:-1:-1;;28664:941:14:o;29181:420::-;28751:854;28664:941;;;:::o;27799:609::-;27873:4;27889:16;27900:4;10135:1;-1:-1:-1;29883:33:14;29807:114;27889:16;27885:519;;;-1:-1:-1;27922:9:14;:29;27915:36;;27885:519;27968:18;27981:4;27968:12;:18::i;:::-;27964:440;;;28003:9;:85;;8226:10;28057:9;:31;28003:85;;;8459:10;28015:9;:39;28003:85;27996:92;;;;27964:440;28105:20;28120:4;28105:14;:20::i;:::-;28101:303;;;28150:9;:89;;8287:10;28206:9;:33;28150:89;;;-1:-1:-1;28162:9:14;8529:10;28162:41;28135:104;;28101:303;28256:14;28265:4;28256:8;:14::i;:::-;28252:152;;;28287:9;:77;;8342:10;28337:9;:27;28287:77;;;-1:-1:-1;28299:9:14;8593;28299:35;28280:84;;28252:152;-1:-1:-1;28392:5:14;28385:12;;30127:156;30186:4;10135:1;30205:4;:34;;:73;;;;-1:-1:-1;;10196:2:14;-1:-1:-1;30243:35:14;30127:156::o;30493:162::-;30554:4;10196:2;30573:4;:36;;:77;;;;-1:-1:-1;;10260:2:14;-1:-1:-1;30613:37:14;30493:162::o;25700:1807::-;25783:10;25797:9;25783:23;25775:44;;;;-1:-1:-1;;;25775:44:14;;20504:2:16;25775:44:14;;;20486:21:16;20543:1;20523:18;;;20516:29;20581:10;20561:18;;;20554:38;20609:18;;25775:44:14;20302:331:16;25775:44:14;25833:4;:10;;;;;;25825:46;;;;-1:-1:-1;;;25825:46:14;;16209:2:16;25825:46:14;;;16191:21:16;16248:2;16228:18;;;16221:30;16287:21;16267:18;;;16260:49;16326:18;;25825:46:14;16007:343:16;25825:46:14;25878:12;25893:6;25878:12;25893:9;;;;;-1:-1:-1;25908:25:14;25893:9;26001:6;26008:1;26001:9;;;;26032:6;26039:1;26032:9;;;;26061:6;26068:1;26061:9;;;;26091:6;26098:1;26091:9;;;;26118:6;26125:1;26118:9;;;;26148:6;26155:1;26148:9;;;;26179:6;26186:1;26179:9;;;;25953:254;;;;;;;;;;;;;;11027:19:16;;;11071:2;11062:12;;11055:28;;;;11108:2;11099:12;;11092:28;;;;11145:2;11136:12;;11129:28;;;;11182:3;11173:13;;11166:29;11220:3;11211:13;;11204:29;11258:3;11249:13;;11242:29;11296:3;11287:13;;11280:29;11334:3;11325:13;;10702:642;25953:254:14;;;;-1:-1:-1;;25953:254:14;;;;;;;;;25936:277;;25953:254;25936:277;;;;26227:35;;;;:16;:35;;;;;;25936:277;;-1:-1:-1;26227:40:14;26219:67;;;;-1:-1:-1;;;26219:67:14;;20840:2:16;26219:67:14;;;20822:21:16;20879:2;20859:18;;;20852:30;20918:16;20898:18;;;20891:44;20952:18;;26219:67:14;20638:338:16;26219:67:14;26296:16;26307:4;10135:1;-1:-1:-1;29883:33:14;29807:114;26296:16;26292:140;;;26347:10;26331:27;;;;:15;:27;;;;;;;;26330:28;26322:61;;;;-1:-1:-1;;;26322:61:14;;21183:2:16;26322:61:14;;;21165:21:16;21222:2;21202:18;;;21195:30;21261:22;21241:18;;;21234:50;21301:18;;26322:61:14;20981:344:16;26322:61:14;26407:10;26391:27;;;;:15;:27;;;;;:34;;-1:-1:-1;;26391:34:14;26421:4;26391:34;;;26292:140;26510:4;:10;26469:15;;26487:33;;26510:10;;;;;8926:7;26487:33;:::i;:::-;:37;;26523:1;26487:37;:::i;:::-;26469:55;;;;26563:16;26574:4;10135:1;-1:-1:-1;29883:33:14;29807:114;26563:16;26559:467;;;26593:13;26601:4;26593:7;:13::i;:::-;26589:99;;;26618:4;:17;;;;;;;;:15;:17;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;26559:467;;26589:99;26660:4;:19;;;;;;;;:17;:19;;;:::i;26559:467::-;26704:18;26717:4;26704:12;:18::i;:::-;26700:326;;;26736:13;26744:4;26736:7;:13::i;:::-;26732:103;;;26761:4;:19;;;;;;;;:17;:19;;;:::i;26732:103::-;26805:4;:21;;;;;;;;:4;:21;;;:::i;26700:326::-;26851:20;26866:4;26851:14;:20::i;:::-;26847:179;;;26885:13;26893:4;26885:7;:13::i;:::-;26881:107;;;26910:4;:21;;;;;;;;:19;:21;;;:::i;26881:107::-;26956:4;:23;;;;;;;;:21;:23;;;:::i;26847:179::-;27008:4;:11;;;;;;;;:9;:11;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;26847:179;27031:4;:12;;;;;;;;:10;:12;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27064:35:14;;;:16;:35;;;;;;;;;:45;;;27143:273;;;;;;;;;;;;;27204:9;;;;27143:273;;;;;;;-1:-1:-1;27143:273:14;;27204:9;27243:1;27236:9;;;;27143:273;;;;;;27269:6;27276:1;27269:9;;;;;;;:::i;:::-;;;;;27143:273;;;;;;27299:6;27306:1;27299:9;;;;;;;:::i;:::-;;;;;27143:273;;;;;;27332:6;27339:1;27332:9;;;;;;;:::i;:::-;;;;;27143:273;;;;;;27366:6;27373:1;27366:9;;;;;;;:::i;:::-;;;;;27143:273;;;;;;27399:6;27406:1;27399:9;;;;;;;:::i;:::-;;;;;;;;;;27143:273;;;;;;;27115:25;;;;:16;:25;;;;;;;:301;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27115:301:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27423:24;27429:8;27132:7;27423:5;:24::i;:::-;27485:8;-1:-1:-1;;;;;27459:43:14;27476:7;27459:43;27495:6;27459:43;;;;;;:::i;:::-;;;;;;;;25769:1738;;;25700:1807;;:::o;11394:307:3:-;11544:8;-1:-1:-1;;;;;11535:17:3;:5;-1:-1:-1;;;;;11535:17:3;;;11527:55;;;;-1:-1:-1;;;11527:55:3;;22011:2:16;11527:55:3;;;21993:21:16;22050:2;22030:18;;;22023:30;22089:27;22069:18;;;22062:55;22134:18;;11527:55:3;21809:349:16;11527:55:3;-1:-1:-1;;;;;11592:25:3;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;11592:46:3;;;;;;;;;;11653:41;;978::16;;;11653::3;;951:18:16;11653:41:3;;;;;;;11394:307;;;:::o;687:205:12:-;826:58;;;-1:-1:-1;;;;;4122:55:16;;826:58:12;;;4104:74:16;4194:18;;;;4187:34;;;826:58:12;;;;;;;;;;4077:18:16;;;;826:58:12;;;;;;;;;;849:23;826:58;;;799:86;;819:5;;799:19;:86::i;6469:307:3:-;6620:28;6630:4;6636:2;6640:7;6620:9;:28::i;:::-;6666:48;6689:4;6695:2;6699:7;6708:5;6666:22;:48::i;:::-;6658:111;;;;-1:-1:-1;;;6658:111:3;;22365:2:16;6658:111:3;;;22347:21:16;22404:2;22384:18;;;22377:30;22443:34;22423:18;;;22416:62;22514:20;22494:18;;;22487:48;22552:19;;6658:111:3;22163:414:16;17461:356:14;17521:24;;:::i;:::-;17553:20;17576:25;;;:16;:25;;;;;;;;;17553:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17607:18;;;17643:10;;17553:48;;17631:22;17607:6;17638:1;17631:9;;;:22;17671:8;;;;;17659:20;;;;:9;;;:20;;;;17697:9;;;;;17685:21;;:9;;;:21;17724:6;;;;;17712:18;;:9;;;:18;17748:9;;;;;17736:21;;:9;;;:21;17775:10;;;;;17763:22;;:9;;;:22;17803:9;;;;;17791:21;:9;;;:21;17659:6;17461:356;-1:-1:-1;17461:356:14:o;4679:970:4:-;4941:22;4991:1;4966:22;4983:4;4966:16;:22::i;:::-;:26;;;;:::i;:::-;5002:18;5023:26;;;:17;:26;;;;;;4941:51;;-1:-1:-1;5153:28:4;;;5149:323;;-1:-1:-1;;;;;5219:18:4;;5197:19;5219:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5268:30;;;;;;:44;;;5384:30;;:17;:30;;;;;:43;;;5149:323;-1:-1:-1;5565:26:4;;;;:17;:26;;;;;;;;5558:33;;;-1:-1:-1;;;;;5608:18:4;;;;;:12;:18;;;;;:34;;;;;;;5601:41;4679:970::o;5937:1061::-;6211:10;:17;6186:22;;6211:21;;6231:1;;6211:21;:::i;:::-;6242:18;6263:24;;;:15;:24;;;;;;6631:10;:26;;6186:46;;-1:-1:-1;6263:24:4;;6186:46;;6631:26;;;;;;:::i;:::-;;;;;;;;;6609:48;;6693:11;6668:10;6679;6668:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;6772:28;;;:15;:28;;;;;;;:41;;;6941:24;;;;;6934:31;6975:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;6008:990;;;5937:1061;:::o;3489:217::-;3573:14;3590:20;3607:2;3590:16;:20::i;:::-;-1:-1:-1;;;;;3620:16:4;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3664:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3489:217:4:o;1490:300:3:-;1592:4;-1:-1:-1;;;;;;1627:40:3;;1642:25;1627:40;;:104;;-1:-1:-1;;;;;;;1683:48:3;;1698:33;1683:48;1627:104;:156;;;-1:-1:-1;952:25:2;-1:-1:-1;;;;;;937:40:2;;;1747:36:3;829:155:2;31513:181:14;31644:45;31671:4;31677:2;31681:7;31644:26;:45::i;31201:91::-;31255:4;31274:8;31281:1;31274:4;:8;:::i;:::-;:13;;31201:91;-1:-1:-1;;31201:91:14:o;30853:152::-;30908:4;10260:2;30927:4;:38;;:73;;;;-1:-1:-1;;10318:2:14;-1:-1:-1;30969:31:14;30853:152::o;8998:427:3:-;-1:-1:-1;;;;;9077:16:3;;9069:61;;;;-1:-1:-1;;;9069:61:3;;23090:2:16;9069:61:3;;;23072:21:16;;;23109:18;;;23102:30;23168:34;23148:18;;;23141:62;23220:18;;9069:61:3;22888:356:16;9069:61:3;7144:4;7167:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7167:16:3;:30;9140:58;;;;-1:-1:-1;;;9140:58:3;;23451:2:16;9140:58:3;;;23433:21:16;23490:2;23470:18;;;23463:30;23529;23509:18;;;23502:58;23577:18;;9140:58:3;23249:352:16;9140:58:3;9209:45;9238:1;9242:2;9246:7;9209:20;:45::i;:::-;-1:-1:-1;;;;;9265:13:3;;;;;;:9;:13;;;;;:18;;9282:1;;9265:13;:18;;9282:1;;9265:18;:::i;:::-;;;;-1:-1:-1;;9293:16:3;;;;:7;:16;;;;;;:21;;-1:-1:-1;;9293:21:3;-1:-1:-1;;;;;9293:21:3;;;;;;;;9330:33;;9293:16;;;9330:33;;9293:16;;9330:33;4203:153;;:::o;1275:706:12:-;1694:23;1720:69;1748:4;1720:69;;;;;;;;;;;;;;;;;1728:5;-1:-1:-1;;;;;1720:27:12;;;:69;;;;;:::i;:::-;1803:17;;1694:95;;-1:-1:-1;1803:21:12;1799:176;;1898:10;1887:30;;;;;;;;;;;;:::i;:::-;1879:85;;;;-1:-1:-1;;;1879:85:12;;24058:2:16;1879:85:12;;;24040:21:16;24097:2;24077:18;;;24070:30;24136:34;24116:18;;;24109:62;24207:12;24187:18;;;24180:40;24237:19;;1879:85:12;23856:406:16;12254:778:3;12404:4;-1:-1:-1;;;;;12424:13:3;;1450:19:0;:23;12420:606:3;;12459:72;;;;;-1:-1:-1;;;;;12459:36:3;;;;;:72;;719:10:1;;12510:4:3;;12516:7;;12525:5;;12459:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12459:72:3;;;;;;;;-1:-1:-1;;12459:72:3;;;;;;;;;;;;:::i;:::-;;;12455:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12698:13:3;;12694:266;;12740:60;;-1:-1:-1;;;12740:60:3;;22365:2:16;12740:60:3;;;22347:21:16;22404:2;22384:18;;;22377:30;22443:34;22423:18;;;22416:62;22514:20;22494:18;;;22487:48;22552:19;;12740:60:3;22163:414:16;12694:266:3;12912:6;12906:13;12897:6;12893:2;12889:15;12882:38;12455:519;-1:-1:-1;;;;;;12581:51:3;12591:41;12581:51;;-1:-1:-1;12574:58:3;;12420:606;-1:-1:-1;13011:4:3;12254:778;;;;;;:::o;3846:223:0:-;3979:12;4010:52;4032:6;4040:4;4046:1;4049:12;4010:21;:52::i;:::-;4003:59;;3846:223;;;;;;:::o;4933:499::-;5098:12;5155:5;5130:21;:30;;5122:81;;;;-1:-1:-1;;;5122:81:0;;25240:2:16;5122:81:0;;;25222:21:16;25279:2;25259:18;;;25252:30;25318:34;25298:18;;;25291:62;25389:8;25369:18;;;25362:36;25415:19;;5122:81:0;25038:402:16;5122:81:0;-1:-1:-1;;;;;1450:19:0;;;5213:60;;;;-1:-1:-1;;;5213:60:0;;25647:2:16;5213:60:0;;;25629:21:16;25686:2;25666:18;;;25659:30;25725:31;25705:18;;;25698:59;25774:18;;5213:60:0;25445:353:16;5213:60:0;5285:12;5299:23;5326:6;-1:-1:-1;;;;;5326:11:0;5345:5;5352:4;5326:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5284:73;;;;5374:51;5391:7;5400:10;5412:12;5374:16;:51::i;:::-;5367:58;4933:499;-1:-1:-1;;;;;;;4933:499:0:o;7546:692::-;7692:12;7720:7;7716:516;;;-1:-1:-1;7750:10:0;7743:17;;7716:516;7861:17;;:21;7857:365;;8055:10;8049:17;8115:15;8102:10;8098:2;8094:19;8087:44;7857:365;8194:12;8187:20;;-1:-1:-1;;;8187:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:196:16:-;82:20;;-1:-1:-1;;;;;131:54:16;;121:65;;111:93;;200:1;197;190:12;111:93;14:196;;;:::o;215:186::-;274:6;327:2;315:9;306:7;302:23;298:32;295:52;;;343:1;340;333:12;295:52;366:29;385:9;366:29;:::i;406:177::-;-1:-1:-1;;;;;;484:5:16;480:78;473:5;470:89;460:117;;573:1;570;563:12;588:245;646:6;699:2;687:9;678:7;674:23;670:32;667:52;;;715:1;712;705:12;667:52;754:9;741:23;773:30;797:5;773:30;:::i;1030:258::-;1102:1;1112:113;1126:6;1123:1;1120:13;1112:113;;;1202:11;;;1196:18;1183:11;;;1176:39;1148:2;1141:10;1112:113;;;1243:6;1240:1;1237:13;1234:48;;;-1:-1:-1;;1278:1:16;1260:16;;1253:27;1030:258::o;1293:317::-;1335:3;1373:5;1367:12;1400:6;1395:3;1388:19;1416:63;1472:6;1465:4;1460:3;1456:14;1449:4;1442:5;1438:16;1416:63;:::i;:::-;1524:2;1512:15;-1:-1:-1;;1508:88:16;1499:98;;;;1599:4;1495:109;;1293:317;-1:-1:-1;;1293:317:16:o;1615:220::-;1764:2;1753:9;1746:21;1727:4;1784:45;1825:2;1814:9;1810:18;1802:6;1784:45;:::i;1840:180::-;1899:6;1952:2;1940:9;1931:7;1927:23;1923:32;1920:52;;;1968:1;1965;1958:12;1920:52;-1:-1:-1;1991:23:16;;1840:180;-1:-1:-1;1840:180:16:o;2256:254::-;2324:6;2332;2385:2;2373:9;2364:7;2360:23;2356:32;2353:52;;;2401:1;2398;2391:12;2353:52;2424:29;2443:9;2424:29;:::i;:::-;2414:39;2500:2;2485:18;;;;2472:32;;-1:-1:-1;;;2256:254:16:o;2515:118::-;2601:5;2594:13;2587:21;2580:5;2577:32;2567:60;;2623:1;2620;2613:12;2638:241;2694:6;2747:2;2735:9;2726:7;2722:23;2718:32;2715:52;;;2763:1;2760;2753:12;2715:52;2802:9;2789:23;2821:28;2843:5;2821:28;:::i;2884:273::-;2968:6;2999:3;3043:2;3031:9;3022:7;3018:23;3014:32;3011:52;;;3059:1;3056;3049:12;3011:52;3098:7;3093:2;3082:9;3078:18;3075:31;3072:51;;;3119:1;3116;3109:12;3072:51;-1:-1:-1;3142:9:16;;2884:273;-1:-1:-1;;2884:273:16:o;3344:328::-;3421:6;3429;3437;3490:2;3478:9;3469:7;3465:23;3461:32;3458:52;;;3506:1;3503;3496:12;3458:52;3529:29;3548:9;3529:29;:::i;:::-;3519:39;;3577:38;3611:2;3600:9;3596:18;3577:38;:::i;:::-;3567:48;;3662:2;3651:9;3647:18;3634:32;3624:42;;3344:328;;;;;:::o;3677:248::-;3745:6;3753;3806:2;3794:9;3785:7;3781:23;3777:32;3774:52;;;3822:1;3819;3812:12;3774:52;-1:-1:-1;;3845:23:16;;;3915:2;3900:18;;;3887:32;;-1:-1:-1;3677:248:16:o;4678:315::-;4743:6;4751;4804:2;4792:9;4783:7;4779:23;4775:32;4772:52;;;4820:1;4817;4810:12;4772:52;4843:29;4862:9;4843:29;:::i;:::-;4833:39;;4922:2;4911:9;4907:18;4894:32;4935:28;4957:5;4935:28;:::i;:::-;4982:5;4972:15;;;4678:315;;;;;:::o;4998:184::-;-1:-1:-1;;;5047:1:16;5040:88;5147:4;5144:1;5137:15;5171:4;5168:1;5161:15;5187:334;5258:2;5252:9;5314:2;5304:13;;-1:-1:-1;;5300:86:16;5288:99;;5417:18;5402:34;;5438:22;;;5399:62;5396:88;;;5464:18;;:::i;:::-;5500:2;5493:22;5187:334;;-1:-1:-1;5187:334:16:o;5526:245::-;5574:4;5607:18;5599:6;5596:30;5593:56;;;5629:18;;:::i;:::-;-1:-1:-1;5686:2:16;5674:15;-1:-1:-1;;5670:88:16;5760:4;5666:99;;5526:245::o;5776:888::-;5871:6;5879;5887;5895;5948:3;5936:9;5927:7;5923:23;5919:33;5916:53;;;5965:1;5962;5955:12;5916:53;5988:29;6007:9;5988:29;:::i;:::-;5978:39;;6036:38;6070:2;6059:9;6055:18;6036:38;:::i;:::-;6026:48;;6121:2;6110:9;6106:18;6093:32;6083:42;;6176:2;6165:9;6161:18;6148:32;6203:18;6195:6;6192:30;6189:50;;;6235:1;6232;6225:12;6189:50;6258:22;;6311:4;6303:13;;6299:27;-1:-1:-1;6289:55:16;;6340:1;6337;6330:12;6289:55;6376:2;6363:16;6401:48;6417:31;6445:2;6417:31;:::i;:::-;6401:48;:::i;:::-;6472:2;6465:5;6458:17;6512:7;6507:2;6502;6498;6494:11;6490:20;6487:33;6484:53;;;6533:1;6530;6523:12;6484:53;6588:2;6583;6579;6575:11;6570:2;6563:5;6559:14;6546:45;6632:1;6627:2;6622;6615:5;6611:14;6607:23;6600:34;6653:5;6643:15;;;;;5776:888;;;;;;;:::o;6669:495::-;6849:3;6834:19;;6838:9;6930:6;6807:4;6964:194;6978:4;6975:1;6972:11;6964:194;;;7037:13;;7025:26;;7074:4;7098:12;;;;7133:15;;;;6998:1;6991:9;6964:194;;;6968:3;;;6669:495;;;;:::o;7169:260::-;7237:6;7245;7298:2;7286:9;7277:7;7273:23;7269:32;7266:52;;;7314:1;7311;7304:12;7266:52;7337:29;7356:9;7337:29;:::i;:::-;7327:39;;7385:38;7419:2;7408:9;7404:18;7385:38;:::i;:::-;7375:48;;7169:260;;;;;:::o;8479:437::-;8558:1;8554:12;;;;8601;;;8622:61;;8676:4;8668:6;8664:17;8654:27;;8622:61;8729:2;8721:6;8718:14;8698:18;8695:38;8692:218;;;-1:-1:-1;;;8763:1:16;8756:88;8867:4;8864:1;8857:15;8895:4;8892:1;8885:15;10513:184;-1:-1:-1;;;10562:1:16;10555:88;10662:4;10659:1;10652:15;10686:4;10683:1;10676:15;12359:184;-1:-1:-1;;;12408:1:16;12401:88;12508:4;12505:1;12498:15;12532:4;12529:1;12522:15;12548:228;12588:7;12714:1;-1:-1:-1;;12642:74:16;12639:1;12636:81;12631:1;12624:9;12617:17;12613:105;12610:131;;;12721:18;;:::i;:::-;-1:-1:-1;12761:9:16;;12548:228::o;12781:184::-;-1:-1:-1;;;12830:1:16;12823:88;12930:4;12927:1;12920:15;12954:4;12951:1;12944:15;12970:120;13010:1;13036;13026:35;;13041:18;;:::i;:::-;-1:-1:-1;13075:9:16;;12970:120::o;13095:219::-;13134:4;13163:8;13221:10;;;;13191;;13243:12;;;13240:38;;;13258:18;;:::i;:::-;13295:13;;13095:219;-1:-1:-1;;;13095:219:16:o;15874:128::-;15914:3;15945:1;15941:6;15938:1;15935:13;15932:39;;;15951:18;;:::i;:::-;-1:-1:-1;15987:9:16;;15874:128::o;17176:230::-;17215:3;17243:12;17282:2;17279:1;17275:10;17312:2;17309:1;17305:10;17343:3;17339:2;17335:12;17330:3;17327:21;17324:47;;;17351:18;;:::i;:::-;17387:13;;17176:230;-1:-1:-1;;;;17176:230:16:o;17964:635::-;18044:6;18097:2;18085:9;18076:7;18072:23;18068:32;18065:52;;;18113:1;18110;18103:12;18065:52;18146:9;18140:16;18179:18;18171:6;18168:30;18165:50;;;18211:1;18208;18201:12;18165:50;18234:22;;18287:4;18279:13;;18275:27;-1:-1:-1;18265:55:16;;18316:1;18313;18306:12;18265:55;18345:2;18339:9;18370:48;18386:31;18414:2;18386:31;:::i;18370:48::-;18441:2;18434:5;18427:17;18481:7;18476:2;18471;18467;18463:11;18459:20;18456:33;18453:53;;;18502:1;18499;18492:12;18453:53;18515:54;18566:2;18561;18554:5;18550:14;18545:2;18541;18537:11;18515:54;:::i;:::-;18588:5;17964:635;-1:-1:-1;;;;;17964:635:16:o;20172:125::-;20212:4;20240:1;20237;20234:8;20231:34;;;20245:18;;:::i;:::-;-1:-1:-1;20282:9:16;;20172:125::o;21330:226::-;21369:3;21397:8;21432:2;21429:1;21425:10;21462:2;21459:1;21455:10;21493:3;21489:2;21485:12;21480:3;21477:21;21474:47;;;21501:18;;:::i;21561:243::-;21599:3;21643:8;21636:5;21632:20;21671:7;21661:41;;21682:18;;:::i;:::-;-1:-1:-1;;21718:80:16;;21561:243;-1:-1:-1;;21561:243:16:o;22582:184::-;-1:-1:-1;;;22631:1:16;22624:88;22731:4;22728:1;22721:15;22755:4;22752:1;22745:15;22771:112;22803:1;22829;22819:35;;22834:18;;:::i;:::-;-1:-1:-1;22868:9:16;;22771:112::o;23606:245::-;23673:6;23726:2;23714:9;23705:7;23701:23;23697:32;23694:52;;;23742:1;23739;23732:12;23694:52;23774:9;23768:16;23793:28;23815:5;23793:28;:::i;24267:512::-;24461:4;-1:-1:-1;;;;;24571:2:16;24563:6;24559:15;24548:9;24541:34;24623:2;24615:6;24611:15;24606:2;24595:9;24591:18;24584:43;;24663:6;24658:2;24647:9;24643:18;24636:34;24706:3;24701:2;24690:9;24686:18;24679:31;24727:46;24768:3;24757:9;24753:19;24745:6;24727:46;:::i;:::-;24719:54;24267:512;-1:-1:-1;;;;;;24267:512:16:o;24784:249::-;24853:6;24906:2;24894:9;24885:7;24881:23;24877:32;24874:52;;;24922:1;24919;24912:12;24874:52;24954:9;24948:16;24973:30;24997:5;24973:30;:::i;25803:274::-;25932:3;25970:6;25964:13;25986:53;26032:6;26027:3;26020:4;26012:6;26008:17;25986:53;:::i;:::-;26055:16;;;;;25803:274;-1:-1:-1;;25803:274:16:o

Swarm Source

ipfs://2b731cdfee9ce9e9bacffec2c13aafc647231678bbf2ccecbdc7480fe212835d
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.