ETH Price: $1,748.33 (+10.80%)
Gas: 1.7 Gwei
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Execute Sale Eth...220812392025-03-19 13:33:2334 days ago1742391203IN
0xE86aD94E...94Db03769
7.13 ETH0.000144531.68
Execute Sale Eth...210666992024-10-28 21:04:47176 days ago1730149487IN
0xE86aD94E...94Db03769
0.0175 ETH0.0008487413.2
Execute Sale Eth...209881192024-10-17 21:58:11187 days ago1729202291IN
0xE86aD94E...94Db03769
0.035 ETH0.0026092722.8
Execute Sale Eth...201900002024-06-28 11:51:23298 days ago1719575483IN
0xE86aD94E...94Db03769
0.00875 ETH0.000385796
Execute Sale Eth...201899662024-06-28 11:44:35298 days ago1719575075IN
0xE86aD94E...94Db03769
0.02625 ETH0.000898028.4
Execute Sale Eth...201899342024-06-28 11:38:11298 days ago1719574691IN
0xE86aD94E...94Db03769
0.02625 ETH0.000769737.2
Execute Sale Eth...185971182023-11-18 7:01:47521 days ago1700290907IN
0xE86aD94E...94Db03769
0.107625 ETH0.0028907433.6
Execute Sale Eth...183602932023-10-16 3:37:23554 days ago1697427443IN
0xE86aD94E...94Db03769
0.030625 ETH0.001070058.4
Execute Sale Eth...181583582023-09-17 21:19:35583 days ago1694985575IN
0xE86aD94E...94Db03769
0.006125 ETH0.0020355618
Execute Sale Eth...181395242023-09-15 5:23:35585 days ago1694755415IN
0xE86aD94E...94Db03769
0.1026375 ETH0.0016484814.4
Execute Sale Eth...181381002023-09-15 0:34:47585 days ago1694738087IN
0xE86aD94E...94Db03769
0.006125 ETH0.0016481314.4
Execute Sale Eth...181380932023-09-15 0:33:23585 days ago1694738003IN
0xE86aD94E...94Db03769
0.00875 ETH0.0012359710.8
Execute Sale Eth...181380912023-09-15 0:32:59585 days ago1694737979IN
0xE86aD94E...94Db03769
0.00875 ETH0.0017849515.6
Execute Sale Eth...181277702023-09-13 13:46:47587 days ago1694612807IN
0xE86aD94E...94Db03769
0.060375 ETH0.0015034320.4
Execute Sale Eth...181235672023-09-12 23:37:35587 days ago1694561855IN
0xE86aD94E...94Db03769
0.0062125 ETH0.001236110.8
Execute Sale Eth...181007862023-09-09 19:02:11591 days ago1694286131IN
0xE86aD94E...94Db03769
0.0116988 ETH0.0035283131.2
Execute Sale Eth...180985922023-09-09 11:39:47591 days ago1694259587IN
0xE86aD94E...94Db03769
0.0112 ETH0.0012666112
Execute Sale Eth...180968892023-09-09 5:55:23591 days ago1694238923IN
0xE86aD94E...94Db03769
0.0112875 ETH0.0016741114.4
Execute Sale Eth...180968882023-09-09 5:55:11591 days ago1694238911IN
0xE86aD94E...94Db03769
0.0111912 ETH0.0013949512
Execute Sale Eth...180968562023-09-09 5:48:47591 days ago1694238527IN
0xE86aD94E...94Db03769
0.0119875 ETH0.001534613.2
Execute Sale Eth...180968472023-09-09 5:46:59591 days ago1694238419IN
0xE86aD94E...94Db03769
0.0105 ETH0.0015344413.2
Execute Sale Eth...180948012023-09-08 22:54:35591 days ago1694213675IN
0xE86aD94E...94Db03769
0.016625 ETH0.0013570412
Execute Sale Eth...180947862023-09-08 22:51:35592 days ago1694213495IN
0xE86aD94E...94Db03769
0.018375 ETH0.002005515.6
Execute Sale Eth...180947742023-09-08 22:49:11592 days ago1694213351IN
0xE86aD94E...94Db03769
0.02275 ETH0.001356912
Execute Sale Eth...180938312023-09-08 19:38:35592 days ago1694201915IN
0xE86aD94E...94Db03769
0.011375 ETH0.0031583227.6
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
Transfer220812392025-03-19 13:33:2334 days ago1742391203
0xE86aD94E...94Db03769
7.13 ETH
Transfer210666992024-10-28 21:04:47176 days ago1730149487
0xE86aD94E...94Db03769
0.0175 ETH
Transfer209881192024-10-17 21:58:11187 days ago1729202291
0xE86aD94E...94Db03769
0.035 ETH
Transfer201900002024-06-28 11:51:23298 days ago1719575483
0xE86aD94E...94Db03769
0.00875 ETH
Transfer201899662024-06-28 11:44:35298 days ago1719575075
0xE86aD94E...94Db03769
0.02625 ETH
Transfer201899342024-06-28 11:38:11298 days ago1719574691
0xE86aD94E...94Db03769
0.02625 ETH
Transfer185971182023-11-18 7:01:47521 days ago1700290907
0xE86aD94E...94Db03769
0.107625 ETH
Transfer183602932023-10-16 3:37:23554 days ago1697427443
0xE86aD94E...94Db03769
0.030625 ETH
Transfer181583582023-09-17 21:19:35583 days ago1694985575
0xE86aD94E...94Db03769
0.006125 ETH
Transfer181395242023-09-15 5:23:35585 days ago1694755415
0xE86aD94E...94Db03769
0.1026375 ETH
Transfer181381002023-09-15 0:34:47585 days ago1694738087
0xE86aD94E...94Db03769
0.006125 ETH
Transfer181380932023-09-15 0:33:23585 days ago1694738003
0xE86aD94E...94Db03769
0.00875 ETH
Transfer181380912023-09-15 0:32:59585 days ago1694737979
0xE86aD94E...94Db03769
0.00875 ETH
Transfer181277702023-09-13 13:46:47587 days ago1694612807
0xE86aD94E...94Db03769
0.060375 ETH
Transfer181235672023-09-12 23:37:35587 days ago1694561855
0xE86aD94E...94Db03769
0.0062125 ETH
Transfer181007862023-09-09 19:02:11591 days ago1694286131
0xE86aD94E...94Db03769
0.0116988 ETH
Transfer180985922023-09-09 11:39:47591 days ago1694259587
0xE86aD94E...94Db03769
0.0112 ETH
Transfer180968892023-09-09 5:55:23591 days ago1694238923
0xE86aD94E...94Db03769
0.0112875 ETH
Transfer180968882023-09-09 5:55:11591 days ago1694238911
0xE86aD94E...94Db03769
0.0111912 ETH
Transfer180968562023-09-09 5:48:47591 days ago1694238527
0xE86aD94E...94Db03769
0.0119875 ETH
Transfer180968472023-09-09 5:46:59591 days ago1694238419
0xE86aD94E...94Db03769
0.0105 ETH
Transfer180948012023-09-08 22:54:35591 days ago1694213675
0xE86aD94E...94Db03769
0.016625 ETH
Transfer180947862023-09-08 22:51:35592 days ago1694213495
0xE86aD94E...94Db03769
0.018375 ETH
Transfer180947742023-09-08 22:49:11592 days ago1694213351
0xE86aD94E...94Db03769
0.02275 ETH
Transfer180938312023-09-08 19:38:35592 days ago1694201915
0xE86aD94E...94Db03769
0.011375 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
NiftyExchangeExecutor

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 14 : NiftyExchangeExecutor.sol
// SPDX-License-Identifier: UNLICENSED
// Copyright (c) 2022 Gemini Trust Company LLC. All Rights Reserved
pragma solidity 0.8.x;

import "./single/721/Single721.sol";
import "./single/721/SingleHandler721.sol";
import "./batch/721/Batch721.sol";
import "./batch/721/BatchHandler721.sol";
import "./single/1155/Single1155.sol";
import "./single/1155/SingleHandler1155.sol";
import "./batch/1155/Batch1155.sol";
import "./batch/1155/BatchHandler1155.sol";
import "./switcher/Switcher.sol";
import "./switcher/SwitcherHandler.sol";

/**
 * @notice We're hiring Solidity engineers! Let's get nifty!
 *         https://www.gemini.com/careers/nifty-gateway
 */
contract NiftyExchangeExecutor is Single721, 
                                  SingleHandler721, 
                                  Batch721, 
                                  BatchHandler721, 
                                  Single1155, 
                                  SingleHandler1155, 
                                  Batch1155, 
                                  BatchHandler1155,
                                  Switcher,
                                  SwitcherHandler {

    constructor(address priceCurrencyUSD_, address recoveryAdmin_, address[] memory validSenders_) ExecutorCore(priceCurrencyUSD_, recoveryAdmin_, validSenders_) {
    }

    function withdraw(address recipient, uint256 value) external {
        _requireOnlyValidSender();
        _transferEth(recipient, value);
    }

    function withdraw20(address tokenContract, address recipient, uint256 amount) external {
        _requireOnlyValidSender();
        _transfer20(amount, tokenContract, recipient);
    }

    function withdraw721(address tokenContract, address recipient, uint256 tokenId) external {
        _requireOnlyValidSender();
        IERC721(tokenContract).safeTransferFrom(address(this), recipient, tokenId);
    }

}

File 2 of 14 : Single721.sol
// SPDX-License-Identifier: UNLICENSED
// Copyright (c) 2022 Gemini Trust Company LLC. All Rights Reserved
pragma solidity 0.8.x;

import "../../core/ExecutorCore.sol";

/**
 *
 */
abstract contract Single721 is ExecutorCore {

    /**
     * 0
     */
    function recordSale721(
        uint256 tokenId,
        address tokenContract,
        uint256 price,
        address priceCurrency) external {
        _requireOnlyValidSender();
        _recordSale721(tokenContract, tokenId, price, priceCurrency);
    }

    /**
     * #1
     */
    function executeSaleUsd721(
        uint256 tokenId,
        address tokenContract,
        uint256 price,
        address seller,
        address buyer) external {
        _requireOnlyValidSender();
        _transfer721(price, _priceCurrencyUSD, tokenId, tokenContract, seller, buyer);
    }

    /**
     * #2
     */
    function executeSaleEth721(
        uint256 tokenId, 
        address tokenContract,
        uint256 price, 
        address seller,
        uint256 sellerProceeds,
        address buyer) external payable {
        _requireOnlyValidSender();
        _transfer721(price, _priceCurrencyETH, tokenId, tokenContract, seller, buyer);
        _transferEth(seller, sellerProceeds);
    }

    /**
     * #3
     */
    function executeSaleToken721(
        uint256 tokenId, 
        address tokenContract,
        uint256 price,
        address priceCurrency,
        address seller,
        uint256 sellerProceeds, 
        address buyer) external {
        _requireOnlyValidSender();
        _transfer721(price, priceCurrency, tokenId, tokenContract, seller, buyer);
        _transfer20(sellerProceeds, priceCurrency, seller);
    }

    /**
     * #4
     */
    function executeSaleReceiver1eth721(
        uint256 tokenId,
        address tokenContract,
        uint256 price,
        address seller,
        uint256 sellerProceeds,
        address buyer,
        address receiverCreator, 
        uint256 receiverAmount) external payable {
        _requireOnlyValidSender();
        _transfer721(price, _priceCurrencyETH, tokenId, tokenContract, seller, buyer);
        _transferEth(seller, sellerProceeds); 
        _transferEth(receiverCreator, receiverAmount); 
    }

    /**
     * #5
     */
    function executeSaleReceiver1token721(
        address receiverCreator, 
        uint256 receiverAmount, 
        address priceCurrency,
        NiftyEvent calldata ne) external {
        _requireOnlyValidSender();
        address seller = ne.seller;
        _transfer721(ne.price, priceCurrency, ne.tokenId, ne.tokenContract, seller, ne.buyer);
        _transfer20(ne.sellerProceeds, priceCurrency, seller);
        _transfer20(receiverAmount, priceCurrency, receiverCreator);
    }

    /**
     * #6
     */
    function executeSaleReceiverNeth721(
        address[] calldata receiverCreators, 
        uint256[] calldata receiverAmounts, 
        NiftyEvent calldata ne) external payable {
        _requireOnlyValidSender();
        address seller = ne.seller;
        _transfer721(ne.price, _priceCurrencyETH, ne.tokenId, ne.tokenContract, seller, ne.buyer);
        _transferEth(seller, ne.sellerProceeds);
        for(uint256 i = 0; i < receiverCreators.length; i++){
            _transferEth(receiverCreators[i], receiverAmounts[i]);
        }
    }

    /**
     * #7
     */
    function executeSaleReceiverNtoken721(
        address[] calldata receiverCreators,
        uint256[] calldata receiverAmounts,
        address priceCurrency,
        NiftyEvent calldata ne) external {
        _requireOnlyValidSender();
        address seller = ne.seller;
        _transfer721(ne.price, priceCurrency, ne.tokenId, ne.tokenContract, seller, ne.buyer);
        _transfer20(ne.sellerProceeds, priceCurrency, seller);
        for(uint256 i = 0; i < receiverCreators.length; i++){
            _transfer20(receiverAmounts[i], priceCurrency, receiverCreators[i]);
        }
    }

}

File 3 of 14 : SingleHandler721.sol
// SPDX-License-Identifier: UNLICENSED
// Copyright (c) 2022 Gemini Trust Company LLC. All Rights Reserved
pragma solidity 0.8.x;

import "../../core/ExecutorCore.sol";

/**
 *
 */
abstract contract SingleHandler721 is ExecutorCore {    

    /**
     * #2x
     */
    function executeSaleEth721handler(
        uint256 refund,
        uint256 price, 
        uint256 sellerProceeds, 
        uint256 tokenId, 
        address tokenContract, 
        address seller, 
        address buyer) external payable {
        _requireOnlyValidSender();
        bool success = _transfer721handler(price, _priceCurrencyETH, tokenId, tokenContract, seller, buyer);
        if(success){
            _transferEth(seller, sellerProceeds);
        } else {
            _transferEth(buyer, refund);
        }
    }

    /**
     * #3x
     */
    function executeSaleToken721handler(
        uint256 refund,
        uint256 price, 
        uint256 sellerProceeds, 
        address priceCurrency, 
        uint256 tokenId, 
        address tokenContract, 
        address seller, 
        address buyer) external {
        _requireOnlyValidSender();
        bool success = _transfer721handler(price, priceCurrency, tokenId, tokenContract, seller, buyer);
        if(success){
            _transfer20(sellerProceeds, priceCurrency, seller);
        } else {
            _transfer20(refund, priceCurrency, buyer);
        }
    }

    /**
     * #4x
     */
    function executeSaleReceiver1eth721handler(
        uint256 refund,
        address receiverCreator, 
        uint256 receiverAmount, 
        uint256 price, 
        uint256 sellerProceeds, 
        uint256 tokenId, 
        address tokenContract, 
        address seller, 
        address buyer) external payable {
        _requireOnlyValidSender();
        bool success = _transfer721handler(price, _priceCurrencyETH, tokenId, tokenContract, seller, buyer);
        if(success){
            _transferEth(seller, sellerProceeds);
            _transferEth(receiverCreator, receiverAmount);
        } else {
            _transferEth(buyer, refund);
        }
    }

    /**
     * #5x
     */
    function executeSaleReceiver1token721handler(
        address receiverCreator, 
        uint256 receiverAmount, 
        address priceCurrency,
        NiftyEventHandler calldata ne) external {
        _requireOnlyValidSender();
        address seller = ne.seller;
        address buyer = ne.buyer;
        bool success = _transfer721handler(ne.price, priceCurrency, ne.tokenId, ne.tokenContract, seller, buyer);
        if(success){
            _transfer20(ne.sellerProceeds, priceCurrency, seller);
            _transfer20(receiverAmount, priceCurrency, receiverCreator);
        } else {
            _transfer20(ne.refund, priceCurrency, buyer);
        }
    }

    /**
     * #6x
     */
    function executeSaleReceiverNeth721handler(
        address[] calldata receiverCreators, 
        uint256[] calldata receiverAmounts, 
        NiftyEventHandler calldata ne) external payable {
        _requireOnlyValidSender();
        address seller = ne.seller;
        address buyer = ne.buyer;
        bool success = _transfer721handler(ne.price, _priceCurrencyETH, ne.tokenId, ne.tokenContract, seller, buyer);
        if(success){
            _transferEth(seller, ne.sellerProceeds);
            for(uint256 i = 0; i < receiverCreators.length; i++){
                _transferEth(receiverCreators[i], receiverAmounts[i]);
            }
        } else {
            _transferEth(buyer, ne.refund);
        }
    }

    /**
     * #7x
     */
    function executeSaleReceiverNtoken721handler(
        address[] calldata receiverCreators,
        uint256[] calldata receiverAmounts,
        address priceCurrency,
        NiftyEventHandler calldata ne) external {
        _requireOnlyValidSender();
        address seller = ne.seller;
        address buyer = ne.buyer;
        bool success = _transfer721handler(ne.price, priceCurrency, ne.tokenId, ne.tokenContract, seller, buyer);
        if(success){
            _transfer20(ne.sellerProceeds, priceCurrency, seller);
            for(uint256 i = 0; i < receiverCreators.length; i++){
                _transfer20(receiverAmounts[i], priceCurrency, receiverCreators[i]);
            }
        } else {
            _transfer20(ne.refund, priceCurrency, buyer);
        }
    }

}

File 4 of 14 : Batch721.sol
// SPDX-License-Identifier: UNLICENSED
// Copyright (c) 2022 Gemini Trust Company LLC. All Rights Reserved
pragma solidity 0.8.x;

import "../../core/ExecutorCore.sol";

/**
 *
 */
abstract contract Batch721 is ExecutorCore {    

    /** 
     * 0
     */
    function recordSale721batch(
        address[] calldata tokenContract, 
        uint256[] calldata tokenId, 
        uint256[] calldata price, 
        address[] calldata priceCurrency) external {
        _requireOnlyValidSender();
        for (uint256 i = 0; i < tokenContract.length; i++) {
            _recordSale721(tokenContract[i], tokenId[i], price[i], priceCurrency[i]);
        }
    }

    /** 
     * 1 
     */
    function executeSaleUsd721batch(
        uint256[] calldata price, 
        uint256[] calldata tokenId, 
        address[] calldata tokenContract, 
        address[] calldata seller, 
        address[] calldata buyer) external {
        _requireOnlyValidSender();
        for(uint256 i = 0; i < tokenContract.length; i++){
            _transfer721(price[i], _priceCurrencyUSD, tokenId[i], tokenContract[i], seller[i], buyer[i]);
        }
    }

    /**
     * 2
     */
    function executeSaleEth721batch(
        uint256[] calldata price, 
        uint256[] calldata sellerProceeds, 
        uint256[] calldata tokenId, 
        address[] calldata tokenContract, 
        address[] calldata seller, 
        address[] calldata buyer) external payable {
        _requireOnlyValidSender();
        for(uint256 i = 0; i < tokenContract.length; i++){
            _transfer721(price[i], _priceCurrencyETH, tokenId[i], tokenContract[i], seller[i], buyer[i]);
            _transferEth(seller[i], sellerProceeds[i]);
        }    
    }

    /** 
     * 3
     */
    function executeSaleToken721batch( 
        address[] calldata priceCurrency, 
        NiftyEvent[] calldata ne) external {
        _requireOnlyValidSender();
        for(uint256 i = 0; i < ne.length; i++){
            address seller = ne[i].seller;
            address currency = priceCurrency[i];
            _transfer721(ne[i].price, currency, ne[i].tokenId, ne[i].tokenContract, seller, ne[i].buyer);
            _transfer20(ne[i].sellerProceeds, currency, seller);
        } 
    }

    /** 
     * 6
     */
    function executeSaleReceiverNeth721batch(
        address[][] calldata receiverCreators, 
        uint256[][] calldata receiverAmounts, 
        NiftyEvent[] calldata ne) external payable {
        _requireOnlyValidSender();
        for(uint256 i = 0; i < ne.length; i++){            
            address seller = ne[i].seller;
            _transfer721(ne[i].price, _priceCurrencyETH, ne[i].tokenId, ne[i].tokenContract, seller, ne[i].buyer); 
            _transferEth(seller, ne[i].sellerProceeds);
            for(uint256 j = 0; j < receiverCreators[i].length; j++){
                _transferEth(receiverCreators[i][j], receiverAmounts[i][j]);
            }
        } 
    }

    /**
     * 7
     */
    function executeSaleReceiverNtoken721batch(NiftyEventReceiver[] calldata ne) external {
        _requireOnlyValidSender();
        for(uint256 i = 0; i < ne.length; i++){            
            address seller = ne[i].seller;
            address currency = ne[i].priceCurrency;
            _transfer721(ne[i].price, currency, ne[i].tokenId, ne[i].tokenContract, seller, ne[i].buyer); 
            _transfer20(ne[i].sellerProceeds, currency, seller);
            for(uint256 j = 0; j < ne[i].receiverCreators.length; j++){
                _transfer20(ne[i].receiverAmounts[j], currency, ne[i].receiverCreators[j]);
            }
        } 
    }

}

File 5 of 14 : BatchHandler721.sol
// SPDX-License-Identifier: UNLICENSED
// Copyright (c) 2022 Gemini Trust Company LLC. All Rights Reserved
pragma solidity 0.8.x;

import "../../core/ExecutorCore.sol";

/**
 *
 */
abstract contract BatchHandler721 is ExecutorCore {

    /**
     * 2
     */
    function executeSaleEth721batchHandler(NiftyEventHandler[] calldata ne) external payable {
        _requireOnlyValidSender();
        for(uint256 i = 0; i < ne.length; i++){
            address seller = ne[i].seller;
            address buyer = ne[i].buyer;
            bool success = _transfer721handler(ne[i].price, _priceCurrencyETH, ne[i].tokenId, ne[i].tokenContract, seller, buyer);
            if(success){
                _transferEth(seller, ne[i].sellerProceeds);
            } else {
                _transferEth(buyer, ne[i].refund);
            }
        } 
    }

    /** 
     * 3
     */
    function executeSaleToken721batchHandler( 
        address[] calldata priceCurrency, 
        NiftyEventHandler[] calldata ne) external {
        _requireOnlyValidSender();
        for(uint256 i = 0; i < ne.length; i++){    
            address seller = ne[i].seller;
            address buyer = ne[i].buyer;
            address currency = priceCurrency[i];
            bool success = _transfer721handler(ne[i].price, currency, ne[i].tokenId, ne[i].tokenContract, seller, buyer);
            if(success){
                _transfer20(ne[i].sellerProceeds, currency, seller);
            } else {
                _transfer20(ne[i].refund, currency, buyer);
            }
        } 
    }

    /**
     * 6
     */
    function executeSaleReceiverNeth721batchHandler(
        address[][] calldata receiverCreators, 
        uint256[][] calldata receiverAmounts, 
        NiftyEventHandler[] calldata ne) external payable {
        _requireOnlyValidSender();
        for(uint256 i = 0; i < ne.length; i++){
            address seller = ne[i].seller;
            address buyer = ne[i].buyer;
            bool success = _transfer721handler(ne[i].price, _priceCurrencyETH, ne[i].tokenId, ne[i].tokenContract, seller, buyer);
            if(success){
                _transferEth(seller, ne[i].sellerProceeds);
                for(uint256 j = 0; j < receiverCreators[i].length; j++){
                    _transferEth(receiverCreators[i][j], receiverAmounts[i][j]);
                }
            } else {
                _transferEth(buyer, ne[i].refund);
            }
        }
    }

    /**
     * 7
     */
    function executeSaleReceiverNtoken721batchHandler(NiftyEventReceiverHandler[] calldata ne) external {
        _requireOnlyValidSender();
        for(uint256 i = 0; i < ne.length; i++){            
            address seller = ne[i].seller;
            address currency = ne[i].priceCurrency;
            address buyer = ne[i].buyer;
            bool success = _transfer721handler(ne[i].price, currency, ne[i].tokenId, ne[i].tokenContract, seller, buyer);
            if(success){
                _transfer20(ne[i].sellerProceeds, currency, seller);
                for(uint256 j = 0; j < ne[i].receiverCreators.length; j++){
                    _transfer20(ne[i].receiverAmounts[j], currency, ne[i].receiverCreators[j]);
                }
            } else {
                _transfer20(ne[i].refund, currency, buyer);
            }
        }
    }

}

File 6 of 14 : Single1155.sol
// SPDX-License-Identifier: UNLICENSED
// Copyright (c) 2022 Gemini Trust Company LLC. All Rights Reserved
pragma solidity 0.8.x;

import "../../core/ExecutorCore.sol";

/**
 *
 */
abstract contract Single1155 is ExecutorCore {
    
    /**
     * #0.5
     */
    function recordSale1155(address tokenContract, uint256 tokenId, uint256 count, uint256 price, address priceCurrency) external {
        _requireOnlyValidSender();
        _recordSale1155(tokenContract, tokenId, count, price, priceCurrency);
    }

    /**
     * #1.5
     */
    function executeSaleUsd1155(
        uint256 count,
        uint256 price,
        uint256 tokenId, 
        address tokenContract, 
        address seller, 
        address buyer) external {
        _requireOnlyValidSender();
        _transfer1155(count, price, _priceCurrencyUSD, tokenId, tokenContract, seller, buyer);
    }

    /**
     * #2.5
     */
    function executeSaleEth1155(
        uint256 count, 
        uint256 price, 
        uint256 sellerProceeds, 
        uint256 tokenId, 
        address tokenContract, 
        address seller, 
        address buyer) external payable {
        _requireOnlyValidSender();
        _transfer1155(count, price, _priceCurrencyETH, tokenId, tokenContract, seller, buyer);
        _transferEth(seller, sellerProceeds);   
    }

    /**
     * #3.5
     */
    function executeSaleToken1155(
        uint256 count, 
        uint256 price, 
        uint256 sellerProceeds, 
        address priceCurrency, 
        uint256 tokenId, 
        address tokenContract, 
        address seller, 
        address buyer) external {
        _requireOnlyValidSender();
        _transfer1155(count, price, priceCurrency, tokenId, tokenContract, seller, buyer);
        _transfer20(sellerProceeds, priceCurrency, seller);
    }

    /**
     * #4.5
     */
    function executeSaleReceiver1eth1155(
        uint256 count, 
        address receiverCreator, 
        uint256 receiverAmount, 
        uint256 price, 
        uint256 sellerProceeds, 
        uint256 tokenId, 
        address tokenContract, 
        address seller, 
        address buyer) external payable {
        _requireOnlyValidSender();
        _transfer1155(count, price, _priceCurrencyETH, tokenId, tokenContract, seller, buyer);
        _transferEth(seller, sellerProceeds); 
        _transferEth(receiverCreator, receiverAmount); 
    }

    /**
     * #5.5
     */
    function executeSaleReceiver1token1155(
        uint256 count,
        address receiverCreator, 
        uint256 receiverAmount, 
        address priceCurrency, 
        NiftyEvent calldata ne) external {
        _requireOnlyValidSender();
        address seller = ne.seller;
        _transfer1155(count, ne.price, priceCurrency, ne.tokenId, ne.tokenContract, seller, ne.buyer);
        _transfer20(ne.sellerProceeds, priceCurrency, seller);
        _transfer20(receiverAmount, priceCurrency, receiverCreator);
    }

    /**
     * #6.5
     */
    function executeSaleReceiverNeth1155(
        uint256 count,
        address[] calldata receiverCreators, 
        uint256[] calldata receiverAmounts, 
        NiftyEvent calldata ne) external payable {
        _requireOnlyValidSender();
        address seller = ne.seller;
        _transfer1155(count, ne.price, _priceCurrencyETH, ne.tokenId, ne.tokenContract, seller, ne.buyer);
        _transferEth(seller, ne.sellerProceeds);
        for(uint256 i = 0; i < receiverCreators.length; i++){
            _transferEth(receiverCreators[i], receiverAmounts[i]);
        }
    }

    /**
     * #7.5
     */
    function executeSaleReceiverNtoken1155(
        uint256 count, 
        address[] calldata receiverCreators,
        uint256[] calldata receiverAmounts,
        address priceCurrency,
        NiftyEvent calldata ne) external {
        _requireOnlyValidSender();
        address seller = ne.seller;
        _transfer1155(count, ne.price, priceCurrency, ne.tokenId, ne.tokenContract, seller, ne.buyer);
        _transfer20(ne.sellerProceeds, priceCurrency, seller);
        for(uint256 i = 0; i < receiverCreators.length; i++){
            _transfer20(receiverAmounts[i], priceCurrency, receiverCreators[i]);
        }
    }

}

File 7 of 14 : SingleHandler1155.sol
// SPDX-License-Identifier: UNLICENSED
// Copyright (c) 2022 Gemini Trust Company LLC. All Rights Reserved
pragma solidity 0.8.x;

import "../../core/ExecutorCore.sol";

/**
 *
 */
abstract contract SingleHandler1155 is ExecutorCore {
    
    /**
     * #2.5x
     */
    function executeSaleEth1155handler(
        uint256 count,
        uint256 refund,
        uint256 price, 
        uint256 sellerProceeds, 
        uint256 tokenId, 
        address tokenContract, 
        address seller, 
        address buyer) external payable {
        _requireOnlyValidSender();
        bool success = _transfer1155handler(count, price, _priceCurrencyETH, tokenId, tokenContract, seller, buyer);
        if(success){
            _transferEth(seller, sellerProceeds);
        } else {
            _transferEth(buyer, refund);
        } 
    }

    /**
     * #3.5x
     */
    function executeSaleToken1155handler(
        uint256 count,
        uint256 refund,
        uint256 price, 
        uint256 sellerProceeds, 
        address priceCurrency, 
        uint256 tokenId, 
        address tokenContract, 
        address seller, 
        address buyer) external {
        _requireOnlyValidSender();
        bool success = _transfer1155handler(count, price, priceCurrency, tokenId, tokenContract, seller, buyer);
        if(success){
            _transfer20(sellerProceeds, priceCurrency, seller);
        } else {
            _transfer20(refund, priceCurrency, buyer);
        }
    }

    /**
     * #4.5x
     */
    function executeSaleReceiver1eth1155handler(
        uint256 count,
        uint256 refund,
        address receiverCreator, 
        uint256 receiverAmount, 
        uint256 price, 
        uint256 sellerProceeds, 
        uint256 tokenId, 
        address tokenContract, 
        address seller, 
        address buyer) external payable {
        _requireOnlyValidSender();
        bool success = _transfer1155handler(count, price, _priceCurrencyETH, tokenId, tokenContract, seller, buyer);
        if(success){
            _transferEth(seller, sellerProceeds);
            _transferEth(receiverCreator, receiverAmount);
        } else {
            _transferEth(buyer, refund);
        }
    }

    /**
     * #5.5x
     */
    function executeSaleReceiver1token1155handler(
        uint256 count,
        address receiverCreator, 
        uint256 receiverAmount, 
        address priceCurrency, 
        NiftyEventHandler calldata ne) external {
        _requireOnlyValidSender();
        address seller = ne.seller;
        address buyer = ne.buyer;
        bool success = _transfer1155handler(count, ne.price, priceCurrency, ne.tokenId, ne.tokenContract, seller, ne.buyer);
        if(success){
            _transfer20(ne.sellerProceeds, priceCurrency, seller);
            _transfer20(receiverAmount, priceCurrency, receiverCreator);
        } else {
            _transfer20(ne.refund, priceCurrency, buyer);
        }
    }

    /**
     * #6.5x
     */
    function executeSaleReceiverNeth1155handler(
        uint256 count,
        address[] calldata receiverCreators, 
        uint256[] calldata receiverAmounts, 
        NiftyEventHandler calldata ne) external payable {
        _requireOnlyValidSender();
        address seller = ne.seller;
        address buyer = ne.buyer;
        bool success = _transfer1155handler(count, ne.price, _priceCurrencyETH, ne.tokenId, ne.tokenContract, seller, ne.buyer);
        if(success){
            _transferEth(seller, ne.sellerProceeds);
            for(uint256 i = 0; i < receiverCreators.length; i++){
                _transferEth(receiverCreators[i], receiverAmounts[i]);
            }
        } else {
            _transferEth(buyer, ne.refund);
        }
    }

    /**
     * #7.5x
     */
    function executeSaleReceiverNtoken1155handler(
        uint256 count,
        address[] calldata receiverCreators,
        uint256[] calldata receiverAmounts,
        address priceCurrency,
        NiftyEventHandler calldata ne) external {
        _requireOnlyValidSender();
        address seller = ne.seller;
        address buyer = ne.buyer;
        bool success = _transfer1155handler(count, ne.price, priceCurrency, ne.tokenId, ne.tokenContract, seller, buyer);
        if(success){
            _transfer20(ne.sellerProceeds, priceCurrency, seller);
            for(uint256 i = 0; i < receiverCreators.length; i++){
                _transfer20(receiverAmounts[i], priceCurrency, receiverCreators[i]);
            }
        } else {
            _transfer20(ne.refund, priceCurrency, buyer);
        }
    }

}

File 8 of 14 : Batch1155.sol
// SPDX-License-Identifier: UNLICENSED
// Copyright (c) 2022 Gemini Trust Company LLC. All Rights Reserved
pragma solidity 0.8.x;

import "../../core/ExecutorCore.sol";

/**
 *
 */
abstract contract Batch1155 is ExecutorCore {    

    /** 
     * 0.5
     */
    function recordSale1155batch(
        uint256[] calldata count, 
        address[] calldata tokenContract, 
        uint256[] calldata tokenId,
        uint256[] calldata price, 
        address[] calldata priceCurrency) external {
        _requireOnlyValidSender();
        for (uint256 i = 0; i < tokenContract.length; i++) {
            _recordSale1155(tokenContract[i], tokenId[i], count[i], price[i], priceCurrency[i]);
        }
    }

    /** 
     * 1.5
     */
    function executeSaleUsd1155batch(
        uint256[] calldata count,
        uint256[] calldata price,
        uint256[] calldata tokenId, 
        address[] calldata tokenContract, 
        address[] calldata seller, 
        address[] calldata buyer) external {
        _requireOnlyValidSender();
        for(uint256 i = 0; i < tokenContract.length; i++){
            _transfer1155(count[i], price[i], _priceCurrencyUSD, tokenId[i], tokenContract[i], seller[i], buyer[i]);
        }
    }

    /** 
     * 2.5
     */
    function executeSaleEth1155batch(
        uint256[] calldata count,
        NiftyEvent[] calldata ne) external payable {
        _requireOnlyValidSender();
        for(uint256 i = 0; i < ne.length; i++){
            _transfer1155(count[i], ne[i].price, _priceCurrencyETH, ne[i].tokenId, ne[i].tokenContract, ne[i].seller, ne[i].buyer);
            _transferEth(ne[i].seller, ne[i].sellerProceeds);
        }  
    }

    /** 
     * 3.5
     */
    function executeSaleToken1155batch(
        uint256[] calldata count, 
        address[] calldata priceCurrency, 
        NiftyEvent[] calldata ne) external {
        _requireOnlyValidSender();
        for(uint256 i = 0; i < ne.length; i++){
            address seller = ne[i].seller;
            address currency = priceCurrency[i];
            _transfer1155(count[i], ne[i].price, currency, ne[i].tokenId, ne[i].tokenContract, seller, ne[i].buyer);
            _transfer20(ne[i].sellerProceeds, currency, seller);
        } 
    }

    /** 
     * 6.5
     */
    function executeSaleReceiverNeth1155batch(
        uint256[] calldata count,
        address[][] calldata receiverCreators, 
        uint256[][] calldata receiverAmounts,  
        NiftyEvent[] calldata ne) external payable {
        _requireOnlyValidSender();
        for(uint256 i = 0; i < ne.length; i++){            
            address seller = ne[i].seller;
            _transfer1155(count[i], ne[i].price, _priceCurrencyETH, ne[i].tokenId, ne[i].tokenContract, seller, ne[i].buyer);
            _transferEth(seller, ne[i].sellerProceeds);
            for(uint256 j = 0; j < receiverCreators[i].length; j++){
                _transferEth(receiverCreators[i][j], receiverAmounts[i][j]);
            }
        } 
    }

    /** 
     * 7.5
     */
    function executeSaleReceiverNtoken1155batch(uint256[] calldata count, NiftyEventReceiver[] calldata ne) external {
        _requireOnlyValidSender();
        for(uint256 i = 0; i < ne.length; i++){            
            address seller = ne[i].seller;
            address currency = ne[i].priceCurrency;
            _transfer1155(count[i], ne[i].price, currency, ne[i].tokenId, ne[i].tokenContract, seller, ne[i].buyer);
            _transfer20(ne[i].sellerProceeds, currency, seller);
            for(uint256 j = 0; j < ne[i].receiverCreators.length; j++){
                _transfer20(ne[i].receiverAmounts[j], currency, ne[i].receiverCreators[j]);
            }
        } 
    }

}

File 9 of 14 : BatchHandler1155.sol
// SPDX-License-Identifier: UNLICENSED
// Copyright (c) 2022 Gemini Trust Company LLC. All Rights Reserved
pragma solidity 0.8.x;

import "../../core/ExecutorCore.sol";

/**
 *
 */
abstract contract BatchHandler1155 is ExecutorCore {

    /**
     * 2.5x
     */
    function executeSaleEth1155batchHandler(
        uint256[] calldata count,
        NiftyEventHandler[] calldata ne) external payable {
        _requireOnlyValidSender();
        for(uint256 i = 0; i < ne.length; i++){
            address seller = ne[i].seller;
            address buyer = ne[i].buyer;
            bool success = _transfer1155handler(count[i], ne[i].price, _priceCurrencyETH, ne[i].tokenId, ne[i].tokenContract, seller, buyer);
            if(success){
                _transferEth(seller, ne[i].sellerProceeds);
            } else {
                _transferEth(buyer, ne[i].refund);
            } 
        } 
    }

    /**
     * 3.5x
     */
    function executeSaleToken1155batchHandler(
        uint256[] calldata count, 
        address[] calldata priceCurrency, 
        NiftyEventHandler[] calldata ne) external {
        _requireOnlyValidSender();
        for(uint256 i = 0; i < ne.length; i++){    
            address seller = ne[i].seller;
            address buyer = ne[i].buyer;
            address currency = priceCurrency[i];
            bool success = _transfer1155handler(count[i], ne[i].price, currency, ne[i].tokenId, ne[i].tokenContract, seller, buyer);
            if(success){
                _transfer20(ne[i].sellerProceeds, currency, seller);
            } else {
                _transfer20(ne[i].refund, currency, buyer);
            }
        } 
    }

    /**
     * 6.5x
     */
    function executeSaleReceiverNeth1155batchHandler(
        uint256[] calldata count,
        address[][] calldata receiverCreators, 
        uint256[][] calldata receiverAmounts,  
        NiftyEventHandler[] calldata ne) external payable {
        _requireOnlyValidSender();
        for(uint256 i = 0; i < ne.length; i++){
            address seller = ne[i].seller;
            address buyer = ne[i].buyer;
            bool success = _transfer1155handler(count[i], ne[i].price, _priceCurrencyETH, ne[i].tokenId, ne[i].tokenContract, seller, buyer);
            if(success){
                _transferEth(seller, ne[i].sellerProceeds);
                for(uint256 j = 0; j < receiverCreators[i].length; j++){
                    _transferEth(receiverCreators[i][j], receiverAmounts[i][j]);
                }
            } else {
                _transferEth(buyer, ne[i].refund);
            }
        }
    }

    /**
     * 7.5x
     */
    function executeSaleReceiverNtoken1155batchHandler(uint256[] calldata count, NiftyEventReceiverHandler[] calldata ne) external {
        _requireOnlyValidSender();
        for(uint256 i = 0; i < ne.length; i++){            
            address seller = ne[i].seller;
            address currency = ne[i].priceCurrency;
            address buyer = ne[i].buyer;
            bool success = _transfer1155handler(count[i], ne[i].price, currency, ne[i].tokenId, ne[i].tokenContract, seller, buyer);
            if(success){
                _transfer20(ne[i].sellerProceeds, currency, seller);
                for(uint256 j = 0; j < ne[i].receiverCreators.length; j++){
                    _transfer20(ne[i].receiverAmounts[j], currency, ne[i].receiverCreators[j]);
                }
            } else {
                _transfer20(ne[i].refund, currency, buyer);
            }
        }
    }

}

File 10 of 14 : Switcher.sol
// SPDX-License-Identifier: UNLICENSED
// Copyright (c) 2022 Gemini Trust Company LLC. All Rights Reserved
pragma solidity 0.8.x;

import "../core/ExecutorCore.sol";

/**
 * 721/1155, ETH/USD/ERC-20, & 0/1/N Receivers, w/o refund 
 */
abstract contract Switcher is ExecutorCore {

    /**
     * @dev Takes as input an array of generalized objects, consisting of 
     * sale events that include tokens of type ERC-721, and ERC-1155. The
     * payment may have been made in ETH, USD, or an ERC-20 token. The number
     * of royalty receivers can be either 0, 1 or N.  
     */
    function executeSaleBatch(NiftyEventBatch[] calldata ne) external payable {
        _requireOnlyValidSender();  
        for (uint256 i = 0; i < ne.length; i++) {
            address currency = ne[i].priceCurrency; 
            uint256 sellerProceeds = ne[i].sellerProceeds;
            address seller = ne[i].seller; 
            if(ne[i].count == 0) {
                _transfer721(ne[i].price, currency, ne[i].tokenId, ne[i].tokenContract, seller, ne[i].buyer);
            } else {
                _transfer1155(ne[i].count, ne[i].price, currency, ne[i].tokenId, ne[i].tokenContract, seller, ne[i].buyer);
            }
            _executeSwitcher(currency, sellerProceeds, seller, ne[i].receiverCreators, ne[i].receiverAmounts);
        }
    }

}

File 11 of 14 : SwitcherHandler.sol
// SPDX-License-Identifier: UNLICENSED
// Copyright (c) 2022 Gemini Trust Company LLC. All Rights Reserved
pragma solidity 0.8.x;

import "../core/ExecutorCore.sol";

/**
 * 721/1155, ETH/USD/ERC-20, & 0/1/N Receivers, w/ refund 
 */
abstract contract SwitcherHandler is ExecutorCore {

    /**
     * @dev Takes as input an array of generalized objects, consisting of 
     * sale events that include tokens of type ERC-721, and ERC-1155. The
     * payment may have been made in ETH, USD, or an ERC-20 token. The number
     * of royalty receivers can be either 0, 1 or N.
     * 
     * @notice In the event the transfer is unsuccessful, the function will 
     * issue a refund to the buyer in the amount specified by the input 'refund'
     * parameter.  
     */
    function executeSaleBatchHandler(uint256[] calldata refund, NiftyEventBatch[] calldata ne) external payable {
        _requireOnlyValidSender();  
        for (uint256 i = 0; i < ne.length; i++) {
            address currency = ne[i].priceCurrency; 
            uint256 sellerProceeds = ne[i].sellerProceeds;
            address seller = ne[i].seller; 
            address buyer = ne[i].buyer; 
            if(ne[i].count == 0) {
                bool success = _transfer721handler(ne[i].price, currency, ne[i].tokenId, ne[i].tokenContract, seller, buyer);
                if(success){
                    _executeSwitcher(currency, sellerProceeds, seller, ne[i].receiverCreators, ne[i].receiverAmounts);
                } else {
                    _executeRefund(refund[i], currency, buyer);
                }
            } else {
                bool success = _transfer1155handler(ne[i].count, ne[i].price, currency, ne[i].tokenId, ne[i].tokenContract, seller, buyer);
                if(success){
                    _executeSwitcher(currency, sellerProceeds, seller, ne[i].receiverCreators, ne[i].receiverAmounts);
                } else {
                    _executeRefund(refund[i], currency, buyer);
                }
            }
        }
    }
}

File 12 of 14 : ExecutorCore.sol
// SPDX-License-Identifier: UNLICENSED
// Copyright (c) 2022 Gemini Trust Company LLC. All Rights Reserved
pragma solidity 0.8.x;

import "../registry/Registry.sol";

interface IERC1155 {
    function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data) external;
}

interface IERC721 {
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
}

struct NiftyEvent {
    uint256 sellerProceeds;
    uint256 price;
    uint256 tokenId; 
    address tokenContract; 
    address seller;
    address buyer;
}

struct NiftyEventHandler {
    uint256 refund; ///
    uint256 sellerProceeds;
    uint256 price;
    uint256 tokenId; 
    address tokenContract; 
    address seller;
    address buyer;
}

struct NiftyEventReceiver {
    uint256 sellerProceeds;
    uint256 price;
    uint256 tokenId;
    address tokenContract;
    address seller;
    address buyer;
    address priceCurrency;
    address[] receiverCreators;
    uint256[] receiverAmounts;
}

struct NiftyEventReceiverHandler {
    uint256 refund; ///
    uint256 sellerProceeds;
    uint256 price;
    uint256 tokenId;
    address tokenContract;
    address seller;
    address buyer;
    address priceCurrency;
    address[] receiverCreators;
    uint256[] receiverAmounts;
}

struct NiftyEventBatch {
    uint256 tokenId;
    uint256 count; /// @notice Value of '0' indicates ERC-721 token
    uint256 sellerProceeds; /// @notice Amount remitted to seller
    uint256 price;
    address priceCurrency; /// @notice Settlement currency (USD, ETH, ERC-20)
    address tokenContract;
    address seller;
    address buyer;
    address[] receiverCreators;
    uint256[] receiverAmounts;
}

/**
 *
 */
abstract contract ExecutorCore is Registry {

    address constant public _priceCurrencyETH = address(0);

    address immutable public _priceCurrencyUSD;

    event NiftySale721(address indexed tokenContract, uint256 tokenId, uint256 price, address priceCurrency);

    event NiftySale1155(address indexed tokenContract, uint256 tokenId, uint256 count, uint256 price, address priceCurrency);

    constructor(address priceCurrencyUSD_, address recoveryAdmin_, address[] memory validSenders_) Registry(recoveryAdmin_, validSenders_) {
        _priceCurrencyUSD = priceCurrencyUSD_;
    }

    /**
     *
     */
    function _transferEth(address recipient, uint256 value) internal {
        (bool success,) = payable(recipient).call{value: value}("");
        require(success, "NiftyExchangeExecutor: Value transfer unsuccessful");
    }

    function _transfer20(uint256 value, address token, address to) internal {
        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))));
    }

    function _transfer721(uint256 price, address priceCurrency, uint256 tokenId, address tokenContract, address seller, address buyer) internal {
        IERC721(tokenContract).safeTransferFrom(seller, buyer, tokenId);
        emit NiftySale721(tokenContract, tokenId, price, priceCurrency);
    }

    function _transfer721handler(uint256 price, address priceCurrency, uint256 tokenId, address tokenContract, address seller, address buyer) internal returns (bool) {
        try IERC721(tokenContract).safeTransferFrom(seller, buyer, tokenId) {
            emit NiftySale721(tokenContract, tokenId, price, priceCurrency);
            return true;
        } catch {
            return false;
        }
    }

    function _transfer1155(uint256 count, uint256 price, address priceCurrency, uint256 tokenId, address tokenContract, address seller, address buyer) internal {
        IERC1155(tokenContract).safeTransferFrom(seller, buyer, tokenId, count, "");
        emit NiftySale1155(tokenContract, tokenId, count, price, priceCurrency); /// @notice 'price' describes entire purchase.
    }

    function _transfer1155handler(uint256 count, uint256 price, address priceCurrency, uint256 tokenId, address tokenContract, address seller, address buyer) internal returns (bool) {
        try IERC1155(tokenContract).safeTransferFrom(seller, buyer, tokenId, count, "") {
            emit NiftySale1155(tokenContract, tokenId, count, price, priceCurrency);
            return true;
        } catch {
            return false;
        }
    }

    function _recordSale721(address tokenContract, uint256 tokenId, uint256 price, address priceCurrency) internal {
        emit NiftySale721(tokenContract, tokenId, price, priceCurrency);
    }

    function _recordSale1155(address tokenContract, uint256 tokenId, uint256 count, uint256 price, address priceCurrency) internal {
        emit NiftySale1155(tokenContract, tokenId, count, price, priceCurrency);
    }

    function _executeSwitcher(
        address currency, 
        uint256 sellerProceeds, 
        address seller, 
        address[] calldata receiverCreators, 
        uint256[] calldata receiverAmounts) internal {
        bool eth = currency == _priceCurrencyETH;
        if(sellerProceeds > 0){
            if(eth){
                _transferEth(seller, sellerProceeds);
            } else {
                _transfer20(sellerProceeds, currency, seller);
            }
        }
        uint256 receiverCount = receiverCreators.length;
        if(receiverCount > 0){
            for(uint256 i = 0; i < receiverCount; i++){
                if(eth){
                    _transferEth(receiverCreators[i], receiverAmounts[i]);
                } else {
                    _transfer20(receiverAmounts[i], currency, receiverCreators[i]);
                }
            }
        }
    }

    function _executeRefund(uint256 refund, address currency, address buyer) internal {
        if(refund > 0){
            if(currency == _priceCurrencyETH) {
                _transferEth(buyer, refund);
            } else {
                _transfer20(refund, currency, buyer);
            }
        }
    }

}

File 13 of 14 : Registry.sol
// SPDX-License-Identifier: UNLICENSED
// Copyright (c) 2022 Gemini Trust Company LLC. All Rights Reserved
pragma solidity 0.8.x;

import "./LockRequestable.sol";

struct AdminUpdateRequest {
    address proposed;
}

contract Registry is LockRequestable {

    address public custodian;

    mapping(bytes32 => AdminUpdateRequest) public custodianChangeReqs;

    event CustodianChangeRequested(
        bytes32 _lockId,
        address _msgSender,
        address _proposedCustodian,
        uint256 _lockRequestIdx
    );
    event CustodianChangeConfirmed(bytes32 _lockId, address _newCustodian);

    mapping(address => address) public _validSenderSet;
    uint256 public setSize;
    address constant GUARD = address(1);

    mapping(bytes32 => AdminUpdateRequest) public ownerAddReqs;

    event ValidSenderAddRequested(
        bytes32 _lockId,
        address _msgSender,
        address _proposed,
        uint256 _lockRequestIdx
    );
    event ValidSenderAddConfirmed(bytes32 _lockId, address _newValidSender);
    
    string internal constant ERROR_INVALID_MSG_SENDER = "Invalid msg.sender";

    constructor(address custodian_, address[] memory validSenders_) LockRequestable() {
        custodian = custodian_;
        _validSenderSet[GUARD] = GUARD;
        for(uint256 i = 0; i < validSenders_.length; i++) {
            address sender = validSenders_[i];
            _addValidSender(sender);
        }
    }

    modifier onlyCustodian {
        require(msg.sender == custodian, ERROR_INVALID_MSG_SENDER);
        _;
    }

    function _requireOnlyValidSender() internal view {       
        require(isValidSender(msg.sender), ERROR_INVALID_MSG_SENDER);
    }

    function confirmCustodianChange(bytes32 lockId) external onlyCustodian {
        custodian = _getRequest(custodianChangeReqs, lockId);
        delete custodianChangeReqs[lockId];
        emit CustodianChangeConfirmed(lockId, custodian);
    }

    function confirmValidSenderAdd(bytes32 lockId) external onlyCustodian {
        address proposed = _getRequest(ownerAddReqs, lockId);
        _addValidSender(proposed);
        delete ownerAddReqs[lockId];
        emit ValidSenderAddConfirmed(lockId, proposed);
    }

    function _getRequest(mapping(bytes32 => AdminUpdateRequest) storage _m, bytes32 _lockId) private view returns (address proposed) {
        AdminUpdateRequest storage adminRequest = _m[_lockId];
        // reject ‘null’ results from the map lookup
        // this can only be the case if an unknown `_lockId` is received
        require(adminRequest.proposed != address(0), "no such lockId");
        return adminRequest.proposed;
    }

    function _requestChange(mapping(bytes32 => AdminUpdateRequest) storage _m, bytes4 _selector, address _proposed) private returns (bytes32 lockId, uint256 lockRequestIdx) {
        require(_proposed != address(0), "zero address");

        (bytes32 preLockId, uint256 idx) = generatePreLockId();
        lockId = keccak256(
            abi.encodePacked(
                preLockId,
                _selector,
                _proposed
            )
        );
        lockRequestIdx = idx;

        _m[lockId] = AdminUpdateRequest({
            proposed : _proposed
        });
    }

    function requestCustodianChange(address _proposedCustodian) external returns (bytes32 lockId) {
        (bytes32 preLockId, uint256 lockRequestIdx) = _requestChange(custodianChangeReqs, this.requestCustodianChange.selector, _proposedCustodian);
        emit CustodianChangeRequested(preLockId, msg.sender, _proposedCustodian, lockRequestIdx);
        return preLockId;
    }

    function requestValidSenderAdd(address _sender) external returns (bytes32 lockId) {
        (bytes32 preLockId, uint256 lockRequestIdx) = _requestChange(ownerAddReqs, this.requestValidSenderAdd.selector, _sender);
        emit ValidSenderAddRequested(preLockId, msg.sender, _sender, lockRequestIdx);
        return preLockId;
    }

    function _getPrevSender(address student) private view returns(address) {
        address currentAddress = GUARD;
        while(_validSenderSet[currentAddress] != GUARD) {
            if (_validSenderSet[currentAddress] == student) {
                return currentAddress;
            }
            currentAddress = _validSenderSet[currentAddress];
        }
        return address(0);
    }

    function removeValidSender(address sender) external {
        _requireOnlyValidSender();
        _removeValidSender(sender);
    }

    function removeAllValidSenders() external {
        _requireOnlyValidSender();
        address currentAddress = GUARD;
        while(_validSenderSet[currentAddress] != GUARD) {
            address sender = _validSenderSet[currentAddress];
            _removeValidSender(sender);
        }
    }

    function isValidSender(address sender) public view returns (bool) {
        return _validSenderSet[sender] != address(0);
    }

    function _addValidSender(address sender) private {
        require(!isValidSender(sender));
        _validSenderSet[sender] = _validSenderSet[GUARD];
        _validSenderSet[GUARD] = sender;
        setSize++;
    }

    function _removeValidSender(address sender) private {
        address prevSender = _getPrevSender(sender);
        _validSenderSet[prevSender] = _validSenderSet[sender];
        _validSenderSet[sender] = address(0);
        setSize--;
    }

    function getValidSenderSet() public view returns (address[] memory) {
        address[] memory validSenderList = new address[](setSize);
        address currentAddress = _validSenderSet[GUARD];
        for(uint256 i = 0; currentAddress != GUARD; ++i) {
            validSenderList[i] = currentAddress;
            currentAddress = _validSenderSet[currentAddress];
        }
        return validSenderList; 
    }

}

File 14 of 14 : LockRequestable.sol
// SPDX-License-Identifier: UNLICENSED
// Copyright (c) 2022 Gemini Trust Company LLC. All Rights Reserved
pragma solidity 0.8.x;


/** @title  A contract for generating unique identifiers
  *
  * @notice  A contract that provides a identifier generation scheme,
  * guaranteeing uniqueness across all contracts that inherit from it,
  * as well as unpredictability of future identifiers.
  *
  * @dev  This contract is intended to be inherited by any contract that
  * implements the callback software pattern for cooperative custodianship.
  *
  * @author  Gemini Trust Company, LLC
  */
abstract contract LockRequestable {

    // MEMBERS
    /// @notice  the count of all invocations of `generateLockId`.
    uint256 public lockRequestCount;

    constructor() {
        lockRequestCount = 0;
    }

    // FUNCTIONS
    /** @notice  Returns a fresh unique identifier.
      *
      * @dev the generation scheme uses three components.
      * First, the blockhash of the previous block.
      * Second, the deployed address.
      * Third, the next value of the counter.
      * This ensure that identifiers are unique across all contracts
      * following this scheme, and that future identifiers are
      * unpredictable.
      *
      * @return  preLockId  a 32-byte unique identifier.
      * @return  lockRequestIdx  index of lock request
      */
    function generatePreLockId() internal returns (bytes32 preLockId, uint256 lockRequestIdx) {
        lockRequestIdx = ++lockRequestCount;
        preLockId = keccak256(
            abi.encodePacked(
                blockhash(block.number - 1),
                address(this),
                lockRequestIdx
            )
        );
    }
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"priceCurrencyUSD_","type":"address"},{"internalType":"address","name":"recoveryAdmin_","type":"address"},{"internalType":"address[]","name":"validSenders_","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_lockId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"_newCustodian","type":"address"}],"name":"CustodianChangeConfirmed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_lockId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"_msgSender","type":"address"},{"indexed":false,"internalType":"address","name":"_proposedCustodian","type":"address"},{"indexed":false,"internalType":"uint256","name":"_lockRequestIdx","type":"uint256"}],"name":"CustodianChangeRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"count","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"address","name":"priceCurrency","type":"address"}],"name":"NiftySale1155","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"address","name":"priceCurrency","type":"address"}],"name":"NiftySale721","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_lockId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"_newValidSender","type":"address"}],"name":"ValidSenderAddConfirmed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_lockId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"_msgSender","type":"address"},{"indexed":false,"internalType":"address","name":"_proposed","type":"address"},{"indexed":false,"internalType":"uint256","name":"_lockRequestIdx","type":"uint256"}],"name":"ValidSenderAddRequested","type":"event"},{"inputs":[],"name":"_priceCurrencyETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_priceCurrencyUSD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_validSenderSet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"lockId","type":"bytes32"}],"name":"confirmCustodianChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"lockId","type":"bytes32"}],"name":"confirmValidSenderAdd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"custodian","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"custodianChangeReqs","outputs":[{"internalType":"address","name":"proposed","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"address","name":"priceCurrency","type":"address"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"address[]","name":"receiverCreators","type":"address[]"},{"internalType":"uint256[]","name":"receiverAmounts","type":"uint256[]"}],"internalType":"struct NiftyEventBatch[]","name":"ne","type":"tuple[]"}],"name":"executeSaleBatch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"refund","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"address","name":"priceCurrency","type":"address"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"address[]","name":"receiverCreators","type":"address[]"},{"internalType":"uint256[]","name":"receiverAmounts","type":"uint256[]"}],"internalType":"struct NiftyEventBatch[]","name":"ne","type":"tuple[]"}],"name":"executeSaleBatchHandler","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"name":"executeSaleEth1155","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"count","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEvent[]","name":"ne","type":"tuple[]"}],"name":"executeSaleEth1155batch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"count","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEventHandler[]","name":"ne","type":"tuple[]"}],"name":"executeSaleEth1155batchHandler","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"name":"executeSaleEth1155handler","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"address","name":"buyer","type":"address"}],"name":"executeSaleEth721","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"price","type":"uint256[]"},{"internalType":"uint256[]","name":"sellerProceeds","type":"uint256[]"},{"internalType":"uint256[]","name":"tokenId","type":"uint256[]"},{"internalType":"address[]","name":"tokenContract","type":"address[]"},{"internalType":"address[]","name":"seller","type":"address[]"},{"internalType":"address[]","name":"buyer","type":"address[]"}],"name":"executeSaleEth721batch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEventHandler[]","name":"ne","type":"tuple[]"}],"name":"executeSaleEth721batchHandler","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"name":"executeSaleEth721handler","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"address","name":"receiverCreator","type":"address"},{"internalType":"uint256","name":"receiverAmount","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"name":"executeSaleReceiver1eth1155","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"address","name":"receiverCreator","type":"address"},{"internalType":"uint256","name":"receiverAmount","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"name":"executeSaleReceiver1eth1155handler","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"address","name":"receiverCreator","type":"address"},{"internalType":"uint256","name":"receiverAmount","type":"uint256"}],"name":"executeSaleReceiver1eth721","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"address","name":"receiverCreator","type":"address"},{"internalType":"uint256","name":"receiverAmount","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"name":"executeSaleReceiver1eth721handler","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"address","name":"receiverCreator","type":"address"},{"internalType":"uint256","name":"receiverAmount","type":"uint256"},{"internalType":"address","name":"priceCurrency","type":"address"},{"components":[{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEvent","name":"ne","type":"tuple"}],"name":"executeSaleReceiver1token1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"address","name":"receiverCreator","type":"address"},{"internalType":"uint256","name":"receiverAmount","type":"uint256"},{"internalType":"address","name":"priceCurrency","type":"address"},{"components":[{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEventHandler","name":"ne","type":"tuple"}],"name":"executeSaleReceiver1token1155handler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiverCreator","type":"address"},{"internalType":"uint256","name":"receiverAmount","type":"uint256"},{"internalType":"address","name":"priceCurrency","type":"address"},{"components":[{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEvent","name":"ne","type":"tuple"}],"name":"executeSaleReceiver1token721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiverCreator","type":"address"},{"internalType":"uint256","name":"receiverAmount","type":"uint256"},{"internalType":"address","name":"priceCurrency","type":"address"},{"components":[{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEventHandler","name":"ne","type":"tuple"}],"name":"executeSaleReceiver1token721handler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"address[]","name":"receiverCreators","type":"address[]"},{"internalType":"uint256[]","name":"receiverAmounts","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEvent","name":"ne","type":"tuple"}],"name":"executeSaleReceiverNeth1155","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"count","type":"uint256[]"},{"internalType":"address[][]","name":"receiverCreators","type":"address[][]"},{"internalType":"uint256[][]","name":"receiverAmounts","type":"uint256[][]"},{"components":[{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEvent[]","name":"ne","type":"tuple[]"}],"name":"executeSaleReceiverNeth1155batch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"count","type":"uint256[]"},{"internalType":"address[][]","name":"receiverCreators","type":"address[][]"},{"internalType":"uint256[][]","name":"receiverAmounts","type":"uint256[][]"},{"components":[{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEventHandler[]","name":"ne","type":"tuple[]"}],"name":"executeSaleReceiverNeth1155batchHandler","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"address[]","name":"receiverCreators","type":"address[]"},{"internalType":"uint256[]","name":"receiverAmounts","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEventHandler","name":"ne","type":"tuple"}],"name":"executeSaleReceiverNeth1155handler","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"receiverCreators","type":"address[]"},{"internalType":"uint256[]","name":"receiverAmounts","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEvent","name":"ne","type":"tuple"}],"name":"executeSaleReceiverNeth721","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[][]","name":"receiverCreators","type":"address[][]"},{"internalType":"uint256[][]","name":"receiverAmounts","type":"uint256[][]"},{"components":[{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEvent[]","name":"ne","type":"tuple[]"}],"name":"executeSaleReceiverNeth721batch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[][]","name":"receiverCreators","type":"address[][]"},{"internalType":"uint256[][]","name":"receiverAmounts","type":"uint256[][]"},{"components":[{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEventHandler[]","name":"ne","type":"tuple[]"}],"name":"executeSaleReceiverNeth721batchHandler","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"receiverCreators","type":"address[]"},{"internalType":"uint256[]","name":"receiverAmounts","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEventHandler","name":"ne","type":"tuple"}],"name":"executeSaleReceiverNeth721handler","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"address[]","name":"receiverCreators","type":"address[]"},{"internalType":"uint256[]","name":"receiverAmounts","type":"uint256[]"},{"internalType":"address","name":"priceCurrency","type":"address"},{"components":[{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEvent","name":"ne","type":"tuple"}],"name":"executeSaleReceiverNtoken1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"count","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"address","name":"priceCurrency","type":"address"},{"internalType":"address[]","name":"receiverCreators","type":"address[]"},{"internalType":"uint256[]","name":"receiverAmounts","type":"uint256[]"}],"internalType":"struct NiftyEventReceiver[]","name":"ne","type":"tuple[]"}],"name":"executeSaleReceiverNtoken1155batch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"count","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"address","name":"priceCurrency","type":"address"},{"internalType":"address[]","name":"receiverCreators","type":"address[]"},{"internalType":"uint256[]","name":"receiverAmounts","type":"uint256[]"}],"internalType":"struct NiftyEventReceiverHandler[]","name":"ne","type":"tuple[]"}],"name":"executeSaleReceiverNtoken1155batchHandler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"address[]","name":"receiverCreators","type":"address[]"},{"internalType":"uint256[]","name":"receiverAmounts","type":"uint256[]"},{"internalType":"address","name":"priceCurrency","type":"address"},{"components":[{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEventHandler","name":"ne","type":"tuple"}],"name":"executeSaleReceiverNtoken1155handler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"receiverCreators","type":"address[]"},{"internalType":"uint256[]","name":"receiverAmounts","type":"uint256[]"},{"internalType":"address","name":"priceCurrency","type":"address"},{"components":[{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEvent","name":"ne","type":"tuple"}],"name":"executeSaleReceiverNtoken721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"address","name":"priceCurrency","type":"address"},{"internalType":"address[]","name":"receiverCreators","type":"address[]"},{"internalType":"uint256[]","name":"receiverAmounts","type":"uint256[]"}],"internalType":"struct NiftyEventReceiver[]","name":"ne","type":"tuple[]"}],"name":"executeSaleReceiverNtoken721batch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"address","name":"priceCurrency","type":"address"},{"internalType":"address[]","name":"receiverCreators","type":"address[]"},{"internalType":"uint256[]","name":"receiverAmounts","type":"uint256[]"}],"internalType":"struct NiftyEventReceiverHandler[]","name":"ne","type":"tuple[]"}],"name":"executeSaleReceiverNtoken721batchHandler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"receiverCreators","type":"address[]"},{"internalType":"uint256[]","name":"receiverAmounts","type":"uint256[]"},{"internalType":"address","name":"priceCurrency","type":"address"},{"components":[{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEventHandler","name":"ne","type":"tuple"}],"name":"executeSaleReceiverNtoken721handler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"address","name":"priceCurrency","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"name":"executeSaleToken1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"count","type":"uint256[]"},{"internalType":"address[]","name":"priceCurrency","type":"address[]"},{"components":[{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEvent[]","name":"ne","type":"tuple[]"}],"name":"executeSaleToken1155batch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"count","type":"uint256[]"},{"internalType":"address[]","name":"priceCurrency","type":"address[]"},{"components":[{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEventHandler[]","name":"ne","type":"tuple[]"}],"name":"executeSaleToken1155batchHandler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"address","name":"priceCurrency","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"name":"executeSaleToken1155handler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"address","name":"priceCurrency","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"address","name":"buyer","type":"address"}],"name":"executeSaleToken721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"priceCurrency","type":"address[]"},{"components":[{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEvent[]","name":"ne","type":"tuple[]"}],"name":"executeSaleToken721batch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"priceCurrency","type":"address[]"},{"components":[{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEventHandler[]","name":"ne","type":"tuple[]"}],"name":"executeSaleToken721batchHandler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"address","name":"priceCurrency","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"name":"executeSaleToken721handler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"name":"executeSaleUsd1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"count","type":"uint256[]"},{"internalType":"uint256[]","name":"price","type":"uint256[]"},{"internalType":"uint256[]","name":"tokenId","type":"uint256[]"},{"internalType":"address[]","name":"tokenContract","type":"address[]"},{"internalType":"address[]","name":"seller","type":"address[]"},{"internalType":"address[]","name":"buyer","type":"address[]"}],"name":"executeSaleUsd1155batch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"name":"executeSaleUsd721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"price","type":"uint256[]"},{"internalType":"uint256[]","name":"tokenId","type":"uint256[]"},{"internalType":"address[]","name":"tokenContract","type":"address[]"},{"internalType":"address[]","name":"seller","type":"address[]"},{"internalType":"address[]","name":"buyer","type":"address[]"}],"name":"executeSaleUsd721batch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getValidSenderSet","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"isValidSender","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockRequestCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"ownerAddReqs","outputs":[{"internalType":"address","name":"proposed","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"address","name":"priceCurrency","type":"address"}],"name":"recordSale1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"count","type":"uint256[]"},{"internalType":"address[]","name":"tokenContract","type":"address[]"},{"internalType":"uint256[]","name":"tokenId","type":"uint256[]"},{"internalType":"uint256[]","name":"price","type":"uint256[]"},{"internalType":"address[]","name":"priceCurrency","type":"address[]"}],"name":"recordSale1155batch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"address","name":"priceCurrency","type":"address"}],"name":"recordSale721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokenContract","type":"address[]"},{"internalType":"uint256[]","name":"tokenId","type":"uint256[]"},{"internalType":"uint256[]","name":"price","type":"uint256[]"},{"internalType":"address[]","name":"priceCurrency","type":"address[]"}],"name":"recordSale721batch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeAllValidSenders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"removeValidSender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_proposedCustodian","type":"address"}],"name":"requestCustodianChange","outputs":[{"internalType":"bytes32","name":"lockId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"}],"name":"requestValidSenderAdd","outputs":[{"internalType":"bytes32","name":"lockId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"withdraw721","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040523480156200001157600080fd5b5060405162005f5538038062005f558339810160408190526200003491620001d3565b6000808055600180546001600160a01b0385166001600160a01b031991821617825581835260036020527fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c80549091169091179055839083908390829082905b8151811015620000e6576000828281518110620000b557620000b5620002cd565b60200260200101519050620000d0816200010360201b60201c565b5080620000dd81620002e3565b91505062000094565b5050506001600160a01b03909216608052506200030b9350505050565b6001600160a01b0380821660009081526003602052604090205416156200012957600080fd5b60036020527fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c80546001600160a01b038381166000818152604081208054939094166001600160a01b0319938416179093556001835283549091161790915560048054916200019883620002e3565b919050555050565b80516001600160a01b0381168114620001b857600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600080600060608486031215620001e957600080fd5b620001f484620001a0565b9250602062000205818601620001a0565b60408601519093506001600160401b03808211156200022357600080fd5b818701915087601f8301126200023857600080fd5b8151818111156200024d576200024d620001bd565b8060051b604051601f19603f83011681018181108582111715620002755762000275620001bd565b60405291825284820192508381018501918a8311156200029457600080fd5b938501935b82851015620002bd57620002ad85620001a0565b8452938501939285019262000299565b8096505050505050509250925092565b634e487b7160e01b600052603260045260246000fd5b6000600182016200030457634e487b7160e01b600052601160045260246000fd5b5060010190565b608051615c12620003436000396000818161089801528181611e8501528181612c7101528181612d3e01526131450152615c126000f3fe6080604052600436106103f95760003560e01c80635626283711610213578063cb81fecf11610123578063edb67d47116100ab578063f3fef3a31161007a578063f3fef3a314610b73578063f63c70ba14610b93578063fb4fb88514610bb3578063fc888f2b14610bd3578063fcc4287314610be657600080fd5b8063edb67d4714610ac7578063ee90c99f14610afd578063f01f2b8b14610b13578063f340fe9614610b5e57600080fd5b8063d7234e3b116100f2578063d7234e3b14610a25578063d81e9bdd14610a47578063defe688714610a67578063e570462114610a87578063ec4ee8a414610aa757600080fd5b8063cb81fecf146109a6578063cf6e4488146109bc578063d57ddaf4146109f2578063d6596de114610a0557600080fd5b806394ecbf1e116101a6578063a6f3766211610175578063a6f376621461092d578063b8c1e3e014610940578063b95c065b14610960578063c38766ac14610973578063c63a20151461098657600080fd5b806394ecbf1e146108ba57806397fdef42146108cd5780639d510474146108ed5780639fc1e76a1461090d57600080fd5b806373f24d98116101e257806373f24d981461081057806374ac120a146108465780638203fd4e146108665780638ad38af31461088657600080fd5b806356262837146107c25780635d6c78f2146107d55780635f825129146107e85780637327dc2b146107fb57600080fd5b806335b5f4441161030e5780634192fafb116102a15780634b47c1e5116102705780634b47c1e51461073c5780634d9728261461075c5780634fef0c471461077c5780635109718e1461079c578063519c6348146107af57600080fd5b80634192fafb146106d657806342231c0d146106e957806343f032ea1461070957806347b6c5f11461072957600080fd5b806339de0527116102dd57806339de0527146106635780633a8343ee146106835780633bba9e94146106a35780633dfb94f1146106b657600080fd5b806335b5f444146105d8578063375b74c3146105f85780633768157d14610630578063378710911461065057600080fd5b80632107b563116103915780632df36835116103605780632df3683514610545578063311007a714610565578063355007f914610585578063355588ea146105a5578063358f8592146105b857600080fd5b80632107b563146104df57806327139e94146104ff5780632a613d4c1461051f5780632d0fb04c1461053257600080fd5b80631052e3c1116103cd5780631052e3c114610459578063110b557f1461047957806315b210821461048c5780631e26ac8d146104bf57600080fd5b80628ac4c1146103fe57806306c94014146104205780630a40d0f8146104335780630a90a27514610446575b600080fd5b34801561040a57600080fd5b5061041e6104193660046146ea565b610c06565b005b61041e61042e3660046147c8565b610c99565b61041e610441366004614877565b610e05565b61041e6104543660046148e8565b610f51565b34801561046557600080fd5b5061041e61047436600461496a565b611012565b61041e6104873660046149c9565b6112fe565b34801561049857600080fd5b506104ac6104a7366004614a53565b6113f0565b6040519081526020015b60405180910390f35b3480156104cb57600080fd5b5061041e6104da3660046147c8565b611466565b3480156104eb57600080fd5b5061041e6104fa366004614a75565b6115df565b34801561050b57600080fd5b5061041e61051a366004614ac2565b61164a565b61041e61052d366004614b47565b611692565b61041e610540366004614bbb565b6116cd565b34801561055157600080fd5b5061041e610560366004614bfc565b6117f9565b34801561057157600080fd5b5061041e610580366004614c40565b61184a565b34801561059157600080fd5b5061041e6105a0366004614d30565b61191d565b61041e6105b3366004614d6c565b611989565b3480156105c457600080fd5b5061041e6105d3366004614dc5565b6119c8565b3480156105e457600080fd5b5061041e6105f3366004614dde565b611aab565b34801561060457600080fd5b50600154610618906001600160a01b031681565b6040516001600160a01b0390911681526020016104b6565b34801561063c57600080fd5b5061041e61064b366004614e2e565b611ae1565b61041e61065e366004614d6c565b611ba0565b34801561066f57600080fd5b5061041e61067e366004614eb3565b611bcc565b34801561068f57600080fd5b5061041e61069e366004614dc5565b611be1565b61041e6106b1366004614ef7565b611cb5565b3480156106c257600080fd5b5061041e6106d1366004614fba565b611e76565b61041e6106e436600461500d565b611ead565b3480156106f557600080fd5b5061041e610704366004615077565b611ef1565b34801561071557600080fd5b5061041e610724366004615126565b611f9e565b61041e6107373660046151b4565b61204a565b34801561074857600080fd5b5061041e6107573660046151e9565b612358565b34801561076857600080fd5b5061041e610777366004615224565b612372565b34801561078857600080fd5b5061041e6107973660046152bd565b6124e2565b61041e6107aa366004615342565b612574565b61041e6107bd3660046153c9565b6126c9565b61041e6107d0366004615224565b612742565b61041e6107e3366004615447565b6128b8565b61041e6107f63660046154c2565b6128e3565b34801561080757600080fd5b5061041e6129ff565b34801561081c57600080fd5b5061061861082b366004614dc5565b6005602052600090815260409020546001600160a01b031681565b34801561085257600080fd5b5061041e610861366004614dde565b612a59565b34801561087257600080fd5b5061041e6108813660046155ff565b612a7b565b34801561089257600080fd5b506106187f000000000000000000000000000000000000000000000000000000000000000081565b61041e6108c836600461564c565b612afa565b3480156108d957600080fd5b5061041e6108e83660046154c2565b612c27565b3480156108f957600080fd5b5061041e6109083660046156fb565b612d30565b34801561091957600080fd5b5061041e610928366004614a53565b612d66565b61041e61093b366004615746565b612d77565b34801561094c57600080fd5b5061041e61095b366004614d30565b612dbc565b61041e61096e3660046157d6565b612dcf565b61041e61098136600461500d565b612e78565b34801561099257600080fd5b5061041e6109a13660046151b4565b612e9a565b3480156109b257600080fd5b506104ac60005481565b3480156109c857600080fd5b506106186109d7366004614dc5565b6002602052600090815260409020546001600160a01b031681565b61041e610a0036600461584c565b6130f3565b348015610a1157600080fd5b5061041e610a20366004614c40565b613114565b348015610a3157600080fd5b50610a3a613188565b6040516104b6919061589f565b348015610a5357600080fd5b5061041e610a623660046158ec565b61327b565b348015610a7357600080fd5b5061041e610a8236600461496a565b6132f4565b348015610a9357600080fd5b506104ac610aa2366004614a53565b6134e1565b348015610ab357600080fd5b5061041e610ac23660046151b4565b61354c565b348015610ad357600080fd5b50610618610ae2366004614a53565b6003602052600090815260409020546001600160a01b031681565b348015610b0957600080fd5b506104ac60045481565b348015610b1f57600080fd5b50610b4e610b2e366004614a53565b6001600160a01b0390811660009081526003602052604090205416151590565b60405190151581526020016104b6565b348015610b6a57600080fd5b50610618600081565b348015610b7f57600080fd5b5061041e610b8e36600461597a565b613752565b348015610b9f57600080fd5b5061041e610bae366004615342565b613768565b348015610bbf57600080fd5b5061041e610bce3660046159a4565b6138a1565b61041e610be136600461496a565b6138c2565b348015610bf257600080fd5b5061041e610c01366004614877565b613be8565b610c0e613cf7565b6000610c2060c0830160a08401614a53565b90506000610c3460e0840160c08501614a53565b90506000610c5d6040850135866060870135610c5660a0890160808a01614a53565b8787613d5b565b90508015610c8457610c7484602001358685613e29565b610c7f868689613e29565b610c90565b610c9084358684613e29565b50505050505050565b610ca1613cf7565b60005b81811015610dfe576000838383818110610cc057610cc0615a07565b905060e0020160a0016020810190610cd89190614a53565b90506000848484818110610cee57610cee615a07565b905060e0020160c0016020810190610d069190614a53565b90506000610d91888886818110610d1f57610d1f615a07565b90506020020135878787818110610d3857610d38615a07565b905060e00201604001356000898989818110610d5657610d56615a07565b905060e00201606001358a8a8a818110610d7257610d72615a07565b905060e002016080016020810190610d8a9190614a53565b8888613efa565b90508015610dc357610dbe83878787818110610daf57610daf615a07565b905060e0020160200135613fc9565b610de8565b610de882878787818110610dd957610dd9615a07565b905060e0020160000135613fc9565b5050508080610df690615a33565b915050610ca4565b5050505050565b610e0d613cf7565b60005b81811015610dfe57610ef1858583818110610e2d57610e2d615a07565b90506020020135848484818110610e4657610e46615a07565b905060c00201602001356000868686818110610e6457610e64615a07565b905060c0020160400135878787818110610e8057610e80615a07565b905060c002016060016020810190610e989190614a53565b888888818110610eaa57610eaa615a07565b905060c002016080016020810190610ec29190614a53565b898989818110610ed457610ed4615a07565b905060c0020160a0016020810190610eec9190614a53565b614087565b610f3f838383818110610f0657610f06615a07565b905060c002016080016020810190610f1e9190614a53565b848484818110610f3057610f30615a07565b905060c0020160000135613fc9565b80610f4981615a33565b915050610e10565b610f59613cf7565b6000610f6b60a0830160808401614a53565b9050610fa2602083013560006040850135610f8c6080870160608801614a53565b85610f9d60c0890160a08a01614a53565b614148565b610fad818335613fc9565b60005b85811015610c9057611000878783818110610fcd57610fcd615a07565b9050602002016020810190610fe29190614a53565b868684818110610ff457610ff4615a07565b90506020020135613fc9565b8061100a81615a33565b915050610fb0565b61101a613cf7565b60005b81811015610dfe57600083838381811061103957611039615a07565b905060200281019061104b9190615a4c565b61105c9060c081019060a001614a53565b9050600084848481811061107257611072615a07565b90506020028101906110849190615a4c565b6110969061010081019060e001614a53565b905060008585858181106110ac576110ac615a07565b90506020028101906110be9190615a4c565b6110cf9060e081019060c001614a53565b9050600061117c8989878181106110e8576110e8615a07565b9050602002013588888881811061110157611101615a07565b90506020028101906111139190615a4c565b60400135858a8a8a81811061112a5761112a615a07565b905060200281019061113c9190615a4c565b606001358b8b8b81811061115257611152615a07565b90506020028101906111649190615a4c565b6111759060a0810190608001614a53565b8988613efa565b905080156112b8576111b687878781811061119957611199615a07565b90506020028101906111ab9190615a4c565b602001358486613e29565b60005b8787878181106111cb576111cb615a07565b90506020028101906111dd9190615a4c565b6111ec90610100810190615a6d565b90508110156112b2576112a088888881811061120a5761120a615a07565b905060200281019061121c9190615a4c565b61122b90610120810190615a6d565b8381811061123b5761123b615a07565b90506020020135858a8a8a81811061125557611255615a07565b90506020028101906112679190615a4c565b61127690610100810190615a6d565b8581811061128657611286615a07565b905060200201602081019061129b9190614a53565b613e29565b806112aa81615a33565b9150506111b9565b506112e7565b6112e78787878181106112cd576112cd615a07565b90506020028101906112df9190615a4c565b358484613e29565b5050505080806112f690615a33565b91505061101d565b611306613cf7565b600061131860c0830160a08401614a53565b9050600061132c60e0840160c08501614a53565b9050600061136589604086013583606088013561134f60a08a0160808b01614a53565b8861136060e08c0160c08d01614a53565b613efa565b905080156113da5761137b838560200135613fc9565b60005b878110156113d4576113c289898381811061139b5761139b615a07565b90506020020160208101906113b09190614a53565b888884818110610ff457610ff4615a07565b806113cc81615a33565b91505061137e565b506113e5565b6113e5828535613fc9565b505050505050505050565b600080806114076002630ad9084160e11b86614207565b604080518381523360208201526001600160a01b038816918101919091526060810182905291935091507f8286bbf6adfae598c227689d4e361af126e220106aaa15764538028b07f3a0d4906080015b60405180910390a15092915050565b61146e613cf7565b60005b81811015610dfe57600083838381811061148d5761148d615a07565b905060e0020160a00160208101906114a59190614a53565b905060008484848181106114bb576114bb615a07565b905060e0020160c00160208101906114d39190614a53565b905060008787858181106114e9576114e9615a07565b90506020020160208101906114fe9190614a53565b9050600061156f87878781811061151757611517615a07565b905060e00201604001358389898981811061153457611534615a07565b905060e00201606001358a8a8a81811061155057611550615a07565b905060e0020160800160208101906115689190614a53565b8888613d5b565b905080156115a25761159d87878781811061158c5761158c615a07565b905060e00201602001358386613e29565b6115c8565b6115c88787878181106115b7576115b7615a07565b905060e00201600001358385613e29565b5050505080806115d790615a33565b915050611471565b6115e7613cf7565b60006115f960a0830160808401614a53565b905061162b86602084013585604086013561161a6080880160608901614a53565b86610eec60c08a0160a08b01614a53565b61163782358483613e29565b611642848487613e29565b505050505050565b611652613cf7565b60006116638a898888888888613efa565b9050801561167b57611676878785613e29565b611686565b611686898784613e29565b50505050505050505050565b61169a613cf7565b60006116ac8988600088888888613efa565b905080156116c3576116be8387613fc9565b6113e5565b6113e58289613fc9565b6116d5613cf7565b60005b818110156117f45760008383838181106116f4576116f4615a07565b905060e0020160a001602081019061170c9190614a53565b9050600084848481811061172257611722615a07565b905060e0020160c001602081019061173a9190614a53565b905060006117a586868681811061175357611753615a07565b905060e0020160400135600088888881811061177157611771615a07565b905060e002016060013589898981811061178d5761178d615a07565b905060e002016080016020810190610c569190614a53565b905080156117c8576117c383878787818110610daf57610daf615a07565b6117de565b6117de82878787818110610dd957610dd9615a07565b50505080806117ec90615a33565b9150506116d8565b505050565b611801613cf7565b600061181360a0830160808401614a53565b90506118336020830135846040850135610f8c6080870160608801614a53565b61183f82358483613e29565b610dfe848487613e29565b611852613cf7565b60005b87811015611910576118fe89898381811061187257611872615a07565b90506020020160208101906118879190614a53565b88888481811061189957611899615a07565b905060200201358d8d858181106118b2576118b2615a07565b905060200201358888868181106118cb576118cb615a07565b905060200201358787878181106118e4576118e4615a07565b90506020020160208101906118f99190614a53565b6142eb565b8061190881615a33565b915050611855565b5050505050505050505050565b611925613cf7565b604051632142170760e11b81523060048201526001600160a01b038381166024830152604482018390528416906342842e0e90606401600060405180830381600087803b15801561197557600080fd5b505af1158015610c90573d6000803e3d6000fd5b611991613cf7565b60006119a287600087878787613d5b565b905080156119be576119b48387613fc9565b6116768989613fc9565b611686828b613fc9565b60015460408051808201909152601281527124b73b30b634b21036b9b39739b2b73232b960711b6020820152906001600160a01b03163314611a265760405162461bcd60e51b8152600401611a1d9190615ae2565b60405180910390fd5b506000611a34600583614346565b9050611a3f816143ad565b6000828152600560205260409081902080546001600160a01b0319169055517f3af7a1ac361fdd53acc657b974ce6047460323fcae43e3cb09d2c888dd69219a90611a9f90849084909182526001600160a01b0316602082015260400190565b60405180910390a15050565b611ab3613cf7565b6000611ac3888787878787613d5b565b90508015611ad6576116be878785613e29565b6113e5898784613e29565b611ae9613cf7565b6000611afb60c0830160a08401614a53565b90506000611b0f60e0840160c08501614a53565b90506000611b316040850135866060870135610c5660a0890160808a01614a53565b90508015611b9457611b4884602001358685613e29565b60005b888110156113d457611b82888883818110611b6857611b68615a07565b90506020020135878c8c8581811061128657611286615a07565b80611b8c81615a33565b915050611b4b565b6113e584358684613e29565b611ba8613cf7565b611bb88987600087878787614087565b611bc28286613fc9565b6113e58888613fc9565b611bd4613cf7565b610dfe85858585856142eb565b60015460408051808201909152601281527124b73b30b634b21036b9b39739b2b73232b960711b6020820152906001600160a01b03163314611c365760405162461bcd60e51b8152600401611a1d9190615ae2565b50611c42600282614346565b600180546001600160a01b03199081166001600160a01b039384161782556000848152600260209081526040918290208054909316909255915482518581529316908301527f9a99272c0f6b7a30ef9e76e684a7cd408bfd4f11a72f36a8e276253c920e442d910160405180910390a150565b611cbd613cf7565b60005b818110156113e5576000838383818110611cdc57611cdc615a07565b905060c002016080016020810190611cf49190614a53565b9050611d898a8a84818110611d0b57611d0b615a07565b90506020020135858585818110611d2457611d24615a07565b905060c00201602001356000878787818110611d4257611d42615a07565b905060c0020160400135888888818110611d5e57611d5e615a07565b905060c002016060016020810190611d769190614a53565b868a8a8a818110610ed457610ed4615a07565b611d9f81858585818110610f3057610f30615a07565b60005b888884818110611db457611db4615a07565b9050602002810190611dc69190615a6d565b9050811015611e6157611e4f898985818110611de457611de4615a07565b9050602002810190611df69190615a6d565b83818110611e0657611e06615a07565b9050602002016020810190611e1b9190614a53565b888886818110611e2d57611e2d615a07565b9050602002810190611e3f9190615a6d565b84818110610ff457610ff4615a07565b80611e5981615a33565b915050611da2565b50508080611e6e90615a33565b915050611cc0565b611e7e613cf7565b61164286867f000000000000000000000000000000000000000000000000000000000000000087878787614087565b611eb5613cf7565b6000611ec687600087878787613d5b565b90508015611edd57611ed88387613fc9565b611ee7565b611ee78289613fc9565b5050505050505050565b611ef9613cf7565b60005b878110156113e557611f8c898983818110611f1957611f19615a07565b9050602002016020810190611f2e9190614a53565b888884818110611f4057611f40615a07565b90506020020135878785818110611f5957611f59615a07565b90506020020135868686818110611f7257611f72615a07565b9050602002016020810190611f879190614a53565b614447565b80611f9681615a33565b915050611efc565b611fa6613cf7565b6000611fb860c0830160a08401614a53565b90506000611fcc60e0840160c08501614a53565b90506000611fef8a6040860135876060880135610d8a60a08a0160808b01614a53565b9050801561203e5761200684602001358685613e29565b60005b8881101561203857612026888883818110611b6857611b68615a07565b8061203081615a33565b915050612009565b50611686565b61168684358684613e29565b612052613cf7565b60005b818110156117f457600083838381811061207157612071615a07565b90506020028101906120839190615a4c565b6120949060a0810190608001614a53565b905060008484848181106120aa576120aa615a07565b90506020028101906120bc9190615a4c565b60400135905060008585858181106120d6576120d6615a07565b90506020028101906120e89190615a4c565b6120f99060e081019060c001614a53565b905085858581811061210d5761210d615a07565b905060200281019061211f9190615a4c565b602001356000036121ec576121e786868681811061213f5761213f615a07565b90506020028101906121519190615a4c565b606001358488888881811061216857612168615a07565b905060200281019061217a9190615a4c565b3589898981811061218d5761218d615a07565b905060200281019061219f9190615a4c565b6121b09060c081019060a001614a53565b858b8b8b8181106121c3576121c3615a07565b90506020028101906121d59190615a4c565b610f9d9061010081019060e001614a53565b6122d1565b6122d186868681811061220157612201615a07565b90506020028101906122139190615a4c565b6020013587878781811061222957612229615a07565b905060200281019061223b9190615a4c565b606001358589898981811061225257612252615a07565b90506020028101906122649190615a4c565b358a8a8a81811061227757612277615a07565b90506020028101906122899190615a4c565b61229a9060c081019060a001614a53565b868c8c8c8181106122ad576122ad615a07565b90506020028101906122bf9190615a4c565b610eec9061010081019060e001614a53565b6123428383838989898181106122e9576122e9615a07565b90506020028101906122fb9190615a4c565b61230a90610100810190615a6d565b8b8b8b81811061231c5761231c615a07565b905060200281019061232e9190615a4c565b61233d90610120810190615a6d565b61449a565b505050808061235090615a33565b915050612055565b612360613cf7565b61236c83858484614447565b50505050565b61237a613cf7565b60005b81811015610c9057600083838381811061239957612399615a07565b905060e0020160a00160208101906123b19190614a53565b905060008484848181106123c7576123c7615a07565b905060e0020160c00160208101906123df9190614a53565b905060008787858181106123f5576123f5615a07565b905060200201602081019061240a9190614a53565b905060006124948b8b8781811061242357612423615a07565b9050602002013588888881811061243c5761243c615a07565b905060e0020160400135848a8a8a81811061245957612459615a07565b905060e00201606001358b8b8b81811061247557612475615a07565b905060e00201608001602081019061248d9190614a53565b8989613efa565b905080156124b6576124b187878781811061158c5761158c615a07565b6124cb565b6124cb8787878181106115b7576115b7615a07565b5050505080806124da90615a33565b91505061237d565b6124ea613cf7565b60006124fc60a0830160808401614a53565b905061251c6020830135846040850135610f8c6080870160608801614a53565b61252882358483613e29565b60005b86811015611ee75761256286868381811061254857612548615a07565b90506020020135858a8a8581811061128657611286615a07565b8061256c81615a33565b91505061252b565b61257c613cf7565b60005b81811015610c9057600083838381811061259b5761259b615a07565b905060c0020160800160208101906125b39190614a53565b90506126478484848181106125ca576125ca615a07565b905060c002016020013560008686868181106125e8576125e8615a07565b905060c002016040013587878781811061260457612604615a07565b905060c00201606001602081019061261c9190614a53565b8589898981811061262f5761262f615a07565b905060c0020160a0016020810190610f9d9190614a53565b61265d81858585818110610f3057610f30615a07565b60005b88888481811061267257612672615a07565b90506020028101906126849190615a6d565b90508110156126b4576126a2898985818110611de457611de4615a07565b806126ac81615a33565b915050612660565b505080806126c190615a33565b91505061257f565b6126d1613cf7565b60006126e360a0830160808401614a53565b90506127058760208401356000604086013561161a6080880160608901614a53565b612710818335613fc9565b60005b85811015611ee757612730878783818110610fcd57610fcd615a07565b8061273a81615a33565b915050612713565b61274a613cf7565b60005b81811015610c9057600083838381811061276957612769615a07565b905060e0020160a00160208101906127819190614a53565b9050600084848481811061279757612797615a07565b905060e0020160c00160208101906127af9190614a53565b905060006127c886868681811061175357611753615a07565b9050801561288c576127e683878787818110610daf57610daf615a07565b60005b8a8a868181106127fb576127fb615a07565b905060200281019061280d9190615a6d565b9050811015612886576128748b8b8781811061282b5761282b615a07565b905060200281019061283d9190615a6d565b8381811061284d5761284d615a07565b90506020020160208101906128629190614a53565b8a8a88818110611e2d57611e2d615a07565b8061287e81615a33565b9150506127e9565b506128a2565b6128a282878787818110610dd957610dd9615a07565b50505080806128b090615a33565b91505061274d565b6128c0613cf7565b6128cf8660008a8a8988614148565b6128d98585613fc9565b611ee78282613fc9565b6128eb613cf7565b60005b858110156129f0576129a28d8d8381811061290b5761290b615a07565b9050602002013560008b8b8581811061292657612926615a07565b905060200201358a8a8681811061293f5761293f615a07565b90506020020160208101906129549190614a53565b89898781811061296657612966615a07565b905060200201602081019061297b9190614a53565b88888881811061298d5761298d615a07565b9050602002016020810190610f9d9190614a53565b6129de8585838181106129b7576129b7615a07565b90506020020160208101906129cc9190614a53565b8c8c84818110610ff457610ff4615a07565b806129e881615a33565b9150506128ee565b50505050505050505050505050565b612a07613cf7565b60015b6001600160a01b0381811660009081526003602052604090205416600114612a56576001600160a01b0380821660009081526003602052604090205416612a508161453e565b50612a0a565b50565b612a61613cf7565b612a7088888787878787614087565b611ee7868684613e29565b612a83613cf7565b6000612a9560c0830160a08401614a53565b90506000612aa960e0840160c08501614a53565b90506000612acc88604086013587606088013561134f60a08a0160808b01614a53565b90508015612aee57612ae384602001358685613e29565b611ed8868689613e29565b611ee784358684613e29565b612b02613cf7565b60005b818110156113e5576000838383818110612b2157612b21615a07565b905060e0020160a0016020810190612b399190614a53565b90506000848484818110612b4f57612b4f615a07565b905060e0020160c0016020810190612b679190614a53565b90506000612b808c8c86818110610d1f57610d1f615a07565b90508015612bfb57612b9e83878787818110610daf57610daf615a07565b60005b8a8a86818110612bb357612bb3615a07565b9050602002810190612bc59190615a6d565b9050811015612bf557612be38b8b8781811061282b5761282b615a07565b80612bed81615a33565b915050612ba1565b50612c11565b612c1182878787818110610dd957610dd9615a07565b5050508080612c1f90615a33565b915050612b05565b612c2f613cf7565b60005b858110156129f057612d1e8d8d83818110612c4f57612c4f615a07565b905060200201358c8c84818110612c6857612c68615a07565b905060200201357f00000000000000000000000000000000000000000000000000000000000000008c8c86818110612ca257612ca2615a07565b905060200201358b8b87818110612cbb57612cbb615a07565b9050602002016020810190612cd09190614a53565b8a8a88818110612ce257612ce2615a07565b9050602002016020810190612cf79190614a53565b898989818110612d0957612d09615a07565b9050602002016020810190610eec9190614a53565b80612d2881615a33565b915050612c32565b612d38613cf7565b610dfe837f000000000000000000000000000000000000000000000000000000000000000087878686614148565b612d6e613cf7565b612a568161453e565b612d7f613cf7565b6000612d918b88600088888888613efa565b90508015612db257612da38387613fc9565b612dad8989613fc9565b611910565b611910828b613fc9565b612dc4613cf7565b6117f4818484613e29565b612dd7613cf7565b6000612de960c0830160a08401614a53565b90506000612dfd60e0840160c08501614a53565b90506000612e1f6040850135826060870135610c5660a0890160808a01614a53565b90508015612e6d57612e35838560200135613fc9565b60005b87811015612e6757612e5589898381811061139b5761139b615a07565b80612e5f81615a33565b915050612e38565b50611ee7565b611ee7828535613fc9565b612e80613cf7565b612e908787600087878787614087565b610c908286613fc9565b612ea2613cf7565b60005b818110156117f4576000838383818110612ec157612ec1615a07565b9050602002810190612ed39190615b15565b612ee49060a0810190608001614a53565b90506000848484818110612efa57612efa615a07565b9050602002810190612f0c9190615b15565b612f1d9060e081019060c001614a53565b9050612fde858585818110612f3457612f34615a07565b9050602002810190612f469190615b15565b6020013582878787818110612f5d57612f5d615a07565b9050602002810190612f6f9190615b15565b60400135888888818110612f8557612f85615a07565b9050602002810190612f979190615b15565b612fa8906080810190606001614a53565b868a8a8a818110612fbb57612fbb615a07565b9050602002810190612fcd9190615b15565b610f9d9060c081019060a001614a53565b61300d858585818110612ff357612ff3615a07565b90506020028101906130059190615b15565b358284613e29565b60005b85858581811061302257613022615a07565b90506020028101906130349190615b15565b6130429060e0810190615a6d565b90508110156130dd576130cb86868681811061306057613060615a07565b90506020028101906130729190615b15565b61308190610100810190615a6d565b8381811061309157613091615a07565b90506020020135838888888181106130ab576130ab615a07565b90506020028101906130bd9190615b15565b6112769060e0810190615a6d565b806130d581615a33565b915050613010565b50505080806130eb90615a33565b915050612ea5565b6130fb613cf7565b61310a84600088888786614148565b6116428383613fc9565b61311c613cf7565b60005b85811015611910576131768b8b8381811061313c5761313c615a07565b905060200201357f00000000000000000000000000000000000000000000000000000000000000008b8b8581811061292657612926615a07565b8061318081615a33565b91505061311f565b606060006004546001600160401b038111156131a6576131a6615b2c565b6040519080825280602002602001820160405280156131cf578160200160208202803683370190505b506001600090815260036020527fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c549192506001600160a01b03909116905b6001600160a01b038216600114613273578183828151811061323257613232615a07565b6001600160a01b03928316602091820292909201810191909152928116600090815260039093526040909220549091169061326c81615a33565b905061320e565b509092915050565b613283613cf7565b600061329560a0830160808401614a53565b90506132b688602084013585604086013561161a6080880160608901614a53565b6132c282358483613e29565b60005b868110156113e5576132e286868381811061254857612548615a07565b806132ec81615a33565b9150506132c5565b6132fc613cf7565b60005b81811015610dfe57600083838381811061331b5761331b615a07565b905060200281019061332d9190615b15565b61333e9060a0810190608001614a53565b9050600084848481811061335457613354615a07565b90506020028101906133669190615b15565b6133779060e081019060c001614a53565b905061345187878581811061338e5761338e615a07565b905060200201358686868181106133a7576133a7615a07565b90506020028101906133b99190615b15565b60200135838888888181106133d0576133d0615a07565b90506020028101906133e29190615b15565b604001358989898181106133f8576133f8615a07565b905060200281019061340a9190615b15565b61341b906080810190606001614a53565b878b8b8b81811061342e5761342e615a07565b90506020028101906134409190615b15565b610eec9060c081019060a001614a53565b613466858585818110612ff357612ff3615a07565b60005b85858581811061347b5761347b615a07565b905060200281019061348d9190615b15565b61349b9060e0810190615a6d565b90508110156134cb576134b986868681811061306057613060615a07565b806134c381615a33565b915050613469565b50505080806134d990615a33565b9150506132ff565b600080806134f8600563e570462160e01b86614207565b604080518381523360208201526001600160a01b038816918101919091526060810182905291935091507f78f4cea8c2f10b967cb5bf327794223ed6ca8dc8238135f61294f1a114f8afb590608001611457565b613554613cf7565b60005b818110156117f457600083838381811061357357613573615a07565b90506020028101906135859190615a4c565b6135969060c081019060a001614a53565b905060008484848181106135ac576135ac615a07565b90506020028101906135be9190615a4c565b6135d09061010081019060e001614a53565b905060008585858181106135e6576135e6615a07565b90506020028101906135f89190615a4c565b6136099060e081019060c001614a53565b9050600061369d87878781811061362257613622615a07565b90506020028101906136349190615a4c565b604001358489898981811061364b5761364b615a07565b905060200281019061365d9190615a4c565b606001358a8a8a81811061367357613673615a07565b90506020028101906136859190615a4c565b6136969060a0810190608001614a53565b8887613d5b565b90508015613726576136ba87878781811061119957611199615a07565b60005b8787878181106136cf576136cf615a07565b90506020028101906136e19190615a4c565b6136f090610100810190615a6d565b90508110156137205761370e88888881811061120a5761120a615a07565b8061371881615a33565b9150506136bd565b5061373b565b61373b8787878181106112cd576112cd615a07565b50505050808061374a90615a33565b915050613557565b61375a613cf7565b6137648282613fc9565b5050565b613770613cf7565b60005b81811015610c9057600083838381811061378f5761378f615a07565b905060c0020160800160208101906137a79190614a53565b905060008686848181106137bd576137bd615a07565b90506020020160208101906137d29190614a53565b90506138668989858181106137e9576137e9615a07565b9050602002013586868681811061380257613802615a07565b905060c00201602001358388888881811061381f5761381f615a07565b905060c002016040013589898981811061383b5761383b615a07565b905060c0020160600160208101906138539190614a53565b878b8b8b818110610ed457610ed4615a07565b61388c85858581811061387b5761387b615a07565b905060c00201600001358284613e29565b5050808061389990615a33565b915050613773565b6138a9613cf7565b6138b7858589898786614148565b610c90828585613e29565b6138ca613cf7565b60005b81811015610dfe5760008383838181106138e9576138e9615a07565b90506020028101906138fb9190615a4c565b61390c9060a0810190608001614a53565b9050600084848481811061392257613922615a07565b90506020028101906139349190615a4c565b604001359050600085858581811061394e5761394e615a07565b90506020028101906139609190615a4c565b6139719060e081019060c001614a53565b9050600086868681811061398757613987615a07565b90506020028101906139999190615a4c565b6139ab9061010081019060e001614a53565b90508686868181106139bf576139bf615a07565b90506020028101906139d19190615a4c565b60200135600003613ae5576000613a648888888181106139f3576139f3615a07565b9050602002810190613a059190615a4c565b60600135868a8a8a818110613a1c57613a1c615a07565b9050602002810190613a2e9190615a4c565b358b8b8b818110613a4157613a41615a07565b9050602002810190613a539190615a4c565b610c569060c081019060a001614a53565b90508015613abc57613ab78585858b8b8b818110613a8457613a84615a07565b9050602002810190613a969190615a4c565b613aa590610100810190615a6d565b8d8d8d81811061231c5761231c615a07565b613adf565b613adf8a8a88818110613ad157613ad1615a07565b9050602002013586846145a8565b50613bd1565b6000613b95888888818110613afc57613afc615a07565b9050602002810190613b0e9190615a4c565b60200135898989818110613b2457613b24615a07565b9050602002810190613b369190615a4c565b60600135878b8b8b818110613b4d57613b4d615a07565b9050602002810190613b5f9190615a4c565b358c8c8c818110613b7257613b72615a07565b9050602002810190613b849190615a4c565b610d8a9060c081019060a001614a53565b90508015613bba57613bb58585858b8b8b818110613a8457613a84615a07565b613bcf565b613bcf8a8a88818110613ad157613ad1615a07565b505b505050508080613be090615a33565b9150506138cd565b613bf0613cf7565b60005b81811015610dfe576000838383818110613c0f57613c0f615a07565b905060c002016080016020810190613c279190614a53565b90506000868684818110613c3d57613c3d615a07565b9050602002016020810190613c529190614a53565b9050613ccd858585818110613c6957613c69615a07565b905060c002016020013582878787818110613c8657613c86615a07565b905060c0020160400135888888818110613ca257613ca2615a07565b905060c002016060016020810190613cba9190614a53565b868a8a8a81811061262f5761262f615a07565b613ce285858581811061387b5761387b615a07565b50508080613cef90615a33565b915050613bf3565b336000908152600360205260409020546001600160a01b031615156040518060400160405280601281526020017124b73b30b634b21036b9b39739b2b73232b960711b81525090612a565760405162461bcd60e51b8152600401611a1d9190615ae2565b604051632142170760e11b81526001600160a01b038381166004830152828116602483015260448201869052600091908516906342842e0e90606401600060405180830381600087803b158015613db157600080fd5b505af1925050508015613dc2575060015b613dce57506000613e1f565b60408051868152602081018990526001600160a01b03888116828401529151918616917ff6935d13435d179652aef36125593f81c762921c3ab20abcf15149f22295f9ae9181900360600190a25060015b9695505050505050565b604080516001600160a01b038381166024830152604480830187905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290861691613e859190615b42565b6000604051808303816000865af19150503d8060008114613ec2576040519150601f19603f3d011682016040523d82523d6000602084013e613ec7565b606091505b5091509150818015613ef1575080511580613ef1575080806020019051810190613ef19190615b54565b610dfe57600080fd5b604051637921219560e11b81526000906001600160a01b0385169063f242432a90613f2f90869086908a908e90600401615b76565b600060405180830381600087803b158015613f4957600080fd5b505af1925050508015613f5a575060015b613f6657506000613fbe565b60408051868152602081018a90529081018890526001600160a01b0387811660608301528516907fc1d7f60447c28539e88fcba0e9120b121409ccca4f3cfaaf54fa68ade306d4c79060800160405180910390a25060015b979650505050505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114614016576040519150601f19603f3d011682016040523d82523d6000602084013e61401b565b606091505b50509050806117f45760405162461bcd60e51b815260206004820152603260248201527f4e6966747945786368616e67654578656375746f723a2056616c7565207472616044820152711b9cd9995c881d5b9cdd58d8d95cdcd99d5b60721b6064820152608401611a1d565b604051637921219560e11b81526001600160a01b0384169063f242432a906140b9908590859089908d90600401615b76565b600060405180830381600087803b1580156140d357600080fd5b505af11580156140e7573d6000803e3d6000fd5b505060408051878152602081018b90529081018990526001600160a01b038881166060830152861692507fc1d7f60447c28539e88fcba0e9120b121409ccca4f3cfaaf54fa68ade306d4c7915060800160405180910390a250505050505050565b604051632142170760e11b81526001600160a01b0383811660048301528281166024830152604482018690528416906342842e0e90606401600060405180830381600087803b15801561419a57600080fd5b505af11580156141ae573d6000803e3d6000fd5b505060408051878152602081018a90526001600160a01b0389811682840152915191871693507ff6935d13435d179652aef36125593f81c762921c3ab20abcf15149f22295f9ae925081900360600190a2505050505050565b6000806001600160a01b03831661424f5760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b6044820152606401611a1d565b60008061425a6145d1565b604080516020808201949094526001600160e01b031999909916898201526bffffffffffffffffffffffff19606089901b1660448a01528051808a03603801815260588a018083528151918501919091206078909a0182526001600160a01b03988916815260008a81529a909352909820905181546001600160a01b03191696169590951790945550929492505050565b60408051858152602081018590529081018390526001600160a01b0382811660608301528616907fc1d7f60447c28539e88fcba0e9120b121409ccca4f3cfaaf54fa68ade306d4c79060800160405180910390a25050505050565b600081815260208390526040812080546001600160a01b031661439c5760405162461bcd60e51b815260206004820152600e60248201526d1b9bc81cdd58da081b1bd8dad25960921b6044820152606401611a1d565b546001600160a01b03169392505050565b6001600160a01b0380821660009081526003602052604090205416156143d257600080fd5b60036020527fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c80546001600160a01b038381166000818152604081208054939094166001600160a01b03199384161790935560018352835490911617909155600480549161443f83615a33565b919050555050565b60408051848152602081018490526001600160a01b03838116828401529151918616917ff6935d13435d179652aef36125593f81c762921c3ab20abcf15149f22295f9ae9181900360600190a250505050565b6001600160a01b0387161586156144cb5780156144c0576144bb8688613fc9565b6144cb565b6144cb878988613e29565b8380156113e55760005b818110156116865782156144fd576144f8878783818110610fcd57610fcd615a07565b61452c565b61452c85858381811061451257614512615a07565b905060200201358b89898581811061128657611286615a07565b8061453681615a33565b9150506144d5565b60006145498261463c565b6001600160a01b03838116600081815260036020526040808220805486861684529183208054929095166001600160a01b0319928316179094559181528254909116909155600480549293509061459f83615bae565b91905055505050565b82156117f4576001600160a01b0382166145c6576117f48184613fc9565b6117f4838383613e29565b60008060008081546145e290615a33565b918290555090506145f4600143615bc5565b60408051914060208301526bffffffffffffffffffffffff193060601b1690820152605481018290526074016040516020818303038152906040528051906020012091509091565b600060015b6001600160a01b03818116600090815260036020526040902054166001146146ad576001600160a01b0381811660009081526003602052604090205481851691160361468d5792915050565b6001600160a01b0390811660009081526003602052604090205416614641565b50600092915050565b80356001600160a01b03811681146146cd57600080fd5b919050565b600060e082840312156146e457600080fd5b50919050565b600080600080610140858703121561470157600080fd5b61470a856146b6565b93506020850135925061471f604086016146b6565b915061472e86606087016146d2565b905092959194509250565b60008083601f84011261474b57600080fd5b5081356001600160401b0381111561476257600080fd5b6020830191508360208260051b850101111561477d57600080fd5b9250929050565b60008083601f84011261479657600080fd5b5081356001600160401b038111156147ad57600080fd5b60208301915083602060e08302850101111561477d57600080fd5b600080600080604085870312156147de57600080fd5b84356001600160401b03808211156147f557600080fd5b61480188838901614739565b9096509450602087013591508082111561481a57600080fd5b5061482787828801614784565b95989497509550505050565b60008083601f84011261484557600080fd5b5081356001600160401b0381111561485c57600080fd5b60208301915083602060c08302850101111561477d57600080fd5b6000806000806040858703121561488d57600080fd5b84356001600160401b03808211156148a457600080fd5b6148b088838901614739565b909650945060208701359150808211156148c957600080fd5b5061482787828801614833565b600060c082840312156146e457600080fd5b6000806000806000610100868803121561490157600080fd5b85356001600160401b038082111561491857600080fd5b61492489838a01614739565b9097509550602088013591508082111561493d57600080fd5b5061494a88828901614739565b909450925061495e905087604088016148d6565b90509295509295909350565b6000806000806040858703121561498057600080fd5b84356001600160401b038082111561499757600080fd5b6149a388838901614739565b909650945060208701359150808211156149bc57600080fd5b5061482787828801614739565b60008060008060008061014087890312156149e357600080fd5b8635955060208701356001600160401b0380821115614a0157600080fd5b614a0d8a838b01614739565b90975095506040890135915080821115614a2657600080fd5b50614a3389828a01614739565b9094509250614a47905088606089016146d2565b90509295509295509295565b600060208284031215614a6557600080fd5b614a6e826146b6565b9392505050565b60008060008060006101408688031215614a8e57600080fd5b85359450614a9e602087016146b6565b935060408601359250614ab3606087016146b6565b915061495e87608088016148d6565b60008060008060008060008060006101208a8c031215614ae157600080fd5b8935985060208a0135975060408a0135965060608a01359550614b0660808b016146b6565b945060a08a01359350614b1b60c08b016146b6565b9250614b2960e08b016146b6565b9150614b386101008b016146b6565b90509295985092959850929598565b600080600080600080600080610100898b031215614b6457600080fd5b8835975060208901359650604089013595506060890135945060808901359350614b9060a08a016146b6565b9250614b9e60c08a016146b6565b9150614bac60e08a016146b6565b90509295985092959890939650565b60008060208385031215614bce57600080fd5b82356001600160401b03811115614be457600080fd5b614bf085828601614784565b90969095509350505050565b6000806000806101208587031215614c1357600080fd5b614c1c856146b6565b935060208501359250614c31604086016146b6565b915061472e86606087016148d6565b60008060008060008060008060008060a08b8d031215614c5f57600080fd5b8a356001600160401b0380821115614c7657600080fd5b614c828e838f01614739565b909c509a5060208d0135915080821115614c9b57600080fd5b614ca78e838f01614739565b909a50985060408d0135915080821115614cc057600080fd5b614ccc8e838f01614739565b909850965060608d0135915080821115614ce557600080fd5b614cf18e838f01614739565b909650945060808d0135915080821115614d0a57600080fd5b50614d178d828e01614739565b915080935050809150509295989b9194979a5092959850565b600080600060608486031215614d4557600080fd5b614d4e846146b6565b9250614d5c602085016146b6565b9150604084013590509250925092565b60008060008060008060008060006101208a8c031215614d8b57600080fd5b89359850614d9b60208b016146b6565b975060408a0135965060608a0135955060808a0135945060a08a01359350614b1b60c08b016146b6565b600060208284031215614dd757600080fd5b5035919050565b600080600080600080600080610100898b031215614dfb57600080fd5b883597506020890135965060408901359550614e1960608a016146b6565b945060808901359350614b9060a08a016146b6565b6000806000806000806101408789031215614e4857600080fd5b86356001600160401b0380821115614e5f57600080fd5b614e6b8a838b01614739565b90985096506020890135915080821115614e8457600080fd5b50614e9189828a01614739565b9095509350614ea49050604088016146b6565b9150614a4788606089016146d2565b600080600080600060a08688031215614ecb57600080fd5b614ed4866146b6565b945060208601359350604086013592506060860135915061495e608087016146b6565b6000806000806000806000806080898b031215614f1357600080fd5b88356001600160401b0380821115614f2a57600080fd5b614f368c838d01614739565b909a50985060208b0135915080821115614f4f57600080fd5b614f5b8c838d01614739565b909850965060408b0135915080821115614f7457600080fd5b614f808c838d01614739565b909650945060608b0135915080821115614f9957600080fd5b50614fa68b828c01614833565b999c989b5096995094979396929594505050565b60008060008060008060c08789031215614fd357600080fd5b863595506020870135945060408701359350614ff1606088016146b6565b9250614fff608088016146b6565b9150614a4760a088016146b6565b600080600080600080600060e0888a03121561502857600080fd5b8735965060208801359550604088013594506060880135935061504d608089016146b6565b925061505b60a089016146b6565b915061506960c089016146b6565b905092959891949750929550565b6000806000806000806000806080898b03121561509357600080fd5b88356001600160401b03808211156150aa57600080fd5b6150b68c838d01614739565b909a50985060208b01359150808211156150cf57600080fd5b6150db8c838d01614739565b909850965060408b01359150808211156150f457600080fd5b6151008c838d01614739565b909650945060608b013591508082111561511957600080fd5b50614fa68b828c01614739565b6000806000806000806000610160888a03121561514257600080fd5b8735965060208801356001600160401b038082111561516057600080fd5b61516c8b838c01614739565b909850965060408a013591508082111561518557600080fd5b506151928a828b01614739565b90955093506151a59050606089016146b6565b91506150698960808a016146d2565b600080602083850312156151c757600080fd5b82356001600160401b038111156151dd57600080fd5b614bf085828601614739565b600080600080608085870312156151ff57600080fd5b8435935061520f602086016146b6565b92506040850135915061472e606086016146b6565b6000806000806000806060878903121561523d57600080fd5b86356001600160401b038082111561525457600080fd5b6152608a838b01614739565b9098509650602089013591508082111561527957600080fd5b6152858a838b01614739565b9096509450604089013591508082111561529e57600080fd5b506152ab89828a01614784565b979a9699509497509295939492505050565b60008060008060008061012087890312156152d757600080fd5b86356001600160401b03808211156152ee57600080fd5b6152fa8a838b01614739565b9098509650602089013591508082111561531357600080fd5b5061532089828a01614739565b90955093506153339050604088016146b6565b9150614a4788606089016148d6565b6000806000806000806060878903121561535b57600080fd5b86356001600160401b038082111561537257600080fd5b61537e8a838b01614739565b9098509650602089013591508082111561539757600080fd5b6153a38a838b01614739565b909650945060408901359150808211156153bc57600080fd5b506152ab89828a01614833565b60008060008060008061012087890312156153e357600080fd5b8635955060208701356001600160401b038082111561540157600080fd5b61540d8a838b01614739565b9097509550604089013591508082111561542657600080fd5b5061543389828a01614739565b9094509250614a47905088606089016148d6565b600080600080600080600080610100898b03121561546457600080fd5b8835975061547460208a016146b6565b96506040890135955061548960608a016146b6565b94506080890135935061549e60a08a016146b6565b92506154ac60c08a016146b6565b915060e089013590509295985092959890939650565b60008060008060008060008060008060008060c08d8f0312156154e457600080fd5b6001600160401b038d3511156154f957600080fd5b6155068e8e358f01614739565b909c509a506001600160401b0360208e0135111561552357600080fd5b6155338e60208f01358f01614739565b909a5098506001600160401b0360408e0135111561555057600080fd5b6155608e60408f01358f01614739565b90985096506001600160401b0360608e0135111561557d57600080fd5b61558d8e60608f01358f01614739565b90965094506001600160401b0360808e013511156155aa57600080fd5b6155ba8e60808f01358f01614739565b90945092506001600160401b0360a08e013511156155d757600080fd5b6155e78e60a08f01358f01614739565b81935080925050509295989b509295989b509295989b565b6000806000806000610160868803121561561857600080fd5b85359450615628602087016146b6565b93506040860135925061563d606087016146b6565b915061495e87608088016146d2565b6000806000806000806000806080898b03121561566857600080fd5b88356001600160401b038082111561567f57600080fd5b61568b8c838d01614739565b909a50985060208b01359150808211156156a457600080fd5b6156b08c838d01614739565b909850965060408b01359150808211156156c957600080fd5b6156d58c838d01614739565b909650945060608b01359150808211156156ee57600080fd5b50614fa68b828c01614784565b600080600080600060a0868803121561571357600080fd5b85359450615723602087016146b6565b935060408601359250615738606087016146b6565b915061495e608087016146b6565b6000806000806000806000806000806101408b8d03121561576657600080fd5b8a35995060208b0135985061577d60408c016146b6565b975060608b0135965060808b0135955060a08b0135945060c08b013593506157a760e08c016146b6565b92506157b66101008c016146b6565b91506157c56101208c016146b6565b90509295989b9194979a5092959850565b600080600080600061012086880312156157ef57600080fd5b85356001600160401b038082111561580657600080fd5b61581289838a01614739565b9097509550602088013591508082111561582b57600080fd5b5061583888828901614739565b909450925061495e905087604088016146d2565b60008060008060008060c0878903121561586557600080fd5b86359550615875602088016146b6565b94506040870135935061588a606088016146b6565b925060808701359150614a4760a088016146b6565b6020808252825182820181905260009190848201906040850190845b818110156158e05783516001600160a01b0316835292840192918401916001016158bb565b50909695505050505050565b6000806000806000806000610140888a03121561590857600080fd5b8735965060208801356001600160401b038082111561592657600080fd5b6159328b838c01614739565b909850965060408a013591508082111561594b57600080fd5b506159588a828b01614739565b909550935061596b9050606089016146b6565b91506150698960808a016148d6565b6000806040838503121561598d57600080fd5b615996836146b6565b946020939093013593505050565b600080600080600080600060e0888a0312156159bf57600080fd5b873596506159cf602089016146b6565b9550604088013594506159e4606089016146b6565b93506159f2608089016146b6565b925060a0880135915061506960c089016146b6565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201615a4557615a45615a1d565b5060010190565b6000823561013e19833603018112615a6357600080fd5b9190910192915050565b6000808335601e19843603018112615a8457600080fd5b8301803591506001600160401b03821115615a9e57600080fd5b6020019150600581901b360382131561477d57600080fd5b60005b83811015615ad1578181015183820152602001615ab9565b8381111561236c5750506000910152565b6020815260008251806020840152615b01816040850160208701615ab6565b601f01601f19169190910160400192915050565b6000823561011e19833603018112615a6357600080fd5b634e487b7160e01b600052604160045260246000fd5b60008251615a63818460208701615ab6565b600060208284031215615b6657600080fd5b81518015158114614a6e57600080fd5b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b600081615bbd57615bbd615a1d565b506000190190565b600082821015615bd757615bd7615a1d565b50039056fea26469706673582212202582ff801306017998602c5bef74a95c4c34ab09dd9cfbba4a20f12a0894e02e64736f6c634300080d00330000000000000000000000002d5d20c50320de5c9861350c4f760e26de0c2dc70000000000000000000000008fe2f09f3684284e15822285d444c13d2cb992100000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000100000000000000000000000015f8733104b67f17158c417d32172eea56c3b61d

Deployed Bytecode

0x6080604052600436106103f95760003560e01c80635626283711610213578063cb81fecf11610123578063edb67d47116100ab578063f3fef3a31161007a578063f3fef3a314610b73578063f63c70ba14610b93578063fb4fb88514610bb3578063fc888f2b14610bd3578063fcc4287314610be657600080fd5b8063edb67d4714610ac7578063ee90c99f14610afd578063f01f2b8b14610b13578063f340fe9614610b5e57600080fd5b8063d7234e3b116100f2578063d7234e3b14610a25578063d81e9bdd14610a47578063defe688714610a67578063e570462114610a87578063ec4ee8a414610aa757600080fd5b8063cb81fecf146109a6578063cf6e4488146109bc578063d57ddaf4146109f2578063d6596de114610a0557600080fd5b806394ecbf1e116101a6578063a6f3766211610175578063a6f376621461092d578063b8c1e3e014610940578063b95c065b14610960578063c38766ac14610973578063c63a20151461098657600080fd5b806394ecbf1e146108ba57806397fdef42146108cd5780639d510474146108ed5780639fc1e76a1461090d57600080fd5b806373f24d98116101e257806373f24d981461081057806374ac120a146108465780638203fd4e146108665780638ad38af31461088657600080fd5b806356262837146107c25780635d6c78f2146107d55780635f825129146107e85780637327dc2b146107fb57600080fd5b806335b5f4441161030e5780634192fafb116102a15780634b47c1e5116102705780634b47c1e51461073c5780634d9728261461075c5780634fef0c471461077c5780635109718e1461079c578063519c6348146107af57600080fd5b80634192fafb146106d657806342231c0d146106e957806343f032ea1461070957806347b6c5f11461072957600080fd5b806339de0527116102dd57806339de0527146106635780633a8343ee146106835780633bba9e94146106a35780633dfb94f1146106b657600080fd5b806335b5f444146105d8578063375b74c3146105f85780633768157d14610630578063378710911461065057600080fd5b80632107b563116103915780632df36835116103605780632df3683514610545578063311007a714610565578063355007f914610585578063355588ea146105a5578063358f8592146105b857600080fd5b80632107b563146104df57806327139e94146104ff5780632a613d4c1461051f5780632d0fb04c1461053257600080fd5b80631052e3c1116103cd5780631052e3c114610459578063110b557f1461047957806315b210821461048c5780631e26ac8d146104bf57600080fd5b80628ac4c1146103fe57806306c94014146104205780630a40d0f8146104335780630a90a27514610446575b600080fd5b34801561040a57600080fd5b5061041e6104193660046146ea565b610c06565b005b61041e61042e3660046147c8565b610c99565b61041e610441366004614877565b610e05565b61041e6104543660046148e8565b610f51565b34801561046557600080fd5b5061041e61047436600461496a565b611012565b61041e6104873660046149c9565b6112fe565b34801561049857600080fd5b506104ac6104a7366004614a53565b6113f0565b6040519081526020015b60405180910390f35b3480156104cb57600080fd5b5061041e6104da3660046147c8565b611466565b3480156104eb57600080fd5b5061041e6104fa366004614a75565b6115df565b34801561050b57600080fd5b5061041e61051a366004614ac2565b61164a565b61041e61052d366004614b47565b611692565b61041e610540366004614bbb565b6116cd565b34801561055157600080fd5b5061041e610560366004614bfc565b6117f9565b34801561057157600080fd5b5061041e610580366004614c40565b61184a565b34801561059157600080fd5b5061041e6105a0366004614d30565b61191d565b61041e6105b3366004614d6c565b611989565b3480156105c457600080fd5b5061041e6105d3366004614dc5565b6119c8565b3480156105e457600080fd5b5061041e6105f3366004614dde565b611aab565b34801561060457600080fd5b50600154610618906001600160a01b031681565b6040516001600160a01b0390911681526020016104b6565b34801561063c57600080fd5b5061041e61064b366004614e2e565b611ae1565b61041e61065e366004614d6c565b611ba0565b34801561066f57600080fd5b5061041e61067e366004614eb3565b611bcc565b34801561068f57600080fd5b5061041e61069e366004614dc5565b611be1565b61041e6106b1366004614ef7565b611cb5565b3480156106c257600080fd5b5061041e6106d1366004614fba565b611e76565b61041e6106e436600461500d565b611ead565b3480156106f557600080fd5b5061041e610704366004615077565b611ef1565b34801561071557600080fd5b5061041e610724366004615126565b611f9e565b61041e6107373660046151b4565b61204a565b34801561074857600080fd5b5061041e6107573660046151e9565b612358565b34801561076857600080fd5b5061041e610777366004615224565b612372565b34801561078857600080fd5b5061041e6107973660046152bd565b6124e2565b61041e6107aa366004615342565b612574565b61041e6107bd3660046153c9565b6126c9565b61041e6107d0366004615224565b612742565b61041e6107e3366004615447565b6128b8565b61041e6107f63660046154c2565b6128e3565b34801561080757600080fd5b5061041e6129ff565b34801561081c57600080fd5b5061061861082b366004614dc5565b6005602052600090815260409020546001600160a01b031681565b34801561085257600080fd5b5061041e610861366004614dde565b612a59565b34801561087257600080fd5b5061041e6108813660046155ff565b612a7b565b34801561089257600080fd5b506106187f0000000000000000000000002d5d20c50320de5c9861350c4f760e26de0c2dc781565b61041e6108c836600461564c565b612afa565b3480156108d957600080fd5b5061041e6108e83660046154c2565b612c27565b3480156108f957600080fd5b5061041e6109083660046156fb565b612d30565b34801561091957600080fd5b5061041e610928366004614a53565b612d66565b61041e61093b366004615746565b612d77565b34801561094c57600080fd5b5061041e61095b366004614d30565b612dbc565b61041e61096e3660046157d6565b612dcf565b61041e61098136600461500d565b612e78565b34801561099257600080fd5b5061041e6109a13660046151b4565b612e9a565b3480156109b257600080fd5b506104ac60005481565b3480156109c857600080fd5b506106186109d7366004614dc5565b6002602052600090815260409020546001600160a01b031681565b61041e610a0036600461584c565b6130f3565b348015610a1157600080fd5b5061041e610a20366004614c40565b613114565b348015610a3157600080fd5b50610a3a613188565b6040516104b6919061589f565b348015610a5357600080fd5b5061041e610a623660046158ec565b61327b565b348015610a7357600080fd5b5061041e610a8236600461496a565b6132f4565b348015610a9357600080fd5b506104ac610aa2366004614a53565b6134e1565b348015610ab357600080fd5b5061041e610ac23660046151b4565b61354c565b348015610ad357600080fd5b50610618610ae2366004614a53565b6003602052600090815260409020546001600160a01b031681565b348015610b0957600080fd5b506104ac60045481565b348015610b1f57600080fd5b50610b4e610b2e366004614a53565b6001600160a01b0390811660009081526003602052604090205416151590565b60405190151581526020016104b6565b348015610b6a57600080fd5b50610618600081565b348015610b7f57600080fd5b5061041e610b8e36600461597a565b613752565b348015610b9f57600080fd5b5061041e610bae366004615342565b613768565b348015610bbf57600080fd5b5061041e610bce3660046159a4565b6138a1565b61041e610be136600461496a565b6138c2565b348015610bf257600080fd5b5061041e610c01366004614877565b613be8565b610c0e613cf7565b6000610c2060c0830160a08401614a53565b90506000610c3460e0840160c08501614a53565b90506000610c5d6040850135866060870135610c5660a0890160808a01614a53565b8787613d5b565b90508015610c8457610c7484602001358685613e29565b610c7f868689613e29565b610c90565b610c9084358684613e29565b50505050505050565b610ca1613cf7565b60005b81811015610dfe576000838383818110610cc057610cc0615a07565b905060e0020160a0016020810190610cd89190614a53565b90506000848484818110610cee57610cee615a07565b905060e0020160c0016020810190610d069190614a53565b90506000610d91888886818110610d1f57610d1f615a07565b90506020020135878787818110610d3857610d38615a07565b905060e00201604001356000898989818110610d5657610d56615a07565b905060e00201606001358a8a8a818110610d7257610d72615a07565b905060e002016080016020810190610d8a9190614a53565b8888613efa565b90508015610dc357610dbe83878787818110610daf57610daf615a07565b905060e0020160200135613fc9565b610de8565b610de882878787818110610dd957610dd9615a07565b905060e0020160000135613fc9565b5050508080610df690615a33565b915050610ca4565b5050505050565b610e0d613cf7565b60005b81811015610dfe57610ef1858583818110610e2d57610e2d615a07565b90506020020135848484818110610e4657610e46615a07565b905060c00201602001356000868686818110610e6457610e64615a07565b905060c0020160400135878787818110610e8057610e80615a07565b905060c002016060016020810190610e989190614a53565b888888818110610eaa57610eaa615a07565b905060c002016080016020810190610ec29190614a53565b898989818110610ed457610ed4615a07565b905060c0020160a0016020810190610eec9190614a53565b614087565b610f3f838383818110610f0657610f06615a07565b905060c002016080016020810190610f1e9190614a53565b848484818110610f3057610f30615a07565b905060c0020160000135613fc9565b80610f4981615a33565b915050610e10565b610f59613cf7565b6000610f6b60a0830160808401614a53565b9050610fa2602083013560006040850135610f8c6080870160608801614a53565b85610f9d60c0890160a08a01614a53565b614148565b610fad818335613fc9565b60005b85811015610c9057611000878783818110610fcd57610fcd615a07565b9050602002016020810190610fe29190614a53565b868684818110610ff457610ff4615a07565b90506020020135613fc9565b8061100a81615a33565b915050610fb0565b61101a613cf7565b60005b81811015610dfe57600083838381811061103957611039615a07565b905060200281019061104b9190615a4c565b61105c9060c081019060a001614a53565b9050600084848481811061107257611072615a07565b90506020028101906110849190615a4c565b6110969061010081019060e001614a53565b905060008585858181106110ac576110ac615a07565b90506020028101906110be9190615a4c565b6110cf9060e081019060c001614a53565b9050600061117c8989878181106110e8576110e8615a07565b9050602002013588888881811061110157611101615a07565b90506020028101906111139190615a4c565b60400135858a8a8a81811061112a5761112a615a07565b905060200281019061113c9190615a4c565b606001358b8b8b81811061115257611152615a07565b90506020028101906111649190615a4c565b6111759060a0810190608001614a53565b8988613efa565b905080156112b8576111b687878781811061119957611199615a07565b90506020028101906111ab9190615a4c565b602001358486613e29565b60005b8787878181106111cb576111cb615a07565b90506020028101906111dd9190615a4c565b6111ec90610100810190615a6d565b90508110156112b2576112a088888881811061120a5761120a615a07565b905060200281019061121c9190615a4c565b61122b90610120810190615a6d565b8381811061123b5761123b615a07565b90506020020135858a8a8a81811061125557611255615a07565b90506020028101906112679190615a4c565b61127690610100810190615a6d565b8581811061128657611286615a07565b905060200201602081019061129b9190614a53565b613e29565b806112aa81615a33565b9150506111b9565b506112e7565b6112e78787878181106112cd576112cd615a07565b90506020028101906112df9190615a4c565b358484613e29565b5050505080806112f690615a33565b91505061101d565b611306613cf7565b600061131860c0830160a08401614a53565b9050600061132c60e0840160c08501614a53565b9050600061136589604086013583606088013561134f60a08a0160808b01614a53565b8861136060e08c0160c08d01614a53565b613efa565b905080156113da5761137b838560200135613fc9565b60005b878110156113d4576113c289898381811061139b5761139b615a07565b90506020020160208101906113b09190614a53565b888884818110610ff457610ff4615a07565b806113cc81615a33565b91505061137e565b506113e5565b6113e5828535613fc9565b505050505050505050565b600080806114076002630ad9084160e11b86614207565b604080518381523360208201526001600160a01b038816918101919091526060810182905291935091507f8286bbf6adfae598c227689d4e361af126e220106aaa15764538028b07f3a0d4906080015b60405180910390a15092915050565b61146e613cf7565b60005b81811015610dfe57600083838381811061148d5761148d615a07565b905060e0020160a00160208101906114a59190614a53565b905060008484848181106114bb576114bb615a07565b905060e0020160c00160208101906114d39190614a53565b905060008787858181106114e9576114e9615a07565b90506020020160208101906114fe9190614a53565b9050600061156f87878781811061151757611517615a07565b905060e00201604001358389898981811061153457611534615a07565b905060e00201606001358a8a8a81811061155057611550615a07565b905060e0020160800160208101906115689190614a53565b8888613d5b565b905080156115a25761159d87878781811061158c5761158c615a07565b905060e00201602001358386613e29565b6115c8565b6115c88787878181106115b7576115b7615a07565b905060e00201600001358385613e29565b5050505080806115d790615a33565b915050611471565b6115e7613cf7565b60006115f960a0830160808401614a53565b905061162b86602084013585604086013561161a6080880160608901614a53565b86610eec60c08a0160a08b01614a53565b61163782358483613e29565b611642848487613e29565b505050505050565b611652613cf7565b60006116638a898888888888613efa565b9050801561167b57611676878785613e29565b611686565b611686898784613e29565b50505050505050505050565b61169a613cf7565b60006116ac8988600088888888613efa565b905080156116c3576116be8387613fc9565b6113e5565b6113e58289613fc9565b6116d5613cf7565b60005b818110156117f45760008383838181106116f4576116f4615a07565b905060e0020160a001602081019061170c9190614a53565b9050600084848481811061172257611722615a07565b905060e0020160c001602081019061173a9190614a53565b905060006117a586868681811061175357611753615a07565b905060e0020160400135600088888881811061177157611771615a07565b905060e002016060013589898981811061178d5761178d615a07565b905060e002016080016020810190610c569190614a53565b905080156117c8576117c383878787818110610daf57610daf615a07565b6117de565b6117de82878787818110610dd957610dd9615a07565b50505080806117ec90615a33565b9150506116d8565b505050565b611801613cf7565b600061181360a0830160808401614a53565b90506118336020830135846040850135610f8c6080870160608801614a53565b61183f82358483613e29565b610dfe848487613e29565b611852613cf7565b60005b87811015611910576118fe89898381811061187257611872615a07565b90506020020160208101906118879190614a53565b88888481811061189957611899615a07565b905060200201358d8d858181106118b2576118b2615a07565b905060200201358888868181106118cb576118cb615a07565b905060200201358787878181106118e4576118e4615a07565b90506020020160208101906118f99190614a53565b6142eb565b8061190881615a33565b915050611855565b5050505050505050505050565b611925613cf7565b604051632142170760e11b81523060048201526001600160a01b038381166024830152604482018390528416906342842e0e90606401600060405180830381600087803b15801561197557600080fd5b505af1158015610c90573d6000803e3d6000fd5b611991613cf7565b60006119a287600087878787613d5b565b905080156119be576119b48387613fc9565b6116768989613fc9565b611686828b613fc9565b60015460408051808201909152601281527124b73b30b634b21036b9b39739b2b73232b960711b6020820152906001600160a01b03163314611a265760405162461bcd60e51b8152600401611a1d9190615ae2565b60405180910390fd5b506000611a34600583614346565b9050611a3f816143ad565b6000828152600560205260409081902080546001600160a01b0319169055517f3af7a1ac361fdd53acc657b974ce6047460323fcae43e3cb09d2c888dd69219a90611a9f90849084909182526001600160a01b0316602082015260400190565b60405180910390a15050565b611ab3613cf7565b6000611ac3888787878787613d5b565b90508015611ad6576116be878785613e29565b6113e5898784613e29565b611ae9613cf7565b6000611afb60c0830160a08401614a53565b90506000611b0f60e0840160c08501614a53565b90506000611b316040850135866060870135610c5660a0890160808a01614a53565b90508015611b9457611b4884602001358685613e29565b60005b888110156113d457611b82888883818110611b6857611b68615a07565b90506020020135878c8c8581811061128657611286615a07565b80611b8c81615a33565b915050611b4b565b6113e584358684613e29565b611ba8613cf7565b611bb88987600087878787614087565b611bc28286613fc9565b6113e58888613fc9565b611bd4613cf7565b610dfe85858585856142eb565b60015460408051808201909152601281527124b73b30b634b21036b9b39739b2b73232b960711b6020820152906001600160a01b03163314611c365760405162461bcd60e51b8152600401611a1d9190615ae2565b50611c42600282614346565b600180546001600160a01b03199081166001600160a01b039384161782556000848152600260209081526040918290208054909316909255915482518581529316908301527f9a99272c0f6b7a30ef9e76e684a7cd408bfd4f11a72f36a8e276253c920e442d910160405180910390a150565b611cbd613cf7565b60005b818110156113e5576000838383818110611cdc57611cdc615a07565b905060c002016080016020810190611cf49190614a53565b9050611d898a8a84818110611d0b57611d0b615a07565b90506020020135858585818110611d2457611d24615a07565b905060c00201602001356000878787818110611d4257611d42615a07565b905060c0020160400135888888818110611d5e57611d5e615a07565b905060c002016060016020810190611d769190614a53565b868a8a8a818110610ed457610ed4615a07565b611d9f81858585818110610f3057610f30615a07565b60005b888884818110611db457611db4615a07565b9050602002810190611dc69190615a6d565b9050811015611e6157611e4f898985818110611de457611de4615a07565b9050602002810190611df69190615a6d565b83818110611e0657611e06615a07565b9050602002016020810190611e1b9190614a53565b888886818110611e2d57611e2d615a07565b9050602002810190611e3f9190615a6d565b84818110610ff457610ff4615a07565b80611e5981615a33565b915050611da2565b50508080611e6e90615a33565b915050611cc0565b611e7e613cf7565b61164286867f0000000000000000000000002d5d20c50320de5c9861350c4f760e26de0c2dc787878787614087565b611eb5613cf7565b6000611ec687600087878787613d5b565b90508015611edd57611ed88387613fc9565b611ee7565b611ee78289613fc9565b5050505050505050565b611ef9613cf7565b60005b878110156113e557611f8c898983818110611f1957611f19615a07565b9050602002016020810190611f2e9190614a53565b888884818110611f4057611f40615a07565b90506020020135878785818110611f5957611f59615a07565b90506020020135868686818110611f7257611f72615a07565b9050602002016020810190611f879190614a53565b614447565b80611f9681615a33565b915050611efc565b611fa6613cf7565b6000611fb860c0830160a08401614a53565b90506000611fcc60e0840160c08501614a53565b90506000611fef8a6040860135876060880135610d8a60a08a0160808b01614a53565b9050801561203e5761200684602001358685613e29565b60005b8881101561203857612026888883818110611b6857611b68615a07565b8061203081615a33565b915050612009565b50611686565b61168684358684613e29565b612052613cf7565b60005b818110156117f457600083838381811061207157612071615a07565b90506020028101906120839190615a4c565b6120949060a0810190608001614a53565b905060008484848181106120aa576120aa615a07565b90506020028101906120bc9190615a4c565b60400135905060008585858181106120d6576120d6615a07565b90506020028101906120e89190615a4c565b6120f99060e081019060c001614a53565b905085858581811061210d5761210d615a07565b905060200281019061211f9190615a4c565b602001356000036121ec576121e786868681811061213f5761213f615a07565b90506020028101906121519190615a4c565b606001358488888881811061216857612168615a07565b905060200281019061217a9190615a4c565b3589898981811061218d5761218d615a07565b905060200281019061219f9190615a4c565b6121b09060c081019060a001614a53565b858b8b8b8181106121c3576121c3615a07565b90506020028101906121d59190615a4c565b610f9d9061010081019060e001614a53565b6122d1565b6122d186868681811061220157612201615a07565b90506020028101906122139190615a4c565b6020013587878781811061222957612229615a07565b905060200281019061223b9190615a4c565b606001358589898981811061225257612252615a07565b90506020028101906122649190615a4c565b358a8a8a81811061227757612277615a07565b90506020028101906122899190615a4c565b61229a9060c081019060a001614a53565b868c8c8c8181106122ad576122ad615a07565b90506020028101906122bf9190615a4c565b610eec9061010081019060e001614a53565b6123428383838989898181106122e9576122e9615a07565b90506020028101906122fb9190615a4c565b61230a90610100810190615a6d565b8b8b8b81811061231c5761231c615a07565b905060200281019061232e9190615a4c565b61233d90610120810190615a6d565b61449a565b505050808061235090615a33565b915050612055565b612360613cf7565b61236c83858484614447565b50505050565b61237a613cf7565b60005b81811015610c9057600083838381811061239957612399615a07565b905060e0020160a00160208101906123b19190614a53565b905060008484848181106123c7576123c7615a07565b905060e0020160c00160208101906123df9190614a53565b905060008787858181106123f5576123f5615a07565b905060200201602081019061240a9190614a53565b905060006124948b8b8781811061242357612423615a07565b9050602002013588888881811061243c5761243c615a07565b905060e0020160400135848a8a8a81811061245957612459615a07565b905060e00201606001358b8b8b81811061247557612475615a07565b905060e00201608001602081019061248d9190614a53565b8989613efa565b905080156124b6576124b187878781811061158c5761158c615a07565b6124cb565b6124cb8787878181106115b7576115b7615a07565b5050505080806124da90615a33565b91505061237d565b6124ea613cf7565b60006124fc60a0830160808401614a53565b905061251c6020830135846040850135610f8c6080870160608801614a53565b61252882358483613e29565b60005b86811015611ee75761256286868381811061254857612548615a07565b90506020020135858a8a8581811061128657611286615a07565b8061256c81615a33565b91505061252b565b61257c613cf7565b60005b81811015610c9057600083838381811061259b5761259b615a07565b905060c0020160800160208101906125b39190614a53565b90506126478484848181106125ca576125ca615a07565b905060c002016020013560008686868181106125e8576125e8615a07565b905060c002016040013587878781811061260457612604615a07565b905060c00201606001602081019061261c9190614a53565b8589898981811061262f5761262f615a07565b905060c0020160a0016020810190610f9d9190614a53565b61265d81858585818110610f3057610f30615a07565b60005b88888481811061267257612672615a07565b90506020028101906126849190615a6d565b90508110156126b4576126a2898985818110611de457611de4615a07565b806126ac81615a33565b915050612660565b505080806126c190615a33565b91505061257f565b6126d1613cf7565b60006126e360a0830160808401614a53565b90506127058760208401356000604086013561161a6080880160608901614a53565b612710818335613fc9565b60005b85811015611ee757612730878783818110610fcd57610fcd615a07565b8061273a81615a33565b915050612713565b61274a613cf7565b60005b81811015610c9057600083838381811061276957612769615a07565b905060e0020160a00160208101906127819190614a53565b9050600084848481811061279757612797615a07565b905060e0020160c00160208101906127af9190614a53565b905060006127c886868681811061175357611753615a07565b9050801561288c576127e683878787818110610daf57610daf615a07565b60005b8a8a868181106127fb576127fb615a07565b905060200281019061280d9190615a6d565b9050811015612886576128748b8b8781811061282b5761282b615a07565b905060200281019061283d9190615a6d565b8381811061284d5761284d615a07565b90506020020160208101906128629190614a53565b8a8a88818110611e2d57611e2d615a07565b8061287e81615a33565b9150506127e9565b506128a2565b6128a282878787818110610dd957610dd9615a07565b50505080806128b090615a33565b91505061274d565b6128c0613cf7565b6128cf8660008a8a8988614148565b6128d98585613fc9565b611ee78282613fc9565b6128eb613cf7565b60005b858110156129f0576129a28d8d8381811061290b5761290b615a07565b9050602002013560008b8b8581811061292657612926615a07565b905060200201358a8a8681811061293f5761293f615a07565b90506020020160208101906129549190614a53565b89898781811061296657612966615a07565b905060200201602081019061297b9190614a53565b88888881811061298d5761298d615a07565b9050602002016020810190610f9d9190614a53565b6129de8585838181106129b7576129b7615a07565b90506020020160208101906129cc9190614a53565b8c8c84818110610ff457610ff4615a07565b806129e881615a33565b9150506128ee565b50505050505050505050505050565b612a07613cf7565b60015b6001600160a01b0381811660009081526003602052604090205416600114612a56576001600160a01b0380821660009081526003602052604090205416612a508161453e565b50612a0a565b50565b612a61613cf7565b612a7088888787878787614087565b611ee7868684613e29565b612a83613cf7565b6000612a9560c0830160a08401614a53565b90506000612aa960e0840160c08501614a53565b90506000612acc88604086013587606088013561134f60a08a0160808b01614a53565b90508015612aee57612ae384602001358685613e29565b611ed8868689613e29565b611ee784358684613e29565b612b02613cf7565b60005b818110156113e5576000838383818110612b2157612b21615a07565b905060e0020160a0016020810190612b399190614a53565b90506000848484818110612b4f57612b4f615a07565b905060e0020160c0016020810190612b679190614a53565b90506000612b808c8c86818110610d1f57610d1f615a07565b90508015612bfb57612b9e83878787818110610daf57610daf615a07565b60005b8a8a86818110612bb357612bb3615a07565b9050602002810190612bc59190615a6d565b9050811015612bf557612be38b8b8781811061282b5761282b615a07565b80612bed81615a33565b915050612ba1565b50612c11565b612c1182878787818110610dd957610dd9615a07565b5050508080612c1f90615a33565b915050612b05565b612c2f613cf7565b60005b858110156129f057612d1e8d8d83818110612c4f57612c4f615a07565b905060200201358c8c84818110612c6857612c68615a07565b905060200201357f0000000000000000000000002d5d20c50320de5c9861350c4f760e26de0c2dc78c8c86818110612ca257612ca2615a07565b905060200201358b8b87818110612cbb57612cbb615a07565b9050602002016020810190612cd09190614a53565b8a8a88818110612ce257612ce2615a07565b9050602002016020810190612cf79190614a53565b898989818110612d0957612d09615a07565b9050602002016020810190610eec9190614a53565b80612d2881615a33565b915050612c32565b612d38613cf7565b610dfe837f0000000000000000000000002d5d20c50320de5c9861350c4f760e26de0c2dc787878686614148565b612d6e613cf7565b612a568161453e565b612d7f613cf7565b6000612d918b88600088888888613efa565b90508015612db257612da38387613fc9565b612dad8989613fc9565b611910565b611910828b613fc9565b612dc4613cf7565b6117f4818484613e29565b612dd7613cf7565b6000612de960c0830160a08401614a53565b90506000612dfd60e0840160c08501614a53565b90506000612e1f6040850135826060870135610c5660a0890160808a01614a53565b90508015612e6d57612e35838560200135613fc9565b60005b87811015612e6757612e5589898381811061139b5761139b615a07565b80612e5f81615a33565b915050612e38565b50611ee7565b611ee7828535613fc9565b612e80613cf7565b612e908787600087878787614087565b610c908286613fc9565b612ea2613cf7565b60005b818110156117f4576000838383818110612ec157612ec1615a07565b9050602002810190612ed39190615b15565b612ee49060a0810190608001614a53565b90506000848484818110612efa57612efa615a07565b9050602002810190612f0c9190615b15565b612f1d9060e081019060c001614a53565b9050612fde858585818110612f3457612f34615a07565b9050602002810190612f469190615b15565b6020013582878787818110612f5d57612f5d615a07565b9050602002810190612f6f9190615b15565b60400135888888818110612f8557612f85615a07565b9050602002810190612f979190615b15565b612fa8906080810190606001614a53565b868a8a8a818110612fbb57612fbb615a07565b9050602002810190612fcd9190615b15565b610f9d9060c081019060a001614a53565b61300d858585818110612ff357612ff3615a07565b90506020028101906130059190615b15565b358284613e29565b60005b85858581811061302257613022615a07565b90506020028101906130349190615b15565b6130429060e0810190615a6d565b90508110156130dd576130cb86868681811061306057613060615a07565b90506020028101906130729190615b15565b61308190610100810190615a6d565b8381811061309157613091615a07565b90506020020135838888888181106130ab576130ab615a07565b90506020028101906130bd9190615b15565b6112769060e0810190615a6d565b806130d581615a33565b915050613010565b50505080806130eb90615a33565b915050612ea5565b6130fb613cf7565b61310a84600088888786614148565b6116428383613fc9565b61311c613cf7565b60005b85811015611910576131768b8b8381811061313c5761313c615a07565b905060200201357f0000000000000000000000002d5d20c50320de5c9861350c4f760e26de0c2dc78b8b8581811061292657612926615a07565b8061318081615a33565b91505061311f565b606060006004546001600160401b038111156131a6576131a6615b2c565b6040519080825280602002602001820160405280156131cf578160200160208202803683370190505b506001600090815260036020527fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c549192506001600160a01b03909116905b6001600160a01b038216600114613273578183828151811061323257613232615a07565b6001600160a01b03928316602091820292909201810191909152928116600090815260039093526040909220549091169061326c81615a33565b905061320e565b509092915050565b613283613cf7565b600061329560a0830160808401614a53565b90506132b688602084013585604086013561161a6080880160608901614a53565b6132c282358483613e29565b60005b868110156113e5576132e286868381811061254857612548615a07565b806132ec81615a33565b9150506132c5565b6132fc613cf7565b60005b81811015610dfe57600083838381811061331b5761331b615a07565b905060200281019061332d9190615b15565b61333e9060a0810190608001614a53565b9050600084848481811061335457613354615a07565b90506020028101906133669190615b15565b6133779060e081019060c001614a53565b905061345187878581811061338e5761338e615a07565b905060200201358686868181106133a7576133a7615a07565b90506020028101906133b99190615b15565b60200135838888888181106133d0576133d0615a07565b90506020028101906133e29190615b15565b604001358989898181106133f8576133f8615a07565b905060200281019061340a9190615b15565b61341b906080810190606001614a53565b878b8b8b81811061342e5761342e615a07565b90506020028101906134409190615b15565b610eec9060c081019060a001614a53565b613466858585818110612ff357612ff3615a07565b60005b85858581811061347b5761347b615a07565b905060200281019061348d9190615b15565b61349b9060e0810190615a6d565b90508110156134cb576134b986868681811061306057613060615a07565b806134c381615a33565b915050613469565b50505080806134d990615a33565b9150506132ff565b600080806134f8600563e570462160e01b86614207565b604080518381523360208201526001600160a01b038816918101919091526060810182905291935091507f78f4cea8c2f10b967cb5bf327794223ed6ca8dc8238135f61294f1a114f8afb590608001611457565b613554613cf7565b60005b818110156117f457600083838381811061357357613573615a07565b90506020028101906135859190615a4c565b6135969060c081019060a001614a53565b905060008484848181106135ac576135ac615a07565b90506020028101906135be9190615a4c565b6135d09061010081019060e001614a53565b905060008585858181106135e6576135e6615a07565b90506020028101906135f89190615a4c565b6136099060e081019060c001614a53565b9050600061369d87878781811061362257613622615a07565b90506020028101906136349190615a4c565b604001358489898981811061364b5761364b615a07565b905060200281019061365d9190615a4c565b606001358a8a8a81811061367357613673615a07565b90506020028101906136859190615a4c565b6136969060a0810190608001614a53565b8887613d5b565b90508015613726576136ba87878781811061119957611199615a07565b60005b8787878181106136cf576136cf615a07565b90506020028101906136e19190615a4c565b6136f090610100810190615a6d565b90508110156137205761370e88888881811061120a5761120a615a07565b8061371881615a33565b9150506136bd565b5061373b565b61373b8787878181106112cd576112cd615a07565b50505050808061374a90615a33565b915050613557565b61375a613cf7565b6137648282613fc9565b5050565b613770613cf7565b60005b81811015610c9057600083838381811061378f5761378f615a07565b905060c0020160800160208101906137a79190614a53565b905060008686848181106137bd576137bd615a07565b90506020020160208101906137d29190614a53565b90506138668989858181106137e9576137e9615a07565b9050602002013586868681811061380257613802615a07565b905060c00201602001358388888881811061381f5761381f615a07565b905060c002016040013589898981811061383b5761383b615a07565b905060c0020160600160208101906138539190614a53565b878b8b8b818110610ed457610ed4615a07565b61388c85858581811061387b5761387b615a07565b905060c00201600001358284613e29565b5050808061389990615a33565b915050613773565b6138a9613cf7565b6138b7858589898786614148565b610c90828585613e29565b6138ca613cf7565b60005b81811015610dfe5760008383838181106138e9576138e9615a07565b90506020028101906138fb9190615a4c565b61390c9060a0810190608001614a53565b9050600084848481811061392257613922615a07565b90506020028101906139349190615a4c565b604001359050600085858581811061394e5761394e615a07565b90506020028101906139609190615a4c565b6139719060e081019060c001614a53565b9050600086868681811061398757613987615a07565b90506020028101906139999190615a4c565b6139ab9061010081019060e001614a53565b90508686868181106139bf576139bf615a07565b90506020028101906139d19190615a4c565b60200135600003613ae5576000613a648888888181106139f3576139f3615a07565b9050602002810190613a059190615a4c565b60600135868a8a8a818110613a1c57613a1c615a07565b9050602002810190613a2e9190615a4c565b358b8b8b818110613a4157613a41615a07565b9050602002810190613a539190615a4c565b610c569060c081019060a001614a53565b90508015613abc57613ab78585858b8b8b818110613a8457613a84615a07565b9050602002810190613a969190615a4c565b613aa590610100810190615a6d565b8d8d8d81811061231c5761231c615a07565b613adf565b613adf8a8a88818110613ad157613ad1615a07565b9050602002013586846145a8565b50613bd1565b6000613b95888888818110613afc57613afc615a07565b9050602002810190613b0e9190615a4c565b60200135898989818110613b2457613b24615a07565b9050602002810190613b369190615a4c565b60600135878b8b8b818110613b4d57613b4d615a07565b9050602002810190613b5f9190615a4c565b358c8c8c818110613b7257613b72615a07565b9050602002810190613b849190615a4c565b610d8a9060c081019060a001614a53565b90508015613bba57613bb58585858b8b8b818110613a8457613a84615a07565b613bcf565b613bcf8a8a88818110613ad157613ad1615a07565b505b505050508080613be090615a33565b9150506138cd565b613bf0613cf7565b60005b81811015610dfe576000838383818110613c0f57613c0f615a07565b905060c002016080016020810190613c279190614a53565b90506000868684818110613c3d57613c3d615a07565b9050602002016020810190613c529190614a53565b9050613ccd858585818110613c6957613c69615a07565b905060c002016020013582878787818110613c8657613c86615a07565b905060c0020160400135888888818110613ca257613ca2615a07565b905060c002016060016020810190613cba9190614a53565b868a8a8a81811061262f5761262f615a07565b613ce285858581811061387b5761387b615a07565b50508080613cef90615a33565b915050613bf3565b336000908152600360205260409020546001600160a01b031615156040518060400160405280601281526020017124b73b30b634b21036b9b39739b2b73232b960711b81525090612a565760405162461bcd60e51b8152600401611a1d9190615ae2565b604051632142170760e11b81526001600160a01b038381166004830152828116602483015260448201869052600091908516906342842e0e90606401600060405180830381600087803b158015613db157600080fd5b505af1925050508015613dc2575060015b613dce57506000613e1f565b60408051868152602081018990526001600160a01b03888116828401529151918616917ff6935d13435d179652aef36125593f81c762921c3ab20abcf15149f22295f9ae9181900360600190a25060015b9695505050505050565b604080516001600160a01b038381166024830152604480830187905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290861691613e859190615b42565b6000604051808303816000865af19150503d8060008114613ec2576040519150601f19603f3d011682016040523d82523d6000602084013e613ec7565b606091505b5091509150818015613ef1575080511580613ef1575080806020019051810190613ef19190615b54565b610dfe57600080fd5b604051637921219560e11b81526000906001600160a01b0385169063f242432a90613f2f90869086908a908e90600401615b76565b600060405180830381600087803b158015613f4957600080fd5b505af1925050508015613f5a575060015b613f6657506000613fbe565b60408051868152602081018a90529081018890526001600160a01b0387811660608301528516907fc1d7f60447c28539e88fcba0e9120b121409ccca4f3cfaaf54fa68ade306d4c79060800160405180910390a25060015b979650505050505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114614016576040519150601f19603f3d011682016040523d82523d6000602084013e61401b565b606091505b50509050806117f45760405162461bcd60e51b815260206004820152603260248201527f4e6966747945786368616e67654578656375746f723a2056616c7565207472616044820152711b9cd9995c881d5b9cdd58d8d95cdcd99d5b60721b6064820152608401611a1d565b604051637921219560e11b81526001600160a01b0384169063f242432a906140b9908590859089908d90600401615b76565b600060405180830381600087803b1580156140d357600080fd5b505af11580156140e7573d6000803e3d6000fd5b505060408051878152602081018b90529081018990526001600160a01b038881166060830152861692507fc1d7f60447c28539e88fcba0e9120b121409ccca4f3cfaaf54fa68ade306d4c7915060800160405180910390a250505050505050565b604051632142170760e11b81526001600160a01b0383811660048301528281166024830152604482018690528416906342842e0e90606401600060405180830381600087803b15801561419a57600080fd5b505af11580156141ae573d6000803e3d6000fd5b505060408051878152602081018a90526001600160a01b0389811682840152915191871693507ff6935d13435d179652aef36125593f81c762921c3ab20abcf15149f22295f9ae925081900360600190a2505050505050565b6000806001600160a01b03831661424f5760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b6044820152606401611a1d565b60008061425a6145d1565b604080516020808201949094526001600160e01b031999909916898201526bffffffffffffffffffffffff19606089901b1660448a01528051808a03603801815260588a018083528151918501919091206078909a0182526001600160a01b03988916815260008a81529a909352909820905181546001600160a01b03191696169590951790945550929492505050565b60408051858152602081018590529081018390526001600160a01b0382811660608301528616907fc1d7f60447c28539e88fcba0e9120b121409ccca4f3cfaaf54fa68ade306d4c79060800160405180910390a25050505050565b600081815260208390526040812080546001600160a01b031661439c5760405162461bcd60e51b815260206004820152600e60248201526d1b9bc81cdd58da081b1bd8dad25960921b6044820152606401611a1d565b546001600160a01b03169392505050565b6001600160a01b0380821660009081526003602052604090205416156143d257600080fd5b60036020527fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c80546001600160a01b038381166000818152604081208054939094166001600160a01b03199384161790935560018352835490911617909155600480549161443f83615a33565b919050555050565b60408051848152602081018490526001600160a01b03838116828401529151918616917ff6935d13435d179652aef36125593f81c762921c3ab20abcf15149f22295f9ae9181900360600190a250505050565b6001600160a01b0387161586156144cb5780156144c0576144bb8688613fc9565b6144cb565b6144cb878988613e29565b8380156113e55760005b818110156116865782156144fd576144f8878783818110610fcd57610fcd615a07565b61452c565b61452c85858381811061451257614512615a07565b905060200201358b89898581811061128657611286615a07565b8061453681615a33565b9150506144d5565b60006145498261463c565b6001600160a01b03838116600081815260036020526040808220805486861684529183208054929095166001600160a01b0319928316179094559181528254909116909155600480549293509061459f83615bae565b91905055505050565b82156117f4576001600160a01b0382166145c6576117f48184613fc9565b6117f4838383613e29565b60008060008081546145e290615a33565b918290555090506145f4600143615bc5565b60408051914060208301526bffffffffffffffffffffffff193060601b1690820152605481018290526074016040516020818303038152906040528051906020012091509091565b600060015b6001600160a01b03818116600090815260036020526040902054166001146146ad576001600160a01b0381811660009081526003602052604090205481851691160361468d5792915050565b6001600160a01b0390811660009081526003602052604090205416614641565b50600092915050565b80356001600160a01b03811681146146cd57600080fd5b919050565b600060e082840312156146e457600080fd5b50919050565b600080600080610140858703121561470157600080fd5b61470a856146b6565b93506020850135925061471f604086016146b6565b915061472e86606087016146d2565b905092959194509250565b60008083601f84011261474b57600080fd5b5081356001600160401b0381111561476257600080fd5b6020830191508360208260051b850101111561477d57600080fd5b9250929050565b60008083601f84011261479657600080fd5b5081356001600160401b038111156147ad57600080fd5b60208301915083602060e08302850101111561477d57600080fd5b600080600080604085870312156147de57600080fd5b84356001600160401b03808211156147f557600080fd5b61480188838901614739565b9096509450602087013591508082111561481a57600080fd5b5061482787828801614784565b95989497509550505050565b60008083601f84011261484557600080fd5b5081356001600160401b0381111561485c57600080fd5b60208301915083602060c08302850101111561477d57600080fd5b6000806000806040858703121561488d57600080fd5b84356001600160401b03808211156148a457600080fd5b6148b088838901614739565b909650945060208701359150808211156148c957600080fd5b5061482787828801614833565b600060c082840312156146e457600080fd5b6000806000806000610100868803121561490157600080fd5b85356001600160401b038082111561491857600080fd5b61492489838a01614739565b9097509550602088013591508082111561493d57600080fd5b5061494a88828901614739565b909450925061495e905087604088016148d6565b90509295509295909350565b6000806000806040858703121561498057600080fd5b84356001600160401b038082111561499757600080fd5b6149a388838901614739565b909650945060208701359150808211156149bc57600080fd5b5061482787828801614739565b60008060008060008061014087890312156149e357600080fd5b8635955060208701356001600160401b0380821115614a0157600080fd5b614a0d8a838b01614739565b90975095506040890135915080821115614a2657600080fd5b50614a3389828a01614739565b9094509250614a47905088606089016146d2565b90509295509295509295565b600060208284031215614a6557600080fd5b614a6e826146b6565b9392505050565b60008060008060006101408688031215614a8e57600080fd5b85359450614a9e602087016146b6565b935060408601359250614ab3606087016146b6565b915061495e87608088016148d6565b60008060008060008060008060006101208a8c031215614ae157600080fd5b8935985060208a0135975060408a0135965060608a01359550614b0660808b016146b6565b945060a08a01359350614b1b60c08b016146b6565b9250614b2960e08b016146b6565b9150614b386101008b016146b6565b90509295985092959850929598565b600080600080600080600080610100898b031215614b6457600080fd5b8835975060208901359650604089013595506060890135945060808901359350614b9060a08a016146b6565b9250614b9e60c08a016146b6565b9150614bac60e08a016146b6565b90509295985092959890939650565b60008060208385031215614bce57600080fd5b82356001600160401b03811115614be457600080fd5b614bf085828601614784565b90969095509350505050565b6000806000806101208587031215614c1357600080fd5b614c1c856146b6565b935060208501359250614c31604086016146b6565b915061472e86606087016148d6565b60008060008060008060008060008060a08b8d031215614c5f57600080fd5b8a356001600160401b0380821115614c7657600080fd5b614c828e838f01614739565b909c509a5060208d0135915080821115614c9b57600080fd5b614ca78e838f01614739565b909a50985060408d0135915080821115614cc057600080fd5b614ccc8e838f01614739565b909850965060608d0135915080821115614ce557600080fd5b614cf18e838f01614739565b909650945060808d0135915080821115614d0a57600080fd5b50614d178d828e01614739565b915080935050809150509295989b9194979a5092959850565b600080600060608486031215614d4557600080fd5b614d4e846146b6565b9250614d5c602085016146b6565b9150604084013590509250925092565b60008060008060008060008060006101208a8c031215614d8b57600080fd5b89359850614d9b60208b016146b6565b975060408a0135965060608a0135955060808a0135945060a08a01359350614b1b60c08b016146b6565b600060208284031215614dd757600080fd5b5035919050565b600080600080600080600080610100898b031215614dfb57600080fd5b883597506020890135965060408901359550614e1960608a016146b6565b945060808901359350614b9060a08a016146b6565b6000806000806000806101408789031215614e4857600080fd5b86356001600160401b0380821115614e5f57600080fd5b614e6b8a838b01614739565b90985096506020890135915080821115614e8457600080fd5b50614e9189828a01614739565b9095509350614ea49050604088016146b6565b9150614a4788606089016146d2565b600080600080600060a08688031215614ecb57600080fd5b614ed4866146b6565b945060208601359350604086013592506060860135915061495e608087016146b6565b6000806000806000806000806080898b031215614f1357600080fd5b88356001600160401b0380821115614f2a57600080fd5b614f368c838d01614739565b909a50985060208b0135915080821115614f4f57600080fd5b614f5b8c838d01614739565b909850965060408b0135915080821115614f7457600080fd5b614f808c838d01614739565b909650945060608b0135915080821115614f9957600080fd5b50614fa68b828c01614833565b999c989b5096995094979396929594505050565b60008060008060008060c08789031215614fd357600080fd5b863595506020870135945060408701359350614ff1606088016146b6565b9250614fff608088016146b6565b9150614a4760a088016146b6565b600080600080600080600060e0888a03121561502857600080fd5b8735965060208801359550604088013594506060880135935061504d608089016146b6565b925061505b60a089016146b6565b915061506960c089016146b6565b905092959891949750929550565b6000806000806000806000806080898b03121561509357600080fd5b88356001600160401b03808211156150aa57600080fd5b6150b68c838d01614739565b909a50985060208b01359150808211156150cf57600080fd5b6150db8c838d01614739565b909850965060408b01359150808211156150f457600080fd5b6151008c838d01614739565b909650945060608b013591508082111561511957600080fd5b50614fa68b828c01614739565b6000806000806000806000610160888a03121561514257600080fd5b8735965060208801356001600160401b038082111561516057600080fd5b61516c8b838c01614739565b909850965060408a013591508082111561518557600080fd5b506151928a828b01614739565b90955093506151a59050606089016146b6565b91506150698960808a016146d2565b600080602083850312156151c757600080fd5b82356001600160401b038111156151dd57600080fd5b614bf085828601614739565b600080600080608085870312156151ff57600080fd5b8435935061520f602086016146b6565b92506040850135915061472e606086016146b6565b6000806000806000806060878903121561523d57600080fd5b86356001600160401b038082111561525457600080fd5b6152608a838b01614739565b9098509650602089013591508082111561527957600080fd5b6152858a838b01614739565b9096509450604089013591508082111561529e57600080fd5b506152ab89828a01614784565b979a9699509497509295939492505050565b60008060008060008061012087890312156152d757600080fd5b86356001600160401b03808211156152ee57600080fd5b6152fa8a838b01614739565b9098509650602089013591508082111561531357600080fd5b5061532089828a01614739565b90955093506153339050604088016146b6565b9150614a4788606089016148d6565b6000806000806000806060878903121561535b57600080fd5b86356001600160401b038082111561537257600080fd5b61537e8a838b01614739565b9098509650602089013591508082111561539757600080fd5b6153a38a838b01614739565b909650945060408901359150808211156153bc57600080fd5b506152ab89828a01614833565b60008060008060008061012087890312156153e357600080fd5b8635955060208701356001600160401b038082111561540157600080fd5b61540d8a838b01614739565b9097509550604089013591508082111561542657600080fd5b5061543389828a01614739565b9094509250614a47905088606089016148d6565b600080600080600080600080610100898b03121561546457600080fd5b8835975061547460208a016146b6565b96506040890135955061548960608a016146b6565b94506080890135935061549e60a08a016146b6565b92506154ac60c08a016146b6565b915060e089013590509295985092959890939650565b60008060008060008060008060008060008060c08d8f0312156154e457600080fd5b6001600160401b038d3511156154f957600080fd5b6155068e8e358f01614739565b909c509a506001600160401b0360208e0135111561552357600080fd5b6155338e60208f01358f01614739565b909a5098506001600160401b0360408e0135111561555057600080fd5b6155608e60408f01358f01614739565b90985096506001600160401b0360608e0135111561557d57600080fd5b61558d8e60608f01358f01614739565b90965094506001600160401b0360808e013511156155aa57600080fd5b6155ba8e60808f01358f01614739565b90945092506001600160401b0360a08e013511156155d757600080fd5b6155e78e60a08f01358f01614739565b81935080925050509295989b509295989b509295989b565b6000806000806000610160868803121561561857600080fd5b85359450615628602087016146b6565b93506040860135925061563d606087016146b6565b915061495e87608088016146d2565b6000806000806000806000806080898b03121561566857600080fd5b88356001600160401b038082111561567f57600080fd5b61568b8c838d01614739565b909a50985060208b01359150808211156156a457600080fd5b6156b08c838d01614739565b909850965060408b01359150808211156156c957600080fd5b6156d58c838d01614739565b909650945060608b01359150808211156156ee57600080fd5b50614fa68b828c01614784565b600080600080600060a0868803121561571357600080fd5b85359450615723602087016146b6565b935060408601359250615738606087016146b6565b915061495e608087016146b6565b6000806000806000806000806000806101408b8d03121561576657600080fd5b8a35995060208b0135985061577d60408c016146b6565b975060608b0135965060808b0135955060a08b0135945060c08b013593506157a760e08c016146b6565b92506157b66101008c016146b6565b91506157c56101208c016146b6565b90509295989b9194979a5092959850565b600080600080600061012086880312156157ef57600080fd5b85356001600160401b038082111561580657600080fd5b61581289838a01614739565b9097509550602088013591508082111561582b57600080fd5b5061583888828901614739565b909450925061495e905087604088016146d2565b60008060008060008060c0878903121561586557600080fd5b86359550615875602088016146b6565b94506040870135935061588a606088016146b6565b925060808701359150614a4760a088016146b6565b6020808252825182820181905260009190848201906040850190845b818110156158e05783516001600160a01b0316835292840192918401916001016158bb565b50909695505050505050565b6000806000806000806000610140888a03121561590857600080fd5b8735965060208801356001600160401b038082111561592657600080fd5b6159328b838c01614739565b909850965060408a013591508082111561594b57600080fd5b506159588a828b01614739565b909550935061596b9050606089016146b6565b91506150698960808a016148d6565b6000806040838503121561598d57600080fd5b615996836146b6565b946020939093013593505050565b600080600080600080600060e0888a0312156159bf57600080fd5b873596506159cf602089016146b6565b9550604088013594506159e4606089016146b6565b93506159f2608089016146b6565b925060a0880135915061506960c089016146b6565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201615a4557615a45615a1d565b5060010190565b6000823561013e19833603018112615a6357600080fd5b9190910192915050565b6000808335601e19843603018112615a8457600080fd5b8301803591506001600160401b03821115615a9e57600080fd5b6020019150600581901b360382131561477d57600080fd5b60005b83811015615ad1578181015183820152602001615ab9565b8381111561236c5750506000910152565b6020815260008251806020840152615b01816040850160208701615ab6565b601f01601f19169190910160400192915050565b6000823561011e19833603018112615a6357600080fd5b634e487b7160e01b600052604160045260246000fd5b60008251615a63818460208701615ab6565b600060208284031215615b6657600080fd5b81518015158114614a6e57600080fd5b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b600081615bbd57615bbd615a1d565b506000190190565b600082821015615bd757615bd7615a1d565b50039056fea26469706673582212202582ff801306017998602c5bef74a95c4c34ab09dd9cfbba4a20f12a0894e02e64736f6c634300080d0033

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

0000000000000000000000002d5d20c50320de5c9861350c4f760e26de0c2dc70000000000000000000000008fe2f09f3684284e15822285d444c13d2cb992100000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000100000000000000000000000015f8733104b67f17158c417d32172eea56c3b61d

-----Decoded View---------------
Arg [0] : priceCurrencyUSD_ (address): 0x2d5D20c50320de5c9861350c4F760E26dE0c2dC7
Arg [1] : recoveryAdmin_ (address): 0x8FE2F09f3684284e15822285d444c13d2CB99210
Arg [2] : validSenders_ (address[]): 0x15F8733104b67F17158c417d32172Eea56C3b61D

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000002d5d20c50320de5c9861350c4f760e26de0c2dc7
Arg [1] : 0000000000000000000000008fe2f09f3684284e15822285d444c13d2cb99210
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [4] : 00000000000000000000000015f8733104b67f17158c417d32172eea56c3b61d


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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