false
false
- We're indexing this chain right now. Some of the counts may be inaccurate.

Contract Address Details

0x1F5F2dDEbA15Ba7E91892c9D1E44141dfA3D212d

Contract Name
cityGPT
Creator
0x864f78–c6436b at 0xe9d408–0d9b79
Balance
0
Tokens
Fetching tokens...
Transactions
0 Transactions
Transfers
0 Transfers
Gas Used
Fetching gas used...
Last Balance Update
18207805
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
cityGPT




Optimization enabled
true
Compiler version
v0.8.0+commit.c7dfd78e




Optimization runs
200
EVM Version
default




Verified at
2024-09-12T09:27:29.600150Z

Contract source code

Sol2uml
new
pragma solidity ^0.8.0;

contract cityGPT {
    struct KnowledgeEntry {
        string content;
        address contributor;
        uint256 timestamp;
        bool verified;
    }

    struct Contributor {
        bool isRegistered;
        bool isTrusted;
    }

    address public cityAdmin;
    mapping(bytes32 => KnowledgeEntry) public knowledgeBase;
    mapping(address => Contributor) public contributors;
    bytes32[] public entryKeys;

    event ContributorRegistered(address indexed contributor, bool isTrusted);
    event KnowledgeAdded(bytes32 indexed entryId, address indexed contributor);
    event KnowledgeVerified(bytes32 indexed entryId);
    event KnowledgeUpdated(bytes32 indexed entryId, address indexed contributor);

    modifier onlyCityAdmin() {
        require(msg.sender == cityAdmin, "Only city admin can call this function");
        _;
    }

    modifier onlyRegisteredContributor() {
        require(contributors[msg.sender].isRegistered, "Only registered contributors can call this function");
        _;
    }

    constructor() {
        cityAdmin = msg.sender;
    }

    function registerContributor(address _contributor, bool _isTrusted) public onlyCityAdmin {
        require(!contributors[_contributor].isRegistered, "Contributor already registered");
        contributors[_contributor] = Contributor(true, _isTrusted);
        emit ContributorRegistered(_contributor, _isTrusted);
    }

    function addKnowledge(string memory _content, string memory _category) public onlyRegisteredContributor {
        bytes32 entryId = keccak256(abi.encodePacked(_content, _category, block.timestamp));
        knowledgeBase[entryId] = KnowledgeEntry(_content, msg.sender, block.timestamp, contributors[msg.sender].isTrusted);
        entryKeys.push(entryId);
        emit KnowledgeAdded(entryId, msg.sender);
    }

    function verifyKnowledge(bytes32 _entryId) public onlyCityAdmin {
        require(!knowledgeBase[_entryId].verified, "Entry already verified");
        knowledgeBase[_entryId].verified = true;
        emit KnowledgeVerified(_entryId);
    }

    function updateKnowledge(bytes32 _entryId, string memory _newContent) public {
        require(msg.sender == knowledgeBase[_entryId].contributor || msg.sender == cityAdmin, "Unauthorized to update");
        knowledgeBase[_entryId].content = _newContent;
        knowledgeBase[_entryId].timestamp = block.timestamp;
        knowledgeBase[_entryId].verified = contributors[msg.sender].isTrusted;
        emit KnowledgeUpdated(_entryId, msg.sender);
    }

    function getKnowledgeEntry(bytes32 _entryId) public view returns (string memory, address, uint256, bool) {
        KnowledgeEntry memory entry = knowledgeBase[_entryId];
        return (entry.content, entry.contributor, entry.timestamp, entry.verified);
    }

    function getEntryCount() public view returns (uint256) {
        return entryKeys.length;
    }

    function getEntryByIndex(uint256 _index) public view returns (bytes32) {
        require(_index < entryKeys.length, "Index out of bounds");
        return entryKeys[_index];
    }

    function searchKnowledge(string memory _keyword) public view returns (bytes32[] memory) {
        bytes32[] memory results = new bytes32[](entryKeys.length);
        uint256 count = 0;

        for (uint256 i = 0; i < entryKeys.length; i++) {
            if (contains(knowledgeBase[entryKeys[i]].content, _keyword)) {
                results[count] = entryKeys[i];
                count++;
            }
        }

        // Resize the array to the actual number of results
        bytes32[] memory finalResults = new bytes32[](count);
        for (uint256 i = 0; i < count; i++) {
            finalResults[i] = results[i];
        }

        return finalResults;
    }

    function contains(string memory _haystack, string memory _needle) internal pure returns (bool) {
        bytes memory haystackBytes = bytes(_haystack);
        bytes memory needleBytes = bytes(_needle);

        for (uint256 i = 0; i <= haystackBytes.length - needleBytes.length; i++) {
            bool found = true;
            for (uint256 j = 0; j < needleBytes.length; j++) {
                if (haystackBytes[i + j] != needleBytes[j]) {
                    found = false;
                    break;
                }
            }
            if (found) {
                return true;
            }
        }
        return false;
    }
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"ContributorRegistered","inputs":[{"type":"address","name":"contributor","internalType":"address","indexed":true},{"type":"bool","name":"isTrusted","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"KnowledgeAdded","inputs":[{"type":"bytes32","name":"entryId","internalType":"bytes32","indexed":true},{"type":"address","name":"contributor","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"KnowledgeUpdated","inputs":[{"type":"bytes32","name":"entryId","internalType":"bytes32","indexed":true},{"type":"address","name":"contributor","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"KnowledgeVerified","inputs":[{"type":"bytes32","name":"entryId","internalType":"bytes32","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addKnowledge","inputs":[{"type":"string","name":"_content","internalType":"string"},{"type":"string","name":"_category","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"cityAdmin","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"isRegistered","internalType":"bool"},{"type":"bool","name":"isTrusted","internalType":"bool"}],"name":"contributors","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"entryKeys","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"getEntryByIndex","inputs":[{"type":"uint256","name":"_index","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getEntryCount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"},{"type":"address","name":"","internalType":"address"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"bool","name":"","internalType":"bool"}],"name":"getKnowledgeEntry","inputs":[{"type":"bytes32","name":"_entryId","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"content","internalType":"string"},{"type":"address","name":"contributor","internalType":"address"},{"type":"uint256","name":"timestamp","internalType":"uint256"},{"type":"bool","name":"verified","internalType":"bool"}],"name":"knowledgeBase","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"registerContributor","inputs":[{"type":"address","name":"_contributor","internalType":"address"},{"type":"bool","name":"_isTrusted","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32[]","name":"","internalType":"bytes32[]"}],"name":"searchKnowledge","inputs":[{"type":"string","name":"_keyword","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateKnowledge","inputs":[{"type":"bytes32","name":"_entryId","internalType":"bytes32"},{"type":"string","name":"_newContent","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"verifyKnowledge","inputs":[{"type":"bytes32","name":"_entryId","internalType":"bytes32"}]}]
              

Contract Creation Code

0x608060405234801561001057600080fd5b50600080546001600160a01b03191633179055611193806100326000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c8063be7fe8eb11610071578063be7fe8eb14610163578063c2797a3114610178578063c793fa061461018b578063c9430c001461019e578063e8cc846d146101b1578063eedffb54146101c4576100b4565b80631f6d4942146100b957806358cd8389146100e3578063702fb5d8146100f857806377b11201146101185780637a360e651461013b5780638fc80ccd14610150575b600080fd5b6100cc6100c7366004610cd0565b6101d7565b6040516100da929190610eb2565b60405180910390f35b6100f66100f1366004610d43565b6101f5565b005b61010b610106366004610d88565b6102e3565b6040516100da9190610e63565b61012b610126366004610d2b565b61056c565b6040516100da9493929190610ecd565b610143610679565b6040516100da9190610ec4565b61014361015e366004610d2b565b61067f565b61016b6106d6565b6040516100da9190610e4f565b610143610186366004610d2b565b6106e5565b6100f6610199366004610d2b565b610706565b6100f66101ac366004610cf1565b6107ab565b6100f66101bf366004610dc3565b61089e565b61012b6101d2366004610d2b565b6109fc565b60026020526000908152604090205460ff8082169161010090041682565b600082815260016020819052604090912001546001600160a01b031633148061022857506000546001600160a01b031633145b61024d5760405162461bcd60e51b81526004016102449061104c565b60405180910390fd5b6000828152600160209081526040909120825161026c92840190610b9f565b50600082815260016020818152604080842042600280830191909155338087529084528286205488875294909352600301805460ff191661010090940460ff161515939093179092559051909184917f89c0d92099158b14347f45708d39d0288d4a5f198bb279790c925f9f8a1369769190a35050565b60035460609060009067ffffffffffffffff81111561031257634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561033b578160200160208202803683370190505b5090506000805b60035481101561049b5761041f600160006003848154811061037457634e487b7160e01b600052603260045260246000fd5b90600052602060002001548152602001908152602001600020600001805461039b906110db565b80601f01602080910402602001604051908101604052809291908181526020018280546103c7906110db565b80156104145780601f106103e957610100808354040283529160200191610414565b820191906000526020600020905b8154815290600101906020018083116103f757829003601f168201915b505050505086610abb565b15610489576003818154811061044557634e487b7160e01b600052603260045260246000fd5b906000526020600020015483838151811061047057634e487b7160e01b600052603260045260246000fd5b60209081029190910101528161048581611116565b9250505b8061049381611116565b915050610342565b5060008167ffffffffffffffff8111156104c557634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156104ee578160200160208202803683370190505b50905060005b828110156105615783818151811061051c57634e487b7160e01b600052603260045260246000fd5b602002602001015182828151811061054457634e487b7160e01b600052603260045260246000fd5b60209081029190910101528061055981611116565b9150506104f4565b50925050505b919050565b6060600080600080600160008781526020019081526020016000206040518060800160405290816000820180546105a2906110db565b80601f01602080910402602001604051908101604052809291908181526020018280546105ce906110db565b801561061b5780601f106105f05761010080835404028352916020019161061b565b820191906000526020600020905b8154815290600101906020018083116105fe57829003601f168201915b505050918352505060018201546001600160a01b0316602080830191909152600283015460408084019190915260039093015460ff161515606092830152835190840151928401519390910151909991985091965090945092505050565b60035490565b60035460009082106106a35760405162461bcd60e51b81526004016102449061101f565b600382815481106106c457634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000546001600160a01b031681565b600381815481106106f557600080fd5b600091825260209091200154905081565b6000546001600160a01b031633146107305760405162461bcd60e51b815260040161024490610fa9565b60008181526001602052604090206003015460ff16156107625760405162461bcd60e51b815260040161024490610fef565b6000818152600160208190526040808320600301805460ff19169092179091555182917f3c8c30ce680635c6e3fc8a2d6bf0b6297b34621c97c66b9dc3a85755ba01544391a250565b6000546001600160a01b031633146107d55760405162461bcd60e51b815260040161024490610fa9565b6001600160a01b03821660009081526002602052604090205460ff161561080e5760405162461bcd60e51b815260040161024490610f72565b6040805180820182526001815282151560208083019182526001600160a01b038616600081815260029092529084902092518354925115156101000261ff001991151560ff1990941693909317169190911790915590517ff3f0d25f6afbac328f2b1ef4cc4b9167f2c393b211885a1174d68c6d0cea165a90610892908490610ea7565b60405180910390a25050565b3360009081526002602052604090205460ff166108cd5760405162461bcd60e51b815260040161024490610f1f565b60008282426040516020016108e493929190610e1a565b60408051808303601f19018152828252805160209182012060808401835286845233828501819052428585015260009081526002835283812054610100900460ff1615156060860152818152600183529290922083518051939550909261094e9284920190610b9f565b506020820151600182810180546001600160a01b0319166001600160a01b039093169290921790915560408084015160028401556060909301516003928301805460ff19169115159190911790558154908101825560009182527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b018390559051339183917f97c6a4ce290c17bfc896dc236ce71bc1166d13f30e824f99d51b60f52b07af3f9190a3505050565b600160205260009081526040902080548190610a17906110db565b80601f0160208091040260200160405190810160405280929190818152602001828054610a43906110db565b8015610a905780601f10610a6557610100808354040283529160200191610a90565b820191906000526020600020905b815481529060010190602001808311610a7357829003601f168201915b505050506001830154600284015460039094015492936001600160a01b039091169290915060ff1684565b60008282825b81518351610acf9190611094565b8111610b9157600160005b8351811015610b6a57838181518110610b0357634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b03191685610b1d838661107c565b81518110610b3b57634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b03191614610b585760009150610b6a565b80610b6281611116565b915050610ada565b508015610b7e576001945050505050610b99565b5080610b8981611116565b915050610ac1565b506000925050505b92915050565b828054610bab906110db565b90600052602060002090601f016020900481019282610bcd5760008555610c13565b82601f10610be657805160ff1916838001178555610c13565b82800160010185558215610c13579182015b82811115610c13578251825591602001919060010190610bf8565b50610c1f929150610c23565b5090565b5b80821115610c1f5760008155600101610c24565b80356001600160a01b038116811461056757600080fd5b600082601f830112610c5f578081fd5b813567ffffffffffffffff80821115610c7a57610c7a611147565b604051601f8301601f191681016020018281118282101715610c9e57610c9e611147565b604052828152848301602001861015610cb5578384fd5b82602086016020830137918201602001929092529392505050565b600060208284031215610ce1578081fd5b610cea82610c38565b9392505050565b60008060408385031215610d03578081fd5b610d0c83610c38565b915060208301358015158114610d20578182fd5b809150509250929050565b600060208284031215610d3c578081fd5b5035919050565b60008060408385031215610d55578182fd5b82359150602083013567ffffffffffffffff811115610d72578182fd5b610d7e85828601610c4f565b9150509250929050565b600060208284031215610d99578081fd5b813567ffffffffffffffff811115610daf578182fd5b610dbb84828501610c4f565b949350505050565b60008060408385031215610dd5578182fd5b823567ffffffffffffffff80821115610dec578384fd5b610df886838701610c4f565b93506020850135915080821115610e0d578283fd5b50610d7e85828601610c4f565b60008451610e2c8184602089016110ab565b845190830190610e408183602089016110ab565b01928352505060200192915050565b6001600160a01b0391909116815260200190565b6020808252825182820181905260009190848201906040850190845b81811015610e9b57835183529284019291840191600101610e7f565b50909695505050505050565b901515815260200190565b91151582521515602082015260400190565b90815260200190565b6000608082528551806080840152610eec8160a0850160208a016110ab565b6001600160a01b039590951660208301525060408101929092521515606082015260a0601f909201601f19160101919050565b60208082526033908201527f4f6e6c79207265676973746572656420636f6e7472696275746f72732063616e6040820152721031b0b636103a3434b990333ab731ba34b7b760691b606082015260800190565b6020808252601e908201527f436f6e7472696275746f7220616c726561647920726567697374657265640000604082015260600190565b60208082526026908201527f4f6e6c7920636974792061646d696e2063616e2063616c6c20746869732066756040820152653731ba34b7b760d11b606082015260800190565b602080825260169082015275115b9d1c9e48185b1c9958591e481d995c9a599a595960521b604082015260600190565b602080825260139082015272496e646578206f7574206f6620626f756e647360681b604082015260600190565b602080825260169082015275556e617574686f72697a656420746f2075706461746560501b604082015260600190565b6000821982111561108f5761108f611131565b500190565b6000828210156110a6576110a6611131565b500390565b60005b838110156110c65781810151838201526020016110ae565b838111156110d5576000848401525b50505050565b6002810460018216806110ef57607f821691505b6020821081141561111057634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561112a5761112a611131565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea264697066735822122008e8ecda6ef7288b095545672ddf8d017950c78d53659b6240877ff5d684814264736f6c63430008000033

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106100b45760003560e01c8063be7fe8eb11610071578063be7fe8eb14610163578063c2797a3114610178578063c793fa061461018b578063c9430c001461019e578063e8cc846d146101b1578063eedffb54146101c4576100b4565b80631f6d4942146100b957806358cd8389146100e3578063702fb5d8146100f857806377b11201146101185780637a360e651461013b5780638fc80ccd14610150575b600080fd5b6100cc6100c7366004610cd0565b6101d7565b6040516100da929190610eb2565b60405180910390f35b6100f66100f1366004610d43565b6101f5565b005b61010b610106366004610d88565b6102e3565b6040516100da9190610e63565b61012b610126366004610d2b565b61056c565b6040516100da9493929190610ecd565b610143610679565b6040516100da9190610ec4565b61014361015e366004610d2b565b61067f565b61016b6106d6565b6040516100da9190610e4f565b610143610186366004610d2b565b6106e5565b6100f6610199366004610d2b565b610706565b6100f66101ac366004610cf1565b6107ab565b6100f66101bf366004610dc3565b61089e565b61012b6101d2366004610d2b565b6109fc565b60026020526000908152604090205460ff8082169161010090041682565b600082815260016020819052604090912001546001600160a01b031633148061022857506000546001600160a01b031633145b61024d5760405162461bcd60e51b81526004016102449061104c565b60405180910390fd5b6000828152600160209081526040909120825161026c92840190610b9f565b50600082815260016020818152604080842042600280830191909155338087529084528286205488875294909352600301805460ff191661010090940460ff161515939093179092559051909184917f89c0d92099158b14347f45708d39d0288d4a5f198bb279790c925f9f8a1369769190a35050565b60035460609060009067ffffffffffffffff81111561031257634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561033b578160200160208202803683370190505b5090506000805b60035481101561049b5761041f600160006003848154811061037457634e487b7160e01b600052603260045260246000fd5b90600052602060002001548152602001908152602001600020600001805461039b906110db565b80601f01602080910402602001604051908101604052809291908181526020018280546103c7906110db565b80156104145780601f106103e957610100808354040283529160200191610414565b820191906000526020600020905b8154815290600101906020018083116103f757829003601f168201915b505050505086610abb565b15610489576003818154811061044557634e487b7160e01b600052603260045260246000fd5b906000526020600020015483838151811061047057634e487b7160e01b600052603260045260246000fd5b60209081029190910101528161048581611116565b9250505b8061049381611116565b915050610342565b5060008167ffffffffffffffff8111156104c557634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156104ee578160200160208202803683370190505b50905060005b828110156105615783818151811061051c57634e487b7160e01b600052603260045260246000fd5b602002602001015182828151811061054457634e487b7160e01b600052603260045260246000fd5b60209081029190910101528061055981611116565b9150506104f4565b50925050505b919050565b6060600080600080600160008781526020019081526020016000206040518060800160405290816000820180546105a2906110db565b80601f01602080910402602001604051908101604052809291908181526020018280546105ce906110db565b801561061b5780601f106105f05761010080835404028352916020019161061b565b820191906000526020600020905b8154815290600101906020018083116105fe57829003601f168201915b505050918352505060018201546001600160a01b0316602080830191909152600283015460408084019190915260039093015460ff161515606092830152835190840151928401519390910151909991985091965090945092505050565b60035490565b60035460009082106106a35760405162461bcd60e51b81526004016102449061101f565b600382815481106106c457634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000546001600160a01b031681565b600381815481106106f557600080fd5b600091825260209091200154905081565b6000546001600160a01b031633146107305760405162461bcd60e51b815260040161024490610fa9565b60008181526001602052604090206003015460ff16156107625760405162461bcd60e51b815260040161024490610fef565b6000818152600160208190526040808320600301805460ff19169092179091555182917f3c8c30ce680635c6e3fc8a2d6bf0b6297b34621c97c66b9dc3a85755ba01544391a250565b6000546001600160a01b031633146107d55760405162461bcd60e51b815260040161024490610fa9565b6001600160a01b03821660009081526002602052604090205460ff161561080e5760405162461bcd60e51b815260040161024490610f72565b6040805180820182526001815282151560208083019182526001600160a01b038616600081815260029092529084902092518354925115156101000261ff001991151560ff1990941693909317169190911790915590517ff3f0d25f6afbac328f2b1ef4cc4b9167f2c393b211885a1174d68c6d0cea165a90610892908490610ea7565b60405180910390a25050565b3360009081526002602052604090205460ff166108cd5760405162461bcd60e51b815260040161024490610f1f565b60008282426040516020016108e493929190610e1a565b60408051808303601f19018152828252805160209182012060808401835286845233828501819052428585015260009081526002835283812054610100900460ff1615156060860152818152600183529290922083518051939550909261094e9284920190610b9f565b506020820151600182810180546001600160a01b0319166001600160a01b039093169290921790915560408084015160028401556060909301516003928301805460ff19169115159190911790558154908101825560009182527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b018390559051339183917f97c6a4ce290c17bfc896dc236ce71bc1166d13f30e824f99d51b60f52b07af3f9190a3505050565b600160205260009081526040902080548190610a17906110db565b80601f0160208091040260200160405190810160405280929190818152602001828054610a43906110db565b8015610a905780601f10610a6557610100808354040283529160200191610a90565b820191906000526020600020905b815481529060010190602001808311610a7357829003601f168201915b505050506001830154600284015460039094015492936001600160a01b039091169290915060ff1684565b60008282825b81518351610acf9190611094565b8111610b9157600160005b8351811015610b6a57838181518110610b0357634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b03191685610b1d838661107c565b81518110610b3b57634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b03191614610b585760009150610b6a565b80610b6281611116565b915050610ada565b508015610b7e576001945050505050610b99565b5080610b8981611116565b915050610ac1565b506000925050505b92915050565b828054610bab906110db565b90600052602060002090601f016020900481019282610bcd5760008555610c13565b82601f10610be657805160ff1916838001178555610c13565b82800160010185558215610c13579182015b82811115610c13578251825591602001919060010190610bf8565b50610c1f929150610c23565b5090565b5b80821115610c1f5760008155600101610c24565b80356001600160a01b038116811461056757600080fd5b600082601f830112610c5f578081fd5b813567ffffffffffffffff80821115610c7a57610c7a611147565b604051601f8301601f191681016020018281118282101715610c9e57610c9e611147565b604052828152848301602001861015610cb5578384fd5b82602086016020830137918201602001929092529392505050565b600060208284031215610ce1578081fd5b610cea82610c38565b9392505050565b60008060408385031215610d03578081fd5b610d0c83610c38565b915060208301358015158114610d20578182fd5b809150509250929050565b600060208284031215610d3c578081fd5b5035919050565b60008060408385031215610d55578182fd5b82359150602083013567ffffffffffffffff811115610d72578182fd5b610d7e85828601610c4f565b9150509250929050565b600060208284031215610d99578081fd5b813567ffffffffffffffff811115610daf578182fd5b610dbb84828501610c4f565b949350505050565b60008060408385031215610dd5578182fd5b823567ffffffffffffffff80821115610dec578384fd5b610df886838701610c4f565b93506020850135915080821115610e0d578283fd5b50610d7e85828601610c4f565b60008451610e2c8184602089016110ab565b845190830190610e408183602089016110ab565b01928352505060200192915050565b6001600160a01b0391909116815260200190565b6020808252825182820181905260009190848201906040850190845b81811015610e9b57835183529284019291840191600101610e7f565b50909695505050505050565b901515815260200190565b91151582521515602082015260400190565b90815260200190565b6000608082528551806080840152610eec8160a0850160208a016110ab565b6001600160a01b039590951660208301525060408101929092521515606082015260a0601f909201601f19160101919050565b60208082526033908201527f4f6e6c79207265676973746572656420636f6e7472696275746f72732063616e6040820152721031b0b636103a3434b990333ab731ba34b7b760691b606082015260800190565b6020808252601e908201527f436f6e7472696275746f7220616c726561647920726567697374657265640000604082015260600190565b60208082526026908201527f4f6e6c7920636974792061646d696e2063616e2063616c6c20746869732066756040820152653731ba34b7b760d11b606082015260800190565b602080825260169082015275115b9d1c9e48185b1c9958591e481d995c9a599a595960521b604082015260600190565b602080825260139082015272496e646578206f7574206f6620626f756e647360681b604082015260600190565b602080825260169082015275556e617574686f72697a656420746f2075706461746560501b604082015260600190565b6000821982111561108f5761108f611131565b500190565b6000828210156110a6576110a6611131565b500390565b60005b838110156110c65781810151838201526020016110ae565b838111156110d5576000848401525b50505050565b6002810460018216806110ef57607f821691505b6020821081141561111057634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561112a5761112a611131565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea264697066735822122008e8ecda6ef7288b095545672ddf8d017950c78d53659b6240877ff5d684814264736f6c63430008000033