false
false
0

Contract Address Details

0x73253Ed6A303c3dcAbcc8bA60bBC44696b904163

Contract Name
ZoneIsolation
Creator
0x331cdb–09a67c at 0xf638c7–3e0c51
Balance
0 BPX
Tokens
Fetching tokens...
Transactions
0 Transactions
Transfers
0 Transfers
Gas Used
Fetching gas used...
Last Balance Update
540148
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
ZoneIsolation




Optimization enabled
false
Compiler version
v0.8.28+commit.7893614a




EVM Version
shanghai




Verified at
2025-01-25T12:32:41.437896Z

Contract source code

Sol2uml
new
// File: bitpost-contracts/contracts-common/interfaces/upgrade/IInitializable.sol



pragma solidity ^0.8.20;

interface IInitializable {
    error InitializableAlreadyInitialized();
    error InitializableRequiredVersion(uint256 currentVersion, uint256 requiredVersion);
    error InitializableMinimalVersion(uint256 currentVersion, uint256 minimalVersion);
    
    function getVersion() external view returns(uint256);
}

// File: bitpost-contracts/contracts-common/contracts/upgrade/Initializable.sol



pragma solidity ^0.8.20;


abstract contract Initializable is IInitializable {
    /// @custom:storage-location erc7201:bitpost.common.Initializable
    struct Storage_Initializable {
        uint256 version;
    }
    
    // keccak256(abi.encode(uint256(keccak256("bitpost.common.Initializable")) - 1)) & ~bytes32(uint256(0xff))
    bytes32 private constant STORAGE_LOCATION_INITIALIZABLE = 0xf9388d16ccb89f8ceeb8bce5074db391472ebb34229a1051e19fc642d992d400;
       
    modifier initVer(uint256 version) {
        Storage_Initializable storage $ = _getStorage_Initializable();
        require($.version == 0, InitializableAlreadyInitialized());
        _;
        $.version = version;
    }
    
    modifier upVer(uint256 version) {
        Storage_Initializable storage $ = _getStorage_Initializable();
        require($.version == version - 1, InitializableRequiredVersion($.version, version - 1));
        _;
        $.version = version;
    }
    
    modifier minVer(uint256 version) {
        _checkMinVer(version);
        _;
    }
    
    function getVersion() public view returns(uint256) {
        Storage_Initializable storage $ = _getStorage_Initializable();
        return $.version;
    }
    
    function _checkMinVer(uint256 version) private view {
        Storage_Initializable storage $ = _getStorage_Initializable();
        require($.version >= version, InitializableMinimalVersion($.version, version));
    }
    
    function _getStorage_Initializable() private pure returns(Storage_Initializable storage $) {
        assembly {
            $.slot := STORAGE_LOCATION_INITIALIZABLE
        }
    }
}

// File: bitpost-contracts/contracts-common/interfaces/access/IPermissions.sol



pragma solidity ^0.8.20;

interface IPermissions {
    error PermissionsUnauthorized(address user, uint16 permissions, uint16 required);
    error PermissionsInvalidUser(address user);
    error PermissionsNotChanged(address user, uint16 permissions);
    error PermissionsLockoutPrevented(address owner);
    
    function getUsers(uint8 limit, uint256 offset) external view returns(address[] memory);
    function getPermissions(address user) external view returns(uint16);
    function setPermissions(address user, uint16 permissions) external;
}

// File: bitpost-contracts/contracts-common/contracts/access/Permissions.sol



pragma solidity >=0.8.0;


abstract contract Permissions is IPermissions {
    /// @custom:storage-location erc7201:bitpost.common.Permissions
    struct Storage_Permissions {
        mapping(address => uint16) permissions;
        address[] users;
        mapping(address => uint256) userIndex;
        uint256 ownerCount;
    }
    
    // keccak256(abi.encode(uint256(keccak256("bitpost.common.Permissions")) - 1)) & ~bytes32(uint256(0xff))
    bytes32 private constant STORAGE_LOCATION_PERMISSIONS = 0x68fe19185e240d9214875be5b2b0c87a4a5a1d49f09c1a0b6456c42cbedb1e00;
    
    uint16 internal constant PERM_NONE = 0x0000;
    uint16 internal constant PERM_OWNER = 0x8000;
    uint8 internal constant SP_FLAG_INIT = 0x01;
    
    modifier perm(uint16 permissions) {
        _checkPermissions(permissions);
        _;
    }
    
    function _init_Permissions(address owner, uint16 ownerPermissions) internal {
        _setPermissions(owner, PERM_OWNER | ownerPermissions, SP_FLAG_INIT);
    }
    
    function getUsers(uint8 limit, uint256 offset) public view returns(address[] memory) {
        Storage_Permissions storage $ = _getStorage_Permissions();
        
        uint256 totalCount = $.users.length;
        if(offset >= totalCount) {
            return new address[](0);
        }
        
        uint256 end = offset + limit;
        if(end > totalCount) {
            end = totalCount;
        }
        uint256 resultCount = end - offset;

        address[] memory result = new address[](resultCount);
        for(uint256 i = 0; i < resultCount; i++) {
            result[i] = $.users[offset + i];
        }
        return result;
    }
    
    function getPermissions(address user) public view returns(uint16) {
        require(user != address(0), PermissionsInvalidUser(address(0)));
        
        Storage_Permissions storage $ = _getStorage_Permissions();
        return $.permissions[user];
    }
    
    function setPermissions(address user, uint16 permissions) external perm(PERM_OWNER) {
        _setPermissions(user, permissions, 0);
    }
    
    function _setPermissions(address user, uint16 permissions, uint8 flags) internal virtual {
        uint16 oldPermissions = getPermissions(user);
        require(oldPermissions != permissions, PermissionsNotChanged(user, oldPermissions));
        
        Storage_Permissions storage $ = _getStorage_Permissions();
        
        if((oldPermissions & PERM_OWNER != 0) && (permissions & PERM_OWNER == 0)) {
            require($.ownerCount > 1, PermissionsLockoutPrevented(user));
            $.ownerCount--;
        } else if((oldPermissions & PERM_OWNER == 0) && (permissions & PERM_OWNER != 0)) {
            $.ownerCount++;
        }
        
        if(oldPermissions == PERM_NONE) {
            _addUser(user, flags);
        }
        else if(permissions == PERM_NONE) {
            _removeUser(user, flags);
        }
        
        $.permissions[user] = permissions;
    }
    
    function _addUser(address user, uint8) internal virtual {
        Storage_Permissions storage $ = _getStorage_Permissions();
        
        $.userIndex[user] = $.users.length;
        $.users.push(user);
    }
    
    function _removeUser(address user, uint8) internal virtual {
        Storage_Permissions storage $ = _getStorage_Permissions();
        
        address lastUser = $.users[$.users.length - 1];
        if(user != lastUser) {
            uint256 midIndex = $.userIndex[user];
            $.users[midIndex] = lastUser;
            $.userIndex[lastUser] = midIndex;
        }
            
        $.users.pop();
        delete $.userIndex[user];
    }
    
    function _checkPermissions(uint16 permissions) private view {
        Storage_Permissions storage $ = _getStorage_Permissions();
        require(
            $.permissions[msg.sender] & permissions == permissions,
            PermissionsUnauthorized(msg.sender, $.permissions[msg.sender], permissions)
        );
    }
    
    function _getStorage_Permissions() private pure returns(Storage_Permissions storage $) {
        assembly {
            $.slot := STORAGE_LOCATION_PERMISSIONS
        }
    }
}

// File: bitpost-contracts/contracts-zi/interfaces/IZoneIsolation.sol



pragma solidity ^0.8.20;



interface IZoneIsolation is IInitializable, IPermissions {
    enum Zone {
        CLEAN,
        PRIVATE,
        PUBLIC
    }
    
    error ZoneIsolationInvalidZone(Zone zone);
    error ZoneIsolationViolation(address user, Zone userZone, Zone requiredZone);

    function init() external;
    function getUserZone(address user) external view returns(Zone);
    function checkUserZone(address user, Zone zone) external;
    function assignUserZone(address user, Zone zone) external;
}

// File: bitpost-contracts/contracts-zi/contracts/ZoneIsolation.sol



pragma solidity ^0.8.20;




contract ZoneIsolation is Initializable, Permissions, IZoneIsolation {
    /// @custom:storage-location erc7201:bitpost.zi.ZoneIsolation
    struct Storage_ZoneIsolation {
        mapping(address => Zone) userZone;
    }

    // keccak256(abi.encode(uint256(keccak256("bitpost.zi.ZoneIsolation")) - 1)) & ~bytes32(uint256(0xff))
    bytes32 private constant STORAGE_LOCATION_ZONEISOLATION = 0x7c05d43dfa50a40ae7e3814ce9638445dbcd9d9ad2e164fbc4f4c052f0160d00;
    uint16 internal constant PERM_ASSIGN_ZONE = 0x0001;

    function init() external initVer(1) {
        _init_Permissions(msg.sender, PERM_NONE);
    }

    function getUserZone(address user) external view returns(Zone) {
        Storage_ZoneIsolation storage $ = _getStorage_ZoneIsolation();
        return $.userZone[user];
    }
    
    function checkUserZone(address user, Zone zone) external {
        _checkAssignUserZone(user, zone, false);
    }

    function assignUserZone(address user, Zone zone) external perm(PERM_ASSIGN_ZONE) {
        _checkAssignUserZone(user, zone, true);
    }
    
    function _checkAssignUserZone(address user, Zone zone, bool assign) private {
        require(zone != Zone.CLEAN, ZoneIsolationInvalidZone(Zone.CLEAN));
        
        Storage_ZoneIsolation storage $ = _getStorage_ZoneIsolation();
        
        Zone currentZone = $.userZone[user];
        if(currentZone == Zone.CLEAN) {
            if(assign) {
                $.userZone[user] = zone;
            }
        } else {
            require(currentZone == zone, ZoneIsolationViolation(user, currentZone, zone));
        }
    }

    function _getStorage_ZoneIsolation() private pure returns(Storage_ZoneIsolation storage $) {
        assembly {
            $.slot := STORAGE_LOCATION_ZONEISOLATION
        }
    }
}
        

Contract ABI

[{"type":"error","name":"InitializableAlreadyInitialized","inputs":[]},{"type":"error","name":"InitializableMinimalVersion","inputs":[{"type":"uint256","name":"currentVersion","internalType":"uint256"},{"type":"uint256","name":"minimalVersion","internalType":"uint256"}]},{"type":"error","name":"InitializableRequiredVersion","inputs":[{"type":"uint256","name":"currentVersion","internalType":"uint256"},{"type":"uint256","name":"requiredVersion","internalType":"uint256"}]},{"type":"error","name":"PermissionsInvalidUser","inputs":[{"type":"address","name":"user","internalType":"address"}]},{"type":"error","name":"PermissionsLockoutPrevented","inputs":[{"type":"address","name":"owner","internalType":"address"}]},{"type":"error","name":"PermissionsNotChanged","inputs":[{"type":"address","name":"user","internalType":"address"},{"type":"uint16","name":"permissions","internalType":"uint16"}]},{"type":"error","name":"PermissionsUnauthorized","inputs":[{"type":"address","name":"user","internalType":"address"},{"type":"uint16","name":"permissions","internalType":"uint16"},{"type":"uint16","name":"required","internalType":"uint16"}]},{"type":"error","name":"ZoneIsolationInvalidZone","inputs":[{"type":"uint8","name":"zone","internalType":"enum IZoneIsolation.Zone"}]},{"type":"error","name":"ZoneIsolationViolation","inputs":[{"type":"address","name":"user","internalType":"address"},{"type":"uint8","name":"userZone","internalType":"enum IZoneIsolation.Zone"},{"type":"uint8","name":"requiredZone","internalType":"enum IZoneIsolation.Zone"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"assignUserZone","inputs":[{"type":"address","name":"user","internalType":"address"},{"type":"uint8","name":"zone","internalType":"enum IZoneIsolation.Zone"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"checkUserZone","inputs":[{"type":"address","name":"user","internalType":"address"},{"type":"uint8","name":"zone","internalType":"enum IZoneIsolation.Zone"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint16","name":"","internalType":"uint16"}],"name":"getPermissions","inputs":[{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"enum IZoneIsolation.Zone"}],"name":"getUserZone","inputs":[{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address[]","name":"","internalType":"address[]"}],"name":"getUsers","inputs":[{"type":"uint8","name":"limit","internalType":"uint8"},{"type":"uint256","name":"offset","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getVersion","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"init","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setPermissions","inputs":[{"type":"address","name":"user","internalType":"address"},{"type":"uint16","name":"permissions","internalType":"uint16"}]}]
              

Contract Creation Code

Verify & Publish
0x6080604052348015600e575f5ffd5b5061134e8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610086575f3560e01c8063bd18180211610059578063bd18180214610124578063e1c7392a14610140578063e5e23d1a1461014a578063f72789941461016657610086565b80630d8e6e2c1461008a5780630f27e4ae146100a8578063160a7925146100d85780639fe751ab14610108575b5f5ffd5b610092610196565b60405161009f9190610d36565b60405180910390f35b6100c260048036038101906100bd9190610dad565b6101ac565b6040516100cf9190610e4b565b60405180910390f35b6100f260048036038101906100ed9190610dad565b61020b565b6040516100ff9190610e80565b60405180910390f35b610122600480360381019061011d9190610ebc565b6102de565b005b61013e60048036038101906101399190610f24565b6102ed565b005b610148610309565b005b610164600480360381019061015f9190610ebc565b610368565b005b610180600480360381019061017b9190610fc2565b610384565b60405161018d91906110b7565b60405180910390f35b5f5f6101a061052e565b9050805f015491505090565b5f5f6101b6610555565b9050805f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16915050919050565b5f5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155f9061027e576040517f387c909300000000000000000000000000000000000000000000000000000000815260040161027591906110e6565b60405180910390fd5b505f61028861057c565b9050805f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900461ffff16915050919050565b6102e982825f6105a3565b5050565b6180006102f98161077d565b61030483835f61087a565b505050565b60015f61031461052e565b90505f815f015414610352576040517f0fe5ade500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61035c335f610a48565b81815f01819055505050565b60016103738161077d565b61037f838360016105a3565b505050565b60605f61038f61057c565b90505f816001018054905090508084106103f5575f67ffffffffffffffff8111156103bd576103bc6110ff565b5b6040519080825280602002602001820160405280156103eb5781602001602082028036833780820191505090505b5092505050610528565b5f8560ff16856104059190611159565b905081811115610413578190505b5f8582610420919061118c565b90505f8167ffffffffffffffff81111561043d5761043c6110ff565b5b60405190808252806020026020018201604052801561046b5781602001602082028036833780820191505090505b5090505f5f90505b8281101561051e5785600101818961048b9190611159565b8154811061049c5761049b6111bf565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168282815181106104d7576104d66111bf565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080600101915050610473565b5080955050505050505b92915050565b5f7ff9388d16ccb89f8ceeb8bce5074db391472ebb34229a1051e19fc642d992d400905090565b5f7f7c05d43dfa50a40ae7e3814ce9638445dbcd9d9ad2e164fbc4f4c052f0160d00905090565b5f7f68fe19185e240d9214875be5b2b0c87a4a5a1d49f09c1a0b6456c42cbedb1e00905090565b5f60028111156105b6576105b5610dd8565b5b8260028111156105c9576105c8610dd8565b5b14155f9061060d576040517f1322334a0000000000000000000000000000000000000000000000000000000081526004016106049190610e4b565b60405180910390fd5b505f610617610555565b90505f815f015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1690505f600281111561067a57610679610dd8565b5b81600281111561068d5761068c610dd8565b5b036107035782156106fe5783825f015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908360028111156106f8576106f7610dd8565b5b02179055505b610776565b83600281111561071657610715610dd8565b5b81600281111561072957610728610dd8565b5b14858286909192610772576040517f55e8586a000000000000000000000000000000000000000000000000000000008152600401610769939291906111ec565b60405180910390fd5b5050505b5050505050565b5f61078661057c565b90508161ffff1682825f015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900461ffff161661ffff161433825f015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900461ffff1684909192610873576040517f65c9b12700000000000000000000000000000000000000000000000000000000815260040161086a93929190611221565b60405180910390fd5b5050505050565b5f6108848461020b565b90508261ffff168161ffff161415848290916108d7576040517f7db81d9b0000000000000000000000000000000000000000000000000000000081526004016108ce929190611256565b60405180910390fd5b50505f6108e261057c565b90505f618000831661ffff161415801561090357505f618000851661ffff16145b156109715760018160030154118590610952576040517f226d4ad300000000000000000000000000000000000000000000000000000000815260040161094991906110e6565b60405180910390fd5b50806003015f8154809291906109679061127d565b91905055506109b0565b5f618000831661ffff1614801561099057505f618000851661ffff1614155b156109af57806003015f8154809291906109a9906112a4565b91905055505b5b5f61ffff168261ffff16036109ce576109c98584610a5c565b6109e9565b5f61ffff168461ffff16036109e8576109e78584610b19565b5b5b83815f015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548161ffff021916908361ffff1602179055505050505050565b610a58828261800017600161087a565b5050565b5f610a6561057c565b90508060010180549050816002015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508060010183908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b5f610b2261057c565b90505f8160010160018360010180549050610b3d919061118c565b81548110610b4e57610b4d6111bf565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614610c90575f826002015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081836001018281548110610c0557610c046111bf565b5b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080836002015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b81600101805480610ca457610ca36112eb565b5b600190038181905f5260205f20015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055816002015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f905550505050565b5f819050919050565b610d3081610d1e565b82525050565b5f602082019050610d495f830184610d27565b92915050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610d7c82610d53565b9050919050565b610d8c81610d72565b8114610d96575f5ffd5b50565b5f81359050610da781610d83565b92915050565b5f60208284031215610dc257610dc1610d4f565b5b5f610dcf84828501610d99565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60038110610e1657610e15610dd8565b5b50565b5f819050610e2682610e05565b919050565b5f610e3582610e19565b9050919050565b610e4581610e2b565b82525050565b5f602082019050610e5e5f830184610e3c565b92915050565b5f61ffff82169050919050565b610e7a81610e64565b82525050565b5f602082019050610e935f830184610e71565b92915050565b60038110610ea5575f5ffd5b50565b5f81359050610eb681610e99565b92915050565b5f5f60408385031215610ed257610ed1610d4f565b5b5f610edf85828601610d99565b9250506020610ef085828601610ea8565b9150509250929050565b610f0381610e64565b8114610f0d575f5ffd5b50565b5f81359050610f1e81610efa565b92915050565b5f5f60408385031215610f3a57610f39610d4f565b5b5f610f4785828601610d99565b9250506020610f5885828601610f10565b9150509250929050565b5f60ff82169050919050565b610f7781610f62565b8114610f81575f5ffd5b50565b5f81359050610f9281610f6e565b92915050565b610fa181610d1e565b8114610fab575f5ffd5b50565b5f81359050610fbc81610f98565b92915050565b5f5f60408385031215610fd857610fd7610d4f565b5b5f610fe585828601610f84565b9250506020610ff685828601610fae565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61103281610d72565b82525050565b5f6110438383611029565b60208301905092915050565b5f602082019050919050565b5f61106582611000565b61106f818561100a565b935061107a8361101a565b805f5b838110156110aa5781516110918882611038565b975061109c8361104f565b92505060018101905061107d565b5085935050505092915050565b5f6020820190508181035f8301526110cf818461105b565b905092915050565b6110e081610d72565b82525050565b5f6020820190506110f95f8301846110d7565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61116382610d1e565b915061116e83610d1e565b92508282019050808211156111865761118561112c565b5b92915050565b5f61119682610d1e565b91506111a183610d1e565b92508282039050818111156111b9576111b861112c565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6060820190506111ff5f8301866110d7565b61120c6020830185610e3c565b6112196040830184610e3c565b949350505050565b5f6060820190506112345f8301866110d7565b6112416020830185610e71565b61124e6040830184610e71565b949350505050565b5f6040820190506112695f8301856110d7565b6112766020830184610e71565b9392505050565b5f61128782610d1e565b91505f82036112995761129861112c565b5b600182039050919050565b5f6112ae82610d1e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036112e0576112df61112c565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea264697066735822122035696d822ee05206fe00a3a4385c2de5ec51d12ac6ad1900d13913c02cafd10064736f6c634300081c0033

Deployed ByteCode

0x608060405234801561000f575f5ffd5b5060043610610086575f3560e01c8063bd18180211610059578063bd18180214610124578063e1c7392a14610140578063e5e23d1a1461014a578063f72789941461016657610086565b80630d8e6e2c1461008a5780630f27e4ae146100a8578063160a7925146100d85780639fe751ab14610108575b5f5ffd5b610092610196565b60405161009f9190610d36565b60405180910390f35b6100c260048036038101906100bd9190610dad565b6101ac565b6040516100cf9190610e4b565b60405180910390f35b6100f260048036038101906100ed9190610dad565b61020b565b6040516100ff9190610e80565b60405180910390f35b610122600480360381019061011d9190610ebc565b6102de565b005b61013e60048036038101906101399190610f24565b6102ed565b005b610148610309565b005b610164600480360381019061015f9190610ebc565b610368565b005b610180600480360381019061017b9190610fc2565b610384565b60405161018d91906110b7565b60405180910390f35b5f5f6101a061052e565b9050805f015491505090565b5f5f6101b6610555565b9050805f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16915050919050565b5f5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155f9061027e576040517f387c909300000000000000000000000000000000000000000000000000000000815260040161027591906110e6565b60405180910390fd5b505f61028861057c565b9050805f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900461ffff16915050919050565b6102e982825f6105a3565b5050565b6180006102f98161077d565b61030483835f61087a565b505050565b60015f61031461052e565b90505f815f015414610352576040517f0fe5ade500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61035c335f610a48565b81815f01819055505050565b60016103738161077d565b61037f838360016105a3565b505050565b60605f61038f61057c565b90505f816001018054905090508084106103f5575f67ffffffffffffffff8111156103bd576103bc6110ff565b5b6040519080825280602002602001820160405280156103eb5781602001602082028036833780820191505090505b5092505050610528565b5f8560ff16856104059190611159565b905081811115610413578190505b5f8582610420919061118c565b90505f8167ffffffffffffffff81111561043d5761043c6110ff565b5b60405190808252806020026020018201604052801561046b5781602001602082028036833780820191505090505b5090505f5f90505b8281101561051e5785600101818961048b9190611159565b8154811061049c5761049b6111bf565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168282815181106104d7576104d66111bf565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080600101915050610473565b5080955050505050505b92915050565b5f7ff9388d16ccb89f8ceeb8bce5074db391472ebb34229a1051e19fc642d992d400905090565b5f7f7c05d43dfa50a40ae7e3814ce9638445dbcd9d9ad2e164fbc4f4c052f0160d00905090565b5f7f68fe19185e240d9214875be5b2b0c87a4a5a1d49f09c1a0b6456c42cbedb1e00905090565b5f60028111156105b6576105b5610dd8565b5b8260028111156105c9576105c8610dd8565b5b14155f9061060d576040517f1322334a0000000000000000000000000000000000000000000000000000000081526004016106049190610e4b565b60405180910390fd5b505f610617610555565b90505f815f015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1690505f600281111561067a57610679610dd8565b5b81600281111561068d5761068c610dd8565b5b036107035782156106fe5783825f015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908360028111156106f8576106f7610dd8565b5b02179055505b610776565b83600281111561071657610715610dd8565b5b81600281111561072957610728610dd8565b5b14858286909192610772576040517f55e8586a000000000000000000000000000000000000000000000000000000008152600401610769939291906111ec565b60405180910390fd5b5050505b5050505050565b5f61078661057c565b90508161ffff1682825f015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900461ffff161661ffff161433825f015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900461ffff1684909192610873576040517f65c9b12700000000000000000000000000000000000000000000000000000000815260040161086a93929190611221565b60405180910390fd5b5050505050565b5f6108848461020b565b90508261ffff168161ffff161415848290916108d7576040517f7db81d9b0000000000000000000000000000000000000000000000000000000081526004016108ce929190611256565b60405180910390fd5b50505f6108e261057c565b90505f618000831661ffff161415801561090357505f618000851661ffff16145b156109715760018160030154118590610952576040517f226d4ad300000000000000000000000000000000000000000000000000000000815260040161094991906110e6565b60405180910390fd5b50806003015f8154809291906109679061127d565b91905055506109b0565b5f618000831661ffff1614801561099057505f618000851661ffff1614155b156109af57806003015f8154809291906109a9906112a4565b91905055505b5b5f61ffff168261ffff16036109ce576109c98584610a5c565b6109e9565b5f61ffff168461ffff16036109e8576109e78584610b19565b5b5b83815f015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548161ffff021916908361ffff1602179055505050505050565b610a58828261800017600161087a565b5050565b5f610a6561057c565b90508060010180549050816002015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508060010183908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b5f610b2261057c565b90505f8160010160018360010180549050610b3d919061118c565b81548110610b4e57610b4d6111bf565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614610c90575f826002015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081836001018281548110610c0557610c046111bf565b5b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080836002015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b81600101805480610ca457610ca36112eb565b5b600190038181905f5260205f20015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055816002015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f905550505050565b5f819050919050565b610d3081610d1e565b82525050565b5f602082019050610d495f830184610d27565b92915050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610d7c82610d53565b9050919050565b610d8c81610d72565b8114610d96575f5ffd5b50565b5f81359050610da781610d83565b92915050565b5f60208284031215610dc257610dc1610d4f565b5b5f610dcf84828501610d99565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60038110610e1657610e15610dd8565b5b50565b5f819050610e2682610e05565b919050565b5f610e3582610e19565b9050919050565b610e4581610e2b565b82525050565b5f602082019050610e5e5f830184610e3c565b92915050565b5f61ffff82169050919050565b610e7a81610e64565b82525050565b5f602082019050610e935f830184610e71565b92915050565b60038110610ea5575f5ffd5b50565b5f81359050610eb681610e99565b92915050565b5f5f60408385031215610ed257610ed1610d4f565b5b5f610edf85828601610d99565b9250506020610ef085828601610ea8565b9150509250929050565b610f0381610e64565b8114610f0d575f5ffd5b50565b5f81359050610f1e81610efa565b92915050565b5f5f60408385031215610f3a57610f39610d4f565b5b5f610f4785828601610d99565b9250506020610f5885828601610f10565b9150509250929050565b5f60ff82169050919050565b610f7781610f62565b8114610f81575f5ffd5b50565b5f81359050610f9281610f6e565b92915050565b610fa181610d1e565b8114610fab575f5ffd5b50565b5f81359050610fbc81610f98565b92915050565b5f5f60408385031215610fd857610fd7610d4f565b5b5f610fe585828601610f84565b9250506020610ff685828601610fae565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61103281610d72565b82525050565b5f6110438383611029565b60208301905092915050565b5f602082019050919050565b5f61106582611000565b61106f818561100a565b935061107a8361101a565b805f5b838110156110aa5781516110918882611038565b975061109c8361104f565b92505060018101905061107d565b5085935050505092915050565b5f6020820190508181035f8301526110cf818461105b565b905092915050565b6110e081610d72565b82525050565b5f6020820190506110f95f8301846110d7565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61116382610d1e565b915061116e83610d1e565b92508282019050808211156111865761118561112c565b5b92915050565b5f61119682610d1e565b91506111a183610d1e565b92508282039050818111156111b9576111b861112c565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6060820190506111ff5f8301866110d7565b61120c6020830185610e3c565b6112196040830184610e3c565b949350505050565b5f6060820190506112345f8301866110d7565b6112416020830185610e71565b61124e6040830184610e71565b949350505050565b5f6040820190506112695f8301856110d7565b6112766020830184610e71565b9392505050565b5f61128782610d1e565b91505f82036112995761129861112c565b5b600182039050919050565b5f6112ae82610d1e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036112e0576112df61112c565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea264697066735822122035696d822ee05206fe00a3a4385c2de5ec51d12ac6ad1900d13913c02cafd10064736f6c634300081c0033