Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 13 from a total of 13 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Upgrade Contract | 9917591 | 2116 days ago | IN | 0 ETH | 0.00018823 | ||||
| Pause | 9917586 | 2116 days ago | IN | 0 ETH | 0.00026836 | ||||
| Add Sys Admin | 9581223 | 2168 days ago | IN | 0 ETH | 0.00036501 | ||||
| Add Sys Admin | 9581195 | 2168 days ago | IN | 0 ETH | 0.00002269 | ||||
| Strip Roles | 9581153 | 2168 days ago | IN | 0 ETH | 0.0000706 | ||||
| Add Owner | 9581078 | 2168 days ago | IN | 0 ETH | 0.00004564 | ||||
| Unpause | 9433325 | 2190 days ago | IN | 0 ETH | 0.00012392 | ||||
| Add Sys Admin | 9433020 | 2190 days ago | IN | 0 ETH | 0.00019048 | ||||
| Add Sys Admin | 9433020 | 2190 days ago | IN | 0 ETH | 0.00036501 | ||||
| Set Media Uri Ba... | 9433018 | 2190 days ago | IN | 0 ETH | 0.00038168 | ||||
| Set View Uri Bas... | 9433012 | 2190 days ago | IN | 0 ETH | 0.00038169 | ||||
| Set Token Uri Ba... | 9433010 | 2190 days ago | IN | 0 ETH | 0.0003816 | ||||
| Set Teleporter C... | 9433008 | 2190 days ago | IN | 0 ETH | 0.00038527 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
AvastarMetadata
Compiler Version
v0.5.14+commit.1f1aaa4
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2020-02-07
*/
// File: contracts/AvastarTypes.sol
pragma solidity 0.5.14;
/**
* @title Avastar Data Types
* @author Cliff Hall
*/
contract AvastarTypes {
enum Generation {
ONE,
TWO,
THREE,
FOUR,
FIVE
}
enum Series {
PROMO,
ONE,
TWO,
THREE,
FOUR,
FIVE
}
enum Wave {
PRIME,
REPLICANT
}
enum Gene {
SKIN_TONE,
HAIR_COLOR,
EYE_COLOR,
BG_COLOR,
BACKDROP,
EARS,
FACE,
NOSE,
MOUTH,
FACIAL_FEATURE,
EYES,
HAIR_STYLE
}
enum Gender {
ANY,
MALE,
FEMALE
}
enum Rarity {
COMMON,
UNCOMMON,
RARE,
EPIC,
LEGENDARY
}
struct Trait {
uint256 id;
Generation generation;
Gender gender;
Gene gene;
Rarity rarity;
uint8 variation;
Series[] series;
string name;
string svg;
}
struct Prime {
uint256 id;
uint256 serial;
uint256 traits;
bool[12] replicated;
Generation generation;
Series series;
Gender gender;
uint8 ranking;
}
struct Replicant {
uint256 id;
uint256 serial;
uint256 traits;
Generation generation;
Gender gender;
uint8 ranking;
}
struct Avastar {
uint256 id;
uint256 serial;
uint256 traits;
Generation generation;
Wave wave;
}
struct Attribution {
Generation generation;
string artist;
string infoURI;
}
}
// File: contracts/IAvastarTeleporter.sol
pragma solidity 0.5.14;
/**
* @title AvastarTeleporter Interface
* @author Cliff Hall
* @notice Declared as abstract contract rather than interface as it must inherit for enum types.
* Used by AvastarMinter contract to interact with subset of AvastarTeleporter contract functions.
*/
contract IAvastarTeleporter is AvastarTypes {
/**
* @notice Acknowledge contract is `AvastarTeleporter`
* @return always true if the contract is in fact `AvastarTeleporter`
*/
function isAvastarTeleporter() external pure returns (bool);
/**
* @notice Get token URI for a given Avastar Token ID.
* Reverts if given token id is not a valid Avastar Token ID.
* @param _tokenId the Token ID of a previously minted Avastar Prime or Replicant
* @return uri the off-chain URI to the JSON metadata for the given Avastar
*/
function tokenURI(uint _tokenId)
external view
returns (string memory uri);
/**
* @notice Get an Avastar's Wave by token ID.
* @param _tokenId the token id of the given Avastar
* @return wave the Avastar's wave (Prime/Replicant)
*/
function getAvastarWaveByTokenId(uint256 _tokenId)
external view
returns (Wave wave);
/**
* @notice Get the Avastar Prime metadata associated with a given Token ID.
* @param _tokenId the Token ID of the specified Prime
* @return tokenId the Prime's token ID
* @return serial the Prime's serial
* @return traits the Prime's trait hash
* @return generation the Prime's generation
* @return series the Prime's series
* @return gender the Prime's gender
* @return ranking the Prime's ranking
*/
function getPrimeByTokenId(uint256 _tokenId)
external view
returns (
uint256 tokenId,
uint256 serial,
uint256 traits,
Generation generation,
Series series,
Gender gender,
uint8 ranking
);
/**
* @notice Get the Avastar Replicant metadata associated with a given Token ID
* @param _tokenId the token ID of the specified Replicant
* @return tokenId the Replicant's token ID
* @return serial the Replicant's serial
* @return traits the Replicant's trait hash
* @return generation the Replicant's generation
* @return gender the Replicant's gender
* @return ranking the Replicant's ranking
*/
function getReplicantByTokenId(uint256 _tokenId)
external view
returns (
uint256 tokenId,
uint256 serial,
uint256 traits,
Generation generation,
Gender gender,
uint8 ranking
);
/**
* @notice Retrieve a Trait's info by ID.
* @param _traitId the ID of the Trait to retrieve
* @return id the ID of the trait
* @return generation generation of the trait
* @return series list of series the trait may appear in
* @return gender gender(s) the trait is valid for
* @return gene gene the trait belongs to
* @return variation variation of the gene the trait represents
* @return rarity the rarity level of this trait
* @return name name of the trait
*/
function getTraitInfoById(uint256 _traitId)
external view
returns (
uint256 id,
Generation generation,
Series[] memory series,
Gender gender,
Gene gene,
Rarity rarity,
uint8 variation,
string memory name
);
/**
* @notice Retrieve a Trait's name by ID.
* @param _traitId the ID of the Trait to retrieve
* @return name name of the trait
*/
function getTraitNameById(uint256 _traitId)
external view
returns (string memory name);
/**
* @notice Get Trait ID by Generation, Gene, and Variation.
* @param _generation the generation the trait belongs to
* @param _gene gene the trait belongs to
* @param _variation the variation of the gene
* @return traitId the ID of the specified trait
*/
function getTraitIdByGenerationGeneAndVariation(
Generation _generation,
Gene _gene,
uint8 _variation
)
external view
returns (uint256 traitId);
/**
* @notice Get the artist Attribution for a given Generation, combined into a single string.
* @param _generation the generation to retrieve artist attribution for
* @return attribution a single string with the artist and artist info URI
*/
function getAttributionByGeneration(Generation _generation)
external view
returns (
string memory attribution
);
/**
* @notice Mint an Avastar Prime
* Only invokable by minter role, when contract is not paused.
* If successful, emits a `NewPrime` event.
* @param _owner the address of the new Avastar's owner
* @param _traits the new Prime's trait hash
* @param _generation the new Prime's generation
* @return _series the new Prime's series
* @param _gender the new Prime's gender
* @param _ranking the new Prime's rarity ranking
* @return tokenId the newly minted Prime's token ID
* @return serial the newly minted Prime's serial
*/
function mintPrime(
address _owner,
uint256 _traits,
Generation _generation,
Series _series,
Gender _gender,
uint8 _ranking
)
external
returns (uint256, uint256);
/**
* @notice Mint an Avastar Replicant.
* Only invokable by minter role, when contract is not paused.
* If successful, emits a `NewReplicant` event.
* @param _owner the address of the new Avastar's owner
* @param _traits the new Replicant's trait hash
* @param _generation the new Replicant's generation
* @param _gender the new Replicant's gender
* @param _ranking the new Replicant's rarity ranking
* @return tokenId the newly minted Replicant's token ID
* @return serial the newly minted Replicant's serial
*/
function mintReplicant(
address _owner,
uint256 _traits,
Generation _generation,
Gender _gender,
uint8 _ranking
)
external
returns (uint256, uint256);
/**
* Gets the owner of the specified token ID.
* @param tokenId the token ID to search for the owner of
* @return owner the owner of the given token ID
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @notice Gets the total amount of tokens stored by the contract.
* @return count total number of tokens
*/
function totalSupply() public view returns (uint256 count);
}
// File: contracts/AvastarBase.sol
pragma solidity 0.5.14;
/**
* @title Avastar Base
* @author Cliff Hall
* @notice Utilities used by descendant contracts
*/
contract AvastarBase {
/**
* @notice Convert a `uint` value to a `string`
* via OraclizeAPI - MIT licence
* https://github.com/provable-things/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol#L896
* @param _i the `uint` value to be converted
* @return result the `string` representation of the given `uint` value
*/
function uintToStr(uint _i)
internal pure
returns (string memory result) {
if (_i == 0) {
return "0";
}
uint j = _i;
uint len;
while (j != 0) {
len++;
j /= 10;
}
bytes memory bstr = new bytes(len);
uint k = len - 1;
while (_i != 0) {
bstr[k--] = byte(uint8(48 + _i % 10));
_i /= 10;
}
result = string(bstr);
}
/**
* @notice Concatenate two strings
* @param _a the first string
* @param _b the second string
* @return result the concatenation of `_a` and `_b`
*/
function strConcat(string memory _a, string memory _b)
internal pure
returns(string memory result) {
result = string(abi.encodePacked(bytes(_a), bytes(_b)));
}
}
// File: @openzeppelin/contracts/access/Roles.sol
pragma solidity ^0.5.0;
/**
* @title Roles
* @dev Library for managing addresses assigned to a Role.
*/
library Roles {
struct Role {
mapping (address => bool) bearer;
}
/**
* @dev Give an account access to this role.
*/
function add(Role storage role, address account) internal {
require(!has(role, account), "Roles: account already has role");
role.bearer[account] = true;
}
/**
* @dev Remove an account's access to this role.
*/
function remove(Role storage role, address account) internal {
require(has(role, account), "Roles: account does not have role");
role.bearer[account] = false;
}
/**
* @dev Check if an account has this role.
* @return bool
*/
function has(Role storage role, address account) internal view returns (bool) {
require(account != address(0), "Roles: account is the zero address");
return role.bearer[account];
}
}
// File: @openzeppelin/contracts/math/SafeMath.sol
pragma solidity ^0.5.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
* - Subtraction cannot overflow.
*
* _Available since v2.4.0._
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*
* _Available since v2.4.0._
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
// Solidity only automatically asserts when dividing by 0
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*
* _Available since v2.4.0._
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
// File: contracts/AccessControl.sol
pragma solidity 0.5.14;
/**
* @title Access Control
* @author Cliff Hall
* @notice Role-based access control and contract upgrade functionality.
*/
contract AccessControl {
using SafeMath for uint256;
using SafeMath for uint16;
using Roles for Roles.Role;
Roles.Role private admins;
Roles.Role private minters;
Roles.Role private owners;
/**
* @notice Sets `msg.sender` as system admin by default.
* Starts paused. System admin must unpause, and add other roles after deployment.
*/
constructor() public {
admins.add(msg.sender);
}
/**
* @notice Emitted when contract is paused by system administrator.
*/
event ContractPaused();
/**
* @notice Emitted when contract is unpaused by system administrator.
*/
event ContractUnpaused();
/**
* @notice Emitted when contract is upgraded by system administrator.
* @param newContract address of the new version of the contract.
*/
event ContractUpgrade(address newContract);
bool public paused = true;
bool public upgraded = false;
address public newContractAddress;
/**
* @notice Modifier to scope access to minters
*/
modifier onlyMinter() {
require(minters.has(msg.sender));
_;
}
/**
* @notice Modifier to scope access to owners
*/
modifier onlyOwner() {
require(owners.has(msg.sender));
_;
}
/**
* @notice Modifier to scope access to system administrators
*/
modifier onlySysAdmin() {
require(admins.has(msg.sender));
_;
}
/**
* @notice Modifier to make a function callable only when the contract is not paused.
*/
modifier whenNotPaused() {
require(!paused);
_;
}
/**
* @notice Modifier to make a function callable only when the contract is paused.
*/
modifier whenPaused() {
require(paused);
_;
}
/**
* @notice Modifier to make a function callable only when the contract not upgraded.
*/
modifier whenNotUpgraded() {
require(!upgraded);
_;
}
/**
* @notice Called by a system administrator to mark the smart contract as upgraded,
* in case there is a serious breaking bug. This method stores the new contract
* address and emits an event to that effect. Clients of the contract should
* update to the new contract address upon receiving this event. This contract will
* remain paused indefinitely after such an upgrade.
* @param _newAddress address of new contract
*/
function upgradeContract(address _newAddress) external onlySysAdmin whenPaused whenNotUpgraded {
require(_newAddress != address(0));
upgraded = true;
newContractAddress = _newAddress;
emit ContractUpgrade(_newAddress);
}
/**
* @notice Called by a system administrator to add a minter.
* Reverts if `_minterAddress` already has minter role
* @param _minterAddress approved minter
*/
function addMinter(address _minterAddress) external onlySysAdmin {
minters.add(_minterAddress);
require(minters.has(_minterAddress));
}
/**
* @notice Called by a system administrator to add an owner.
* Reverts if `_ownerAddress` already has owner role
* @param _ownerAddress approved owner
* @return added boolean indicating whether the role was granted
*/
function addOwner(address _ownerAddress) external onlySysAdmin {
owners.add(_ownerAddress);
require(owners.has(_ownerAddress));
}
/**
* @notice Called by a system administrator to add another system admin.
* Reverts if `_sysAdminAddress` already has sysAdmin role
* @param _sysAdminAddress approved owner
*/
function addSysAdmin(address _sysAdminAddress) external onlySysAdmin {
admins.add(_sysAdminAddress);
require(admins.has(_sysAdminAddress));
}
/**
* @notice Called by an owner to remove all roles from an address.
* Reverts if address had no roles to be removed.
* @param _address address having its roles stripped
*/
function stripRoles(address _address) external onlyOwner {
require(msg.sender != _address);
bool stripped = false;
if (admins.has(_address)) {
admins.remove(_address);
stripped = true;
}
if (minters.has(_address)) {
minters.remove(_address);
stripped = true;
}
if (owners.has(_address)) {
owners.remove(_address);
stripped = true;
}
require(stripped == true);
}
/**
* @notice Called by a system administrator to pause, triggers stopped state
*/
function pause() external onlySysAdmin whenNotPaused {
paused = true;
emit ContractPaused();
}
/**
* @notice Called by a system administrator to un-pause, returns to normal state
*/
function unpause() external onlySysAdmin whenPaused whenNotUpgraded {
paused = false;
emit ContractUnpaused();
}
}
// File: contracts/AvastarMetadata.sol
pragma solidity 0.5.14;
/**
* @title Avastar Metadata Generator
* @author Cliff Hall
* @notice Generate Avastar metadata from on-chain data.
* Refers to the `AvastarTeleporter` for raw data to generate
* the human and machine readable metadata for a given Avastar token Id.
*/
contract AvastarMetadata is AvastarBase, AvastarTypes, AccessControl {
string public constant INVALID_TOKEN_ID = "Invalid Token ID";
/**
* @notice Event emitted when AvastarTeleporter contract is set
* @param contractAddress the address of the AvastarTeleporter contract
*/
event TeleporterContractSet(address contractAddress);
/**
* @notice Event emitted when TokenURI base changes
* @param tokenUriBase the base URI for tokenURI calls
*/
event TokenUriBaseSet(string tokenUriBase);
/**
* @notice Event emitted when the `mediaUriBase` is set.
* Only emitted when the `mediaUriBase` is set after contract deployment.
* @param mediaUriBase the new URI
*/
event MediaUriBaseSet(string mediaUriBase);
/**
* @notice Event emitted when the `viewUriBase` is set.
* Only emitted when the `viewUriBase` is set after contract deployment.
* @param viewUriBase the new URI
*/
event ViewUriBaseSet(string viewUriBase);
/**
* @notice Address of the AvastarTeleporter contract
*/
IAvastarTeleporter private teleporterContract ;
/**
* @notice The base URI for an Avastar's off-chain metadata
*/
string internal tokenUriBase;
/**
* @notice Base URI for an Avastar's off-chain image
*/
string private mediaUriBase;
/**
* @notice Base URI to view an Avastar on the Avastars website
*/
string private viewUriBase;
/**
* @notice Set the address of the `AvastarTeleporter` contract.
* Only invokable by system admin role, when contract is paused and not upgraded.
* To be used if the Teleporter contract has to be upgraded and a new instance deployed.
* If successful, emits an `TeleporterContractSet` event.
* @param _address address of `AvastarTeleporter` contract
*/
function setTeleporterContract(address _address) external onlySysAdmin whenPaused whenNotUpgraded {
// Cast the candidate contract to the IAvastarTeleporter interface
IAvastarTeleporter candidateContract = IAvastarTeleporter(_address);
// Verify that we have the appropriate address
require(candidateContract.isAvastarTeleporter());
// Set the contract address
teleporterContract = IAvastarTeleporter(_address);
// Emit the event
emit TeleporterContractSet(_address);
}
/**
* @notice Acknowledge contract is `AvastarMetadata`
* @return always true
*/
function isAvastarMetadata() external pure returns (bool) {return true;}
/**
* @notice Set the base URI for creating `tokenURI` for each Avastar.
* Only invokable by system admin role, when contract is paused and not upgraded.
* If successful, emits an `TokenUriBaseSet` event.
* @param _tokenUriBase base for the ERC721 tokenURI
*/
function setTokenUriBase(string calldata _tokenUriBase)
external onlySysAdmin whenPaused whenNotUpgraded
{
// Set the base for metadata tokenURI
tokenUriBase = _tokenUriBase;
// Emit the event
emit TokenUriBaseSet(_tokenUriBase);
}
/**
* @notice Set the base URI for the image of each Avastar.
* Only invokable by system admin role, when contract is paused and not upgraded.
* If successful, emits an `MediaUriBaseSet` event.
* @param _mediaUriBase base for the mediaURI shown in metadata for each Avastar
*/
function setMediaUriBase(string calldata _mediaUriBase)
external onlySysAdmin whenPaused whenNotUpgraded
{
// Set the base for metadata tokenURI
mediaUriBase = _mediaUriBase;
// Emit the event
emit MediaUriBaseSet(_mediaUriBase);
}
/**
* @notice Set the base URI for the image of each Avastar.
* Only invokable by system admin role, when contract is paused and not upgraded.
* If successful, emits an `MediaUriBaseSet` event.
* @param _viewUriBase base URI for viewing an Avastar on the Avastars website
*/
function setViewUriBase(string calldata _viewUriBase)
external onlySysAdmin whenPaused whenNotUpgraded
{
// Set the base for metadata tokenURI
viewUriBase = _viewUriBase;
// Emit the event
emit ViewUriBaseSet(_viewUriBase);
}
/**
* @notice Get view URI for a given Avastar Token ID.
* @param _tokenId the Token ID of a previously minted Avastar Prime or Replicant
* @return uri the off-chain URI to view the Avastar on the Avastars website
*/
function viewURI(uint _tokenId)
public view
returns (string memory uri)
{
require(_tokenId < teleporterContract.totalSupply(), INVALID_TOKEN_ID);
uri = strConcat(viewUriBase, uintToStr(_tokenId));
}
/**
* @notice Get media URI for a given Avastar Token ID.
* @param _tokenId the Token ID of a previously minted Avastar Prime or Replicant
* @return uri the off-chain URI to the Avastar image
*/
function mediaURI(uint _tokenId)
public view
returns (string memory uri)
{
require(_tokenId < teleporterContract.totalSupply(), INVALID_TOKEN_ID);
uri = strConcat(mediaUriBase, uintToStr(_tokenId));
}
/**
* @notice Get token URI for a given Avastar Token ID.
* @param _tokenId the Token ID of a previously minted Avastar Prime or Replicant
* @return uri the Avastar's off-chain JSON metadata URI
*/
function tokenURI(uint _tokenId)
external view
returns (string memory uri)
{
require(_tokenId < teleporterContract.totalSupply(), INVALID_TOKEN_ID);
uri = strConcat(tokenUriBase, uintToStr(_tokenId));
}
/**
* @notice Get human-readable metadata for a given Avastar by Token ID.
* @param _tokenId the token id of the given Avastar
* @return metadata the Avastar's human-readable metadata
*/
function getAvastarMetadata(uint256 _tokenId)
external view
returns (string memory metadata) {
require(_tokenId < teleporterContract.totalSupply(), INVALID_TOKEN_ID);
uint256 id;
uint256 serial;
uint256 traits;
Generation generation;
Wave wave;
Series series;
Gender gender;
uint8 ranking;
string memory attribution;
// Get the Avastar
wave = teleporterContract.getAvastarWaveByTokenId(_tokenId);
// Get Prime or Replicant info depending on Avastar's Wave
if (wave == Wave.PRIME) {
(id, serial, traits, generation, series, gender, ranking) = teleporterContract.getPrimeByTokenId(_tokenId);
} else {
(id, serial, traits, generation, gender, ranking) = teleporterContract.getReplicantByTokenId(_tokenId);
}
// Get artist attribution
attribution = teleporterContract.getAttributionByGeneration(generation);
attribution = strConcat('Original art by: ', attribution);
// Name
metadata = strConcat('{\n "name": "Avastar #', uintToStr(uint8(id)));
metadata = strConcat(metadata, '",\n');
// Description: Generation
metadata = strConcat(metadata, ' "description": "Generation ');
metadata = strConcat(metadata, uintToStr(uint8(generation) + 1));
// Description: Series (if 1-5)
if (wave == Wave.PRIME && series != Series.PROMO) {
metadata = strConcat(metadata, ' Series ');
metadata = strConcat(metadata, uintToStr(uint8(series)));
}
// Description: Gender
metadata = strConcat(metadata, (gender == Gender.MALE) ? ' Male ' : ' Female ');
// Description: Founder, Exclusive, Prime, or Replicant
if (wave == Wave.PRIME && series == Series.PROMO) {
metadata = strConcat(metadata, (serial <100) ? 'Founder. ' : 'Exclusive. ');
} else {
metadata = strConcat(metadata, (wave == Wave.PRIME) ? 'Prime. ' : 'Replicant. ');
}
metadata = strConcat(metadata, attribution);
metadata = strConcat(metadata, '",\n');
// View URI
metadata = strConcat(metadata, ' "external_url": "');
metadata = strConcat(metadata, viewURI(_tokenId));
metadata = strConcat(metadata, '",\n');
// Media URI
metadata = strConcat(metadata, ' "image": "');
metadata = strConcat(metadata, mediaURI(_tokenId));
metadata = strConcat(metadata, '",\n');
// Attributes (ala OpenSea)
metadata = strConcat(metadata, ' "attributes": [\n');
// Gender
metadata = strConcat(metadata, ' {\n');
metadata = strConcat(metadata, ' "trait_type": "gender",\n');
metadata = strConcat(metadata, ' "value": "');
metadata = strConcat(metadata, (gender == Gender.MALE) ? 'male"' : 'female"');
metadata = strConcat(metadata, '\n },\n');
// Wave
metadata = strConcat(metadata, ' {\n');
metadata = strConcat(metadata, ' "trait_type": "wave",\n');
metadata = strConcat(metadata, ' "value": "');
metadata = strConcat(metadata, (wave == Wave.PRIME) ? 'prime"' : 'replicant"');
metadata = strConcat(metadata, '\n },\n');
// Generation
metadata = strConcat(metadata, ' {\n');
metadata = strConcat(metadata, ' "display_type": "number",\n');
metadata = strConcat(metadata, ' "trait_type": "generation",\n');
metadata = strConcat(metadata, ' "value": ');
metadata = strConcat(metadata, uintToStr(uint8(generation) + 1));
metadata = strConcat(metadata, '\n },\n');
// Series
if (wave == Wave.PRIME) {
metadata = strConcat(metadata, ' {\n');
metadata = strConcat(metadata, ' "display_type": "number",\n');
metadata = strConcat(metadata, ' "trait_type": "series",\n');
metadata = strConcat(metadata, ' "value": ');
metadata = strConcat(metadata, uintToStr(uint8(series)));
metadata = strConcat(metadata, '\n },\n');
}
// Serial
metadata = strConcat(metadata, ' {\n');
metadata = strConcat(metadata, ' "display_type": "number",\n');
metadata = strConcat(metadata, ' "trait_type": "serial",\n');
metadata = strConcat(metadata, ' "value": ');
metadata = strConcat(metadata, uintToStr(serial));
metadata = strConcat(metadata, '\n },\n');
// Ranking
metadata = strConcat(metadata, ' {\n');
metadata = strConcat(metadata, ' "display_type": "number",\n');
metadata = strConcat(metadata, ' "trait_type": "ranking",\n');
metadata = strConcat(metadata, ' "value": ');
metadata = strConcat(metadata, uintToStr(ranking));
metadata = strConcat(metadata, '\n },\n');
// Level
metadata = strConcat(metadata, ' {\n');
metadata = strConcat(metadata, ' "trait_type": "level",\n');
metadata = strConcat(metadata, ' "value": "');
metadata = strConcat(metadata, getRankingLevel(ranking));
metadata = strConcat(metadata, '"\n },\n');
// Traits
metadata = strConcat(metadata, assembleTraitMetadata(generation, traits));
// Finish JSON object
metadata = strConcat(metadata, ' ]\n}');
}
/**
* @notice Get the rarity level for a given Avastar Rank
* @param ranking the ranking level (1-100)
* @return level the rarity level (Common, Uncommon, Rare, Epic, Legendary)
*/
function getRankingLevel(uint8 ranking)
internal pure
returns (string memory level) {
require(ranking >0 && ranking <=100);
uint8[4] memory breaks = [33, 41, 50, 60];
if (ranking < breaks[0]) {level = "Common";}
else if (ranking < breaks[1]) {level = "Uncommon";}
else if (ranking < breaks[2]) {level = "Rare";}
else if (ranking < breaks[3]) {level = "Epic";}
else {level = "Legendary";}
}
/**
* @notice Assemble the human-readable metadata for a given Trait hash.
* Used internally by
* @param _generation the generation the Avastar belongs to
* @param _traitHash the Avastar's trait hash
* @return metdata the JSON trait metadata for the Avastar
*/
function assembleTraitMetadata(Generation _generation, uint256 _traitHash)
internal view
returns (string memory metadata)
{
require(_traitHash > 0);
uint256 slotConst = 256;
uint256 slotMask = 255;
uint256 bitMask;
uint256 slottedValue;
uint256 slotMultiplier;
uint256 variation;
uint256 traitId;
// Iterate trait hash by Gene and assemble trait attribute data
for (uint8 slot = 0; slot <= uint8(Gene.HAIR_STYLE); slot++){
slotMultiplier = uint256(slotConst**slot); // Create slot multiplier
bitMask = slotMask * slotMultiplier; // Create bit mask for slot
slottedValue = _traitHash & bitMask; // Extract slotted value from hash
if (slottedValue > 0) {
variation = (slot > 0) // Extract variation from slotted value
? slottedValue / slotMultiplier
: slottedValue;
if (variation > 0) {
traitId = teleporterContract.getTraitIdByGenerationGeneAndVariation(_generation, Gene(slot), uint8(variation));
metadata = strConcat(metadata, ' {\n');
metadata = strConcat(metadata, ' "trait_type": "');
if (slot == uint8(Gene.SKIN_TONE)) {
metadata = strConcat(metadata, 'skin_tone');
} else if (slot == uint8(Gene.HAIR_COLOR)) {
metadata = strConcat(metadata, 'hair_color');
} else if (slot == uint8(Gene.EYE_COLOR)) {
metadata = strConcat(metadata, 'eye_color');
} else if (slot == uint8(Gene.BG_COLOR)) {
metadata = strConcat(metadata, 'background_color');
} else if (slot == uint8(Gene.BACKDROP)) {
metadata = strConcat(metadata, 'backdrop');
} else if (slot == uint8(Gene.EARS)) {
metadata = strConcat(metadata, 'ears');
} else if (slot == uint8(Gene.FACE)) {
metadata = strConcat(metadata, 'face');
} else if (slot == uint8(Gene.NOSE)) {
metadata = strConcat(metadata, 'nose');
} else if (slot == uint8(Gene.MOUTH)) {
metadata = strConcat(metadata, 'mouth');
} else if (slot == uint8(Gene.FACIAL_FEATURE)) {
metadata = strConcat(metadata, 'facial_feature');
} else if (slot == uint8(Gene.EYES)) {
metadata = strConcat(metadata, 'eyes');
} else if (slot == uint8(Gene.HAIR_STYLE)) {
metadata = strConcat(metadata, 'hair_style');
}
metadata = strConcat(metadata, '",\n');
metadata = strConcat(metadata, ' "value": "');
metadata = strConcat(metadata, teleporterContract.getTraitNameById(traitId));
metadata = strConcat(metadata, '"\n }');
if (slot < uint8(Gene.HAIR_STYLE)) metadata = strConcat(metadata, ',');
metadata = strConcat(metadata, '\n');
}
}
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[],"name":"ContractPaused","type":"event"},{"anonymous":false,"inputs":[],"name":"ContractUnpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newContract","type":"address"}],"name":"ContractUpgrade","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"mediaUriBase","type":"string"}],"name":"MediaUriBaseSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"}],"name":"TeleporterContractSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"tokenUriBase","type":"string"}],"name":"TokenUriBaseSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"viewUriBase","type":"string"}],"name":"ViewUriBaseSet","type":"event"},{"constant":true,"inputs":[],"name":"INVALID_TOKEN_ID","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_minterAddress","type":"address"}],"name":"addMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_ownerAddress","type":"address"}],"name":"addOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_sysAdminAddress","type":"address"}],"name":"addSysAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getAvastarMetadata","outputs":[{"internalType":"string","name":"metadata","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isAvastarMetadata","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"mediaURI","outputs":[{"internalType":"string","name":"uri","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"newContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"_mediaUriBase","type":"string"}],"name":"setMediaUriBase","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setTeleporterContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"_tokenUriBase","type":"string"}],"name":"setTokenUriBase","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"_viewUriBase","type":"string"}],"name":"setViewUriBase","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"stripRoles","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"uri","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"upgradeContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"upgraded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"viewURI","outputs":[{"internalType":"string","name":"uri","type":"string"}],"payable":false,"stateMutability":"view","type":"function"}]Contract Creation Code
608060405260038054600160ff199091161761ff00191690556200003160003362000037602090811b6200205d17901c565b6200012d565b6200004c82826001600160e01b03620000c416565b156200009f576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b60006001600160a01b0382166200010d5760405162461bcd60e51b815260040180806020018281038252602281526020018062002ca66022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b612b69806200013d6000396000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c80638f8e854b116100ad578063c87b56dd11610071578063c87b56dd1461042d578063dc97f5741461044a578063e486b68114610467578063eb2c02231461046f578063eeb9bf05146104955761012c565b80638f8e854b1461033f578063983b2d56146103d15780639a3b58c9146103f7578063b49aa3b51461041d578063c28de2cd146104255761012c565b80635fdc4ec6116100f45780635fdc4ec6146102595780636533a6fc1461027f5780636af04a57146102ed5780637065cb48146103115780638456cb59146103375761012c565b80633bdafc43146101315780633f4ba83a146101595780634ea17ef2146101615780635bea607f146101cf5780635c975abb1461023d575b600080fd5b6101576004803603602081101561014757600080fd5b50356001600160a01b03166104b2565b005b610157610577565b6101576004803603602081101561017757600080fd5b810190602081018135600160201b81111561019157600080fd5b8201836020820111156101a357600080fd5b803590602001918460018302840111600160201b831117156101c457600080fd5b5090925090506105ea565b610157600480360360208110156101e557600080fd5b810190602081018135600160201b8111156101ff57600080fd5b82018360208201111561021157600080fd5b803590602001918460018302840111600160201b8311171561023257600080fd5b509092509050610699565b610245610748565b604080519115158252519081900360200190f35b6101576004803603602081101561026f57600080fd5b50356001600160a01b0316610751565b6101576004803603602081101561029557600080fd5b810190602081018135600160201b8111156102af57600080fd5b8201836020820111156102c157600080fd5b803590602001918460018302840111600160201b831117156102e257600080fd5b509092509050610857565b6102f5610906565b604080516001600160a01b039092168252519081900360200190f35b6101576004803603602081101561032757600080fd5b50356001600160a01b031661091b565b610157610963565b61035c6004803603602081101561035557600080fd5b50356109c5565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561039657818101518382015260200161037e565b50505050905090810190601f1680156103c35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610157600480360360208110156103e757600080fd5b50356001600160a01b03166119e2565b6101576004803603602081101561040d57600080fd5b50356001600160a01b0316611a1e565b61035c611a5a565b610245611a86565b61035c6004803603602081101561044357600080fd5b5035611a94565b61035c6004803603602081101561046057600080fd5b5035611c27565b610245611d7b565b6101576004803603602081101561048557600080fd5b50356001600160a01b0316611d81565b61035c600480360360208110156104ab57600080fd5b5035611e3b565b6104c360023363ffffffff611f8f16565b6104cc57600080fd5b336001600160a01b03821614156104e257600080fd5b60006104f4818363ffffffff611f8f16565b1561050e5761050a60008363ffffffff611ff616565b5060015b61051f60018363ffffffff611f8f16565b156105395761053560018363ffffffff611ff616565b5060015b61054a60028363ffffffff611f8f16565b156105645761056060028363ffffffff611ff616565b5060015b60018115151461057357600080fd5b5050565b61058860003363ffffffff611f8f16565b61059157600080fd5b60035460ff166105a057600080fd5b600354610100900460ff16156105b557600080fd5b6003805460ff191690556040517f0e5e3b3fb504c22cf5c42fa07d521225937514c654007e1f12646f89768d6f9490600090a1565b6105fb60003363ffffffff611f8f16565b61060457600080fd5b60035460ff1661061357600080fd5b600354610100900460ff161561062857600080fd5b610634600783836129f9565b507f34c2bb88eea859654dad64c1ba2b28a3ea76b179b635d750a5b8d7ca092c1bb1828260405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a15050565b6106aa60003363ffffffff611f8f16565b6106b357600080fd5b60035460ff166106c257600080fd5b600354610100900460ff16156106d757600080fd5b6106e3600683836129f9565b507f39859a3024bf53d50e0b0d5d0c56f098fadc7b96710cf0f277f302e1ae2c33fa828260405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a15050565b60035460ff1681565b61076260003363ffffffff611f8f16565b61076b57600080fd5b60035460ff1661077a57600080fd5b600354610100900460ff161561078f57600080fd5b6000819050806001600160a01b031663950699fe6040518163ffffffff1660e01b815260040160206040518083038186803b1580156107cd57600080fd5b505afa1580156107e1573d6000803e3d6000fd5b505050506040513d60208110156107f757600080fd5b505161080257600080fd5b600480546001600160a01b0384166001600160a01b0319909116811790915560408051918252517f703bc78725b2f16bafbf6232f3d5d610f25096a4a6b759fdbb5a46252d12108f9181900360200190a15050565b61086860003363ffffffff611f8f16565b61087157600080fd5b60035460ff1661088057600080fd5b600354610100900460ff161561089557600080fd5b6108a1600583836129f9565b507fd5136665992c6c23e622ac8866b41e520263e8197aabd6d13903819906bcd384828260405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a15050565b6003546201000090046001600160a01b031681565b61092c60003363ffffffff611f8f16565b61093557600080fd5b61094660028263ffffffff61205d16565b61095760028263ffffffff611f8f16565b61096057600080fd5b50565b61097460003363ffffffff611f8f16565b61097d57600080fd5b60035460ff161561098d57600080fd5b6003805460ff191660011790556040517fab35696f06e428ebc5ceba8cd17f8fed287baf43440206d1943af1ee53e6d26790600090a1565b6060600460009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610a1557600080fd5b505afa158015610a29573d6000803e3d6000fd5b505050506040513d6020811015610a3f57600080fd5b505160408051808201909152601081526f125b9d985b1a5908151bdad95b88125160821b6020820152908310610af35760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610ab8578181015183820152602001610aa0565b50505050905090810190601f168015610ae55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000806000806000806000806060600460009054906101000a90046001600160a01b03166001600160a01b031663b622528a8c6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610b5b57600080fd5b505afa158015610b6f573d6000803e3d6000fd5b505050506040513d6020811015610b8557600080fd5b505194506000856001811115610b9757fe5b1415610c4a5760048054604080516306ea67cd60e11b81529283018e9052516001600160a01b0390911691630dd4cf9a9160248083019260e0929190829003018186803b158015610be757600080fd5b505afa158015610bfb573d6000803e3d6000fd5b505050506040513d60e0811015610c1157600080fd5b508051602082015160408301516060840151608085015160a086015160c090960151949e50929c50909a50985095509093509150610ceb565b60048054604080516332630d0d60e21b81529283018e9052516001600160a01b039091169163c98c34349160248083019260c0929190829003018186803b158015610c9457600080fd5b505afa158015610ca8573d6000803e3d6000fd5b505050506040513d60c0811015610cbe57600080fd5b508051602082015160408301516060840151608085015160a090950151939d50919b509950975090935091505b60048054604051630a68970560e11b81526001600160a01b03909116916314d12e0a9189919081019081908390811115610d2157fe5b60ff16815260200191505060006040518083038186803b158015610d4457600080fd5b505afa158015610d58573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610d8157600080fd5b8101908080516040519392919084600160201b821115610da057600080fd5b908301906020820185811115610db557600080fd5b8251600160201b811182820188101715610dce57600080fd5b82525081516020918201929091019080838360005b83811015610dfb578181015183820152602001610de3565b50505050905090810190601f168015610e285780820380516001836020036101000a031916815260200191505b506040525050509050610e6460405180604001604052806011815260200170027b934b3b4b730b61030b93a10313c9d1607d1b815250826120de565b9050610ea9604051806040016040528060168152602001757b0a2020226e616d65223a202241766173746172202360501b815250610ea48b60ff16612199565b6120de565b9950610ed08a6040518060400160405280600381526020016211160560e91b8152506120de565b9950610f118a6040518060400160405280601d81526020017f2020226465736372697074696f6e223a202247656e65726174696f6e200000008152506120de565b9950610f318a610ea4886004811115610f2657fe5b60010160ff16612199565b99506000856001811115610f4157fe5b148015610f5a57506000846005811115610f5757fe5b14155b15610fa957610f898a6040518060400160405280600881526020016701029b2b934b2b9960c51b8152506120de565b9950610fa68a610ea4866005811115610f9e57fe5b60ff16612199565b99505b61100a8a6001856002811115610fbb57fe5b14610fe657604051806040016040528060088152602001670102332b6b0b632960c51b815250610ea4565b6040518060400160405280600681526020016501026b0b632960d51b8152506120de565b9950600085600181111561101a57fe5b1480156110325750600084600581111561103057fe5b145b1561109a576110938a60648a1061106c576040518060400160405280600b81526020016a022bc31b63ab9b4bb3297160ad1b815250610ea4565b6040518060400160405280600981526020016802337bab73232b917160bd1b8152506120de565b9950611102565b6110ff8a60008760018111156110ac57fe5b146110da576040518060400160405280600b81526020016a02932b83634b1b0b73a17160ad1b815250610ea4565b604051806040016040528060078152602001660283934b6b297160cd1b8152506120de565b99505b61110c8a826120de565b99506111338a6040518060400160405280600381526020016211160560e91b8152506120de565b995061116a8a6040518060400160405280601381526020017210101132bc3a32b93730b62fbab936111d101160691b8152506120de565b99506111798a610ea48d611c27565b99506111a08a6040518060400160405280600381526020016211160560e91b8152506120de565b99506111d08a6040518060400160405280600c81526020016b10101134b6b0b3b2911d101160a11b8152506120de565b99506111df8a610ea48d611e3b565b99506112068a6040518060400160405280600381526020016211160560e91b8152506120de565b995061123c8a6040518060400160405280601281526020017110101130ba3a3934b13aba32b9911d102d8560711b8152506120de565b99506112668a60405180604001604052806006815260200165101010103d8560d11b8152506120de565b99506112a78a6040518060400160405280601e81526020017f2020202020202274726169745f74797065223a202267656e646572222c0a00008152506120de565b99506112db8a6040518060400160405280601081526020016f101010101010113b30b63ab2911d101160811b8152506120de565b995061133c8a60018560028111156112ef57fe5b1461131957604051806040016040528060078152602001663332b6b0b6329160c91b815250610ea4565b6040518060400160405280600581526020016436b0b6329160d91b8152506120de565b99506113688a6040518060400160405280600881526020016705101010103e960560c11b8152506120de565b99506113928a60405180604001604052806006815260200165101010103d8560d11b8152506120de565b99506113d38a6040518060400160405280601c81526020017f2020202020202274726169745f74797065223a202277617665222c0a000000008152506120de565b99506114078a6040518060400160405280601081526020016f101010101010113b30b63ab2911d101160811b8152506120de565b995061146c8a600087600181111561141b57fe5b14611448576040518060400160405280600a8152602001693932b83634b1b0b73a1160b11b815250610ea4565b60405180604001604052806006815260200165383934b6b29160d11b8152506120de565b99506114988a6040518060400160405280600881526020016705101010103e960560c11b8152506120de565b99506114c28a60405180604001604052806006815260200165101010103d8560d11b8152506120de565b99506114f18a604051806040016040528060208152602001600080516020612b158339815191528152506120de565b99506115158a604051806060016040528060228152602001612af3602291396120de565b99506115488a6040518060400160405280600f81526020016e0101010101010113b30b63ab2911d1608d1b8152506120de565b995061155d8a610ea4886004811115610f2657fe5b99506115898a6040518060400160405280600881526020016705101010103e960560c11b8152506120de565b9950600085600181111561159957fe5b14156116ae576115c78a60405180604001604052806006815260200165101010103d8560d11b8152506120de565b99506115f68a604051806040016040528060208152602001600080516020612b158339815191528152506120de565b99506116378a6040518060400160405280601e81526020017f2020202020202274726169745f74797065223a2022736572696573222c0a00008152506120de565b995061166a8a6040518060400160405280600f81526020016e0101010101010113b30b63ab2911d1608d1b8152506120de565b995061167f8a610ea4866005811115610f9e57fe5b99506116ab8a6040518060400160405280600881526020016705101010103e960560c11b8152506120de565b99505b6116d68a60405180604001604052806006815260200165101010103d8560d11b8152506120de565b99506117058a604051806040016040528060208152602001600080516020612b158339815191528152506120de565b99506117468a6040518060400160405280601e81526020017f2020202020202274726169745f74797065223a202273657269616c222c0a00008152506120de565b99506117798a6040518060400160405280600f81526020016e0101010101010113b30b63ab2911d1608d1b8152506120de565b99506117888a610ea48a612199565b99506117b48a6040518060400160405280600881526020016705101010103e960560c11b8152506120de565b99506117de8a60405180604001604052806006815260200165101010103d8560d11b8152506120de565b995061180d8a604051806040016040528060208152602001600080516020612b158339815191528152506120de565b995061184e8a6040518060400160405280601f81526020017f2020202020202274726169745f74797065223a202272616e6b696e67222c0a008152506120de565b99506118818a6040518060400160405280600f81526020016e0101010101010113b30b63ab2911d1608d1b8152506120de565b99506118938a610ea48460ff16612199565b99506118bf8a6040518060400160405280600881526020016705101010103e960560c11b8152506120de565b99506118e98a60405180604001604052806006815260200165101010103d8560d11b8152506120de565b995061192a8a6040518060400160405280601d81526020017f2020202020202274726169745f74797065223a20226c6576656c222c0a0000008152506120de565b995061195e8a6040518060400160405280601081526020016f101010101010113b30b63ab2911d101160811b8152506120de565b995061196d8a610ea48461225c565b995061199a8a604051806040016040528060098152602001681105101010103e960560b91b8152506120de565b99506119aa8a610ea4888a6123b8565b99506119d38a6040518060400160405280600581526020016420205d0a7d60d81b8152506120de565b9b9a5050505050505050505050565b6119f360003363ffffffff611f8f16565b6119fc57600080fd5b611a0d60018263ffffffff61205d16565b61095760018263ffffffff611f8f16565b611a2f60003363ffffffff611f8f16565b611a3857600080fd5b611a4960008263ffffffff61205d16565b61095760008263ffffffff611f8f16565b6040518060400160405280601081526020016f125b9d985b1a5908151bdad95b88125160821b81525081565b600354610100900460ff1681565b6060600460009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ae457600080fd5b505afa158015611af8573d6000803e3d6000fd5b505050506040513d6020811015611b0e57600080fd5b505160408051808201909152601081526f125b9d985b1a5908151bdad95b88125160821b6020820152908310611b855760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610ab8578181015183820152602001610aa0565b5060058054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152611c219390929091830182828015611c135780601f10611be857610100808354040283529160200191611c13565b820191906000526020600020905b815481529060010190602001808311611bf657829003601f168201915b5050505050610ea484612199565b92915050565b6060600460009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611c7757600080fd5b505afa158015611c8b573d6000803e3d6000fd5b505050506040513d6020811015611ca157600080fd5b505160408051808201909152601081526f125b9d985b1a5908151bdad95b88125160821b6020820152908310611d185760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610ab8578181015183820152602001610aa0565b5060078054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152611c219390929091830182828015611c135780601f10611be857610100808354040283529160200191611c13565b60015b90565b611d9260003363ffffffff611f8f16565b611d9b57600080fd5b60035460ff16611daa57600080fd5b600354610100900460ff1615611dbf57600080fd5b6001600160a01b038116611dd257600080fd5b6003805461010061ff00199091161762010000600160b01b031916620100006001600160a01b0384169081029190911790915560408051918252517f450db8da6efbe9c22f2347f7c2021231df1fc58d3ae9a2fa75d39fa446199305916020908290030190a150565b6060600460009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611e8b57600080fd5b505afa158015611e9f573d6000803e3d6000fd5b505050506040513d6020811015611eb557600080fd5b505160408051808201909152601081526f125b9d985b1a5908151bdad95b88125160821b6020820152908310611f2c5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610ab8578181015183820152602001610aa0565b5060068054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152611c219390929091830182828015611c135780601f10611be857610100808354040283529160200191611c13565b60006001600160a01b038216611fd65760405162461bcd60e51b8152600401808060200182810382526022815260200180612ad16022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b6120008282611f8f565b61203b5760405162461bcd60e51b8152600401808060200182810382526021815260200180612ab06021913960400191505060405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b6120678282611f8f565b156120b9576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b606082826040516020018083805190602001908083835b602083106121145780518252601f1990920191602091820191016120f5565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b6020831061215c5780518252601f19909201916020918201910161213d565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052905092915050565b6060816121be57506040805180820190915260018152600360fc1b6020820152612257565b8160005b81156121d657600101600a820491506121c2565b6060816040519080825280601f01601f191660200182016040528015612203576020820181803883390190505b50905060001982015b851561225157600a860660300160f81b8282806001900393508151811061222f57fe5b60200101906001600160f81b031916908160001a905350600a8604955061220c565b50925050505b919050565b606060008260ff16118015612275575060648260ff1611155b61227e57600080fd5b612286612a77565b5060408051608081018252602180825260296020830152603292820192909252603c60608201529060ff841610156122de576040518060400160405280600681526020016521b7b6b6b7b760d11b81525091506123b2565b806001602002015160ff168360ff16101561231b57604051806040016040528060088152602001672ab731b7b6b6b7b760c11b81525091506123b2565b806002602002015160ff168360ff16101561235457604051806040016040528060048152602001635261726560e01b81525091506123b2565b806003602002015160ff168360ff16101561238d57604051806040016040528060048152602001634570696360e01b81525091506123b2565b604051806040016040528060098152602001684c6567656e6461727960b81b81525091505b50919050565b6060600082116123c757600080fd5b61010060ff600080808080805b600b60ff8216116129eb5760ff8116880a87810296508a87169550935084156129e35760008160ff16116124085784612413565b83858161241157fe5b045b925082156129e3576004546001600160a01b0316634001a2678c60ff8416600b81111561243c57fe5b866040518463ffffffff1660e01b81526004018084600481111561245c57fe5b60ff16815260200183600b81111561247057fe5b60ff1681526020018260ff1660ff168152602001935050505060206040518083038186803b1580156124a157600080fd5b505afa1580156124b5573d6000803e3d6000fd5b505050506040513d60208110156124cb57600080fd5b5051604080518082019091526006815265101010103d8560d11b60208201529092506124f8908a906120de565b98506125318960405180604001604052806015815260200174101010101010113a3930b4ba2fba3cb832911d101160591b8152506120de565b985060ff811661256d576125668960405180604001604052806009815260200168736b696e5f746f6e6560b81b8152506120de565b98506127c2565b60ff8116600114156125a557612566896040518060400160405280600a8152602001693430b4b92fb1b7b637b960b11b8152506120de565b60ff8116600214156125dc57612566896040518060400160405280600981526020016832bcb2afb1b7b637b960b91b8152506120de565b60ff81166003141561261a57612566896040518060400160405280601081526020016f3130b1b5b3b937bab7322fb1b7b637b960811b8152506120de565b60ff81166004141561265057612566896040518060400160405280600881526020016706261636b64726f760c41b8152506120de565b60ff8116600514156126825761256689604051806040016040528060048152602001636561727360e01b8152506120de565b60ff8116600614156126b45761256689604051806040016040528060048152602001636661636560e01b8152506120de565b60ff8116600714156126e65761256689604051806040016040528060048152602001636e6f736560e01b8152506120de565b60ff8116600814156127195761256689604051806040016040528060058152602001640dadeeae8d60db1b8152506120de565b60ff81166009141561275557612566896040518060400160405280600e81526020016d66616369616c5f6665617475726560901b8152506120de565b60ff8116600a14156127875761256689604051806040016040528060048152602001636579657360e01b8152506120de565b60ff8116600b14156127c2576127bf896040518060400160405280600a815260200169686169725f7374796c6560b01b8152506120de565b98505b6127e7896040518060400160405280600381526020016211160560e91b8152506120de565b985061281b896040518060400160405280601081526020016f101010101010113b30b63ab2911d101160811b8152506120de565b600480546040805163eaf3a9b960e01b815292830186905251929b5061295e928c926001600160a01b039092169163eaf3a9b9916024808301926000929190829003018186803b15801561286e57600080fd5b505afa158015612882573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156128ab57600080fd5b8101908080516040519392919084600160201b8211156128ca57600080fd5b9083019060208201858111156128df57600080fd5b8251600160201b8111828201881017156128f857600080fd5b82525081516020918201929091019080838360005b8381101561292557818101518382015260200161290d565b50505050905090810190601f1680156129525780820380516001836020036101000a031916815260200191505b506040525050506120de565b98506129898960405180604001604052806007815260200166220a202020207d60c81b8152506120de565b9850600b60ff821610156129bd576129ba89604051806040016040528060018152602001600b60fa1b8152506120de565b98505b6129e089604051806040016040528060018152602001600560f91b8152506120de565b98505b6001016123d4565b505050505050505092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612a3a5782800160ff19823516178555612a67565b82800160010185558215612a67579182015b82811115612a67578235825591602001919060010190612a4c565b50612a73929150612a95565b5090565b60405180608001604052806004906020820280388339509192915050565b611d7e91905b80821115612a735760008155600101612a9b56fe526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65526f6c65733a206163636f756e7420697320746865207a65726f20616464726573732020202020202274726169745f74797065223a202267656e65726174696f6e222c0a20202020202022646973706c61795f74797065223a20226e756d626572222c0aa265627a7a72315820e7765bcd8b5d49a5a6c38427a5ac415d39905f83e91602aad980956129f8c5fa64736f6c634300050e0032526f6c65733a206163636f756e7420697320746865207a65726f2061646472657373
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061012c5760003560e01c80638f8e854b116100ad578063c87b56dd11610071578063c87b56dd1461042d578063dc97f5741461044a578063e486b68114610467578063eb2c02231461046f578063eeb9bf05146104955761012c565b80638f8e854b1461033f578063983b2d56146103d15780639a3b58c9146103f7578063b49aa3b51461041d578063c28de2cd146104255761012c565b80635fdc4ec6116100f45780635fdc4ec6146102595780636533a6fc1461027f5780636af04a57146102ed5780637065cb48146103115780638456cb59146103375761012c565b80633bdafc43146101315780633f4ba83a146101595780634ea17ef2146101615780635bea607f146101cf5780635c975abb1461023d575b600080fd5b6101576004803603602081101561014757600080fd5b50356001600160a01b03166104b2565b005b610157610577565b6101576004803603602081101561017757600080fd5b810190602081018135600160201b81111561019157600080fd5b8201836020820111156101a357600080fd5b803590602001918460018302840111600160201b831117156101c457600080fd5b5090925090506105ea565b610157600480360360208110156101e557600080fd5b810190602081018135600160201b8111156101ff57600080fd5b82018360208201111561021157600080fd5b803590602001918460018302840111600160201b8311171561023257600080fd5b509092509050610699565b610245610748565b604080519115158252519081900360200190f35b6101576004803603602081101561026f57600080fd5b50356001600160a01b0316610751565b6101576004803603602081101561029557600080fd5b810190602081018135600160201b8111156102af57600080fd5b8201836020820111156102c157600080fd5b803590602001918460018302840111600160201b831117156102e257600080fd5b509092509050610857565b6102f5610906565b604080516001600160a01b039092168252519081900360200190f35b6101576004803603602081101561032757600080fd5b50356001600160a01b031661091b565b610157610963565b61035c6004803603602081101561035557600080fd5b50356109c5565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561039657818101518382015260200161037e565b50505050905090810190601f1680156103c35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610157600480360360208110156103e757600080fd5b50356001600160a01b03166119e2565b6101576004803603602081101561040d57600080fd5b50356001600160a01b0316611a1e565b61035c611a5a565b610245611a86565b61035c6004803603602081101561044357600080fd5b5035611a94565b61035c6004803603602081101561046057600080fd5b5035611c27565b610245611d7b565b6101576004803603602081101561048557600080fd5b50356001600160a01b0316611d81565b61035c600480360360208110156104ab57600080fd5b5035611e3b565b6104c360023363ffffffff611f8f16565b6104cc57600080fd5b336001600160a01b03821614156104e257600080fd5b60006104f4818363ffffffff611f8f16565b1561050e5761050a60008363ffffffff611ff616565b5060015b61051f60018363ffffffff611f8f16565b156105395761053560018363ffffffff611ff616565b5060015b61054a60028363ffffffff611f8f16565b156105645761056060028363ffffffff611ff616565b5060015b60018115151461057357600080fd5b5050565b61058860003363ffffffff611f8f16565b61059157600080fd5b60035460ff166105a057600080fd5b600354610100900460ff16156105b557600080fd5b6003805460ff191690556040517f0e5e3b3fb504c22cf5c42fa07d521225937514c654007e1f12646f89768d6f9490600090a1565b6105fb60003363ffffffff611f8f16565b61060457600080fd5b60035460ff1661061357600080fd5b600354610100900460ff161561062857600080fd5b610634600783836129f9565b507f34c2bb88eea859654dad64c1ba2b28a3ea76b179b635d750a5b8d7ca092c1bb1828260405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a15050565b6106aa60003363ffffffff611f8f16565b6106b357600080fd5b60035460ff166106c257600080fd5b600354610100900460ff16156106d757600080fd5b6106e3600683836129f9565b507f39859a3024bf53d50e0b0d5d0c56f098fadc7b96710cf0f277f302e1ae2c33fa828260405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a15050565b60035460ff1681565b61076260003363ffffffff611f8f16565b61076b57600080fd5b60035460ff1661077a57600080fd5b600354610100900460ff161561078f57600080fd5b6000819050806001600160a01b031663950699fe6040518163ffffffff1660e01b815260040160206040518083038186803b1580156107cd57600080fd5b505afa1580156107e1573d6000803e3d6000fd5b505050506040513d60208110156107f757600080fd5b505161080257600080fd5b600480546001600160a01b0384166001600160a01b0319909116811790915560408051918252517f703bc78725b2f16bafbf6232f3d5d610f25096a4a6b759fdbb5a46252d12108f9181900360200190a15050565b61086860003363ffffffff611f8f16565b61087157600080fd5b60035460ff1661088057600080fd5b600354610100900460ff161561089557600080fd5b6108a1600583836129f9565b507fd5136665992c6c23e622ac8866b41e520263e8197aabd6d13903819906bcd384828260405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a15050565b6003546201000090046001600160a01b031681565b61092c60003363ffffffff611f8f16565b61093557600080fd5b61094660028263ffffffff61205d16565b61095760028263ffffffff611f8f16565b61096057600080fd5b50565b61097460003363ffffffff611f8f16565b61097d57600080fd5b60035460ff161561098d57600080fd5b6003805460ff191660011790556040517fab35696f06e428ebc5ceba8cd17f8fed287baf43440206d1943af1ee53e6d26790600090a1565b6060600460009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610a1557600080fd5b505afa158015610a29573d6000803e3d6000fd5b505050506040513d6020811015610a3f57600080fd5b505160408051808201909152601081526f125b9d985b1a5908151bdad95b88125160821b6020820152908310610af35760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610ab8578181015183820152602001610aa0565b50505050905090810190601f168015610ae55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000806000806000806000806060600460009054906101000a90046001600160a01b03166001600160a01b031663b622528a8c6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610b5b57600080fd5b505afa158015610b6f573d6000803e3d6000fd5b505050506040513d6020811015610b8557600080fd5b505194506000856001811115610b9757fe5b1415610c4a5760048054604080516306ea67cd60e11b81529283018e9052516001600160a01b0390911691630dd4cf9a9160248083019260e0929190829003018186803b158015610be757600080fd5b505afa158015610bfb573d6000803e3d6000fd5b505050506040513d60e0811015610c1157600080fd5b508051602082015160408301516060840151608085015160a086015160c090960151949e50929c50909a50985095509093509150610ceb565b60048054604080516332630d0d60e21b81529283018e9052516001600160a01b039091169163c98c34349160248083019260c0929190829003018186803b158015610c9457600080fd5b505afa158015610ca8573d6000803e3d6000fd5b505050506040513d60c0811015610cbe57600080fd5b508051602082015160408301516060840151608085015160a090950151939d50919b509950975090935091505b60048054604051630a68970560e11b81526001600160a01b03909116916314d12e0a9189919081019081908390811115610d2157fe5b60ff16815260200191505060006040518083038186803b158015610d4457600080fd5b505afa158015610d58573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610d8157600080fd5b8101908080516040519392919084600160201b821115610da057600080fd5b908301906020820185811115610db557600080fd5b8251600160201b811182820188101715610dce57600080fd5b82525081516020918201929091019080838360005b83811015610dfb578181015183820152602001610de3565b50505050905090810190601f168015610e285780820380516001836020036101000a031916815260200191505b506040525050509050610e6460405180604001604052806011815260200170027b934b3b4b730b61030b93a10313c9d1607d1b815250826120de565b9050610ea9604051806040016040528060168152602001757b0a2020226e616d65223a202241766173746172202360501b815250610ea48b60ff16612199565b6120de565b9950610ed08a6040518060400160405280600381526020016211160560e91b8152506120de565b9950610f118a6040518060400160405280601d81526020017f2020226465736372697074696f6e223a202247656e65726174696f6e200000008152506120de565b9950610f318a610ea4886004811115610f2657fe5b60010160ff16612199565b99506000856001811115610f4157fe5b148015610f5a57506000846005811115610f5757fe5b14155b15610fa957610f898a6040518060400160405280600881526020016701029b2b934b2b9960c51b8152506120de565b9950610fa68a610ea4866005811115610f9e57fe5b60ff16612199565b99505b61100a8a6001856002811115610fbb57fe5b14610fe657604051806040016040528060088152602001670102332b6b0b632960c51b815250610ea4565b6040518060400160405280600681526020016501026b0b632960d51b8152506120de565b9950600085600181111561101a57fe5b1480156110325750600084600581111561103057fe5b145b1561109a576110938a60648a1061106c576040518060400160405280600b81526020016a022bc31b63ab9b4bb3297160ad1b815250610ea4565b6040518060400160405280600981526020016802337bab73232b917160bd1b8152506120de565b9950611102565b6110ff8a60008760018111156110ac57fe5b146110da576040518060400160405280600b81526020016a02932b83634b1b0b73a17160ad1b815250610ea4565b604051806040016040528060078152602001660283934b6b297160cd1b8152506120de565b99505b61110c8a826120de565b99506111338a6040518060400160405280600381526020016211160560e91b8152506120de565b995061116a8a6040518060400160405280601381526020017210101132bc3a32b93730b62fbab936111d101160691b8152506120de565b99506111798a610ea48d611c27565b99506111a08a6040518060400160405280600381526020016211160560e91b8152506120de565b99506111d08a6040518060400160405280600c81526020016b10101134b6b0b3b2911d101160a11b8152506120de565b99506111df8a610ea48d611e3b565b99506112068a6040518060400160405280600381526020016211160560e91b8152506120de565b995061123c8a6040518060400160405280601281526020017110101130ba3a3934b13aba32b9911d102d8560711b8152506120de565b99506112668a60405180604001604052806006815260200165101010103d8560d11b8152506120de565b99506112a78a6040518060400160405280601e81526020017f2020202020202274726169745f74797065223a202267656e646572222c0a00008152506120de565b99506112db8a6040518060400160405280601081526020016f101010101010113b30b63ab2911d101160811b8152506120de565b995061133c8a60018560028111156112ef57fe5b1461131957604051806040016040528060078152602001663332b6b0b6329160c91b815250610ea4565b6040518060400160405280600581526020016436b0b6329160d91b8152506120de565b99506113688a6040518060400160405280600881526020016705101010103e960560c11b8152506120de565b99506113928a60405180604001604052806006815260200165101010103d8560d11b8152506120de565b99506113d38a6040518060400160405280601c81526020017f2020202020202274726169745f74797065223a202277617665222c0a000000008152506120de565b99506114078a6040518060400160405280601081526020016f101010101010113b30b63ab2911d101160811b8152506120de565b995061146c8a600087600181111561141b57fe5b14611448576040518060400160405280600a8152602001693932b83634b1b0b73a1160b11b815250610ea4565b60405180604001604052806006815260200165383934b6b29160d11b8152506120de565b99506114988a6040518060400160405280600881526020016705101010103e960560c11b8152506120de565b99506114c28a60405180604001604052806006815260200165101010103d8560d11b8152506120de565b99506114f18a604051806040016040528060208152602001600080516020612b158339815191528152506120de565b99506115158a604051806060016040528060228152602001612af3602291396120de565b99506115488a6040518060400160405280600f81526020016e0101010101010113b30b63ab2911d1608d1b8152506120de565b995061155d8a610ea4886004811115610f2657fe5b99506115898a6040518060400160405280600881526020016705101010103e960560c11b8152506120de565b9950600085600181111561159957fe5b14156116ae576115c78a60405180604001604052806006815260200165101010103d8560d11b8152506120de565b99506115f68a604051806040016040528060208152602001600080516020612b158339815191528152506120de565b99506116378a6040518060400160405280601e81526020017f2020202020202274726169745f74797065223a2022736572696573222c0a00008152506120de565b995061166a8a6040518060400160405280600f81526020016e0101010101010113b30b63ab2911d1608d1b8152506120de565b995061167f8a610ea4866005811115610f9e57fe5b99506116ab8a6040518060400160405280600881526020016705101010103e960560c11b8152506120de565b99505b6116d68a60405180604001604052806006815260200165101010103d8560d11b8152506120de565b99506117058a604051806040016040528060208152602001600080516020612b158339815191528152506120de565b99506117468a6040518060400160405280601e81526020017f2020202020202274726169745f74797065223a202273657269616c222c0a00008152506120de565b99506117798a6040518060400160405280600f81526020016e0101010101010113b30b63ab2911d1608d1b8152506120de565b99506117888a610ea48a612199565b99506117b48a6040518060400160405280600881526020016705101010103e960560c11b8152506120de565b99506117de8a60405180604001604052806006815260200165101010103d8560d11b8152506120de565b995061180d8a604051806040016040528060208152602001600080516020612b158339815191528152506120de565b995061184e8a6040518060400160405280601f81526020017f2020202020202274726169745f74797065223a202272616e6b696e67222c0a008152506120de565b99506118818a6040518060400160405280600f81526020016e0101010101010113b30b63ab2911d1608d1b8152506120de565b99506118938a610ea48460ff16612199565b99506118bf8a6040518060400160405280600881526020016705101010103e960560c11b8152506120de565b99506118e98a60405180604001604052806006815260200165101010103d8560d11b8152506120de565b995061192a8a6040518060400160405280601d81526020017f2020202020202274726169745f74797065223a20226c6576656c222c0a0000008152506120de565b995061195e8a6040518060400160405280601081526020016f101010101010113b30b63ab2911d101160811b8152506120de565b995061196d8a610ea48461225c565b995061199a8a604051806040016040528060098152602001681105101010103e960560b91b8152506120de565b99506119aa8a610ea4888a6123b8565b99506119d38a6040518060400160405280600581526020016420205d0a7d60d81b8152506120de565b9b9a5050505050505050505050565b6119f360003363ffffffff611f8f16565b6119fc57600080fd5b611a0d60018263ffffffff61205d16565b61095760018263ffffffff611f8f16565b611a2f60003363ffffffff611f8f16565b611a3857600080fd5b611a4960008263ffffffff61205d16565b61095760008263ffffffff611f8f16565b6040518060400160405280601081526020016f125b9d985b1a5908151bdad95b88125160821b81525081565b600354610100900460ff1681565b6060600460009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ae457600080fd5b505afa158015611af8573d6000803e3d6000fd5b505050506040513d6020811015611b0e57600080fd5b505160408051808201909152601081526f125b9d985b1a5908151bdad95b88125160821b6020820152908310611b855760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610ab8578181015183820152602001610aa0565b5060058054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152611c219390929091830182828015611c135780601f10611be857610100808354040283529160200191611c13565b820191906000526020600020905b815481529060010190602001808311611bf657829003601f168201915b5050505050610ea484612199565b92915050565b6060600460009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611c7757600080fd5b505afa158015611c8b573d6000803e3d6000fd5b505050506040513d6020811015611ca157600080fd5b505160408051808201909152601081526f125b9d985b1a5908151bdad95b88125160821b6020820152908310611d185760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610ab8578181015183820152602001610aa0565b5060078054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152611c219390929091830182828015611c135780601f10611be857610100808354040283529160200191611c13565b60015b90565b611d9260003363ffffffff611f8f16565b611d9b57600080fd5b60035460ff16611daa57600080fd5b600354610100900460ff1615611dbf57600080fd5b6001600160a01b038116611dd257600080fd5b6003805461010061ff00199091161762010000600160b01b031916620100006001600160a01b0384169081029190911790915560408051918252517f450db8da6efbe9c22f2347f7c2021231df1fc58d3ae9a2fa75d39fa446199305916020908290030190a150565b6060600460009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611e8b57600080fd5b505afa158015611e9f573d6000803e3d6000fd5b505050506040513d6020811015611eb557600080fd5b505160408051808201909152601081526f125b9d985b1a5908151bdad95b88125160821b6020820152908310611f2c5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610ab8578181015183820152602001610aa0565b5060068054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152611c219390929091830182828015611c135780601f10611be857610100808354040283529160200191611c13565b60006001600160a01b038216611fd65760405162461bcd60e51b8152600401808060200182810382526022815260200180612ad16022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b6120008282611f8f565b61203b5760405162461bcd60e51b8152600401808060200182810382526021815260200180612ab06021913960400191505060405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b6120678282611f8f565b156120b9576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b606082826040516020018083805190602001908083835b602083106121145780518252601f1990920191602091820191016120f5565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b6020831061215c5780518252601f19909201916020918201910161213d565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052905092915050565b6060816121be57506040805180820190915260018152600360fc1b6020820152612257565b8160005b81156121d657600101600a820491506121c2565b6060816040519080825280601f01601f191660200182016040528015612203576020820181803883390190505b50905060001982015b851561225157600a860660300160f81b8282806001900393508151811061222f57fe5b60200101906001600160f81b031916908160001a905350600a8604955061220c565b50925050505b919050565b606060008260ff16118015612275575060648260ff1611155b61227e57600080fd5b612286612a77565b5060408051608081018252602180825260296020830152603292820192909252603c60608201529060ff841610156122de576040518060400160405280600681526020016521b7b6b6b7b760d11b81525091506123b2565b806001602002015160ff168360ff16101561231b57604051806040016040528060088152602001672ab731b7b6b6b7b760c11b81525091506123b2565b806002602002015160ff168360ff16101561235457604051806040016040528060048152602001635261726560e01b81525091506123b2565b806003602002015160ff168360ff16101561238d57604051806040016040528060048152602001634570696360e01b81525091506123b2565b604051806040016040528060098152602001684c6567656e6461727960b81b81525091505b50919050565b6060600082116123c757600080fd5b61010060ff600080808080805b600b60ff8216116129eb5760ff8116880a87810296508a87169550935084156129e35760008160ff16116124085784612413565b83858161241157fe5b045b925082156129e3576004546001600160a01b0316634001a2678c60ff8416600b81111561243c57fe5b866040518463ffffffff1660e01b81526004018084600481111561245c57fe5b60ff16815260200183600b81111561247057fe5b60ff1681526020018260ff1660ff168152602001935050505060206040518083038186803b1580156124a157600080fd5b505afa1580156124b5573d6000803e3d6000fd5b505050506040513d60208110156124cb57600080fd5b5051604080518082019091526006815265101010103d8560d11b60208201529092506124f8908a906120de565b98506125318960405180604001604052806015815260200174101010101010113a3930b4ba2fba3cb832911d101160591b8152506120de565b985060ff811661256d576125668960405180604001604052806009815260200168736b696e5f746f6e6560b81b8152506120de565b98506127c2565b60ff8116600114156125a557612566896040518060400160405280600a8152602001693430b4b92fb1b7b637b960b11b8152506120de565b60ff8116600214156125dc57612566896040518060400160405280600981526020016832bcb2afb1b7b637b960b91b8152506120de565b60ff81166003141561261a57612566896040518060400160405280601081526020016f3130b1b5b3b937bab7322fb1b7b637b960811b8152506120de565b60ff81166004141561265057612566896040518060400160405280600881526020016706261636b64726f760c41b8152506120de565b60ff8116600514156126825761256689604051806040016040528060048152602001636561727360e01b8152506120de565b60ff8116600614156126b45761256689604051806040016040528060048152602001636661636560e01b8152506120de565b60ff8116600714156126e65761256689604051806040016040528060048152602001636e6f736560e01b8152506120de565b60ff8116600814156127195761256689604051806040016040528060058152602001640dadeeae8d60db1b8152506120de565b60ff81166009141561275557612566896040518060400160405280600e81526020016d66616369616c5f6665617475726560901b8152506120de565b60ff8116600a14156127875761256689604051806040016040528060048152602001636579657360e01b8152506120de565b60ff8116600b14156127c2576127bf896040518060400160405280600a815260200169686169725f7374796c6560b01b8152506120de565b98505b6127e7896040518060400160405280600381526020016211160560e91b8152506120de565b985061281b896040518060400160405280601081526020016f101010101010113b30b63ab2911d101160811b8152506120de565b600480546040805163eaf3a9b960e01b815292830186905251929b5061295e928c926001600160a01b039092169163eaf3a9b9916024808301926000929190829003018186803b15801561286e57600080fd5b505afa158015612882573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156128ab57600080fd5b8101908080516040519392919084600160201b8211156128ca57600080fd5b9083019060208201858111156128df57600080fd5b8251600160201b8111828201881017156128f857600080fd5b82525081516020918201929091019080838360005b8381101561292557818101518382015260200161290d565b50505050905090810190601f1680156129525780820380516001836020036101000a031916815260200191505b506040525050506120de565b98506129898960405180604001604052806007815260200166220a202020207d60c81b8152506120de565b9850600b60ff821610156129bd576129ba89604051806040016040528060018152602001600b60fa1b8152506120de565b98505b6129e089604051806040016040528060018152602001600560f91b8152506120de565b98505b6001016123d4565b505050505050505092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612a3a5782800160ff19823516178555612a67565b82800160010185558215612a67579182015b82811115612a67578235825591602001919060010190612a4c565b50612a73929150612a95565b5090565b60405180608001604052806004906020820280388339509192915050565b611d7e91905b80821115612a735760008155600101612a9b56fe526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65526f6c65733a206163636f756e7420697320746865207a65726f20616464726573732020202020202274726169745f74797065223a202267656e65726174696f6e222c0a20202020202022646973706c61795f74797065223a20226e756d626572222c0aa265627a7a72315820e7765bcd8b5d49a5a6c38427a5ac415d39905f83e91602aad980956129f8c5fa64736f6c634300050e0032
Deployed Bytecode Sourcemap
22485:16205:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22485:16205:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21136:525;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21136:525:0;-1:-1:-1;;;;;21136:525:0;;:::i;:::-;;21998:135;;;:::i;26664:278::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26664:278:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;26664:278:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;26664:278:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;26664:278:0;;-1:-1:-1;26664:278:0;-1:-1:-1;26664:278:0;:::i;26062:284::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26062:284:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;26062:284:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;26062:284:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;26062:284:0;;-1:-1:-1;26062:284:0;-1:-1:-1;26062:284:0;:::i;17868:25::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;24417:554;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24417:554:0;-1:-1:-1;;;;;24417:554:0;;:::i;25458:284::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25458:284:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;25458:284:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;25458:284:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;25458:284:0;;-1:-1:-1;25458:284:0;-1:-1:-1;25458:284:0;:::i;17935:33::-;;;:::i;:::-;;;;-1:-1:-1;;;;;17935:33:0;;;;;;;;;;;;;;20394:152;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20394:152:0;-1:-1:-1;;;;;20394:152:0;;:::i;21769:117::-;;;:::i;28601:5660::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28601:5660:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;28601:5660:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19972:158;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19972:158:0;-1:-1:-1;;;;;19972:158:0;;:::i;20761:164::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20761:164:0;-1:-1:-1;;;;;20761:164:0;;:::i;22563:60::-;;;:::i;17900:28::-;;;:::i;28137:240::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28137:240:0;;:::i;27196:236::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27196:236:0;;:::i;25083:72::-;;;:::i;19513:261::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19513:261:0;-1:-1:-1;;;;;19513:261:0;;:::i;27664:238::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27664:238:0;;:::i;21136:525::-;18249:22;:6;18260:10;18249:22;:10;:22;:::i;:::-;18241:31;;;;;;21212:10;-1:-1:-1;;;;;21212:22:0;;;;21204:31;;;;;;21246:13;21282:20;21246:13;21293:8;21282:20;:10;:20;:::i;:::-;21278:106;;;21319:23;:6;21333:8;21319:23;:13;:23;:::i;:::-;-1:-1:-1;21368:4:0;21278:106;21398:21;:7;21410:8;21398:21;:11;:21;:::i;:::-;21394:108;;;21436:24;:7;21451:8;21436:24;:14;:24;:::i;:::-;-1:-1:-1;21486:4:0;21394:108;21516:20;:6;21527:8;21516:20;:10;:20;:::i;:::-;21512:106;;;21553:23;:6;21567:8;21553:23;:13;:23;:::i;:::-;-1:-1:-1;21602:4:0;21512:106;21648:4;21636:16;;;;21628:25;;;;;;18283:1;21136:525;:::o;21998:135::-;18427:22;:6;18438:10;18427:22;:10;:22;:::i;:::-;18419:31;;;;;;18813:6;;;;18805:15;;;;;;19003:8;;;;;;;19002:9;18994:18;;;;;;22077:6;:14;;-1:-1:-1;;22077:14:0;;;22107:18;;;;22086:5;;22107:18;21998:135::o;26664:278::-;18427:22;:6;18438:10;18427:22;:10;:22;:::i;:::-;18419:31;;;;;;18813:6;;;;18805:15;;;;;;19003:8;;;;;;;19002:9;18994:18;;;;;;26835:26;:11;26849:12;;26835:26;:::i;:::-;;26906:28;26921:12;;26906:28;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;26906:28:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;26906:28:0;;;;-1:-1:-1;26906:28:0;;-1:-1:-1;;;;26906:28:0;26664:278;;:::o;26062:284::-;18427:22;:6;18438:10;18427:22;:10;:22;:::i;:::-;18419:31;;;;;;18813:6;;;;18805:15;;;;;;19003:8;;;;;;;19002:9;18994:18;;;;;;26235:28;:12;26250:13;;26235:28;:::i;:::-;;26308:30;26324:13;;26308:30;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;26308:30:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;26308:30:0;;;;-1:-1:-1;26308:30:0;;-1:-1:-1;;;;26308:30:0;26062:284;;:::o;17868:25::-;;;;;;:::o;24417:554::-;18427:22;:6;18438:10;18427:22;:10;:22;:::i;:::-;18419:31;;;;;;18813:6;;;;18805:15;;;;;;19003:8;;;;;;;19002:9;18994:18;;;;;;24604:36;24662:8;24604:67;;24748:17;-1:-1:-1;;;;;24748:37:0;;:39;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24748:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24748:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24748:39:0;24740:48;;;;;;24838:18;:49;;-1:-1:-1;;;;;24838:49:0;;-1:-1:-1;;;;;;24838:49:0;;;;;;;;24932:31;;;;;;;;;;;;;;;;19023:1;24417:554;:::o;25458:284::-;18427:22;:6;18438:10;18427:22;:10;:22;:::i;:::-;18419:31;;;;;;18813:6;;;;18805:15;;;;;;19003:8;;;;;;;19002:9;18994:18;;;;;;25631:28;:12;25646:13;;25631:28;:::i;:::-;;25704:30;25720:13;;25704:30;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;25704:30:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;25704:30:0;;;;-1:-1:-1;25704:30:0;;-1:-1:-1;;;;25704:30:0;25458:284;;:::o;17935:33::-;;;;;;-1:-1:-1;;;;;17935:33:0;;:::o;20394:152::-;18427:22;:6;18438:10;18427:22;:10;:22;:::i;:::-;18419:31;;;;;;20468:25;:6;20479:13;20468:25;:10;:25;:::i;:::-;20512;:6;20523:13;20512:25;:10;:25;:::i;:::-;20504:34;;;;;;20394:152;:::o;21769:117::-;18427:22;:6;18438:10;18427:22;:10;:22;:::i;:::-;18419:31;;;;;;18632:6;;;;18631:7;18623:16;;;;;;21833:6;:13;;-1:-1:-1;;21833:13:0;21842:4;21833:13;;;21862:16;;;;21833:6;;21862:16;21769:117::o;28601:5660::-;28680:22;28736:18;;;;;;;;;-1:-1:-1;;;;;28736:18:0;-1:-1:-1;;;;;28736:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28736:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28736:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28736:32:0;28770:16;;;;;;;;;;;;-1:-1:-1;;;28736:32:0;28770:16;;;;28725:43;;28717:70;;;;-1:-1:-1;;;28717:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;28717:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28800:10;28821:14;28846;28871:21;28903:9;28923:13;28947;28971;28995:25;29068:18;;;;;;;;;-1:-1:-1;;;;;29068:18:0;-1:-1:-1;;;;;29068:42:0;;29111:8;29068:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29068:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29068:52:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29068:52:0;;-1:-1:-1;29213:10:0;29205:4;:18;;;;;;;;;29201:293;;;29300:18;;;:46;;;-1:-1:-1;;;29300:46:0;;;;;;;;;-1:-1:-1;;;;;29300:18:0;;;;:36;;:46;;;;;;;;;;;;;;:18;:46;;;5:2:-1;;;;30:1;27;20:12;5:2;29300:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29300:46:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;29300:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29300:46:0;;-1:-1:-1;29300:46:0;;-1:-1:-1;29300:46:0;-1:-1:-1;29300:46:0;-1:-1:-1;29300:46:0;;-1:-1:-1;29300:46:0;-1:-1:-1;29201:293:0;;;29432:18;;;:50;;;-1:-1:-1;;;29432:50:0;;;;;;;;;-1:-1:-1;;;;;29432:18:0;;;;:40;;:50;;;;;;;;;;;;;;:18;:50;;;5:2:-1;;;;30:1;27;20:12;5:2;29432:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29432:50:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;29432:50:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29432:50:0;;-1:-1:-1;29432:50:0;-1:-1:-1;29432:50:0;-1:-1:-1;29432:50:0;;-1:-1:-1;29432:50:0;-1:-1:-1;29201:293:0;29555:18;;;:57;;-1:-1:-1;;;29555:57:0;;-1:-1:-1;;;;;29555:18:0;;;;:45;;29601:10;;29555:57;;;;;;29601:10;;29555:57;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29555:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29555:57:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;29555:57:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;29555:57:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;-1:-1;;;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;372:25;;-1:-1;29555:57:0;;420:4:-1;411:14;;;;29555:57:0;;;;;411:14:-1;29555:57:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;29555:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29541:71;;29637:43;;;;;;;;;;;;;;-1:-1:-1;;;29637:43:0;;;29668:11;29637:9;:43::i;:::-;29623:57;;29721:58;;;;;;;;;;;;;;-1:-1:-1;;;29721:58:0;;;29758:20;29774:2;29758:20;;:9;:20::i;:::-;29721:9;:58::i;:::-;29710:69;;29801:27;29811:8;29801:27;;;;;;;;;;;;;-1:-1:-1;;;29801:27:0;;;:9;:27::i;:::-;29790:38;;29888:52;29898:8;29888:52;;;;;;;;;;;;;;;;;:9;:52::i;:::-;29877:63;;29962:53;29972:8;29982:32;29998:10;29992:17;;;;;;;;30012:1;29992:21;29982:32;;:9;:32::i;29962:53::-;29951:64;-1:-1:-1;30081:10:0;30073:4;:18;;;;;;;;;:44;;;;-1:-1:-1;30105:12:0;30095:6;:22;;;;;;;;;;30073:44;30069:190;;;30145:31;30155:8;30145:31;;;;;;;;;;;;;-1:-1:-1;;;30145:31:0;;;:9;:31::i;:::-;30134:42;;30202:45;30212:8;30222:24;30238:6;30232:13;;;;;;;;30222:24;;:9;:24::i;30202:45::-;30191:56;;30069:190;30314:68;30324:8;30345:11;30335:6;:21;;;;;;;;;30334:47;;;;;;;;;;;;;;;-1:-1:-1;;;30334:47:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30334:47:0;;;30314:9;:68::i;:::-;30303:79;-1:-1:-1;30472:10:0;30464:4;:18;;;;;;;;;:44;;;;-1:-1:-1;30496:12:0;30486:6;:22;;;;;;;;;30464:44;30460:265;;;30536:64;30546:8;30565:3;30557:6;:11;30556:43;;;;;;;;;;;;;;;-1:-1:-1;;;30556:43:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30556:43:0;;;30536:9;:64::i;:::-;30525:75;;30460:265;;;30644:69;30654:8;30673:10;30665:4;:18;;;;;;;;;30664:48;;;;;;;;;;;;;;;-1:-1:-1;;;30664:48:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30664:48:0;;;30644:9;:69::i;:::-;30633:80;;30460:265;30746:32;30756:8;30766:11;30746:9;:32::i;:::-;30735:43;;30800:27;30810:8;30800:27;;;;;;;;;;;;;-1:-1:-1;;;30800:27:0;;;:9;:27::i;:::-;30789:38;;30872:42;30882:8;30872:42;;;;;;;;;;;;;-1:-1:-1;;;30872:42:0;;;:9;:42::i;:::-;30861:53;;30936:38;30946:8;30956:17;30964:8;30956:7;:17::i;30936:38::-;30925:49;;30996:27;31006:8;30996:27;;;;;;;;;;;;;-1:-1:-1;;;30996:27:0;;;:9;:27::i;:::-;30985:38;;31069:35;31079:8;31069:35;;;;;;;;;;;;;-1:-1:-1;;;31069:35:0;;;:9;:35::i;:::-;31058:46;;31126:39;31136:8;31146:18;31155:8;31146;:18::i;31126:39::-;31115:50;;31187:27;31197:8;31187:27;;;;;;;;;;;;;-1:-1:-1;;;31187:27:0;;;:9;:27::i;:::-;31176:38;;31275:42;31285:8;31275:42;;;;;;;;;;;;;-1:-1:-1;;;31275:42:0;;;:9;:42::i;:::-;31264:53;;31360:30;31370:8;31360:30;;;;;;;;;;;;;-1:-1:-1;;;31360:30:0;;;:9;:30::i;:::-;31349:41;;31412:54;31422:8;31412:54;;;;;;;;;;;;;;;;;:9;:54::i;:::-;31401:65;;31488:39;31498:8;31488:39;;;;;;;;;;;;;-1:-1:-1;;;31488:39:0;;;:9;:39::i;:::-;31477:50;-1:-1:-1;31549:66:0;31477:50;31580:11;31570:6;:21;;;;;;;;;31569:45;;;;;;;;;;;;;;;-1:-1:-1;;;31569:45:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31569:45:0;;;31549:9;:66::i;:::-;31538:77;;31637:33;31647:8;31637:33;;;;;;;;;;;;;-1:-1:-1;;;31637:33:0;;;:9;:33::i;:::-;31626:44;;31711:30;31721:8;31711:30;;;;;;;;;;;;;-1:-1:-1;;;31711:30:0;;;:9;:30::i;:::-;31700:41;;31763:52;31773:8;31763:52;;;;;;;;;;;;;;;;;:9;:52::i;:::-;31752:63;;31837:39;31847:8;31837:39;;;;;;;;;;;;;-1:-1:-1;;;31837:39:0;;;:9;:39::i;:::-;31826:50;-1:-1:-1;31898:67:0;31826:50;31927:10;31919:4;:18;;;;;;;;;31918:46;;;;;;;;;;;;;;;-1:-1:-1;;;31918:46:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31918:46:0;;;31898:9;:67::i;:::-;31887:78;;31987:33;31997:8;31987:33;;;;;;;;;;;;;-1:-1:-1;;;31987:33:0;;;:9;:33::i;:::-;31976:44;;32067:30;32077:8;32067:30;;;;;;;;;;;;;-1:-1:-1;;;32067:30:0;;;:9;:30::i;:::-;32056:41;;32119:56;32129:8;32119:56;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;32119:56:0;;;:9;:56::i;:::-;32108:67;;32197:58;32207:8;32197:58;;;;;;;;;;;;;;;;;:9;:58::i;:::-;32186:69;;32277:38;32287:8;32277:38;;;;;;;;;;;;;-1:-1:-1;;;32277:38:0;;;:9;:38::i;:::-;32266:49;;32337:53;32347:8;32357:32;32373:10;32367:17;;;;;;;32337:53;32326:64;;32412:33;32422:8;32412:33;;;;;;;;;;;;;-1:-1:-1;;;32412:33:0;;;:9;:33::i;:::-;32401:44;-1:-1:-1;32489:10:0;32481:4;:18;;;;;;;;;32477:448;;;32527:30;32537:8;32527:30;;;;;;;;;;;;;-1:-1:-1;;;32527:30:0;;;:9;:30::i;:::-;32516:41;;32583:56;32593:8;32583:56;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;32583:56:0;;;:9;:56::i;:::-;32572:67;;32665:54;32675:8;32665:54;;;;;;;;;;;;;;;;;:9;:54::i;:::-;32654:65;;32745:38;32755:8;32745:38;;;;;;;;;;;;;-1:-1:-1;;;32745:38:0;;;:9;:38::i;:::-;32734:49;;32809:45;32819:8;32829:24;32845:6;32839:13;;;;;;;32809:45;32798:56;;32880:33;32890:8;32880:33;;;;;;;;;;;;;-1:-1:-1;;;32880:33:0;;;:9;:33::i;:::-;32869:44;;32477:448;32967:30;32977:8;32967:30;;;;;;;;;;;;;-1:-1:-1;;;32967:30:0;;;:9;:30::i;:::-;32956:41;;33019:56;33029:8;33019:56;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33019:56:0;;;:9;:56::i;:::-;33008:67;;33097:54;33107:8;33097:54;;;;;;;;;;;;;;;;;:9;:54::i;:::-;33086:65;;33173:38;33183:8;33173:38;;;;;;;;;;;;;-1:-1:-1;;;33173:38:0;;;:9;:38::i;:::-;33162:49;;33233:38;33243:8;33253:17;33263:6;33253:9;:17::i;33233:38::-;33222:49;;33293:33;33303:8;33293:33;;;;;;;;;;;;;-1:-1:-1;;;33293:33:0;;;:9;:33::i;:::-;33282:44;;33370:30;33380:8;33370:30;;;;;;;;;;;;;-1:-1:-1;;;33370:30:0;;;:9;:30::i;:::-;33359:41;;33422:56;33432:8;33422:56;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33422:56:0;;;:9;:56::i;:::-;33411:67;;33500:55;33510:8;33500:55;;;;;;;;;;;;;;;;;:9;:55::i;:::-;33489:66;;33577:38;33587:8;33577:38;;;;;;;;;;;;;-1:-1:-1;;;33577:38:0;;;:9;:38::i;:::-;33566:49;;33637:39;33647:8;33657:18;33667:7;33657:18;;:9;:18::i;33637:39::-;33626:50;;33698:33;33708:8;33698:33;;;;;;;;;;;;;-1:-1:-1;;;33698:33:0;;;:9;:33::i;:::-;33687:44;;33773:30;33783:8;33773:30;;;;;;;;;;;;;-1:-1:-1;;;33773:30:0;;;:9;:30::i;:::-;33762:41;;33825:53;33835:8;33825:53;;;;;;;;;;;;;;;;;:9;:53::i;:::-;33814:64;;33900:39;33910:8;33900:39;;;;;;;;;;;;;-1:-1:-1;;;33900:39:0;;;:9;:39::i;:::-;33889:50;;33961:45;33971:8;33981:24;33997:7;33981:15;:24::i;33961:45::-;33950:56;;34028:34;34038:8;34028:34;;;;;;;;;;;;;-1:-1:-1;;;34028:34:0;;;:9;:34::i;:::-;34017:45;;34105:62;34115:8;34125:41;34147:10;34159:6;34125:21;:41::i;34105:62::-;34094:73;;34222:29;34232:8;34222:29;;;;;;;;;;;;;-1:-1:-1;;;34222:29:0;;;:9;:29::i;:::-;34211:40;28601:5660;-1:-1:-1;;;;;;;;;;;28601:5660:0:o;19972:158::-;18427:22;:6;18438:10;18427:22;:10;:22;:::i;:::-;18419:31;;;;;;20048:27;:7;20060:14;20048:27;:11;:27;:::i;:::-;20094;:7;20106:14;20094:27;:11;:27;:::i;20761:164::-;18427:22;:6;18438:10;18427:22;:10;:22;:::i;:::-;18419:31;;;;;;20841:28;:6;20852:16;20841:28;:10;:28;:::i;:::-;20888;:6;20899:16;20888:28;:10;:28;:::i;22563:60::-;;;;;;;;;;;;;;-1:-1:-1;;;22563:60:0;;;;:::o;17900:28::-;;;;;;;;;:::o;28137:240::-;28203:17;28257:18;;;;;;;;;-1:-1:-1;;;;;28257:18:0;-1:-1:-1;;;;;28257:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28257:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28257:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28257:32:0;28291:16;;;;;;;;;;;;-1:-1:-1;;;28257:32:0;28291:16;;;;28246:43;;28238:70;;;;-1:-1:-1;;;28238:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;28238:70:0;-1:-1:-1;28335:12:0;28325:44;;;;;;;;-1:-1:-1;;28325:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28335:12;;28325:44;;28335:12;28325:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28349:19;28359:8;28349:9;:19::i;28325:44::-;28319:50;28137:240;-1:-1:-1;;28137:240:0:o;27196:236::-;27259:17;27313:18;;;;;;;;;-1:-1:-1;;;;;27313:18:0;-1:-1:-1;;;;;27313:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27313:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27313:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27313:32:0;27347:16;;;;;;;;;;;;-1:-1:-1;;;27313:32:0;27347:16;;;;27302:43;;27294:70;;;;-1:-1:-1;;;27294:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;27294:70:0;-1:-1:-1;27391:11:0;27381:43;;;;;;;;-1:-1:-1;;27381:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27391:11;;27381:43;;27391:11;27381:43;;;;;;;;;;;;;;;;;;;;;;;;25083:72;25149:4;25083:72;;:::o;19513:261::-;18427:22;:6;18438:10;18427:22;:10;:22;:::i;:::-;18419:31;;;;;;18813:6;;;;18805:15;;;;;;19003:8;;;;;;;19002:9;18994:18;;;;;;-1:-1:-1;;;;;19627:25:0;;19619:34;;;;;;19664:8;:15;;;-1:-1:-1;;19664:15:0;;;;-1:-1:-1;;;;;;19690:32:0;;-1:-1:-1;;;;;19690:32:0;;;;;;;;;;;;19738:28;;;;;;;;;;;;;;;;;19513:261;:::o;27664:238::-;27728:17;27782:18;;;;;;;;;-1:-1:-1;;;;;27782:18:0;-1:-1:-1;;;;;27782:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27782:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27782:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27782:32:0;27816:16;;;;;;;;;;;;-1:-1:-1;;;27782:32:0;27816:16;;;;27771:43;;27763:70;;;;-1:-1:-1;;;27763:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;27763:70:0;-1:-1:-1;27860:12:0;27850:44;;;;;;;;-1:-1:-1;;27850:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27860:12;;27850:44;;27860:12;27850:44;;;;;;;;;;;;;;;;;;;;;;;;11010:203;11082:4;-1:-1:-1;;;;;11107:21:0;;11099:68;;;;-1:-1:-1;;;11099:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;11185:20:0;:11;:20;;;;;;;;;;;;;;;11010:203::o;10732:183::-;10812:18;10816:4;10822:7;10812:3;:18::i;:::-;10804:64;;;;-1:-1:-1;;;10804:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10879:20:0;10902:5;10879:20;;;;;;;;;;;:28;;-1:-1:-1;;10879:28:0;;;10732:183::o;10474:178::-;10552:18;10556:4;10562:7;10552:3;:18::i;:::-;10551:19;10543:63;;;;;-1:-1:-1;;;10543:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10617:20:0;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;10617:27:0;10640:4;10617:27;;;10474:178::o;9955:183::-;10042:20;10114:2;10125;10091:38;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;10091:38:0;;;;;;;;;;-1:-1:-1;10091:38:0;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;10091:38:0;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;10091:38:0;;;10075:55;;9955:183;;;;:::o;9272:488::-;9333:20;9370:7;9366:50;;-1:-1:-1;9394:10:0;;;;;;;;;;;;-1:-1:-1;;;9394:10:0;;;;;;9366:50;9435:2;9426:6;9467:69;9474:6;;9467:69;;9497:5;;9522:2;9517:7;;;;9467:69;;;9546:17;9576:3;9566:14;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;9566:14:0;87:34:-1;135:17;;-1:-1;9566:14:0;-1:-1:-1;9546:34:0;-1:-1:-1;;;9600:7:0;;9618:103;9625:7;;9618:103;;9682:2;9677;:7;9672:2;:12;9661:25;;9649:4;9654:3;;;;;;;9649:9;;;;;;;;;;;:37;-1:-1:-1;;;;;9649:37:0;;;;;;;;-1:-1:-1;9707:2:0;9701:8;;;;9618:103;;;-1:-1:-1;9747:4:0;-1:-1:-1;;;9272:488:0;;;;:::o;34479:467::-;34552:19;34601:1;34592:7;:10;;;:27;;;;;34616:3;34606:7;:13;;;;34592:27;34584:36;;;;;;34631:22;;:::i;:::-;-1:-1:-1;34631:41:0;;;;;;;;34657:2;34631:41;;;34661:2;34631:41;;;;34665:2;34631:41;;;;;;;34669:2;34631:41;;;;;34687:19;;;;34683:256;;;34709:16;;;;;;;;;;;;;-1:-1:-1;;;34709:16:0;;;;;34683:256;;;34756:6;34763:1;34756:9;;;;34746:19;;:7;:19;;;34742:197;;;34768:18;;;;;;;;;;;;;-1:-1:-1;;;34768:18:0;;;;;34742:197;;;34817:6;34824:1;34817:9;;;;34807:19;;:7;:19;;;34803:136;;;34829:14;;;;;;;;;;;;;-1:-1:-1;;;34829:14:0;;;;;34803:136;;;34874:6;34881:1;34874:9;;;;34864:19;;:7;:19;;;34860:79;;;34886:14;;;;;;;;;;;;;-1:-1:-1;;;34886:14:0;;;;;34860:79;;;34918:19;;;;;;;;;;;;;-1:-1:-1;;;34918:19:0;;;;;34860:79;34479:467;;;;:::o;35256:3429::-;35364:22;35425:1;35412:10;:14;35404:23;;;;;;35458:3;35491;35438:17;;;;;;35724:2954;35759:15;35745:30;;;;35724:2954;;35824:15;;;;;35892:25;;;;-1:-1:-1;35982:20:0;;;;-1:-1:-1;35824:15:0;-1:-1:-1;36063:16:0;;36059:2608;;36120:1;36113:4;:8;;;36112:148;;36248:12;36112:148;;;36214:14;36199:12;:29;;;;;;36112:148;36100:160;-1:-1:-1;36283:13:0;;36279:2373;;36331:18;;-1:-1:-1;;;;;36331:18:0;:57;36389:11;36402:10;;;;;;;;;;;36420:9;36331:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36331:100:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36331:100:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36331:100:0;36465:30;;;;;;;;;;;;-1:-1:-1;;;36331:100:0;36465:30;;;36331:100;;-1:-1:-1;36465:30:0;;36475:8;;36465:9;:30::i;:::-;36454:41;;36529:44;36539:8;36529:44;;;;;;;;;;;;;-1:-1:-1;;;36529:44:0;;;:9;:44::i;:::-;36518:55;-1:-1:-1;36600:29:0;;;36596:1584;;36669:32;36679:8;36669:32;;;;;;;;;;;;;-1:-1:-1;;;36669:32:0;;;:9;:32::i;:::-;36658:43;;36596:1584;;;36735:30;;;36749:15;36735:30;36731:1449;;;36805:33;36815:8;36805:33;;;;;;;;;;;;;-1:-1:-1;;;36805:33:0;;;:9;:33::i;36731:1449::-;36872:29;;;36886:14;36872:29;36868:1312;;;36941:32;36951:8;36941:32;;;;;;;;;;;;;-1:-1:-1;;;36941:32:0;;;:9;:32::i;36868:1312::-;37007:28;;;37021:13;37007:28;37003:1177;;;37075:39;37085:8;37075:39;;;;;;;;;;;;;-1:-1:-1;;;37075:39:0;;;:9;:39::i;37003:1177::-;37148:28;;;37162:13;37148:28;37144:1036;;;37216:31;37226:8;37216:31;;;;;;;;;;;;;-1:-1:-1;;;37216:31:0;;;:9;:31::i;37144:1036::-;37281:24;;;37295:9;37281:24;37277:903;;;37345:27;37355:8;37345:27;;;;;;;;;;;;;-1:-1:-1;;;37345:27:0;;;:9;:27::i;37277:903::-;37406:24;;;37420:9;37406:24;37402:778;;;37470:27;37480:8;37470:27;;;;;;;;;;;;;-1:-1:-1;;;37470:27:0;;;:9;:27::i;37402:778::-;37531:24;;;37545:9;37531:24;37527:653;;;37595:27;37605:8;37595:27;;;;;;;;;;;;;-1:-1:-1;;;37595:27:0;;;:9;:27::i;37527:653::-;37656:25;;;37670:10;37656:25;37652:528;;;37721:28;37731:8;37721:28;;;;;;;;;;;;;-1:-1:-1;;;37721:28:0;;;:9;:28::i;37652:528::-;37783:34;;;37797:19;37783:34;37779:401;;;37857:37;37867:8;37857:37;;;;;;;;;;;;;-1:-1:-1;;;37857:37:0;;;:9;:37::i;37779:401::-;37928:24;;;37942:9;37928:24;37924:256;;;37992:27;38002:8;37992:27;;;;;;;;;;;;;-1:-1:-1;;;37992:27:0;;;:9;:27::i;37924:256::-;38053:30;;;38067:15;38053:30;38049:131;;;38123:33;38133:8;38123:33;;;;;;;;;;;;;-1:-1:-1;;;38123:33:0;;;:9;:33::i;:::-;38112:44;;38049:131;38213:27;38223:8;38213:27;;;;;;;;;;;;;-1:-1:-1;;;38213:27:0;;;:9;:27::i;:::-;38202:38;;38274:39;38284:8;38274:39;;;;;;;;;;;;;-1:-1:-1;;;38274:39:0;;;:9;:39::i;:::-;38367:18;;;:44;;;-1:-1:-1;;;38367:44:0;;;;;;;;;38263:50;;-1:-1:-1;38347:65:0;;38263:50;;-1:-1:-1;;;;;38367:18:0;;;;:35;;:44;;;;;:18;;:44;;;;;;;:18;:44;;;5:2:-1;;;;30:1;27;20:12;5:2;38367:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38367:44:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;38367:44:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;38367:44:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;-1:-1;;;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;372:25;;-1:-1;38367:44:0;;420:4:-1;411:14;;;;38367:44:0;;;;;411:14:-1;38367:44:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;38367:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38347:9;:65::i;:::-;38336:76;;38446:31;38456:8;38446:31;;;;;;;;;;;;;-1:-1:-1;;;38446:31:0;;;:9;:31::i;:::-;38435:42;-1:-1:-1;38517:15:0;38504:29;;;;38500:71;;;38547:24;38557:8;38547:24;;;;;;;;;;;;;-1:-1:-1;;;38547:24:0;;;:9;:24::i;:::-;38536:35;;38500:71;38605:25;38615:8;38605:25;;;;;;;;;;;;;-1:-1:-1;;;38605:25:0;;;:9;:25::i;:::-;38594:36;;36279:2373;35777:6;;35724:2954;;;;35256:3429;;;;;;;;;;;:::o;22485:16205::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;22485:16205:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22485:16205:0;;;-1:-1:-1;22485:16205:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;22485:16205:0;;;-1:-1:-1;;22485:16205:0:o;:::-;;;;;;;;;;;;;;;;;
Swarm Source
bzzr://e7765bcd8b5d49a5a6c38427a5ac415d39905f83e91602aad980956129f8c5fa
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.