Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,558 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
_Live Mint Artis... | 19488595 | 396 days ago | IN | 0 ETH | 0.04663051 | ||||
_Live Mint Artis... | 19488458 | 396 days ago | IN | 0 ETH | 0.39580576 | ||||
_Live Mint Artis... | 19488451 | 396 days ago | IN | 0 ETH | 0.56819802 | ||||
_Live Mint Artis... | 19488401 | 396 days ago | IN | 0 ETH | 0.03080394 | ||||
Remote Mint Arti... | 19461005 | 400 days ago | IN | 0 ETH | 0.057 | ||||
Remote Mint Arti... | 19458524 | 400 days ago | IN | 0 ETH | 0.02239882 | ||||
Remote Mint Arti... | 19454412 | 400 days ago | IN | 0 ETH | 0.00942142 | ||||
Remote Mint Arti... | 19452380 | 401 days ago | IN | 0 ETH | 0.00967882 | ||||
Remote Mint Arti... | 19452320 | 401 days ago | IN | 0 ETH | 0.01693805 | ||||
Remote Mint Arti... | 19451303 | 401 days ago | IN | 0 ETH | 0.01643169 | ||||
Remote Mint Arti... | 19446159 | 402 days ago | IN | 0 ETH | 0.01046354 | ||||
Remote Mint Arti... | 19441572 | 402 days ago | IN | 0 ETH | 0.03448161 | ||||
Remote Mint Arti... | 19414316 | 406 days ago | IN | 0 ETH | 0.02535458 | ||||
Remote Mint Arti... | 19361118 | 414 days ago | IN | 0 ETH | 0.03149302 | ||||
Remote Mint Arti... | 19357191 | 414 days ago | IN | 0 ETH | 0.02152868 | ||||
Remote Mint Arti... | 19350039 | 415 days ago | IN | 0 ETH | 0.07121216 | ||||
Remote Mint Arti... | 19345400 | 416 days ago | IN | 0 ETH | 0.01204532 | ||||
Remote Mint Arti... | 19326123 | 418 days ago | IN | 0 ETH | 0.02065223 | ||||
Remote Mint Arti... | 19322164 | 419 days ago | IN | 0 ETH | 0.01321243 | ||||
Remote Mint Arti... | 19321336 | 419 days ago | IN | 0 ETH | 0.0139998 | ||||
Remote Mint Arti... | 19317474 | 420 days ago | IN | 0 ETH | 0.0111349 | ||||
Remote Mint Arti... | 19315392 | 420 days ago | IN | 0 ETH | 0.01357809 | ||||
Remote Mint Arti... | 19314568 | 420 days ago | IN | 0 ETH | 0.01682873 | ||||
Remote Mint Arti... | 19311368 | 420 days ago | IN | 0 ETH | 0.0215695 | ||||
Remote Mint Arti... | 19310799 | 421 days ago | IN | 0 ETH | 0.01094162 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
LiveMintParis
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes with 10000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ /** * @dev: @brougkr */ pragma solidity 0.8.19; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { ReentrancyGuard } from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import { MerkleProof } from "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; import { IMinter } from "./IMinter.sol"; import { IMP } from "./IMP.sol"; import { IGT } from "./IGT.sol"; contract LiveMintParis is Ownable, ReentrancyGuard { struct City { string _Name; // _Name uint _QRCurrentIndex; // _QRCurrentIndex bytes32 _RootEligibility; // _RootEligibility bytes32 _RootAmount; // _RootAmount bool _RemoteMintingEnabledArtists; // _RemoteMintingEnabledArtists bool _RemoteMintingEnabledCitizens; // _RemoteMintingEnabledCitizen } struct Artist { address _MintPass; // _MintPass address _Minter; // _Minter address _AlternateMinter; // _AlternateMinter uint _MaxSupply; // _MaxSupply uint _ArtBlocksProjectID; // _ArtBlocksProjectID uint _PolyStart; // _PolyStart uint _PolyEnd; // _PolyEnd } /*-------------------*/ /* STATE VARIABLES */ /*-------------------*/ bytes32 private constant _AUTHORIZED = keccak256("AUTHORIZED"); // Authorized Role bytes32 private constant _MINTER_ROLE = keccak256("MINTER_ROLE"); // Minter Role address private constant _DN = 0x00000000000076A84feF008CDAbe6409d2FE638B; // delegate.cash Delegation Registry uint private constant _CCI = 8; // Current City Index address private constant _GOLDEN_TOKEN = 0x985e1932FFd2aA4bC9cE611DFe12816A248cD2cE; // Golden Token Address address private constant _CITIZEN_MINTER = 0xDd06d8483868Cd0C5E69C24eEaA2A5F2bEaFd42b; // ArtBlocks Minter Contract address private constant _BRT_MULTISIG = 0xB96E81f80b3AEEf65CB6d0E280b15FD5DBE71937; // BRT Multisig address public _MARKETPLACE; // Marketplace Address uint public _UniqueArtistsInvoked; // Unique Artists Invoked uint public _MaxQRDelegationsPerDay = 10; // Max QR Delegations Per Day bool public _QRDelegationsEnabled = true; // QR Delegations Enabled /*-------------------*/ /* MAPPINGS */ /*-------------------*/ mapping(uint => Artist) public Artists; // [ArtistID] => Artist mapping(uint => City) public Cities; // [CityIndex] => City Struct mapping(uint => mapping(address => bool)) public _QRRedeemed; // [CityIndex][Wallet] => If User Has Redeemed QR mapping(uint => mapping(address => uint)) public _QRAllocation; // [CityIndex][Wallet] => Wallet's QR Code Allocation mapping(uint => mapping(uint => address)) public _BrightListCitizen; // [CityIndex][TicketID] => Address Of CryptoCitizen Minting Recipient mapping(uint => mapping(uint => address)) public _BrightListArtist; // [ArtistID][TicketID] => Address Of Artist NFT Recipient mapping(uint => mapping(uint => uint)) public _MintedTokenIDCitizen; // [CityIndex][TicketID] => MintedTokenID mapping(uint => mapping(uint => uint)) public _MintedTokenIDArtist; // [ArtistID][TicketID] => MintedTokenID mapping(uint => mapping(uint => bool)) public _MintedArtist; // [ArtistID][TicketID] => If Minted mapping(uint => mapping(uint => bool)) public _MintedCitizen; // [CityIndex][TicketID] => If Golden Ticket ID Has Minted Or Not mapping(uint => mapping(uint => uint)) public _ArtBlocksProjectID; // [ArtistID][TicketID] => ArtBlocksProjectID mapping(uint => mapping(address => uint)) public _QRsRedeemed; // [CityIndex][Wallet] => Amount Of QRs Redeemed mapping(uint => uint) public AmountRemaining; // [ArtistID] => Mints Remaining mapping(uint => uint) public DailyCalls; // [ElapsedDaysSinceUnixEpoch] => Amount Of Function Calls Today mapping(address => bytes32) public Role; // [Wallet] => BRT Minter Role /*-------------------*/ /* EVENTS */ /*-------------------*/ /** * @dev Emitted When `Redeemer` IRL-mints CryptoCitizen Corresponding To Their Redeemed `TicketID`. **/ event LiveMintComplete(address Redeemer, uint TicketID, uint TokenID); /** * @dev Emitted When `Redeemer` IRL-mints A Artist NFT Corresponding To Their Redeemed `TicketID`. */ event LiveMintCompleteArtist(address Recipient, uint ArtistID, uint TicketID, uint MintedWorkTokenID); /** * @dev Emitted When `Redeemer` Redeems Golden Token Corresponding To `TicketID` **/ event QRRedeemed(address Redeemer, uint TicketID); /** * @dev Emitted When A Contract Is Authorized */ event AuthorizedContract(address NewAddress); /** * @dev Emitted When A Contract Is Deauthorized */ event DeauthorizedContract(address NewAddress); /** * @dev Emitted When A TokenID Is Minted From Marketplace */ event Minted(uint TokenID); /*-------------------*/ /* CONSTRUCTOR */ /*-------------------*/ constructor() { Cities[0]._Name = "CryptoGalacticans"; Cities[1]._Name = "CryptoVenetians"; Cities[2]._Name = "CryptoNewYorkers"; Cities[3]._Name = "CryptoBerliners"; Cities[4]._Name = "CryptoLondoners"; Cities[5]._Name = "CryptoMexas"; Cities[6]._Name = "CryptoTokyites"; Cities[7]._Name = "CryptoPatagonians"; Cities[8]._Name = "CryptoParisians"; Cities[8]._QRCurrentIndex = 999; Cities[8]._RootEligibility = 0x302dc7afac84ccea916b1efa18450e9a52cadd533f1e74d596f541fe8a115905; Cities[8]._RootAmount = 0x4dd20fff095ef5aaf17d6d33b39873402fdc5ff05a0bf8088b2e01fcde3b22ff; Cities[9]._Name = "CryptoVenezians"; Cities[9]._QRCurrentIndex = 1332; Role[msg.sender] = _AUTHORIZED; Role[0xe06F5FAE754e81Bc050215fF89B03d9e9FF20700] = _AUTHORIZED; // `operator.brightmoments.eth` Role[0x18B7511938FBe2EE08ADf3d4A24edB00A5C9B783] = _AUTHORIZED; // `phil.brightmoments.eth` Role[0x91594b5E5d74FCCB3f71674eE74C5F4D44f333D5] = _AUTHORIZED; // `future.brightmoments.eth` Role[0x1A0a3E3AE390a0710f8A6d00587082273eA8F6C9] = _MINTER_ROLE; // BRT Minter #1 Role[0x4d8013b0c264034CBf22De9DF33e22f58D52F207] = _MINTER_ROLE; // BRT Minter #2 Role[0x4D9A8CF2fE52b8D49C7F7EAA87b2886c2bCB4160] = _MINTER_ROLE; // BRT Minter #3 Role[0x124fd966A0D83aA020D3C54AE2c9f4800b46F460] = _MINTER_ROLE; // BRT Minter #4 Role[0x100469feA90Ac1Fe1073E1B2b5c020A8413635c4] = _MINTER_ROLE; // BRT Minter #5 Role[0x756De4236373fd17652b377315954ca327412bBA] = _MINTER_ROLE; // BRT Minter #6 Role[0xc5Dfba6ef7803665C1BDE478B51Bd7eB257A2Cb9] = _MINTER_ROLE; // BRT Minter #7 Role[0xFBF32b29Bcf8fEe32d43a4Bfd3e7249daec457C0] = _MINTER_ROLE; // BRT Minter #8 Role[0xF2A15A83DEE7f03C70936449037d65a1C100FF27] = _MINTER_ROLE; // BRT Minter #9 Role[0x1D2BAB965a4bB72f177Cd641C7BacF3d8257230D] = _MINTER_ROLE; // BRT Minter #10 Role[0x2e51E8b950D72BDf003b58E357C2BA28FB77c7fB] = _MINTER_ROLE; // BRT Minter #11 Role[0x8a7186dECb91Da854090be8226222eA42c5eeCb6] = _MINTER_ROLE; // BRT Minter #12 _transferOwnership(0xe06F5FAE754e81Bc050215fF89B03d9e9FF20700); // `operator.brightmoments.eth` } /*---------------------*/ /* QR REDEMPTION */ /*---------------------*/ /** * @dev Redeems Spot(s) For IRL Minting * @param ProofEligibility Proof For Merkle Eligibility * @param ProofAmounts Proof For Merkle Amounts * @param Vault Address Of Vault For Merkle Eligibility (Delegate.xyz) * @param Amount Amount Of QR Codes To Redeem */ function RedeemQR ( bytes32[] calldata ProofEligibility, bytes32[] calldata ProofAmounts, address Vault, uint Amount ) external nonReentrant { address Recipient = msg.sender; if(Vault != address(0)) { if(IDelegationRegistry(_DN).checkDelegateForAll(msg.sender, Vault)) { Recipient = Vault; } } readQREligibility(Recipient, ProofEligibility, ProofAmounts, Amount); _QRsRedeemed[_CCI][Recipient] += Amount; if(_QRAllocation[_CCI][Recipient] == 0) // User Is Able To Redeem Explicitly 1 QR Code { require(!_QRRedeemed[_CCI][Recipient], "LiveMint: User Has Already Redeemed"); _BrightListCitizen[_CCI][Cities[_CCI]._QRCurrentIndex] = Recipient; emit QRRedeemed(Recipient, Cities[_CCI]._QRCurrentIndex); Cities[_CCI]._QRCurrentIndex++; } else // User Is Able To Redeem More Than 1 QR Code Because Their Allocation Is Greater Than 1 { require ( _QRsRedeemed[_CCI][Recipient] <= _QRAllocation[_CCI][Recipient], "LiveMint: User Has No Remaining Authorized QRs To Redeem" ); uint _CurrentQR = Cities[_CCI]._QRCurrentIndex; uint _Limit = Amount + _CurrentQR; Cities[_CCI]._QRCurrentIndex = _Limit; for(_CurrentQR; _CurrentQR < _Limit; _CurrentQR++) { _BrightListCitizen[_CCI][_CurrentQR] = Recipient; emit QRRedeemed(Recipient, _CurrentQR); } } _QRRedeemed[_CCI][Recipient] = true; } /** * @dev Remote Mints Artist NFTs Via Mint Pass LiveMintBurn * @param ArtistIDs Array Of ArtistIDs To Mint * @param TicketIDs Array Of TicketIDs To Mint */ function RemoteMintArtists(uint[] calldata ArtistIDs, uint[][] calldata TicketIDs) external nonReentrant { require(tx.origin == msg.sender, "LiveMint: msg.sender Must Be EOA"); require(Cities[_CCI]._RemoteMintingEnabledArtists, "LiveMint: Remote Minting Of Artists Not Active"); address Recipient; address MintPass; address Minter; uint ArtBlocksProjectID; uint MintedWorkTokenID; uint TicketID; uint ActiveArtistID; for(uint ArtistIDIndex; ArtistIDIndex < ArtistIDs.length; ArtistIDIndex++) { ActiveArtistID = ArtistIDs[ArtistIDIndex]; MintPass = Artists[ActiveArtistID]._MintPass; Minter = Artists[ActiveArtistID]._Minter; for(uint TicketIDIndex; TicketIDIndex < TicketIDs[ArtistIDIndex].length; TicketIDIndex++) { TicketID = TicketIDs[ArtistIDIndex][TicketIDIndex]; require(!_MintedArtist[ActiveArtistID][TicketID], "LiveMint: Artist Mint Pass Already Minted"); _MintedArtist[ActiveArtistID][TicketID] = true; (Recipient, ArtBlocksProjectID) = IMP(MintPass)._LiveMintBurn(TicketID); require(Recipient == msg.sender, "LiveMint: msg.sender Is Not The Owner Of Input Mint Pass"); MintedWorkTokenID = IMinter(Minter).purchaseTo(Recipient, ArtBlocksProjectID); _MintedTokenIDArtist[ActiveArtistID][TicketID] = MintedWorkTokenID; emit LiveMintCompleteArtist(Recipient, ActiveArtistID, TicketID, MintedWorkTokenID); } } } /** * @dev Remote Mints GoldenTokens For Citizens * @param TicketIDs Array Of TicketIDs To Mint */ function RemoteMintCitizens(uint[] calldata TicketIDs) external nonReentrant { require(tx.origin == msg.sender, "LiveMint: msg.sender Must Be EOA"); require(Cities[_CCI]._RemoteMintingEnabledCitizens, "LiveMint: Remote Minting Of Citizens Not Active"); address Recipient; uint MintedWorkTokenID; for(uint TicketID; TicketID < TicketIDs.length; TicketID++) { require(TicketIDs[TicketID] < 999, "LiveMint: Invalid Input TicketID, Must Be Golden Token"); require(!_MintedCitizen[_CCI][TicketIDs[TicketID]], "LiveMint: Golden Token Already Minted"); _MintedCitizen[_CCI][TicketIDs[TicketID]] = true; Recipient = IGT(_GOLDEN_TOKEN)._LiveMintBurn(TicketIDs[TicketID]); require(Recipient == msg.sender, "LiveMint: msg.sender Is Not Owner Of Golden Token"); MintedWorkTokenID = IMinter(_CITIZEN_MINTER).purchaseTo(Recipient, _CCI); _MintedTokenIDCitizen[_CCI][TicketIDs[TicketID]] = MintedWorkTokenID; emit LiveMintComplete(Recipient, TicketIDs[TicketID], MintedWorkTokenID); } } /*--------------------*/ /* LIVE MINTING */ /*--------------------*/ /** * @dev Batch Mints Verified Users On The Brightlist CryptoCitizens * @param TicketIDs Array Of TicketIDs To Mint * note: { For CryptoCitizen Cities } */ function _LiveMintCitizen(uint[] calldata TicketIDs) external onlyMinter { address Recipient; uint MintedWorkTokenID; for(uint TicketID; TicketID < TicketIDs.length; TicketID++) { require(!_MintedCitizen[_CCI][TicketIDs[TicketID]], "LiveMint: Golden Token Already Minted"); if(_BrightListCitizen[_CCI][TicketIDs[TicketID]] != address(0)) { Recipient = _BrightListCitizen[_CCI][TicketIDs[TicketID]]; } else if (TicketIDs[TicketID] < 999) { Recipient = IGT(_GOLDEN_TOKEN)._LiveMintBurn(TicketIDs[TicketID]); } else { revert("LiveMint: TicketID Is Not Eligible To Mint Citizen"); } require(Recipient != address(0), "LiveMint: Invalid Recipient"); _MintedCitizen[_CCI][TicketIDs[TicketID]] = true; MintedWorkTokenID = IMinter(_CITIZEN_MINTER).purchaseTo(Recipient, _CCI); _MintedTokenIDCitizen[_CCI][TicketIDs[TicketID]] = MintedWorkTokenID; emit LiveMintComplete(Recipient, TicketIDs[TicketID], MintedWorkTokenID); } } /** * @dev Burns Artist Mint Pass In Exchange For The Minted Work * @param ArtistID ArtistID To Mint * @param TicketIDs Array Of TicketIDs To Mint * note: { For Instances Where Multiple Artists Share The Same Mint Pass & Return (Recipient, ArtBlocksProjectID) } */ function _LiveMintArtist(uint ArtistID, uint[] calldata TicketIDs) external onlyMinter { address Recipient; address MintPass = Artists[ArtistID]._MintPass; address Minter = Artists[ArtistID]._Minter; uint ArtBlocksProjectID; uint MintedWorkTokenID; uint TicketID; require(AmountRemaining[ArtistID] > 0, "LiveMint: ArtistID Mint Limit Reached"); require(TicketIDs.length <= AmountRemaining[ArtistID], "LiveMint: TicketID Length Exceeds ArtistID Mint Limit"); AmountRemaining[ArtistID] = AmountRemaining[ArtistID] - TicketIDs.length; for(uint x; x < TicketIDs.length; x++) { TicketID = TicketIDs[x]; require(!_MintedArtist[ArtistID][TicketID], "LiveMint: Artist Mint Pass Already Minted"); _MintedArtist[ArtistID][TicketID] = true; (Recipient, ArtBlocksProjectID) = IMP(MintPass)._LiveMintBurn(TicketID); MintedWorkTokenID = IMinter(Minter).purchaseTo(Recipient, ArtBlocksProjectID); // Pre-Defined Minter Contract _MintedTokenIDArtist[ArtistID][TicketID] = MintedWorkTokenID; emit LiveMintCompleteArtist(Recipient, ArtistID, TicketID, MintedWorkTokenID); } } /** * @dev Burns Artist Mint Pass In Exchange For The Minted Work * @param ArtistIDs Array Of ArtistIDs To Mint * @param TicketIDs 2D-Array Of TicketIDs To Mint * note: { For Instances Where Multiple Artists Share The Same Mint Pass & Return (Recipient, ArtBlocksProjectID) } */ function _LiveMintArtistBatch(uint[] calldata ArtistIDs, uint[][] calldata TicketIDs) external onlyMinter { address Recipient; address MintPass; address Minter; uint ArtBlocksProjectID; uint MintedWorkTokenID; uint TicketID; uint ActiveArtistID; for(uint ArtistIDIndex; ArtistIDIndex < ArtistIDs.length; ArtistIDIndex++) { ActiveArtistID = ArtistIDs[ArtistIDIndex]; MintPass = Artists[ActiveArtistID]._MintPass; Minter = Artists[ActiveArtistID]._Minter; for(uint TicketIDIndex; TicketIDIndex < TicketIDs[ArtistIDIndex].length; TicketIDIndex++) { TicketID = TicketIDs[ArtistIDIndex][TicketIDIndex]; require(!_MintedArtist[ActiveArtistID][TicketID], "LiveMint: Artist Mint Pass Already Minted"); _MintedArtist[ActiveArtistID][TicketID] = true; (Recipient, ArtBlocksProjectID) = IMP(MintPass)._LiveMintBurn(TicketID); MintedWorkTokenID = IMinter(Minter).purchaseTo(Recipient, ArtBlocksProjectID); _MintedTokenIDArtist[ActiveArtistID][TicketID] = MintedWorkTokenID; emit LiveMintCompleteArtist(Recipient, ActiveArtistID, TicketID, MintedWorkTokenID); } } } /** * @dev Mints An Artist Work Directly From Marketplace * @param Recipient Address To Mint To * @param ArtistID ArtistID To Mint * @param Amount Amount To Mint */ function _LiveMintMarketplace(address Recipient, uint ArtistID, uint Amount) external onlyMarketplace { uint _AmountRemaining = AmountRemaining[ArtistID]; require(Amount <= _AmountRemaining, "LiveMint: Not Enough Mints Remaining For Desired ArtistID"); AmountRemaining[ArtistID] = _AmountRemaining - Amount; address _Minter = Artists[ArtistID]._Minter; uint _ABProjectID = Artists[ArtistID]._ArtBlocksProjectID; uint _TokenID; for(uint PurchaseAmt; PurchaseAmt < Amount; PurchaseAmt++) { _TokenID = IMinter(_Minter).purchaseTo(Recipient, _ABProjectID); emit Minted (_TokenID); } } /*-------------------*/ /* OWNER FUNCTIONS */ /*-------------------*/ /** * @dev Initializes A LiveMint Artist */ function __InitLiveMint (Artist memory _Params) external onlyAdmin returns (uint ArtistID) { ArtistID = _UniqueArtistsInvoked; AmountRemaining[ArtistID] = _Params._MaxSupply; Artists[ArtistID] = _Params; _UniqueArtistsInvoked = ArtistID + 1; return ArtistID; } /** * @dev Changes The Current Active Marketplace Address */ function __DelegateQR (address Recipient) external onlyAdmin { require(_QRDelegationsEnabled, "LiveMint: QR Delegations Not Enabled"); uint _DaysElapsed = block.timestamp / 86400; require(DailyCalls[_DaysElapsed] + 1 <= _MaxQRDelegationsPerDay, "LiveMint: Max Per Day Reached"); require(!_QRRedeemed[_CCI][Recipient], "LiveMint: User Has Already Redeemed"); DailyCalls[_DaysElapsed]++; _QRRedeemed[_CCI][Recipient] = true; _BrightListCitizen[_CCI][Cities[_CCI]._QRCurrentIndex] = Recipient; emit QRRedeemed(Recipient, Cities[_CCI]._QRCurrentIndex); Cities[_CCI]._QRCurrentIndex++; } /** * @dev Changes Merkle Root For Citizen LiveMint Eligibility * @param NewRoot The New Merkle Root To Seed */ function __ChangeRootEligibility (bytes32 NewRoot) external onlyAdmin { Cities[_CCI]._RootEligibility = NewRoot; } /** * @dev Changes Merkle Root For Citizen LiveMint Amounts * @param NewRoot The New Merkle Root To Seed */ function __ChangeRootAmounts (bytes32 NewRoot) external onlyAdmin { Cities[_CCI]._RootAmount = NewRoot; } /** * @dev Changes Merkle Root For Artist LiveMints * @param EligibilityRoot The New Merkle Eligibility Root To Seed * @param EligibilityAmount The New Merkle Amount Root To Seed */ function __ChangeRoots (bytes32 EligibilityRoot, bytes32 EligibilityAmount) external onlyAdmin { Cities[_CCI]._RootEligibility = EligibilityRoot; Cities[_CCI]._RootAmount = EligibilityAmount; } /** * @dev Overwrites QR Allocation(s) * @param Addresses Array Of Addresses To Overwrite * @param Amounts Array Of Amounts To Overwrite */ function __QRAllocationsOverwrite (address[] calldata Addresses, uint[] calldata Amounts) external onlyAdmin { require(Addresses.length == Amounts.length, "LiveMint: Input Arrays Must Match"); for(uint x; x < Addresses.length; x++) { _QRAllocation[_CCI][Addresses[x]] = Amounts[x]; } } /** * @dev Increments QR Allocation(s) * @param Addresses Array Of Addresses To Increment * @param Amounts Array Of Amounts To Increment */ function __QRAllocationsIncrement (address[] calldata Addresses, uint[] calldata Amounts) external onlyAdmin { require(Addresses.length == Amounts.length, "LiveMint: Input Arrays Must Match"); for(uint x; x < Addresses.length; x++) { _QRAllocation[_CCI][Addresses[x]] += Amounts[x]; } } /** * @dev Overrides QR To Mint To Multisig * @param TicketIDs Array Of TicketIDs To Override */ function __QRAllocationsSetNoShow (uint[] calldata TicketIDs) external onlyAdmin { for(uint TicketIndex; TicketIndex < TicketIDs.length; TicketIndex++) { require(!_MintedCitizen[_CCI][TicketIDs[TicketIndex]], "LiveMint: Ticket ID Already Minted"); require(TicketIDs[TicketIndex] > 999, "LiveMint: Invalid TicketID"); _BrightListCitizen[_CCI][TicketIDs[TicketIndex]] = _BRT_MULTISIG; } } /*-------------------*/ /* OWNER FUNCTIONS */ /*-------------------*/ /** * @dev Changes Max QR Delegations Per Day */ function __ChangeQRDelegationsEnabled(bool NewState) external onlyOwner { _QRDelegationsEnabled = NewState; } /** * @dev Changes Max QR Delegations Per Day */ function __ChangeMaxPerDay(uint NewMax) external onlyOwner { _MaxQRDelegationsPerDay = NewMax; } /** * @dev Changes The Current Active Marketplace Address * @param NewAddress The New Address To Seed */ function __ChangeMarketplaceAddress(address NewAddress) external onlyOwner { _MARKETPLACE = NewAddress; } /** * @dev Flips Remote Minting State For CryptoCitizens (True or False) */ function __FlipRemoteMintingCitizens() external onlyOwner { Cities[_CCI]._RemoteMintingEnabledCitizens = !Cities[_CCI]._RemoteMintingEnabledCitizens; } /** * @dev Flips Remote Minting State For Artists */ function __FlipRemoteMintingArtists() external onlyOwner { Cities[_CCI]._RemoteMintingEnabledArtists = !Cities[_CCI]._RemoteMintingEnabledArtists; } /** * @dev Flips Remote Minting State For Both Artists & Citizens */ function __FlipRemoteMintingStates() external onlyOwner { Cities[_CCI]._RemoteMintingEnabledArtists = !Cities[_CCI]._RemoteMintingEnabledArtists; Cities[_CCI]._RemoteMintingEnabledCitizens = !Cities[_CCI]._RemoteMintingEnabledCitizens; } /** * @dev Grants Address BRT Minter Role * @param Minter Address To Grant Role * note: BRT Minter Role Is Required To Mint NFTs **/ function __AddMinter(address Minter) external onlyOwner { Role[Minter] = _MINTER_ROLE; } /** * @dev Deactivates Address From BRT Minter Role * @param Minter Address To Remove Role * note: BRT Minter Role Is Required To Mint NFTs **/ function __RemoveMinter(address Minter) external onlyOwner { Role[Minter] = 0x0; } /** * @dev Changes Mint Pass Address For Artist LiveMints * @param ProjectID Artist ProjectID * @param Contract Mint Pass Contract Address * note: Mint Pass Is Burned In Exchange For Minted Work */ function __ChangeMintPass(uint ProjectID, address Contract) external onlyOwner { Artists[ProjectID]._MintPass = Contract; } /** * @dev Changes Minter Address For Artist LiveMints * @param ProjectID Artist ProjectID * @param Contract Minter Contract Address */ function __ChangeMinter(uint ProjectID, address Contract) external onlyOwner { Artists[ProjectID]._Minter = Contract; } /** * @dev Changes QR Current Index * @param NewIndex The Next QR Index To Redeem */ function __ChangeQRIndex(uint NewIndex) external onlyOwner { Cities[_CCI]._QRCurrentIndex = NewIndex; } /** * @dev Instantiates New City * @param Name Name Of City * @param CityIndex CityIndex Of City * @param QRIndex QRIndex Of City * @param RemoteMintingEnabledArtists Remote Minting Enabled For Artists * @param RemoteMintingEnabledCitizens Remote Minting Enabled For Citizens * note: CityIndex Always Corresponds To ArtBlocks ProjectID For CryptoCitizens */ function __NewCity ( string calldata Name, uint CityIndex, uint QRIndex, bool RemoteMintingEnabledArtists, bool RemoteMintingEnabledCitizens ) external onlyOwner { Cities[CityIndex] = City( Name, QRIndex, 0x6942069420694206942069420694206942069420694206942069420694206942, 0x6942069420694206942069420694206942069420694206942069420694206942, RemoteMintingEnabledArtists, RemoteMintingEnabledCitizens ); } /** * @dev Changes The Amount Remaining For An Artist Mint * @param ArtistID ArtistID To Change * @param Amount Amount To Change To */ function __NewAmountRemaining(uint ArtistID, uint Amount) external onlyOwner { AmountRemaining[ArtistID] = Amount; } /** * @dev Instantiates A New City * @param CityIndex CityIndex Of New City * @param NewCity The City Struct */ function __NewCityStruct(uint CityIndex, City memory NewCity) external onlyOwner { Cities[CityIndex] = NewCity; } /** * @dev Returns An Artist Struct * @param ArtistID The ArtistID To Change * @param NewArtist The Artist Struct */ function __NewArtistStruct(uint ArtistID, Artist memory NewArtist) external onlyOwner { Artists[ArtistID] = NewArtist; } /** * @dev Changes The Minter Address For An Artist * @param ArtistID ArtistID To Change * @param Minter New Minter Address */ function __NewArtistMinter(uint ArtistID, address Minter) external onlyOwner { Artists[ArtistID]._Minter = Minter; } /** * @dev Withdraws Any Ether Mistakenly Sent to Contract to Multisig **/ function __WithdrawEther() external onlyOwner { payable(msg.sender).transfer(address(this).balance); } /** * @dev Executes Arbitrary Transaction(s) * @param Targets Array Of Addresses To Execute Transactions On * @param Values Array Of Values To Execute Transactions With * @param Datas Array Of Datas To Execute Transactions With */ function __InitTransaction(address[] memory Targets, uint[] memory Values, bytes[] memory Datas) external onlyOwner { for(uint x; x < Targets.length; x++) { (bool success,) = Targets[x].call{value:(Values[x])}(Datas[x]); require(success, "i have failed u anakin"); } } /** * @dev Authorizes An Address * @param NewAddress Address To Authorize */ function ____AddressAuthorize(address NewAddress) external onlyOwner { Role[NewAddress] = _AUTHORIZED; emit AuthorizedContract(NewAddress); } /** * @dev Deauthorizes An Address * @param NewAddress Address To Deauthorize */ function ____AddressDeauthorize(address NewAddress) external onlyOwner { Role[NewAddress] = 0x0; emit DeauthorizedContract(NewAddress); } /*-------------------*/ /* PUBLIC VIEW */ /*-------------------*/ /** * @dev Returns A User's QR Allocation Amount, Or 0 If Not Eligible */ function readEligibility ( address Recipient, bytes32[] memory Proof, bytes32[] memory ProofAmount, uint Amount ) public view returns (uint ) { bool Eligible = readQREligibility(Recipient, Proof, ProofAmount, Amount); uint Allocation = _QRAllocation[_CCI][Recipient]; uint AmountRedeemed = _QRsRedeemed[_CCI][Recipient]; if(Eligible && Allocation > AmountRedeemed) { return Allocation - AmountRedeemed; } else if (Eligible && Allocation == 0 && AmountRedeemed == 0) { return 1; } else { return 0; } } /** * @dev Returns If User Is Eligible To Redeem QR Code */ function readQREligibility ( address Recipient, bytes32[] memory ProofEligibility, bytes32[] memory ProofAmount, uint Amount ) public view returns (bool) { require(Amount > 0, "LiveMint: QR Redemption Amount Must Be > 0"); bytes32 Leaf = keccak256(abi.encodePacked(Recipient)); bytes32 LeafAmount = keccak256(abi.encodePacked(Recipient, Amount)); require(MerkleProof.verify(ProofEligibility, Cities[_CCI]._RootEligibility, Leaf), "LiveMint: Invalid Merkle Eligibility Proof"); require(MerkleProof.verify(ProofAmount, Cities[_CCI]._RootAmount, LeafAmount), "LiveMint: Invalid Merkle Amount Proof"); return true; } /** * @dev Returns How Many QR Codes A User Has Redeemed */ function readAmountRedeemed(address Recipient) public view returns(uint) { return _QRsRedeemed[_CCI][Recipient]; } /** * @dev Returns An Array Of Unminted Golden Tokens */ function readCitizenUnmintedTicketIDs() public view returns(uint[] memory) { uint[] memory UnmintedTokenIDs = new uint[](1000); uint Counter; uint CityIDBuffer = _CCI % 6 * 333; uint _TokenID; for(uint TokenID; TokenID < 1000; TokenID++) { _TokenID = TokenID + CityIDBuffer; if ( (!_MintedCitizen[_CCI][_TokenID] && _BrightListCitizen[_CCI][_TokenID] != address(0)) || (!_MintedCitizen[_CCI][_TokenID] && _TokenID < 999) ) { UnmintedTokenIDs[Counter] = _TokenID; Counter++; } } uint[] memory FormattedUnMintedTokenIDs = new uint[](Counter); for(uint Index; Index < Counter; Index++) { FormattedUnMintedTokenIDs[Index] = UnmintedTokenIDs[Index]; } return FormattedUnMintedTokenIDs; } /** * @dev Returns An Array Of Unminted Golden Tokens */ function readCitizenMintedTicketIDs(uint CityID) public view returns(uint[] memory) { uint[] memory MintedTokenIDs = new uint[](1000); uint Counter; uint CityIDBuffer = (CityID % 6) * 333; uint _TicketID; for(uint TicketID; TicketID < 1000; TicketID++) { _TicketID = TicketID + CityIDBuffer; if(_MintedCitizen[CityID][_TicketID]) { MintedTokenIDs[Counter] = _TicketID; Counter++; } } uint[] memory FormattedMintedTokenIDs = new uint[](Counter); uint Found; for(uint FormattedTokenID; FormattedTokenID < Counter; FormattedTokenID++) { if(MintedTokenIDs[FormattedTokenID] != 0 || (MintedTokenIDs[FormattedTokenID] == 0 && FormattedTokenID == 0)) { FormattedMintedTokenIDs[Found] = MintedTokenIDs[FormattedTokenID]; Found++; } } return FormattedMintedTokenIDs; } /** * @dev Returns A 2d Array Of Checked In & Unminted TicketIDs Awaiting A Mint */ function readCitizenCheckedInTicketIDs() public view returns(uint[] memory TokenIDs) { uint[] memory _TokenIDs = new uint[](1000); uint CityIDBuffer = (_CCI % 6) * 333; uint _TicketID; uint Counter; for(uint TicketID; TicketID < 1000; TicketID++) { _TicketID = TicketID + CityIDBuffer; if( !_MintedCitizen[_CCI][_TicketID] && _BrightListCitizen[_CCI][_TicketID] != address(0) ) { _TokenIDs[Counter] = _TicketID; Counter++; } } uint[] memory FormattedCheckedInTickets = new uint[](Counter); uint Found; for(uint x; x < Counter; x++) { if(_TokenIDs[x] != 0 || (_TokenIDs[x] == 0 && x == 0)) { FormattedCheckedInTickets[Found] = _TokenIDs[x]; Found++; } } return FormattedCheckedInTickets; } /** * @dev Returns A 2d Array Of Minted ArtistIDs */ function readArtistUnmintedTicketIDs(uint[] calldata ArtistIDs, uint Range) public view returns(uint[][] memory TokenIDs) { uint[][] memory _TokenIDs = new uint[][](ArtistIDs.length); uint Index; for(uint ArtistID; ArtistID < ArtistIDs.length; ArtistID++) { uint[] memory UnmintedArtistTokenIDs = new uint[](Range); uint Counter; for(uint TokenID; TokenID < Range; TokenID++) { if(!_MintedArtist[ArtistIDs[ArtistID]][TokenID]) { UnmintedArtistTokenIDs[Counter] = TokenID; Counter++; } } uint[] memory FormattedUnMintedArtistIDs = new uint[](Counter); uint Found; for(uint x; x < Counter; x++) { if(UnmintedArtistTokenIDs[x] != 0 || (UnmintedArtistTokenIDs[x] == 0 && x == 0)) { FormattedUnMintedArtistIDs[Found] = UnmintedArtistTokenIDs[x]; Found++; } } _TokenIDs[Index] = FormattedUnMintedArtistIDs; Index++; } return (_TokenIDs); } /** * @dev Returns A 2d Array Of Minted ArtistIDs */ function readArtistMintedTicketIDs(uint[] calldata ArtistIDs, uint Range) public view returns(uint[][] memory TokenIDs) { uint[][] memory _TokenIDs = new uint[][](ArtistIDs.length); uint Index; for(uint ArtistID; ArtistID < ArtistIDs.length; ArtistID++) { uint[] memory MintedTokenIDs = new uint[](Range); uint Counter; for(uint TokenID; TokenID < Range; TokenID++) { if(_MintedArtist[ArtistIDs[ArtistID]][TokenID]) { MintedTokenIDs[Counter] = TokenID; Counter++; } } uint[] memory FormattedMintedTokenIDs = new uint[](Counter); uint Found; for(uint x; x < Counter; x++) { if(MintedTokenIDs[x] != 0 || (MintedTokenIDs[x] == 0 && x == 0)) { FormattedMintedTokenIDs[Found] = MintedTokenIDs[x]; Found++; } } _TokenIDs[Index] = FormattedMintedTokenIDs; Index++; } return (_TokenIDs); } /** * @dev Returns Original Recipients Of CryptoCitizens */ function readCitizenBrightList(uint CityIndex) public view returns(address[] memory Recipients) { address[] memory _Recipients = new address[](1000); uint Start = (CityIndex % 6) * 333; for(uint x; x < 1000; x++) { _Recipients[x] = _BrightListCitizen[CityIndex][Start+x]; } return _Recipients; } /** * @dev Returns Original Recipient Of Artist NFTs */ function readArtistBrightList(uint ArtistID, uint Range) public view returns(address[] memory Recipients) { address[] memory _Recipients = new address[](Range); for(uint x; x < Range; x++) { _Recipients[x] = _BrightListArtist[ArtistID][x]; } return _Recipients; } /** * @dev Returns The City Struct At Index Of `CityIndex` */ function readCitizenCity(uint CityIndex) public view returns(City memory) { return Cities[CityIndex]; } /** * @dev Returns The Artist Struct At Index Of `ArtistID` */ function readArtist(uint ArtistID) public view returns(Artist memory) { return Artists[ArtistID]; } /** * @dev Returns A Minted Work TokenID Corresponding To The Input Artist TicketID */ function readArtistMintedTokenID(uint ArtistID, uint TicketID) external view returns (uint) { if(!_MintedArtist[ArtistID][TicketID]) { return 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff; } else { return _MintedTokenIDArtist[ArtistID][TicketID]; } } /** * @dev Returns A Minted Citizen TokenID Corresponding To Input TicketID */ function readCitizenMintedTokenID(uint CityIndex, uint TicketID) external view returns(uint) { if(!_MintedCitizen[CityIndex][TicketID]) { return type(uint).max; } else { return _MintedTokenIDCitizen[CityIndex][TicketID]; } } /*-------------------------*/ /* ACCESS MODIFIERS */ /*-------------------------*/ /** * @dev Access Modifier That Allows Only BrightListed BRT Minters **/ modifier onlyMinter() { require(Role[msg.sender] == _MINTER_ROLE, "LiveMint | onlyMinter | Caller Is Not Approved BRT Minter"); _; } /** * @dev Access Modifier That Allows Only Authorized Contracts */ modifier onlyAdmin() { require(Role[msg.sender] == _AUTHORIZED || msg.sender == owner(), "LiveMint | onlyAdmin | Caller Is Not Approved Admin"); _; } /** * @dev onlyMarketplace Access Modifier */ modifier onlyMarketplace { require(_MARKETPLACE == msg.sender, "LiveMint | onlyMarketplace | Caller Is Not Marketplace"); _; } } /** * @dev Interface For Delegate.cash */ interface IDelegationRegistry { /** * @dev Checks If A Vault Has Delegated To The Delegate */ function checkDelegateForAll(address delegate, address delegator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.2) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. * OpenZeppelin's JavaScript library generates merkle trees that are safe * against this attack out of the box. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 proofLen = proof.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proofLen - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]) : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { require(proofPos == proofLen, "MerkleProof: invalid multiproof"); unchecked { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 proofLen = proof.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proofLen - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]) : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { require(proofPos == proofLen, "MerkleProof: invalid multiproof"); unchecked { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: MIT /** * @dev @brougkr */ pragma solidity 0.8.19; interface IGT { /** * @dev { Golden Token Burn } */ function _LiveMintBurn(uint TicketID) external returns (address Recipient); }
// SPDX-License-Identifier: MIT /** * @title IMinter Minter Interface * @author @brougkr */ pragma solidity ^0.8.19; interface IMinter { function purchase(uint256 _projectId) payable external returns (uint tokenID); // Custom function purchaseTo(address _to, uint _projectId) payable external returns (uint tokenID); // ArtBlocks Standard Minter // function purchaseTo(address _to) external returns (uint tokenID); // Custom // function purchaseTo(address _to, uint _projectId, address _ownedNFTAddress, uint _ownedNFTTokenID) payable external returns (uint tokenID); // ArtBlocks PolyMinter function tokenURI(uint256 _tokenId) external view returns (string memory); function _MintToFactory(uint ProjectID, address To, uint Amount) external; // MintPassFactory function _MintToFactory(address To, uint Amount) external; // MintPassBespoke }
// SPDX-License-Identifier: MIT /** * @dev @brougkr */ pragma solidity 0.8.19; interface IMP { /** * @dev { For Instances Where Golden Token Or Artists Have A Bespoke Mint Pass Contract } */ function _LiveMintBurn(uint TicketID) external returns (address Recipient, uint ArtistID); }
{ "viaIR": true, "optimizer": { "enabled": true, "runs": 10000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"NewAddress","type":"address"}],"name":"AuthorizedContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"NewAddress","type":"address"}],"name":"DeauthorizedContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"Redeemer","type":"address"},{"indexed":false,"internalType":"uint256","name":"TicketID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"TokenID","type":"uint256"}],"name":"LiveMintComplete","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"Recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"ArtistID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"TicketID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"MintedWorkTokenID","type":"uint256"}],"name":"LiveMintCompleteArtist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"TokenID","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"Redeemer","type":"address"},{"indexed":false,"internalType":"uint256","name":"TicketID","type":"uint256"}],"name":"QRRedeemed","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"AmountRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"Artists","outputs":[{"internalType":"address","name":"_MintPass","type":"address"},{"internalType":"address","name":"_Minter","type":"address"},{"internalType":"address","name":"_AlternateMinter","type":"address"},{"internalType":"uint256","name":"_MaxSupply","type":"uint256"},{"internalType":"uint256","name":"_ArtBlocksProjectID","type":"uint256"},{"internalType":"uint256","name":"_PolyStart","type":"uint256"},{"internalType":"uint256","name":"_PolyEnd","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"Cities","outputs":[{"internalType":"string","name":"_Name","type":"string"},{"internalType":"uint256","name":"_QRCurrentIndex","type":"uint256"},{"internalType":"bytes32","name":"_RootEligibility","type":"bytes32"},{"internalType":"bytes32","name":"_RootAmount","type":"bytes32"},{"internalType":"bool","name":"_RemoteMintingEnabledArtists","type":"bool"},{"internalType":"bool","name":"_RemoteMintingEnabledCitizens","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"DailyCalls","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"ProofEligibility","type":"bytes32[]"},{"internalType":"bytes32[]","name":"ProofAmounts","type":"bytes32[]"},{"internalType":"address","name":"Vault","type":"address"},{"internalType":"uint256","name":"Amount","type":"uint256"}],"name":"RedeemQR","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ArtistIDs","type":"uint256[]"},{"internalType":"uint256[][]","name":"TicketIDs","type":"uint256[][]"}],"name":"RemoteMintArtists","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"TicketIDs","type":"uint256[]"}],"name":"RemoteMintCitizens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"Role","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"_ArtBlocksProjectID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"_BrightListArtist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"_BrightListCitizen","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"ArtistID","type":"uint256"},{"internalType":"uint256[]","name":"TicketIDs","type":"uint256[]"}],"name":"_LiveMintArtist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ArtistIDs","type":"uint256[]"},{"internalType":"uint256[][]","name":"TicketIDs","type":"uint256[][]"}],"name":"_LiveMintArtistBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"TicketIDs","type":"uint256[]"}],"name":"_LiveMintCitizen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"Recipient","type":"address"},{"internalType":"uint256","name":"ArtistID","type":"uint256"},{"internalType":"uint256","name":"Amount","type":"uint256"}],"name":"_LiveMintMarketplace","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_MARKETPLACE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_MaxQRDelegationsPerDay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"_MintedArtist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"_MintedCitizen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"_MintedTokenIDArtist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"_MintedTokenIDCitizen","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"_QRAllocation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_QRDelegationsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"_QRRedeemed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"_QRsRedeemed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_UniqueArtistsInvoked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"Minter","type":"address"}],"name":"__AddMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"NewAddress","type":"address"}],"name":"__ChangeMarketplaceAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"NewMax","type":"uint256"}],"name":"__ChangeMaxPerDay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ProjectID","type":"uint256"},{"internalType":"address","name":"Contract","type":"address"}],"name":"__ChangeMintPass","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ProjectID","type":"uint256"},{"internalType":"address","name":"Contract","type":"address"}],"name":"__ChangeMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"NewState","type":"bool"}],"name":"__ChangeQRDelegationsEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"NewIndex","type":"uint256"}],"name":"__ChangeQRIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"NewRoot","type":"bytes32"}],"name":"__ChangeRootAmounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"NewRoot","type":"bytes32"}],"name":"__ChangeRootEligibility","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"EligibilityRoot","type":"bytes32"},{"internalType":"bytes32","name":"EligibilityAmount","type":"bytes32"}],"name":"__ChangeRoots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"Recipient","type":"address"}],"name":"__DelegateQR","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"__FlipRemoteMintingArtists","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"__FlipRemoteMintingCitizens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"__FlipRemoteMintingStates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"_MintPass","type":"address"},{"internalType":"address","name":"_Minter","type":"address"},{"internalType":"address","name":"_AlternateMinter","type":"address"},{"internalType":"uint256","name":"_MaxSupply","type":"uint256"},{"internalType":"uint256","name":"_ArtBlocksProjectID","type":"uint256"},{"internalType":"uint256","name":"_PolyStart","type":"uint256"},{"internalType":"uint256","name":"_PolyEnd","type":"uint256"}],"internalType":"struct LiveMintParis.Artist","name":"_Params","type":"tuple"}],"name":"__InitLiveMint","outputs":[{"internalType":"uint256","name":"ArtistID","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"Targets","type":"address[]"},{"internalType":"uint256[]","name":"Values","type":"uint256[]"},{"internalType":"bytes[]","name":"Datas","type":"bytes[]"}],"name":"__InitTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ArtistID","type":"uint256"},{"internalType":"uint256","name":"Amount","type":"uint256"}],"name":"__NewAmountRemaining","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ArtistID","type":"uint256"},{"internalType":"address","name":"Minter","type":"address"}],"name":"__NewArtistMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ArtistID","type":"uint256"},{"components":[{"internalType":"address","name":"_MintPass","type":"address"},{"internalType":"address","name":"_Minter","type":"address"},{"internalType":"address","name":"_AlternateMinter","type":"address"},{"internalType":"uint256","name":"_MaxSupply","type":"uint256"},{"internalType":"uint256","name":"_ArtBlocksProjectID","type":"uint256"},{"internalType":"uint256","name":"_PolyStart","type":"uint256"},{"internalType":"uint256","name":"_PolyEnd","type":"uint256"}],"internalType":"struct LiveMintParis.Artist","name":"NewArtist","type":"tuple"}],"name":"__NewArtistStruct","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"Name","type":"string"},{"internalType":"uint256","name":"CityIndex","type":"uint256"},{"internalType":"uint256","name":"QRIndex","type":"uint256"},{"internalType":"bool","name":"RemoteMintingEnabledArtists","type":"bool"},{"internalType":"bool","name":"RemoteMintingEnabledCitizens","type":"bool"}],"name":"__NewCity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"CityIndex","type":"uint256"},{"components":[{"internalType":"string","name":"_Name","type":"string"},{"internalType":"uint256","name":"_QRCurrentIndex","type":"uint256"},{"internalType":"bytes32","name":"_RootEligibility","type":"bytes32"},{"internalType":"bytes32","name":"_RootAmount","type":"bytes32"},{"internalType":"bool","name":"_RemoteMintingEnabledArtists","type":"bool"},{"internalType":"bool","name":"_RemoteMintingEnabledCitizens","type":"bool"}],"internalType":"struct LiveMintParis.City","name":"NewCity","type":"tuple"}],"name":"__NewCityStruct","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"Addresses","type":"address[]"},{"internalType":"uint256[]","name":"Amounts","type":"uint256[]"}],"name":"__QRAllocationsIncrement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"Addresses","type":"address[]"},{"internalType":"uint256[]","name":"Amounts","type":"uint256[]"}],"name":"__QRAllocationsOverwrite","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"TicketIDs","type":"uint256[]"}],"name":"__QRAllocationsSetNoShow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"Minter","type":"address"}],"name":"__RemoveMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"__WithdrawEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"NewAddress","type":"address"}],"name":"____AddressAuthorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"NewAddress","type":"address"}],"name":"____AddressDeauthorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"Recipient","type":"address"}],"name":"readAmountRedeemed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"ArtistID","type":"uint256"}],"name":"readArtist","outputs":[{"components":[{"internalType":"address","name":"_MintPass","type":"address"},{"internalType":"address","name":"_Minter","type":"address"},{"internalType":"address","name":"_AlternateMinter","type":"address"},{"internalType":"uint256","name":"_MaxSupply","type":"uint256"},{"internalType":"uint256","name":"_ArtBlocksProjectID","type":"uint256"},{"internalType":"uint256","name":"_PolyStart","type":"uint256"},{"internalType":"uint256","name":"_PolyEnd","type":"uint256"}],"internalType":"struct LiveMintParis.Artist","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"ArtistID","type":"uint256"},{"internalType":"uint256","name":"Range","type":"uint256"}],"name":"readArtistBrightList","outputs":[{"internalType":"address[]","name":"Recipients","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ArtistIDs","type":"uint256[]"},{"internalType":"uint256","name":"Range","type":"uint256"}],"name":"readArtistMintedTicketIDs","outputs":[{"internalType":"uint256[][]","name":"TokenIDs","type":"uint256[][]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"ArtistID","type":"uint256"},{"internalType":"uint256","name":"TicketID","type":"uint256"}],"name":"readArtistMintedTokenID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ArtistIDs","type":"uint256[]"},{"internalType":"uint256","name":"Range","type":"uint256"}],"name":"readArtistUnmintedTicketIDs","outputs":[{"internalType":"uint256[][]","name":"TokenIDs","type":"uint256[][]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"CityIndex","type":"uint256"}],"name":"readCitizenBrightList","outputs":[{"internalType":"address[]","name":"Recipients","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"readCitizenCheckedInTicketIDs","outputs":[{"internalType":"uint256[]","name":"TokenIDs","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"CityIndex","type":"uint256"}],"name":"readCitizenCity","outputs":[{"components":[{"internalType":"string","name":"_Name","type":"string"},{"internalType":"uint256","name":"_QRCurrentIndex","type":"uint256"},{"internalType":"bytes32","name":"_RootEligibility","type":"bytes32"},{"internalType":"bytes32","name":"_RootAmount","type":"bytes32"},{"internalType":"bool","name":"_RemoteMintingEnabledArtists","type":"bool"},{"internalType":"bool","name":"_RemoteMintingEnabledCitizens","type":"bool"}],"internalType":"struct LiveMintParis.City","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"CityID","type":"uint256"}],"name":"readCitizenMintedTicketIDs","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"CityIndex","type":"uint256"},{"internalType":"uint256","name":"TicketID","type":"uint256"}],"name":"readCitizenMintedTokenID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"readCitizenUnmintedTicketIDs","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"Recipient","type":"address"},{"internalType":"bytes32[]","name":"Proof","type":"bytes32[]"},{"internalType":"bytes32[]","name":"ProofAmount","type":"bytes32[]"},{"internalType":"uint256","name":"Amount","type":"uint256"}],"name":"readEligibility","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"Recipient","type":"address"},{"internalType":"bytes32[]","name":"ProofEligibility","type":"bytes32[]"},{"internalType":"bytes32[]","name":"ProofAmount","type":"bytes32[]"},{"internalType":"uint256","name":"Amount","type":"uint256"}],"name":"readQREligibility","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60406080815234620004da5760008054336001600160a01b03198083168217845592917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0916001600160a01b03918216838580a360146001808055600a6004558060ff196005541617600555848052610534600791602092808452898820620000946200008d8254620004df565b826200051c565b60227043727970746f47616c6163746963616e7360781b019055818852808452898820620000c76200008d8254620004df565b601e6e43727970746f56656e657469616e7360881b01905560028852808452898820620000f96200008d8254620004df565b846f43727970746f4e6577596f726b65727360801b019055600388528084528988206200012b6200008d8254620004df565b601e6e43727970746f4265726c696e65727360881b019055600488528084528988206200015d6200008d8254620004df565b601e6e43727970746f4c6f6e646f6e65727360881b019055600588528084528988206200018f6200008d8254620004df565b60166a43727970746f4d6578617360a81b01905560068852808452898820620001bd6200008d8254620004df565b601c6d43727970746f546f6b796974657360901b019055808852808452898820620001ed6200008d8254620004df565b60227043727970746f50617461676f6e69616e7360781b01905560088852808452898820620002216200008d8254620004df565b601e6e43727970746f506172697369616e7360881b019055600888528084527f4dd20fff095ef5aaf17d6d33b39873402fdc5ff05a0bf8088b2e01fcde3b22ff60038b8a206103e7858201557f302dc7afac84ccea916b1efa18450e9a52cadd533f1e74d596f541fe8a1159056002820155015560098852898820620002ac6200008d8254620004df565b601e6e43727970746f56656e657a69616e7360881b0190556009885283528887200155338552527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff60793848685205573e06f5fae754e81bc050215ff89b03d9e9ff207009485855280878620557318b7511938fbe2ee08adf3d4a24edb00a5c9b783855280878620557391594b5e5d74fccb3f71674ee74c5f4d44f333d5855286852055731a0a3e3ae390a0710f8a6d00587082273ea8f6c984527f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a68087862055734d8013b0c264034cbf22de9df33e22f58d52f20785528087862055734d9a8cf2fe52b8d49c7f7eaa87b2886c2bcb41608552808786205573124fd966a0d83aa020d3c54ae2c9f4800b46f4608552808786205573100469fea90ac1fe1073e1b2b5c020a8413635c48552808786205573756de4236373fd17652b377315954ca327412bba8552808786205573c5dfba6ef7803665c1bde478b51bd7eb257a2cb98552808786205573fbf32b29bcf8fee32d43a4bfd3e7249daec457c08552808786205573f2a15a83dee7f03c70936449037d65a1c100ff2785528087862055731d2bab965a4bb72f177cd641c7bacf3d8257230d85528087862055732e51e8b950d72bdf003b58e357c2ba28fb77c7fb85528087862055738a7186decb91da854090be8226222ea42c5eecb6855286852055848454918216178455169180a351614ffd9081620005578239f35b600080fd5b90600182811c9216801562000511575b6020831014620004fb57565b634e487b7160e01b600052602260045260246000fd5b91607f1691620004ef565b601f821162000529575050565b6000908152601f60208220920160051c8201915b8281106200054a57505050565b8181556001016200053d56fe6080604052600436101561001257600080fd5b60e0600035811c9081630356fb7214614127578163070e1119146140c05781631b18ed3914613d335781631f099fea14613d075781632165f39914613ca957816322c08d8914613c8357816322f0409914613c5057816325709be214613c24578163260df27714613801578163273c42ca146137c95781632cc2bb601461367d578163324f4cdd146133fb578163326141f71461339f57816335388966146131085781633a49a7b9146130a35781633a7ce968146130675781633be4c93914612fef5781633fceb9e214612fce578163401202c114612fa7578163401e994d14612eb65781634090b2a414612d65578163463ef6d914612cc957816349e9e8bd14612cad5781634c644a6e14612c7a5781634f4feff9146128e5578163525a330e1461288d57816354d6e36c1461285257816358c47362146128165781635de87228146127c857816360c92f2f146127475781636216091a146124ef5781636c7eba5f146121535781636dfd5a8c14611f5e578163715018a614611eed5781637328fcca14611eb55781637f220f4714611cb25781638429228714611c6957816388d3376714611bd55781638c024a5114611b8c5781638da5cb5b14611b6557816391f2b07814611a985781639366ca6b14611a135781639a973fd4146119f55781639adf3f95146119dc5781639cd90e11146118b15781639f55aac41461184a578163a0cad2111461176c578163a6a09bbe14611732578163abe0a8d314611714578163ae556f9a14611690578163b1e3b1d114611656578163b2a5249a14611511578163b35fadc2146112f5578163b5a9b3e9146110e1578163b6f2bc9c146112d2578163b95247ab14611288578163befe160a1461114b578163c39aee57146110e1578163c873016414610ff1578163d1a9045514610fc7578163d4322d7d14610f8d578163d605aeb714610f35578163d90afeb114610f02578163dc4a42b214610ee1578163e14826b214610d7b578163e74e77da14610cdf578163ebb1708e14610c36578163f29601ac146109b8578163f2fde38b146108c8578163f33229681461072f575063f42ab95d1461032c57600080fd5b346105a3576020806003193601126105a35760043567ffffffffffffffff81116105a35761035e903690600401614242565b90916103686147b9565b61037333321461480e565b600892836000526007825260ff9283600460406000200154861c16156106c55760005b8181106103a35760018055005b6103e76103b1828486614859565b35101561065b5785600052600f80855260406000206103d1838587614859565b3560005285526103e886604060002054161561499d565b86600052845260406000206103fe828486614859565b3560005284526040600020600160ff1982541617905561041f818385614859565b3590604051917f6d325d310000000000000000000000000000000000000000000000000000000083526004830152602485838281600073985e1932ffd2aa4bc9ce611dfe12816a248cd2ce5af19283156105af57600093610624575b506001600160a01b038316903382036105bb578890604051927f891407c000000000000000000000000000000000000000000000000000000000845260048401528201528581604481600073dd06d8483868cd0c5e69c24eeaa2a5f2beafd42b5af19081156105af5760009161057b575b507ff8c49ca221d1df5614d0b0cb321288da61168d6c3a7dc52686e4190b4abe9d4b906105769389600052600c8852604060002061052b85888a614859565b3560005288528160406000205561056e61054685888a614859565b3592604051938493846040919493926001600160a01b03606083019616825260208201520152565b0390a1614739565b610396565b90508581813d83116105a8575b61059281836142f4565b810103126105a357516105766104ec565b600080fd5b503d610588565b6040513d6000823e3d90fd5b8660316084926040519262461bcd60e51b845260048401528201527f4c6976654d696e743a206d73672e73656e646572204973204e6f74204f776e6560448201527f72204f6620476f6c64656e20546f6b656e0000000000000000000000000000006064820152fd5b9092508581813d8311610654575b61063c81836142f4565b810103126105a35761064d9061496c565b913861047b565b503d610632565b6084846040519062461bcd60e51b82526004820152603660248201527f4c6976654d696e743a20496e76616c696420496e707574205469636b6574494460448201527f2c204d75737420426520476f6c64656e20546f6b656e000000000000000000006064820152fd5b6084836040519062461bcd60e51b82526004820152602f60248201527f4c6976654d696e743a2052656d6f7465204d696e74696e67204f66204369746960448201527f7a656e73204e6f742041637469766500000000000000000000000000000000006064820152fd5b346105a3576003193601126105a35760405161074a816142bb565b6001600160a01b039060043582811681036105a357815260243582811681036105a357602082019081526044359083821682036105a357600691604084019081526060840160643581526080850190608435825260a086019260a435845260c087019460c43586523360005260146020527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff6076040600020541480156108bb575b6107f390614a8c565b6003549883518a600052601260205260406000205587602052806040600020995116917fffffffffffffffffffffffff000000000000000000000000000000000000000092838b5416178a558160018b0191511683825416179055600289019251169082541617905551600386015551600485015551600584015551910155600181019081811161088c57602091600355604051908152f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50600054891633146107ea565b346105a35760206003193601126105a3576108e1614273565b6108e96146c5565b6001600160a01b0380911690811561094e57600054827fffffffffffffffffffffffff0000000000000000000000000000000000000000821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b608460405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b346105a3576003196040813601126105a35760243567ffffffffffffffff918282116105a35760c09082360301126105a357604051916109f78361429f565b81600401358181116105a3578201366023820112156105a357610a249036906024600482013591016144d4565b835260209081840160248401358152604085019060448501358252606086019260648601358452610a6a60a4610a5c6084890161450b565b9760808a019889520161450b565b9460a08801958652610a7a6146c5565b60043560005260078152604060002097518051928311610c0757610a9e8954614518565b601f8111610bc1575b5081601f8411600114610b4c57509282610b0b969360049693610b3f9b96600092610b41575b50506000198260011b9260031b1c19161784555b5160018401555160028301555160038201550192511515839060ff60ff1983541691151516179055565b5181547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690151560081b61ff0016179055565b005b015190508b80610acd565b9190601f1984168a60005283600020936000905b828210610ba95750509360049693610b3f9b969360019383610b0b9b9810610b90575b505050811b018455610ae1565b015160001960f88460031b161c191690558b8080610b83565b80600186978294978701518155019601940190610b60565b8960005282600020601f850160051c810191848610610bfd575b601f0160051c01905b818110610bf15750610aa7565b60008155600101610be4565b9091508190610bdb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b346105a3576020806003193601126105a35760405190600435610c58836142d7565b6103e891828452617d00368286013761014d600683068181029391811591850414171561088c5760005b848110610c9b5760405180610c9788826141fe565b0390f35b610cda9082600052600a84526040600020610cb6828761472c565b60005284526001600160a01b0360406000205416610cd48289614b82565b52614739565b610c82565b346105a35760206003193601126105a3573360005260146020527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff607604060002054148015610d62575b610d3190614a8c565b600860005260076020526004357f4b1bf46c9f1bd48ff8274d40bad76a6615cb6c59a637d451a3994194b2db86c055005b50610d316001600160a01b036000541633149050610d28565b346105a357610d8936614612565b610d94829392614ef0565b91600090815b858310610daf5760405180610c978782614645565b610db884614ebf565b60009060005b868110610e755750610dcf82614ebf565b916000805b828110610e0e575050505081610e0291610df1610e089489614b82565b52610dfc8188614b82565b50614739565b92614739565b91610d9a565b610e188185614b82565b5115801590610e5a575b610e35575b610e3090614739565b610dd4565b90610e52610e3091610e478487614b82565b51610cd48289614b82565b919050610e27565b50610e658185614b82565b51158015610e2257508015610e22565b610e8a868a87949b95979a989a999699614859565b356000526020600e8152604060002090826000525260ff60406000205416610ec6575b610eb690614739565b9790939197969496959295610dbe565b93610ed98186610cd4610eb6948d614b82565b949050610ead565b346105a3576020610efa610ef4366141e8565b90614f80565b604051908152f35b346105a357610f10366141e8565b90600052600c6020526040600020906000526020526020604060002054604051908152f35b346105a35760006003193601126105a357610f4e6146c5565b600860005260076020527f4b1bf46c9f1bd48ff8274d40bad76a6615cb6c59a637d451a3994194b2db86c2805460ff818116151660ff19909116179055005b346105a35760206003193601126105a3576001600160a01b03610fae614273565b1660005260146020526020604060002054604051908152f35b346105a357610fd5366141e8565b90610fde6146c5565b6000526012602052604060002055600080f35b346105a35760206003193601126105a357600060c0604051611012816142bb565b8281528260208201528260408201528260608201528260808201528260a0820152015260043560005260066020526040600020604051611051816142bb565b6001600160a01b0391828154169283835280600183015416906020840191825280600284015416906040850191825260038401549160608601928352816004860154946080880195865260c0600660058901549860a08b01998a520154980197885260405198895251166020880152511660408601525160608501525160808401525160a08301525160c0820152f35b346105a35760406003193601126105a357610b3f6110fd614289565b6111056146c5565b60043560005260066020526001600160a01b03600160406000200191167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b346105a3576020806003193601126105a3576040519060043561116d836142d7565b6103e8808452617d00368486013760009161014d6006820681810291811591830414171561088c5760005b83811061123457505050506111ac81614ebf565b9260009060005b8381106111cd5760405185815280610c97818801896143f9565b6111d78183614b82565b5115801590611219575b6111f4575b6111ef90614739565b6111b3565b916112116111ef916112068585614b82565b51610cd4828a614b82565b9290506111e6565b506112248183614b82565b511580156111e1575080156111e1565b61123e828261472c565b83600052600f8752604060002081600052875260ff6040600020541661126e575b5061126990614739565b611198565b8561128191610cd461126994988b614b82565b949061125f565b346105a35760206003193601126105a3576112a16146c5565b600860005260076020526004357f4b1bf46c9f1bd48ff8274d40bad76a6615cb6c59a637d451a3994194b2db86bf55005b346105a35760006003193601126105a357602060ff600554166040519015158152f35b346105a35760606003193601126105a35761130e614273565b60243590604435906001600160a01b0390816002541633036114a757836000526020936012855260406000205480851161143d578461134c91614a7f565b906000526012855260406000205560068452600460406000209260018401541692015460005b84811061137b57005b6040517f891407c00000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602481018390529086826044816000895af180156105af57879260009161140a575b50611405927f176b02bb2d12439ff7a20b59f402cca16c76f50508b13ef3166a600eb719354a91604051908152a1614739565b611372565b83819492503d8311611436575b61142181836142f4565b810103126105a35790518691906114056113d2565b503d611417565b6084866040519062461bcd60e51b82526004820152603960248201527f4c6976654d696e743a204e6f7420456e6f756768204d696e74732052656d616960448201527f6e696e6720466f722044657369726564204172746973744944000000000000006064820152fd5b608460405162461bcd60e51b815260206004820152603660248201527f4c6976654d696e74207c206f6e6c794d61726b6574706c616365207c2043616c60448201527f6c6572204973204e6f74204d61726b6574706c616365000000000000000000006064820152fd5b346105a35761151f36614612565b61152a829392614ef0565b91600090815b8583106115455760405180610c978782614645565b61154e84614ebf565b60009060005b8681106115e9575061156582614ebf565b916000805b82811061158d575050505081610e0291610df16115879489614b82565b91611530565b6115978185614b82565b51158015906115ce575b6115b4575b6115af90614739565b61156a565b906115c66115af91610e478487614b82565b9190506115a6565b506115d98185614b82565b511580156115a1575080156115a1565b6115fe868a87949b95979a989a999699614859565b356000526020600e8152604060002090826000525260ff604060002054161561163b575b61162b90614739565b9790939197969496959295611554565b9361164e8186610cd461162b948d614b82565b949050611622565b346105a35760206003193601126105a3576004358015158091036105a35761167c6146c5565b60ff60ff1960055416911617600555600080f35b346105a35760206003193601126105a35760043560005260076020526116eb60406000206116bd8161456b565b9060ff600182015491600281015490600460038201549101549160405196879660c0885260c0880190614478565b946020870152604086015260608501528181161515608085015260081c16151560a08301520390f35b346105a35760006003193601126105a3576020600354604051908152f35b346105a35760006003193601126105a35761174b6146c5565b600080808047818115611763575b3390f1156105af57005b506108fc611759565b346105a35761177a3661442d565b919092336000526020601481527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff607604060002054148015611831575b6117bf90614a8c565b6117ca848414614afd565b60005b8381106117d657005b806117e561182c928789614859565b3560086000526009845260406000206001600160a01b0361180f61180a858a8a614859565b614b6e565b166000528452611825604060002091825461472c565b9055614739565b6117cd565b506117bf6001600160a01b0360005416331490506117b6565b346105a35760406003193601126105a357611863614289565b61186b6146c5565b60043560005260066020526001600160a01b03604060002091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b346105a3576101006003193601126105a3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc3601126105a3576040516118f7816142bb565b6001600160a01b0360243581811681036105a35782526044359080821682036105a357602083019182526064359181831683036105a35760069260408501908152606085016084358152608086019160a435835260a087019360c435855260c088019560e43587526119676146c5565b60043560005287602052806040600020995116917fffffffffffffffffffffffff000000000000000000000000000000000000000092838b5416178a558160018b0191511683825416179055600289019251169082541617905551600386015551600485015551600584015551910155600080f35b346105a3576020610efa6119ef366141e8565b90614f39565b346105a35760006003193601126105a3576020600454604051908152f35b346105a35760206003193601126105a3577f2c74592fddad593c2c4403101ce9b30930711ab87571268ddd1e1989ee1d791760206001600160a01b03611a57614273565b611a5f6146c5565b1680600052601482527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff607604060002055604051908152a1005b346105a357611aa63661442d565b919092336000526020601481527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff607604060002054148015611b4c575b611aeb90614a8c565b611af6848414614afd565b60005b838110611b0257005b80611b11611b47928789614859565b3560086000526009845260406000206001600160a01b03611b3661180a858a8a614859565b166000528452604060002055614739565b611af9565b50611aeb6001600160a01b036000541633149050611ae2565b346105a35760006003193601126105a35760206001600160a01b0360005416604051908152f35b346105a35760406003193601126105a357611ba5614289565b60043560005260116020526001600160a01b03604060002091166000526020526020604060002054604051908152f35b346105a35760006003193601126105a357611bee6146c5565b600860005260076020527f4b1bf46c9f1bd48ff8274d40bad76a6615cb6c59a637d451a3994194b2db86c2805460ff818116151660ff19909116178155610b3f9080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff8116600891821c60ff161590911b61ff0016179055565b346105a35760406003193601126105a357611c82614289565b60043560005260096020526001600160a01b03604060002091166000526020526020604060002054604051908152f35b346105a35760a06003193601126105a35760043567ffffffffffffffff8082116105a357366023830112156105a3578160040135918183116105a35736602484830101116105a357606435918215158093036105a357608435918215158093036105a357611d3990611d226146c5565b60405195611d2f8761429f565b60243692016144d4565b8452602090818501604435815260408601917f694206942069420694206942069420694206942069420694206942069420694293848452606088019485526080880196875260a0880195865260243560005260078152604060002097518051928311610c0757611da98954614518565b601f8111611e6f575b5081601f8411600114611e1457509282610b0b969360049693610b3f9b96600092610b415750506000198260011b9260031b1c19161784555160018401555160028301555160038201550192511515839060ff60ff1983541691151516179055565b9190601f1984168a60005283600020936000905b828210611e575750509360049693610b3f9b969360019383610b0b9b9810610b9057505050811b018455610ae1565b80600186978294978701518155019601940190611e28565b8960005282600020601f850160051c810191848610611eab575b601f0160051c01905b818110611e9f5750611db2565b60008155600101611e92565b9091508190611e89565b346105a357611ec3366141e8565b90600052600f602052604060002090600052602052602060ff604060002054166040519015158152f35b346105a35760006003193601126105a357611f066146c5565b60006001600160a01b0381547fffffffffffffffffffffffff000000000000000000000000000000000000000081168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346105a3576020806003193601126105a35760043567ffffffffffffffff81116105a357611f90903690600401614242565b9033600052601483527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff60760406000205414801561213a575b611fd190614a8c565b60005b828110611fdd57005b600880600052600f85526040600020611ff7838686614859565b35600052855260ff604060002054166120d0576103e7612018838686614859565b35111561208c579061208791600052600a8552604060002061203b828686614859565b356000528552604060002073b96e81f80b3aeef65cb6d0e280b15fd5dbe719377fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055614739565b611fd4565b6064856040519062461bcd60e51b82526004820152601a60248201527f4c6976654d696e743a20496e76616c6964205469636b657449440000000000006044820152fd5b6084856040519062461bcd60e51b82526004820152602260248201527f4c6976654d696e743a205469636b657420494420416c7265616479204d696e7460448201527f65640000000000000000000000000000000000000000000000000000000000006064820152fd5b50611fd16001600160a01b036000541633149050611fc8565b346105a3576121613661442d565b92909161216c6147b9565b61217733321461480e565b600860005260076020527f4b1bf46c9f1bd48ff8274d40bad76a6615cb6c59a637d451a3994194b2db86c25460ff1615612485579060005b8281106121bc5760018055005b6121c7818484614859565b35948560005260066020526040600020936001600160a01b03600181875416960154169360005b6121f985858a614898565b905081101561246d576122178161221187878c614898565b90614859565b359089600052600e8060205260406000208360005260205261224160ff60406000205416156148fb565b8a6000526020526040600020826000526020526040600020600160ff19825416179055604051917f6d325d3100000000000000000000000000000000000000000000000000000000835280600484015260006040848b8160249485925af19081156105af57600094600092612439575b50336001600160a01b038616036123cf57506040517f891407c00000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260248101919091529060208260448160008d5af19081156105af578c92600092612396575b509361056e8392612391967f63e2ac9188fe2de978d4fb15017e0654ffd728f711404cb267e805ffdcf6b8ad95600052600d6020526040600020816000526020528160406000205560405194859485909493926060926001600160a01b036080840197168352602083015260408201520152565b6121ee565b925090506020823d6020116123c7575b816123b3602093836142f4565b810103126105a35790518b9161056e61231d565b3d91506123a6565b60849060386040519162461bcd60e51b8352602060048401528201527f4c6976654d696e743a206d73672e73656e646572204973204e6f74205468652060448201527f4f776e6572204f6620496e707574204d696e74205061737300000000000000006064820152fd5b90945061245e915060403d604011612466575b61245681836142f4565b810190614980565b90938d6122b1565b503d61244c565b5094509250945061247d90614739565b9190916121af565b608460405162461bcd60e51b815260206004820152602e60248201527f4c6976654d696e743a2052656d6f7465204d696e74696e67204f66204172746960448201527f737473204e6f74204163746976650000000000000000000000000000000000006064820152fd5b346105a35760606003193601126105a35767ffffffffffffffff6004358181116105a357366023820112156105a357806004013561252c81614317565b9061253a60405192836142f4565b8082526020928383016024809360051b830101913683116105a3578301905b8282106127285750505080358481116105a357366023820112156105a35780600401359061258682614317565b9161259460405193846142f4565b808352838684019160051b830101913683116105a35784879101915b838310612718575050505060449283358681116105a357366023820112156105a35780600401356125e081614317565b976125ee604051998a6142f4565b81895285888a019260051b840101923684116105a357868101925b8484106126e257505050505061261d6146c5565b60005b8151811015610b3f576000806001600160a01b0361263e8486614b82565b511661264a8487614b82565b5190612656858c614b82565b51918a83519301915af13d156126dd573d612670816144b8565b9061267e60405192836142f4565b81526000883d92013e5b1561269b5761269690614739565b612620565b6064867f692068617665206661696c6564207520616e616b696e00000000000000000000876016886040519462461bcd60e51b86526004860152840152820152fd5b612688565b83358381116105a3578201366043820112156105a3578a9161270d839236908d8d82013591016144d4565b815201930192612609565b82358152918101918791016125b0565b81356001600160a01b03811681036105a3578152908501908501612559565b346105a35760006003193601126105a3576127606146c5565b6008600081905260076020527f4b1bf46c9f1bd48ff8274d40bad76a6615cb6c59a637d451a3994194b2db86c280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff811690831c60ff161590921b61ff0016919091179055005b346105a35760406003193601126105a3576127e1614289565b60043560005260086020526001600160a01b0360406000209116600052602052602060ff604060002054166040519015158152f35b346105a357612824366141e8565b90600052600a60205260406000209060005260205260206001600160a01b0360406000205416604051908152f35b346105a35760206003193601126105a3576001600160a01b03612873614273565b61287b6146c5565b16600090815260146020526040812055005b346105a35760206003193601126105a3576001600160a01b036128ae614273565b6128b66146c5565b167fffffffffffffffffffffffff00000000000000000000000000000000000000006002541617600255600080f35b346105a3576020806003193601126105a35760043567ffffffffffffffff81116105a357612917903690600401614242565b919033600052601482526129517f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a660406000205414614a0e565b60005b83811061295d57005b60089081600052600f8085526040600020612979838887614859565b35600052855261299160ff604060002054161561499d565b82600052600a9283865260406000206129ab848988614859565b3560005286526001600160a01b039384604060002054161515600014612b595781600052865260406000206129e1848988614859565b3560005286528360406000205416935b8416918215612b15578160005286526040600020612a10848988614859565b3560005286526040600020600160ff19825416179055604051917f891407c000000000000000000000000000000000000000000000000000000000835260048301528060248301528582604481600073dd06d8483868cd0c5e69c24eeaa2a5f2beafd42b5af19182156105af57600092612ae4575b5090612adf937ff8c49ca221d1df5614d0b0cb321288da61168d6c3a7dc52686e4190b4abe9d4b92600052600c87526040600020612ac4858a89614859565b3560005287528160406000205561056e610546858a89614859565b612954565b91508582813d8311612b0e575b612afb81836142f4565b810103126105a357905190612adf612a85565b503d612af1565b6064876040519062461bcd60e51b82526004820152601b60248201527f4c6976654d696e743a20496e76616c696420526563697069656e7400000000006044820152fd5b506103e7612b68848988614859565b351015612c1057612b7a838887614859565b35604051907f6d325d3100000000000000000000000000000000000000000000000000000000825260048201528681602481600073985e1932ffd2aa4bc9ce611dfe12816a248cd2ce5af19081156105af57600091612bdb575b50936129f1565b90508681813d8311612c09575b612bf281836142f4565b810103126105a357612c039061496c565b88612bd4565b503d612be8565b6084866040519062461bcd60e51b82526004820152603260248201527f4c6976654d696e743a205469636b65744944204973204e6f7420456c6967696260448201527f6c6520546f204d696e7420436974697a656e00000000000000000000000000006064820152fd5b346105a357612c88366141e8565b90600052600d6020526040600020906000526020526020604060002054604051908152f35b346105a3576020610efa612cc03661439b565b92919091614b96565b346105a35760206003193601126105a3573360005260146020527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff607604060002054148015612d4c575b612d1b90614a8c565b600860005260076020526004357f4b1bf46c9f1bd48ff8274d40bad76a6615cb6c59a637d451a3994194b2db86c155005b50612d1b6001600160a01b036000541633149050612d12565b346105a35760006003193601126105a357604051612d82816142d7565b6103e8808252602090617d00368385013760009060005b818110612deb575050612dab81614ebf565b9260005b828110612dcd57505050610c976040519282849384528301906143f9565b80612ddb612de69284614b82565b51610cd48288614b82565b612daf565b612df48161471d565b600880600052600f808752604060002083600052875260ff908160406000205416159283612e8a575b8315612e55575b505050612e3b575b50612e3690614739565b612d99565b83612e4e91610cd4612e36949689614b82565b9290612e2c565b9091925060005286526040600020826000528652604060002054161580612e7f575b878080612e24565b506103e78110612e77565b809350600052600a885260406000208460005288526001600160a01b0360406000205416151592612e1d565b346105a357602090816003193601126105a35760c091600060a0604051612edc8161429f565b60608152828482015282604082015282606082015282608082015201526004356000526007815260406000209060405192612f168461429f565b612f1f8361456b565b8452600183015492828501938452600281015460408601908152612f80600460038401549360608901948552015494608088019460ff87161515865260ff60a08a019760081c1615158752604051998a99838b5251928a0152880190614478565b9451604087015251606086015251608085015251151560a084015251151560c08301520390f35b346105a35760006003193601126105a35760206001600160a01b0360025416604051908152f35b346105a35760206003193601126105a357612fe76146c5565b600480359055005b346105a35760206003193601126105a357600435600052600660205260406000206001600160a01b038082541691816001820154169160028201541660038201546004830154916006600585015494015494604051968752602087015260408601526060850152608084015260a083015260c0820152f35b346105a357613075366141e8565b90600052600b60205260406000209060005260205260206001600160a01b0360406000205416604051908152f35b346105a35760206003193601126105a3577fdce35c6ead5e97f9a12a9dfe363465b6f62c5fab770d14f46f89c82c58819cc660206001600160a01b036130e7614273565b6130ef6146c5565b16806000526014825260006040812055604051908152a1005b346105a3576131163661442d565b90919233600052602093601485526131547f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a660406000205414614a0e565b60005b81811061316057005b61316b818385614859565b359384600052600687526040600020926001600160a01b03600181865416950154169460005b61319c85858b614898565b9050811015613387576131b48161221187878d614898565b359088600052600e808c526040600020836000528c526131dc60ff60406000205416156148fb565b896000528b526040600020826000528b526040600020600160ff19825416179055604051907f6d325d3100000000000000000000000000000000000000000000000000000000825282600483015260408260248160008c5af19283156105af578c8a9460009460009161335a575b506040517f891407c00000000000000000000000000000000000000000000000000000000081526001600160a01b038616600482015260248101919091529394929392839081600081604481015b03925af19081156105af578d8c93600093613326575b508392613321969261056e927f63e2ac9188fe2de978d4fb15017e0654ffd728f711404cb267e805ffdcf6b8ad96600052600d815260406000209082600052528160406000205560405194859485909493926060926001600160a01b036080840197168352602083015260408201520152565b613191565b925090925081813d8311613353575b61333f81836142f4565b810103126105a357518a918d61056e6132ae565b503d613335565b6000949550613298915061337c9060403d6040116124665761245681836142f4565b90959490915061324a565b5095509250925061339790614739565b929192613157565b346105a35760206003193601126105a3576133b8614273565b6001600160a01b031660009081527f5fae251ae169e8e40026ce4ce85a026bc3adcccdc8459be361195e4cd924077f602090815260409182902054915191825290f35b346105a3576020806003193601126105a357613415614273565b9033600052601481527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff607604060002054148015613664575b61345690614a8c565b60ff60055416156135fb5762015180420480600052601382526040600020546001810180911161088c57600454106135b7577fb98da0e6a30cd3b780eff429cf26a49da9d9958fba01c872d67b4c3d6707c9a2600793600892836000528385526040600020906001600160a01b038316918260005286526134df60ff6040600020541615614748565b6000526013855260406000206134f58154614739565b90558360005283855260406000208160005285526040600020600160ff1982541617905583600052600a8552604060002086865260016040600020015460005285526040600020907fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055826000528484526001604060002001549061359a60405192839283602090939291936001600160a01b0360408201951681520152565b0390a16000525260016040600020016135b38154614739565b9055005b6064826040519062461bcd60e51b82526004820152601d60248201527f4c6976654d696e743a204d6178205065722044617920526561636865640000006044820152fd5b6084906040519062461bcd60e51b825260048201526024808201527f4c6976654d696e743a2051522044656c65676174696f6e73204e6f7420456e6160448201527f626c6564000000000000000000000000000000000000000000000000000000006064820152fd5b506134566001600160a01b03600054163314905061344d565b346105a35760006003193601126105a35760405161369a816142d7565b6103e8808252602090617d00368385013760009060005b8181106137405750506136c381614ebf565b9260009060005b8381106136e45760405185815280610c97818801896143f9565b6136ee8183614b82565b5115801590613725575b61370b575b61370690614739565b6136ca565b9161371d613706916112068585614b82565b9290506136fd565b506137308183614b82565b511580156136f8575080156136f8565b6137498161471d565b600880600052600f8652604060002082600052865260ff6040600020541615908161379e575b50613784575b5061377f90614739565b6136b1565b8361379791610cd461377f949689614b82565b9290613775565b9050600052600a855260406000208160005285526001600160a01b036040600020541615158761376f565b346105a3576137d7366141e8565b90600052600e602052604060002090600052602052602060ff604060002054166040519015158152f35b346105a35760806003193601126105a35767ffffffffffffffff6004358181116105a357613833903690600401614242565b916024359081116105a35761384c903690600401614242565b6044939193356001600160a01b0394858216948583036105a3576064359485936138746147b9565b339780613b73575b50509161389261389a926138a19694369161432f565b92369161432f565b9085614c56565b50600890816000526020926011845260406000209481169485600052845260406000206138cf83825461472c565b90558260005260098452604060002085600052845260406000205415600014613a05577fb98da0e6a30cd3b780eff429cf26a49da9d9958fba01c872d67b4c3d6707c9a2915082600052828452604060002085600052845261393960ff6040600020541615614748565b82600052600a845260406000206007855260016040600020015460005284526040600020857fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790558260005260078452600160406000200154906139bc60405192839283602090939291936001600160a01b0360408201951681520152565b0390a1806000526007825260016040600020016139d98154614739565b90555b806000528152604060002091600052526040600020600160ff1982541617905560018055600080f35b826000526011845260406000208560005284526040600020548360005260098552604060002086600052855260406000205410613b09578260005260078452613a57600160406000200154809361472c565b918360005260078552826001604060002001555b828110613a7a575050506139dc565b613b049084600052600a865260406000208160005286526040600020877fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557fb98da0e6a30cd3b780eff429cf26a49da9d9958fba01c872d67b4c3d6707c9a26040518061056e848783602090939291936001600160a01b0360408201951681520152565b613a6b565b6084846040519062461bcd60e51b82526004820152603860248201527f4c6976654d696e743a205573657220486173204e6f2052656d61696e696e672060448201527f417574686f72697a65642051527320546f2052656465656d00000000000000006064820152fd5b909192939450604051907f9c395bc200000000000000000000000000000000000000000000000000000000825288600483015260248201526020816044816d76a84fef008cdabe6409d2fe638b5afa9081156105af57600091613bea575b50613be2575b90818694939261387c565b955084613bd7565b90506020813d8211613c1c575b81613c04602093836142f4565b810103126105a3575180151581036105a35789613bd1565b3d9150613bf7565b346105a35760206003193601126105a35760043560005260126020526020604060002054604051908152f35b346105a357613c5e366141e8565b9060005260106020526040600020906000526020526020604060002054604051908152f35b346105a3576020613c9f613c963661439b565b92919091614c56565b6040519015158152f35b346105a35760206003193601126105a3576001600160a01b03613cca614273565b613cd26146c5565b1660005260146020527f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6604060002055600080f35b346105a35760206003193601126105a35760043560005260136020526020604060002054604051908152f35b346105a35760406003193601126105a3576004356024803567ffffffffffffffff81116105a357613d68903690600401614242565b92903360005260209360148552613da57f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a660406000205414614a0e565b826000526006855260406000206001600160a01b03928382541693600180930154169360128852604060002054156140575785600052601288526040600020548411613fee578560005260128852613e0284604060002054614a7f565b866000526012895260406000205560005b848110613e1c57005b613e27818685614859565b359087600052600e808b526040600020836000528b52613e4f60ff60406000205416156148fb565b886000528a526040600020826000528a5260406000208560ff19825416179055604051917f6d325d310000000000000000000000000000000000000000000000000000000083528060048401526040838b816000885af180156105af578b90600094600091613fc5575b506040517f891407c00000000000000000000000000000000000000000000000000000000081526001600160a01b0386166004820152602481019190915291908280604481015b038160008d5af19081156105af578c8b93600093613f91575b508392613f8c969261056e927f63e2ac9188fe2de978d4fb15017e0654ffd728f711404cb267e805ffdcf6b8ad96600052600d815260406000209082600052528160406000205560405194859485909493926060926001600160a01b036080840197168352602083015260408201520152565b613e13565b925090925081813d8311613fbe575b613faa81836142f4565b810103126105a3575189918c61056e613f19565b503d613fa0565b613f0093929550613fe5915060403d6040116124665761245681836142f4565b90949192613eb9565b6084886035896040519262461bcd60e51b845260048401528201527f4c6976654d696e743a205469636b65744944204c656e6774682045786365656460448201527f73204172746973744944204d696e74204c696d697400000000000000000000006064820152fd5b6084886025896040519262461bcd60e51b845260048401528201527f4c6976654d696e743a204172746973744944204d696e74204c696d697420526560448201527f61636865640000000000000000000000000000000000000000000000000000006064820152fd5b346105a3576140ce366141e8565b6140d781614ebf565b9160005b8281106140f05760405180610c9786826141fe565b61412290826000526020600b815260406000209082600052526001600160a01b0360406000205416610cd48287614b82565b6140db565b346105a35760406003193601126105a3573360005260146020527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff6076040600020541480156141cf575b61417990614a8c565b600860005260076020526004357f4b1bf46c9f1bd48ff8274d40bad76a6615cb6c59a637d451a3994194b2db86c0556024357f4b1bf46c9f1bd48ff8274d40bad76a6615cb6c59a637d451a3994194b2db86c155005b506141796001600160a01b036000541633149050614170565b60031960409101126105a3576004359060243590565b6020908160408183019282815285518094520193019160005b828110614225575050505090565b83516001600160a01b031685529381019392810192600101614217565b9181601f840112156105a35782359167ffffffffffffffff83116105a3576020808501948460051b0101116105a357565b600435906001600160a01b03821682036105a357565b602435906001600160a01b03821682036105a357565b60c0810190811067ffffffffffffffff821117610c0757604052565b60e0810190811067ffffffffffffffff821117610c0757604052565b617d20810190811067ffffffffffffffff821117610c0757604052565b90601f601f19910116810190811067ffffffffffffffff821117610c0757604052565b67ffffffffffffffff8111610c075760051b60200190565b929161433a82614317565b9161434860405193846142f4565b829481845260208094019160051b81019283116105a357905b82821061436e5750505050565b81358152908301908301614361565b9080601f830112156105a3578160206143989335910161432f565b90565b60806003198201126105a3576004356001600160a01b03811681036105a3579167ffffffffffffffff6024358181116105a357836143db9160040161437d565b926044359182116105a3576143f29160040161437d565b9060643590565b90815180825260208080930193019160005b828110614419575050505090565b83518552938101939281019260010161440b565b60406003198201126105a35767ffffffffffffffff916004358381116105a3578261445a91600401614242565b939093926024359182116105a35761447491600401614242565b9091565b919082519283825260005b8481106144a4575050601f19601f8460006020809697860101520116010190565b602081830181015184830182015201614483565b67ffffffffffffffff8111610c0757601f01601f191660200190565b9291926144e0826144b8565b916144ee60405193846142f4565b8294818452818301116105a3578281602093846000960137010152565b359081151582036105a357565b90600182811c92168015614561575b602083101461453257565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691614527565b906040519182600082549261457f84614518565b9081845260019485811690816000146145ee57506001146145ab575b50506145a9925003836142f4565b565b9093915060005260209081600020936000915b8183106145d65750506145a99350820101388061459b565b855488840185015294850194879450918301916145be565b90506145a995506020935060ff1991501682840152151560051b820101388061459b565b60406003198201126105a3576004359067ffffffffffffffff82116105a35761463d91600401614242565b909160243590565b602080820190808352835180925260408301928160408460051b8301019501936000915b8483106146795750505050505090565b90919293949584806146b5837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc086600196030187528a516143f9565b9801930193019194939290614669565b6001600160a01b036000541633036146d957565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b9061029a820180921161088c57565b9190820180921161088c57565b600019811461088c5760010190565b1561474f57565b608460405162461bcd60e51b815260206004820152602360248201527f4c6976654d696e743a20557365722048617320416c726561647920526564656560448201527f6d656400000000000000000000000000000000000000000000000000000000006064820152fd5b6002600154146147ca576002600155565b606460405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b1561481557565b606460405162461bcd60e51b815260206004820152602060248201527f4c6976654d696e743a206d73672e73656e646572204d75737420426520454f416044820152fd5b91908110156148695760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b91908110156148695760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156105a357019081359167ffffffffffffffff83116105a3576020018260051b360381136105a3579190565b1561490257565b608460405162461bcd60e51b815260206004820152602960248201527f4c6976654d696e743a20417274697374204d696e74205061737320416c72656160448201527f6479204d696e74656400000000000000000000000000000000000000000000006064820152fd5b51906001600160a01b03821682036105a357565b91908260409103126105a35760206149978361496c565b92015190565b156149a457565b608460405162461bcd60e51b815260206004820152602560248201527f4c6976654d696e743a20476f6c64656e20546f6b656e20416c7265616479204d60448201527f696e7465640000000000000000000000000000000000000000000000000000006064820152fd5b15614a1557565b608460405162461bcd60e51b815260206004820152603960248201527f4c6976654d696e74207c206f6e6c794d696e746572207c2043616c6c6572204960448201527f73204e6f7420417070726f76656420425254204d696e746572000000000000006064820152fd5b9190820391821161088c57565b15614a9357565b608460405162461bcd60e51b815260206004820152603360248201527f4c6976654d696e74207c206f6e6c7941646d696e207c2043616c6c657220497360448201527f204e6f7420417070726f7665642041646d696e000000000000000000000000006064820152fd5b15614b0457565b608460405162461bcd60e51b815260206004820152602160248201527f4c6976654d696e743a20496e70757420417272617973204d757374204d61746360448201527f68000000000000000000000000000000000000000000000000000000000000006064820152fd5b356001600160a01b03811681036105a35790565b80518210156148695760209160051b010190565b929091614ba39284614c56565b6001600160a01b039190911660009081527fc7694af312c4f286114180fd0ba6a52461fcee8a381636770b19a343af92538a60209081526040808320547f5fae251ae169e8e40026ce4ce85a026bc3adcccdc8459be361195e4cd924077f90925282205491928080614c4d575b15614c2057506143989250614a7f565b919082614c44575b5081614c3b575b50156143985750600190565b90501538614c2f565b15915038614c28565b50828211614c10565b9190918315614df9576040938451917fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602084019160601b1690818152601484528684019067ffffffffffffffff9480831086841117610c075760a091838a52815190209460608201948552607482015260348352019381851090851117610c0757614cfa9387525190209360086000526007602052600286600020015490614e63565b15614d905790614d1c9160086000526007602052600384600020015490614e63565b15614d275750600190565b6084905162461bcd60e51b815260206004820152602560248201527f4c6976654d696e743a20496e76616c6964204d65726b6c6520416d6f756e742060448201527f50726f6f660000000000000000000000000000000000000000000000000000006064820152fd5b6084835162461bcd60e51b815260206004820152602a60248201527f4c6976654d696e743a20496e76616c6964204d65726b6c6520456c696769626960448201527f6c6974792050726f6f66000000000000000000000000000000000000000000006064820152fd5b608460405162461bcd60e51b815260206004820152602a60248201527f4c6976654d696e743a20515220526564656d7074696f6e20416d6f756e74204d60448201527f757374204265203e2030000000000000000000000000000000000000000000006064820152fd5b929091906000915b8451831015614eb757614e7e8386614b82565b5190600082821015614ea55750600052602052614e9f604060002092614739565b91614e6b565b604091614e9f93825260205220610e02565b915092501490565b90614ec982614317565b614ed660405191826142f4565b828152601f19614ee68294614317565b0190602036910137565b90614efa82614317565b614f0760405191826142f4565b828152601f19614f178294614317565b019060005b828110614f2857505050565b806060602080938501015201614f1c565b90600090828252600e6020526040822081835260205260ff60408320541615600014614f685750505060001990565b6040928252600d602052828220908252602052205490565b90600090828252600f6020526040822081835260205260ff60408320541615600014614faf5750505060001990565b6040928252600c60205282822090825260205220549056fea2646970667358221220f61d094969a3da3368b2bf4411265a4c697c55f51cb5f9e44c0de28399f7163064736f6c63430008130033
Deployed Bytecode
0x6080604052600436101561001257600080fd5b60e0600035811c9081630356fb7214614127578163070e1119146140c05781631b18ed3914613d335781631f099fea14613d075781632165f39914613ca957816322c08d8914613c8357816322f0409914613c5057816325709be214613c24578163260df27714613801578163273c42ca146137c95781632cc2bb601461367d578163324f4cdd146133fb578163326141f71461339f57816335388966146131085781633a49a7b9146130a35781633a7ce968146130675781633be4c93914612fef5781633fceb9e214612fce578163401202c114612fa7578163401e994d14612eb65781634090b2a414612d65578163463ef6d914612cc957816349e9e8bd14612cad5781634c644a6e14612c7a5781634f4feff9146128e5578163525a330e1461288d57816354d6e36c1461285257816358c47362146128165781635de87228146127c857816360c92f2f146127475781636216091a146124ef5781636c7eba5f146121535781636dfd5a8c14611f5e578163715018a614611eed5781637328fcca14611eb55781637f220f4714611cb25781638429228714611c6957816388d3376714611bd55781638c024a5114611b8c5781638da5cb5b14611b6557816391f2b07814611a985781639366ca6b14611a135781639a973fd4146119f55781639adf3f95146119dc5781639cd90e11146118b15781639f55aac41461184a578163a0cad2111461176c578163a6a09bbe14611732578163abe0a8d314611714578163ae556f9a14611690578163b1e3b1d114611656578163b2a5249a14611511578163b35fadc2146112f5578163b5a9b3e9146110e1578163b6f2bc9c146112d2578163b95247ab14611288578163befe160a1461114b578163c39aee57146110e1578163c873016414610ff1578163d1a9045514610fc7578163d4322d7d14610f8d578163d605aeb714610f35578163d90afeb114610f02578163dc4a42b214610ee1578163e14826b214610d7b578163e74e77da14610cdf578163ebb1708e14610c36578163f29601ac146109b8578163f2fde38b146108c8578163f33229681461072f575063f42ab95d1461032c57600080fd5b346105a3576020806003193601126105a35760043567ffffffffffffffff81116105a35761035e903690600401614242565b90916103686147b9565b61037333321461480e565b600892836000526007825260ff9283600460406000200154861c16156106c55760005b8181106103a35760018055005b6103e76103b1828486614859565b35101561065b5785600052600f80855260406000206103d1838587614859565b3560005285526103e886604060002054161561499d565b86600052845260406000206103fe828486614859565b3560005284526040600020600160ff1982541617905561041f818385614859565b3590604051917f6d325d310000000000000000000000000000000000000000000000000000000083526004830152602485838281600073985e1932ffd2aa4bc9ce611dfe12816a248cd2ce5af19283156105af57600093610624575b506001600160a01b038316903382036105bb578890604051927f891407c000000000000000000000000000000000000000000000000000000000845260048401528201528581604481600073dd06d8483868cd0c5e69c24eeaa2a5f2beafd42b5af19081156105af5760009161057b575b507ff8c49ca221d1df5614d0b0cb321288da61168d6c3a7dc52686e4190b4abe9d4b906105769389600052600c8852604060002061052b85888a614859565b3560005288528160406000205561056e61054685888a614859565b3592604051938493846040919493926001600160a01b03606083019616825260208201520152565b0390a1614739565b610396565b90508581813d83116105a8575b61059281836142f4565b810103126105a357516105766104ec565b600080fd5b503d610588565b6040513d6000823e3d90fd5b8660316084926040519262461bcd60e51b845260048401528201527f4c6976654d696e743a206d73672e73656e646572204973204e6f74204f776e6560448201527f72204f6620476f6c64656e20546f6b656e0000000000000000000000000000006064820152fd5b9092508581813d8311610654575b61063c81836142f4565b810103126105a35761064d9061496c565b913861047b565b503d610632565b6084846040519062461bcd60e51b82526004820152603660248201527f4c6976654d696e743a20496e76616c696420496e707574205469636b6574494460448201527f2c204d75737420426520476f6c64656e20546f6b656e000000000000000000006064820152fd5b6084836040519062461bcd60e51b82526004820152602f60248201527f4c6976654d696e743a2052656d6f7465204d696e74696e67204f66204369746960448201527f7a656e73204e6f742041637469766500000000000000000000000000000000006064820152fd5b346105a3576003193601126105a35760405161074a816142bb565b6001600160a01b039060043582811681036105a357815260243582811681036105a357602082019081526044359083821682036105a357600691604084019081526060840160643581526080850190608435825260a086019260a435845260c087019460c43586523360005260146020527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff6076040600020541480156108bb575b6107f390614a8c565b6003549883518a600052601260205260406000205587602052806040600020995116917fffffffffffffffffffffffff000000000000000000000000000000000000000092838b5416178a558160018b0191511683825416179055600289019251169082541617905551600386015551600485015551600584015551910155600181019081811161088c57602091600355604051908152f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50600054891633146107ea565b346105a35760206003193601126105a3576108e1614273565b6108e96146c5565b6001600160a01b0380911690811561094e57600054827fffffffffffffffffffffffff0000000000000000000000000000000000000000821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b608460405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b346105a3576003196040813601126105a35760243567ffffffffffffffff918282116105a35760c09082360301126105a357604051916109f78361429f565b81600401358181116105a3578201366023820112156105a357610a249036906024600482013591016144d4565b835260209081840160248401358152604085019060448501358252606086019260648601358452610a6a60a4610a5c6084890161450b565b9760808a019889520161450b565b9460a08801958652610a7a6146c5565b60043560005260078152604060002097518051928311610c0757610a9e8954614518565b601f8111610bc1575b5081601f8411600114610b4c57509282610b0b969360049693610b3f9b96600092610b41575b50506000198260011b9260031b1c19161784555b5160018401555160028301555160038201550192511515839060ff60ff1983541691151516179055565b5181547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690151560081b61ff0016179055565b005b015190508b80610acd565b9190601f1984168a60005283600020936000905b828210610ba95750509360049693610b3f9b969360019383610b0b9b9810610b90575b505050811b018455610ae1565b015160001960f88460031b161c191690558b8080610b83565b80600186978294978701518155019601940190610b60565b8960005282600020601f850160051c810191848610610bfd575b601f0160051c01905b818110610bf15750610aa7565b60008155600101610be4565b9091508190610bdb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b346105a3576020806003193601126105a35760405190600435610c58836142d7565b6103e891828452617d00368286013761014d600683068181029391811591850414171561088c5760005b848110610c9b5760405180610c9788826141fe565b0390f35b610cda9082600052600a84526040600020610cb6828761472c565b60005284526001600160a01b0360406000205416610cd48289614b82565b52614739565b610c82565b346105a35760206003193601126105a3573360005260146020527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff607604060002054148015610d62575b610d3190614a8c565b600860005260076020526004357f4b1bf46c9f1bd48ff8274d40bad76a6615cb6c59a637d451a3994194b2db86c055005b50610d316001600160a01b036000541633149050610d28565b346105a357610d8936614612565b610d94829392614ef0565b91600090815b858310610daf5760405180610c978782614645565b610db884614ebf565b60009060005b868110610e755750610dcf82614ebf565b916000805b828110610e0e575050505081610e0291610df1610e089489614b82565b52610dfc8188614b82565b50614739565b92614739565b91610d9a565b610e188185614b82565b5115801590610e5a575b610e35575b610e3090614739565b610dd4565b90610e52610e3091610e478487614b82565b51610cd48289614b82565b919050610e27565b50610e658185614b82565b51158015610e2257508015610e22565b610e8a868a87949b95979a989a999699614859565b356000526020600e8152604060002090826000525260ff60406000205416610ec6575b610eb690614739565b9790939197969496959295610dbe565b93610ed98186610cd4610eb6948d614b82565b949050610ead565b346105a3576020610efa610ef4366141e8565b90614f80565b604051908152f35b346105a357610f10366141e8565b90600052600c6020526040600020906000526020526020604060002054604051908152f35b346105a35760006003193601126105a357610f4e6146c5565b600860005260076020527f4b1bf46c9f1bd48ff8274d40bad76a6615cb6c59a637d451a3994194b2db86c2805460ff818116151660ff19909116179055005b346105a35760206003193601126105a3576001600160a01b03610fae614273565b1660005260146020526020604060002054604051908152f35b346105a357610fd5366141e8565b90610fde6146c5565b6000526012602052604060002055600080f35b346105a35760206003193601126105a357600060c0604051611012816142bb565b8281528260208201528260408201528260608201528260808201528260a0820152015260043560005260066020526040600020604051611051816142bb565b6001600160a01b0391828154169283835280600183015416906020840191825280600284015416906040850191825260038401549160608601928352816004860154946080880195865260c0600660058901549860a08b01998a520154980197885260405198895251166020880152511660408601525160608501525160808401525160a08301525160c0820152f35b346105a35760406003193601126105a357610b3f6110fd614289565b6111056146c5565b60043560005260066020526001600160a01b03600160406000200191167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b346105a3576020806003193601126105a3576040519060043561116d836142d7565b6103e8808452617d00368486013760009161014d6006820681810291811591830414171561088c5760005b83811061123457505050506111ac81614ebf565b9260009060005b8381106111cd5760405185815280610c97818801896143f9565b6111d78183614b82565b5115801590611219575b6111f4575b6111ef90614739565b6111b3565b916112116111ef916112068585614b82565b51610cd4828a614b82565b9290506111e6565b506112248183614b82565b511580156111e1575080156111e1565b61123e828261472c565b83600052600f8752604060002081600052875260ff6040600020541661126e575b5061126990614739565b611198565b8561128191610cd461126994988b614b82565b949061125f565b346105a35760206003193601126105a3576112a16146c5565b600860005260076020526004357f4b1bf46c9f1bd48ff8274d40bad76a6615cb6c59a637d451a3994194b2db86bf55005b346105a35760006003193601126105a357602060ff600554166040519015158152f35b346105a35760606003193601126105a35761130e614273565b60243590604435906001600160a01b0390816002541633036114a757836000526020936012855260406000205480851161143d578461134c91614a7f565b906000526012855260406000205560068452600460406000209260018401541692015460005b84811061137b57005b6040517f891407c00000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602481018390529086826044816000895af180156105af57879260009161140a575b50611405927f176b02bb2d12439ff7a20b59f402cca16c76f50508b13ef3166a600eb719354a91604051908152a1614739565b611372565b83819492503d8311611436575b61142181836142f4565b810103126105a35790518691906114056113d2565b503d611417565b6084866040519062461bcd60e51b82526004820152603960248201527f4c6976654d696e743a204e6f7420456e6f756768204d696e74732052656d616960448201527f6e696e6720466f722044657369726564204172746973744944000000000000006064820152fd5b608460405162461bcd60e51b815260206004820152603660248201527f4c6976654d696e74207c206f6e6c794d61726b6574706c616365207c2043616c60448201527f6c6572204973204e6f74204d61726b6574706c616365000000000000000000006064820152fd5b346105a35761151f36614612565b61152a829392614ef0565b91600090815b8583106115455760405180610c978782614645565b61154e84614ebf565b60009060005b8681106115e9575061156582614ebf565b916000805b82811061158d575050505081610e0291610df16115879489614b82565b91611530565b6115978185614b82565b51158015906115ce575b6115b4575b6115af90614739565b61156a565b906115c66115af91610e478487614b82565b9190506115a6565b506115d98185614b82565b511580156115a1575080156115a1565b6115fe868a87949b95979a989a999699614859565b356000526020600e8152604060002090826000525260ff604060002054161561163b575b61162b90614739565b9790939197969496959295611554565b9361164e8186610cd461162b948d614b82565b949050611622565b346105a35760206003193601126105a3576004358015158091036105a35761167c6146c5565b60ff60ff1960055416911617600555600080f35b346105a35760206003193601126105a35760043560005260076020526116eb60406000206116bd8161456b565b9060ff600182015491600281015490600460038201549101549160405196879660c0885260c0880190614478565b946020870152604086015260608501528181161515608085015260081c16151560a08301520390f35b346105a35760006003193601126105a3576020600354604051908152f35b346105a35760006003193601126105a35761174b6146c5565b600080808047818115611763575b3390f1156105af57005b506108fc611759565b346105a35761177a3661442d565b919092336000526020601481527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff607604060002054148015611831575b6117bf90614a8c565b6117ca848414614afd565b60005b8381106117d657005b806117e561182c928789614859565b3560086000526009845260406000206001600160a01b0361180f61180a858a8a614859565b614b6e565b166000528452611825604060002091825461472c565b9055614739565b6117cd565b506117bf6001600160a01b0360005416331490506117b6565b346105a35760406003193601126105a357611863614289565b61186b6146c5565b60043560005260066020526001600160a01b03604060002091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b346105a3576101006003193601126105a3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc3601126105a3576040516118f7816142bb565b6001600160a01b0360243581811681036105a35782526044359080821682036105a357602083019182526064359181831683036105a35760069260408501908152606085016084358152608086019160a435835260a087019360c435855260c088019560e43587526119676146c5565b60043560005287602052806040600020995116917fffffffffffffffffffffffff000000000000000000000000000000000000000092838b5416178a558160018b0191511683825416179055600289019251169082541617905551600386015551600485015551600584015551910155600080f35b346105a3576020610efa6119ef366141e8565b90614f39565b346105a35760006003193601126105a3576020600454604051908152f35b346105a35760206003193601126105a3577f2c74592fddad593c2c4403101ce9b30930711ab87571268ddd1e1989ee1d791760206001600160a01b03611a57614273565b611a5f6146c5565b1680600052601482527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff607604060002055604051908152a1005b346105a357611aa63661442d565b919092336000526020601481527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff607604060002054148015611b4c575b611aeb90614a8c565b611af6848414614afd565b60005b838110611b0257005b80611b11611b47928789614859565b3560086000526009845260406000206001600160a01b03611b3661180a858a8a614859565b166000528452604060002055614739565b611af9565b50611aeb6001600160a01b036000541633149050611ae2565b346105a35760006003193601126105a35760206001600160a01b0360005416604051908152f35b346105a35760406003193601126105a357611ba5614289565b60043560005260116020526001600160a01b03604060002091166000526020526020604060002054604051908152f35b346105a35760006003193601126105a357611bee6146c5565b600860005260076020527f4b1bf46c9f1bd48ff8274d40bad76a6615cb6c59a637d451a3994194b2db86c2805460ff818116151660ff19909116178155610b3f9080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff8116600891821c60ff161590911b61ff0016179055565b346105a35760406003193601126105a357611c82614289565b60043560005260096020526001600160a01b03604060002091166000526020526020604060002054604051908152f35b346105a35760a06003193601126105a35760043567ffffffffffffffff8082116105a357366023830112156105a3578160040135918183116105a35736602484830101116105a357606435918215158093036105a357608435918215158093036105a357611d3990611d226146c5565b60405195611d2f8761429f565b60243692016144d4565b8452602090818501604435815260408601917f694206942069420694206942069420694206942069420694206942069420694293848452606088019485526080880196875260a0880195865260243560005260078152604060002097518051928311610c0757611da98954614518565b601f8111611e6f575b5081601f8411600114611e1457509282610b0b969360049693610b3f9b96600092610b415750506000198260011b9260031b1c19161784555160018401555160028301555160038201550192511515839060ff60ff1983541691151516179055565b9190601f1984168a60005283600020936000905b828210611e575750509360049693610b3f9b969360019383610b0b9b9810610b9057505050811b018455610ae1565b80600186978294978701518155019601940190611e28565b8960005282600020601f850160051c810191848610611eab575b601f0160051c01905b818110611e9f5750611db2565b60008155600101611e92565b9091508190611e89565b346105a357611ec3366141e8565b90600052600f602052604060002090600052602052602060ff604060002054166040519015158152f35b346105a35760006003193601126105a357611f066146c5565b60006001600160a01b0381547fffffffffffffffffffffffff000000000000000000000000000000000000000081168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346105a3576020806003193601126105a35760043567ffffffffffffffff81116105a357611f90903690600401614242565b9033600052601483527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff60760406000205414801561213a575b611fd190614a8c565b60005b828110611fdd57005b600880600052600f85526040600020611ff7838686614859565b35600052855260ff604060002054166120d0576103e7612018838686614859565b35111561208c579061208791600052600a8552604060002061203b828686614859565b356000528552604060002073b96e81f80b3aeef65cb6d0e280b15fd5dbe719377fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055614739565b611fd4565b6064856040519062461bcd60e51b82526004820152601a60248201527f4c6976654d696e743a20496e76616c6964205469636b657449440000000000006044820152fd5b6084856040519062461bcd60e51b82526004820152602260248201527f4c6976654d696e743a205469636b657420494420416c7265616479204d696e7460448201527f65640000000000000000000000000000000000000000000000000000000000006064820152fd5b50611fd16001600160a01b036000541633149050611fc8565b346105a3576121613661442d565b92909161216c6147b9565b61217733321461480e565b600860005260076020527f4b1bf46c9f1bd48ff8274d40bad76a6615cb6c59a637d451a3994194b2db86c25460ff1615612485579060005b8281106121bc5760018055005b6121c7818484614859565b35948560005260066020526040600020936001600160a01b03600181875416960154169360005b6121f985858a614898565b905081101561246d576122178161221187878c614898565b90614859565b359089600052600e8060205260406000208360005260205261224160ff60406000205416156148fb565b8a6000526020526040600020826000526020526040600020600160ff19825416179055604051917f6d325d3100000000000000000000000000000000000000000000000000000000835280600484015260006040848b8160249485925af19081156105af57600094600092612439575b50336001600160a01b038616036123cf57506040517f891407c00000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260248101919091529060208260448160008d5af19081156105af578c92600092612396575b509361056e8392612391967f63e2ac9188fe2de978d4fb15017e0654ffd728f711404cb267e805ffdcf6b8ad95600052600d6020526040600020816000526020528160406000205560405194859485909493926060926001600160a01b036080840197168352602083015260408201520152565b6121ee565b925090506020823d6020116123c7575b816123b3602093836142f4565b810103126105a35790518b9161056e61231d565b3d91506123a6565b60849060386040519162461bcd60e51b8352602060048401528201527f4c6976654d696e743a206d73672e73656e646572204973204e6f74205468652060448201527f4f776e6572204f6620496e707574204d696e74205061737300000000000000006064820152fd5b90945061245e915060403d604011612466575b61245681836142f4565b810190614980565b90938d6122b1565b503d61244c565b5094509250945061247d90614739565b9190916121af565b608460405162461bcd60e51b815260206004820152602e60248201527f4c6976654d696e743a2052656d6f7465204d696e74696e67204f66204172746960448201527f737473204e6f74204163746976650000000000000000000000000000000000006064820152fd5b346105a35760606003193601126105a35767ffffffffffffffff6004358181116105a357366023820112156105a357806004013561252c81614317565b9061253a60405192836142f4565b8082526020928383016024809360051b830101913683116105a3578301905b8282106127285750505080358481116105a357366023820112156105a35780600401359061258682614317565b9161259460405193846142f4565b808352838684019160051b830101913683116105a35784879101915b838310612718575050505060449283358681116105a357366023820112156105a35780600401356125e081614317565b976125ee604051998a6142f4565b81895285888a019260051b840101923684116105a357868101925b8484106126e257505050505061261d6146c5565b60005b8151811015610b3f576000806001600160a01b0361263e8486614b82565b511661264a8487614b82565b5190612656858c614b82565b51918a83519301915af13d156126dd573d612670816144b8565b9061267e60405192836142f4565b81526000883d92013e5b1561269b5761269690614739565b612620565b6064867f692068617665206661696c6564207520616e616b696e00000000000000000000876016886040519462461bcd60e51b86526004860152840152820152fd5b612688565b83358381116105a3578201366043820112156105a3578a9161270d839236908d8d82013591016144d4565b815201930192612609565b82358152918101918791016125b0565b81356001600160a01b03811681036105a3578152908501908501612559565b346105a35760006003193601126105a3576127606146c5565b6008600081905260076020527f4b1bf46c9f1bd48ff8274d40bad76a6615cb6c59a637d451a3994194b2db86c280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff811690831c60ff161590921b61ff0016919091179055005b346105a35760406003193601126105a3576127e1614289565b60043560005260086020526001600160a01b0360406000209116600052602052602060ff604060002054166040519015158152f35b346105a357612824366141e8565b90600052600a60205260406000209060005260205260206001600160a01b0360406000205416604051908152f35b346105a35760206003193601126105a3576001600160a01b03612873614273565b61287b6146c5565b16600090815260146020526040812055005b346105a35760206003193601126105a3576001600160a01b036128ae614273565b6128b66146c5565b167fffffffffffffffffffffffff00000000000000000000000000000000000000006002541617600255600080f35b346105a3576020806003193601126105a35760043567ffffffffffffffff81116105a357612917903690600401614242565b919033600052601482526129517f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a660406000205414614a0e565b60005b83811061295d57005b60089081600052600f8085526040600020612979838887614859565b35600052855261299160ff604060002054161561499d565b82600052600a9283865260406000206129ab848988614859565b3560005286526001600160a01b039384604060002054161515600014612b595781600052865260406000206129e1848988614859565b3560005286528360406000205416935b8416918215612b15578160005286526040600020612a10848988614859565b3560005286526040600020600160ff19825416179055604051917f891407c000000000000000000000000000000000000000000000000000000000835260048301528060248301528582604481600073dd06d8483868cd0c5e69c24eeaa2a5f2beafd42b5af19182156105af57600092612ae4575b5090612adf937ff8c49ca221d1df5614d0b0cb321288da61168d6c3a7dc52686e4190b4abe9d4b92600052600c87526040600020612ac4858a89614859565b3560005287528160406000205561056e610546858a89614859565b612954565b91508582813d8311612b0e575b612afb81836142f4565b810103126105a357905190612adf612a85565b503d612af1565b6064876040519062461bcd60e51b82526004820152601b60248201527f4c6976654d696e743a20496e76616c696420526563697069656e7400000000006044820152fd5b506103e7612b68848988614859565b351015612c1057612b7a838887614859565b35604051907f6d325d3100000000000000000000000000000000000000000000000000000000825260048201528681602481600073985e1932ffd2aa4bc9ce611dfe12816a248cd2ce5af19081156105af57600091612bdb575b50936129f1565b90508681813d8311612c09575b612bf281836142f4565b810103126105a357612c039061496c565b88612bd4565b503d612be8565b6084866040519062461bcd60e51b82526004820152603260248201527f4c6976654d696e743a205469636b65744944204973204e6f7420456c6967696260448201527f6c6520546f204d696e7420436974697a656e00000000000000000000000000006064820152fd5b346105a357612c88366141e8565b90600052600d6020526040600020906000526020526020604060002054604051908152f35b346105a3576020610efa612cc03661439b565b92919091614b96565b346105a35760206003193601126105a3573360005260146020527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff607604060002054148015612d4c575b612d1b90614a8c565b600860005260076020526004357f4b1bf46c9f1bd48ff8274d40bad76a6615cb6c59a637d451a3994194b2db86c155005b50612d1b6001600160a01b036000541633149050612d12565b346105a35760006003193601126105a357604051612d82816142d7565b6103e8808252602090617d00368385013760009060005b818110612deb575050612dab81614ebf565b9260005b828110612dcd57505050610c976040519282849384528301906143f9565b80612ddb612de69284614b82565b51610cd48288614b82565b612daf565b612df48161471d565b600880600052600f808752604060002083600052875260ff908160406000205416159283612e8a575b8315612e55575b505050612e3b575b50612e3690614739565b612d99565b83612e4e91610cd4612e36949689614b82565b9290612e2c565b9091925060005286526040600020826000528652604060002054161580612e7f575b878080612e24565b506103e78110612e77565b809350600052600a885260406000208460005288526001600160a01b0360406000205416151592612e1d565b346105a357602090816003193601126105a35760c091600060a0604051612edc8161429f565b60608152828482015282604082015282606082015282608082015201526004356000526007815260406000209060405192612f168461429f565b612f1f8361456b565b8452600183015492828501938452600281015460408601908152612f80600460038401549360608901948552015494608088019460ff87161515865260ff60a08a019760081c1615158752604051998a99838b5251928a0152880190614478565b9451604087015251606086015251608085015251151560a084015251151560c08301520390f35b346105a35760006003193601126105a35760206001600160a01b0360025416604051908152f35b346105a35760206003193601126105a357612fe76146c5565b600480359055005b346105a35760206003193601126105a357600435600052600660205260406000206001600160a01b038082541691816001820154169160028201541660038201546004830154916006600585015494015494604051968752602087015260408601526060850152608084015260a083015260c0820152f35b346105a357613075366141e8565b90600052600b60205260406000209060005260205260206001600160a01b0360406000205416604051908152f35b346105a35760206003193601126105a3577fdce35c6ead5e97f9a12a9dfe363465b6f62c5fab770d14f46f89c82c58819cc660206001600160a01b036130e7614273565b6130ef6146c5565b16806000526014825260006040812055604051908152a1005b346105a3576131163661442d565b90919233600052602093601485526131547f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a660406000205414614a0e565b60005b81811061316057005b61316b818385614859565b359384600052600687526040600020926001600160a01b03600181865416950154169460005b61319c85858b614898565b9050811015613387576131b48161221187878d614898565b359088600052600e808c526040600020836000528c526131dc60ff60406000205416156148fb565b896000528b526040600020826000528b526040600020600160ff19825416179055604051907f6d325d3100000000000000000000000000000000000000000000000000000000825282600483015260408260248160008c5af19283156105af578c8a9460009460009161335a575b506040517f891407c00000000000000000000000000000000000000000000000000000000081526001600160a01b038616600482015260248101919091529394929392839081600081604481015b03925af19081156105af578d8c93600093613326575b508392613321969261056e927f63e2ac9188fe2de978d4fb15017e0654ffd728f711404cb267e805ffdcf6b8ad96600052600d815260406000209082600052528160406000205560405194859485909493926060926001600160a01b036080840197168352602083015260408201520152565b613191565b925090925081813d8311613353575b61333f81836142f4565b810103126105a357518a918d61056e6132ae565b503d613335565b6000949550613298915061337c9060403d6040116124665761245681836142f4565b90959490915061324a565b5095509250925061339790614739565b929192613157565b346105a35760206003193601126105a3576133b8614273565b6001600160a01b031660009081527f5fae251ae169e8e40026ce4ce85a026bc3adcccdc8459be361195e4cd924077f602090815260409182902054915191825290f35b346105a3576020806003193601126105a357613415614273565b9033600052601481527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff607604060002054148015613664575b61345690614a8c565b60ff60055416156135fb5762015180420480600052601382526040600020546001810180911161088c57600454106135b7577fb98da0e6a30cd3b780eff429cf26a49da9d9958fba01c872d67b4c3d6707c9a2600793600892836000528385526040600020906001600160a01b038316918260005286526134df60ff6040600020541615614748565b6000526013855260406000206134f58154614739565b90558360005283855260406000208160005285526040600020600160ff1982541617905583600052600a8552604060002086865260016040600020015460005285526040600020907fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055826000528484526001604060002001549061359a60405192839283602090939291936001600160a01b0360408201951681520152565b0390a16000525260016040600020016135b38154614739565b9055005b6064826040519062461bcd60e51b82526004820152601d60248201527f4c6976654d696e743a204d6178205065722044617920526561636865640000006044820152fd5b6084906040519062461bcd60e51b825260048201526024808201527f4c6976654d696e743a2051522044656c65676174696f6e73204e6f7420456e6160448201527f626c6564000000000000000000000000000000000000000000000000000000006064820152fd5b506134566001600160a01b03600054163314905061344d565b346105a35760006003193601126105a35760405161369a816142d7565b6103e8808252602090617d00368385013760009060005b8181106137405750506136c381614ebf565b9260009060005b8381106136e45760405185815280610c97818801896143f9565b6136ee8183614b82565b5115801590613725575b61370b575b61370690614739565b6136ca565b9161371d613706916112068585614b82565b9290506136fd565b506137308183614b82565b511580156136f8575080156136f8565b6137498161471d565b600880600052600f8652604060002082600052865260ff6040600020541615908161379e575b50613784575b5061377f90614739565b6136b1565b8361379791610cd461377f949689614b82565b9290613775565b9050600052600a855260406000208160005285526001600160a01b036040600020541615158761376f565b346105a3576137d7366141e8565b90600052600e602052604060002090600052602052602060ff604060002054166040519015158152f35b346105a35760806003193601126105a35767ffffffffffffffff6004358181116105a357613833903690600401614242565b916024359081116105a35761384c903690600401614242565b6044939193356001600160a01b0394858216948583036105a3576064359485936138746147b9565b339780613b73575b50509161389261389a926138a19694369161432f565b92369161432f565b9085614c56565b50600890816000526020926011845260406000209481169485600052845260406000206138cf83825461472c565b90558260005260098452604060002085600052845260406000205415600014613a05577fb98da0e6a30cd3b780eff429cf26a49da9d9958fba01c872d67b4c3d6707c9a2915082600052828452604060002085600052845261393960ff6040600020541615614748565b82600052600a845260406000206007855260016040600020015460005284526040600020857fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790558260005260078452600160406000200154906139bc60405192839283602090939291936001600160a01b0360408201951681520152565b0390a1806000526007825260016040600020016139d98154614739565b90555b806000528152604060002091600052526040600020600160ff1982541617905560018055600080f35b826000526011845260406000208560005284526040600020548360005260098552604060002086600052855260406000205410613b09578260005260078452613a57600160406000200154809361472c565b918360005260078552826001604060002001555b828110613a7a575050506139dc565b613b049084600052600a865260406000208160005286526040600020877fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557fb98da0e6a30cd3b780eff429cf26a49da9d9958fba01c872d67b4c3d6707c9a26040518061056e848783602090939291936001600160a01b0360408201951681520152565b613a6b565b6084846040519062461bcd60e51b82526004820152603860248201527f4c6976654d696e743a205573657220486173204e6f2052656d61696e696e672060448201527f417574686f72697a65642051527320546f2052656465656d00000000000000006064820152fd5b909192939450604051907f9c395bc200000000000000000000000000000000000000000000000000000000825288600483015260248201526020816044816d76a84fef008cdabe6409d2fe638b5afa9081156105af57600091613bea575b50613be2575b90818694939261387c565b955084613bd7565b90506020813d8211613c1c575b81613c04602093836142f4565b810103126105a3575180151581036105a35789613bd1565b3d9150613bf7565b346105a35760206003193601126105a35760043560005260126020526020604060002054604051908152f35b346105a357613c5e366141e8565b9060005260106020526040600020906000526020526020604060002054604051908152f35b346105a3576020613c9f613c963661439b565b92919091614c56565b6040519015158152f35b346105a35760206003193601126105a3576001600160a01b03613cca614273565b613cd26146c5565b1660005260146020527f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6604060002055600080f35b346105a35760206003193601126105a35760043560005260136020526020604060002054604051908152f35b346105a35760406003193601126105a3576004356024803567ffffffffffffffff81116105a357613d68903690600401614242565b92903360005260209360148552613da57f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a660406000205414614a0e565b826000526006855260406000206001600160a01b03928382541693600180930154169360128852604060002054156140575785600052601288526040600020548411613fee578560005260128852613e0284604060002054614a7f565b866000526012895260406000205560005b848110613e1c57005b613e27818685614859565b359087600052600e808b526040600020836000528b52613e4f60ff60406000205416156148fb565b886000528a526040600020826000528a5260406000208560ff19825416179055604051917f6d325d310000000000000000000000000000000000000000000000000000000083528060048401526040838b816000885af180156105af578b90600094600091613fc5575b506040517f891407c00000000000000000000000000000000000000000000000000000000081526001600160a01b0386166004820152602481019190915291908280604481015b038160008d5af19081156105af578c8b93600093613f91575b508392613f8c969261056e927f63e2ac9188fe2de978d4fb15017e0654ffd728f711404cb267e805ffdcf6b8ad96600052600d815260406000209082600052528160406000205560405194859485909493926060926001600160a01b036080840197168352602083015260408201520152565b613e13565b925090925081813d8311613fbe575b613faa81836142f4565b810103126105a3575189918c61056e613f19565b503d613fa0565b613f0093929550613fe5915060403d6040116124665761245681836142f4565b90949192613eb9565b6084886035896040519262461bcd60e51b845260048401528201527f4c6976654d696e743a205469636b65744944204c656e6774682045786365656460448201527f73204172746973744944204d696e74204c696d697400000000000000000000006064820152fd5b6084886025896040519262461bcd60e51b845260048401528201527f4c6976654d696e743a204172746973744944204d696e74204c696d697420526560448201527f61636865640000000000000000000000000000000000000000000000000000006064820152fd5b346105a3576140ce366141e8565b6140d781614ebf565b9160005b8281106140f05760405180610c9786826141fe565b61412290826000526020600b815260406000209082600052526001600160a01b0360406000205416610cd48287614b82565b6140db565b346105a35760406003193601126105a3573360005260146020527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff6076040600020541480156141cf575b61417990614a8c565b600860005260076020526004357f4b1bf46c9f1bd48ff8274d40bad76a6615cb6c59a637d451a3994194b2db86c0556024357f4b1bf46c9f1bd48ff8274d40bad76a6615cb6c59a637d451a3994194b2db86c155005b506141796001600160a01b036000541633149050614170565b60031960409101126105a3576004359060243590565b6020908160408183019282815285518094520193019160005b828110614225575050505090565b83516001600160a01b031685529381019392810192600101614217565b9181601f840112156105a35782359167ffffffffffffffff83116105a3576020808501948460051b0101116105a357565b600435906001600160a01b03821682036105a357565b602435906001600160a01b03821682036105a357565b60c0810190811067ffffffffffffffff821117610c0757604052565b60e0810190811067ffffffffffffffff821117610c0757604052565b617d20810190811067ffffffffffffffff821117610c0757604052565b90601f601f19910116810190811067ffffffffffffffff821117610c0757604052565b67ffffffffffffffff8111610c075760051b60200190565b929161433a82614317565b9161434860405193846142f4565b829481845260208094019160051b81019283116105a357905b82821061436e5750505050565b81358152908301908301614361565b9080601f830112156105a3578160206143989335910161432f565b90565b60806003198201126105a3576004356001600160a01b03811681036105a3579167ffffffffffffffff6024358181116105a357836143db9160040161437d565b926044359182116105a3576143f29160040161437d565b9060643590565b90815180825260208080930193019160005b828110614419575050505090565b83518552938101939281019260010161440b565b60406003198201126105a35767ffffffffffffffff916004358381116105a3578261445a91600401614242565b939093926024359182116105a35761447491600401614242565b9091565b919082519283825260005b8481106144a4575050601f19601f8460006020809697860101520116010190565b602081830181015184830182015201614483565b67ffffffffffffffff8111610c0757601f01601f191660200190565b9291926144e0826144b8565b916144ee60405193846142f4565b8294818452818301116105a3578281602093846000960137010152565b359081151582036105a357565b90600182811c92168015614561575b602083101461453257565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691614527565b906040519182600082549261457f84614518565b9081845260019485811690816000146145ee57506001146145ab575b50506145a9925003836142f4565b565b9093915060005260209081600020936000915b8183106145d65750506145a99350820101388061459b565b855488840185015294850194879450918301916145be565b90506145a995506020935060ff1991501682840152151560051b820101388061459b565b60406003198201126105a3576004359067ffffffffffffffff82116105a35761463d91600401614242565b909160243590565b602080820190808352835180925260408301928160408460051b8301019501936000915b8483106146795750505050505090565b90919293949584806146b5837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc086600196030187528a516143f9565b9801930193019194939290614669565b6001600160a01b036000541633036146d957565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b9061029a820180921161088c57565b9190820180921161088c57565b600019811461088c5760010190565b1561474f57565b608460405162461bcd60e51b815260206004820152602360248201527f4c6976654d696e743a20557365722048617320416c726561647920526564656560448201527f6d656400000000000000000000000000000000000000000000000000000000006064820152fd5b6002600154146147ca576002600155565b606460405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b1561481557565b606460405162461bcd60e51b815260206004820152602060248201527f4c6976654d696e743a206d73672e73656e646572204d75737420426520454f416044820152fd5b91908110156148695760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b91908110156148695760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156105a357019081359167ffffffffffffffff83116105a3576020018260051b360381136105a3579190565b1561490257565b608460405162461bcd60e51b815260206004820152602960248201527f4c6976654d696e743a20417274697374204d696e74205061737320416c72656160448201527f6479204d696e74656400000000000000000000000000000000000000000000006064820152fd5b51906001600160a01b03821682036105a357565b91908260409103126105a35760206149978361496c565b92015190565b156149a457565b608460405162461bcd60e51b815260206004820152602560248201527f4c6976654d696e743a20476f6c64656e20546f6b656e20416c7265616479204d60448201527f696e7465640000000000000000000000000000000000000000000000000000006064820152fd5b15614a1557565b608460405162461bcd60e51b815260206004820152603960248201527f4c6976654d696e74207c206f6e6c794d696e746572207c2043616c6c6572204960448201527f73204e6f7420417070726f76656420425254204d696e746572000000000000006064820152fd5b9190820391821161088c57565b15614a9357565b608460405162461bcd60e51b815260206004820152603360248201527f4c6976654d696e74207c206f6e6c7941646d696e207c2043616c6c657220497360448201527f204e6f7420417070726f7665642041646d696e000000000000000000000000006064820152fd5b15614b0457565b608460405162461bcd60e51b815260206004820152602160248201527f4c6976654d696e743a20496e70757420417272617973204d757374204d61746360448201527f68000000000000000000000000000000000000000000000000000000000000006064820152fd5b356001600160a01b03811681036105a35790565b80518210156148695760209160051b010190565b929091614ba39284614c56565b6001600160a01b039190911660009081527fc7694af312c4f286114180fd0ba6a52461fcee8a381636770b19a343af92538a60209081526040808320547f5fae251ae169e8e40026ce4ce85a026bc3adcccdc8459be361195e4cd924077f90925282205491928080614c4d575b15614c2057506143989250614a7f565b919082614c44575b5081614c3b575b50156143985750600190565b90501538614c2f565b15915038614c28565b50828211614c10565b9190918315614df9576040938451917fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602084019160601b1690818152601484528684019067ffffffffffffffff9480831086841117610c075760a091838a52815190209460608201948552607482015260348352019381851090851117610c0757614cfa9387525190209360086000526007602052600286600020015490614e63565b15614d905790614d1c9160086000526007602052600384600020015490614e63565b15614d275750600190565b6084905162461bcd60e51b815260206004820152602560248201527f4c6976654d696e743a20496e76616c6964204d65726b6c6520416d6f756e742060448201527f50726f6f660000000000000000000000000000000000000000000000000000006064820152fd5b6084835162461bcd60e51b815260206004820152602a60248201527f4c6976654d696e743a20496e76616c6964204d65726b6c6520456c696769626960448201527f6c6974792050726f6f66000000000000000000000000000000000000000000006064820152fd5b608460405162461bcd60e51b815260206004820152602a60248201527f4c6976654d696e743a20515220526564656d7074696f6e20416d6f756e74204d60448201527f757374204265203e2030000000000000000000000000000000000000000000006064820152fd5b929091906000915b8451831015614eb757614e7e8386614b82565b5190600082821015614ea55750600052602052614e9f604060002092614739565b91614e6b565b604091614e9f93825260205220610e02565b915092501490565b90614ec982614317565b614ed660405191826142f4565b828152601f19614ee68294614317565b0190602036910137565b90614efa82614317565b614f0760405191826142f4565b828152601f19614f178294614317565b019060005b828110614f2857505050565b806060602080938501015201614f1c565b90600090828252600e6020526040822081835260205260ff60408320541615600014614f685750505060001990565b6040928252600d602052828220908252602052205490565b90600090828252600f6020526040822081835260205260ff60408320541615600014614faf5750505060001990565b6040928252600c60205282822090825260205220549056fea2646970667358221220f61d094969a3da3368b2bf4411265a4c697c55f51cb5f9e44c0de28399f7163064736f6c63430008130033
Loading...
Loading
Loading...
Loading
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.