@openzeppelin/contracts-upgradeable
Version:
Secure Smart Contract library for Solidity
1,029 lines • 52.6 kB
JSON
{
"_format": "hh-sol-artifact-1",
"contractName": "TimelockControllerUpgradeable",
"sourceName": "contracts/governance/TimelockControllerUpgradeable.sol",
"abi": [
{
"inputs": [],
"name": "AccessControlBadConfirmation",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "bytes32",
"name": "neededRole",
"type": "bytes32"
}
],
"name": "AccessControlUnauthorizedAccount",
"type": "error"
},
{
"inputs": [],
"name": "FailedCall",
"type": "error"
},
{
"inputs": [],
"name": "InvalidInitialization",
"type": "error"
},
{
"inputs": [],
"name": "NotInitializing",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "delay",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "minDelay",
"type": "uint256"
}
],
"name": "TimelockInsufficientDelay",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "targets",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "payloads",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "values",
"type": "uint256"
}
],
"name": "TimelockInvalidOperationLength",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "caller",
"type": "address"
}
],
"name": "TimelockUnauthorizedCaller",
"type": "error"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "predecessorId",
"type": "bytes32"
}
],
"name": "TimelockUnexecutedPredecessor",
"type": "error"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "operationId",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "expectedStates",
"type": "bytes32"
}
],
"name": "TimelockUnexpectedOperationState",
"type": "error"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "id",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "uint256",
"name": "index",
"type": "uint256"
},
{
"indexed": false,
"internalType": "address",
"name": "target",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"indexed": false,
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "CallExecuted",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "id",
"type": "bytes32"
},
{
"indexed": false,
"internalType": "bytes32",
"name": "salt",
"type": "bytes32"
}
],
"name": "CallSalt",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "id",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "uint256",
"name": "index",
"type": "uint256"
},
{
"indexed": false,
"internalType": "address",
"name": "target",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"indexed": false,
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
{
"indexed": false,
"internalType": "bytes32",
"name": "predecessor",
"type": "bytes32"
},
{
"indexed": false,
"internalType": "uint256",
"name": "delay",
"type": "uint256"
}
],
"name": "CallScheduled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "id",
"type": "bytes32"
}
],
"name": "Cancelled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint64",
"name": "version",
"type": "uint64"
}
],
"name": "Initialized",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "oldDuration",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "newDuration",
"type": "uint256"
}
],
"name": "MinDelayChange",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "bytes32",
"name": "previousAdminRole",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "bytes32",
"name": "newAdminRole",
"type": "bytes32"
}
],
"name": "RoleAdminChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "address",
"name": "account",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "RoleGranted",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "address",
"name": "account",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "RoleRevoked",
"type": "event"
},
{
"inputs": [],
"name": "CANCELLER_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "DEFAULT_ADMIN_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "EXECUTOR_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "PROPOSER_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "id",
"type": "bytes32"
}
],
"name": "cancel",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "target",
"type": "address"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "payload",
"type": "bytes"
},
{
"internalType": "bytes32",
"name": "predecessor",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "salt",
"type": "bytes32"
}
],
"name": "execute",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address[]",
"name": "targets",
"type": "address[]"
},
{
"internalType": "uint256[]",
"name": "values",
"type": "uint256[]"
},
{
"internalType": "bytes[]",
"name": "payloads",
"type": "bytes[]"
},
{
"internalType": "bytes32",
"name": "predecessor",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "salt",
"type": "bytes32"
}
],
"name": "executeBatch",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [],
"name": "getMinDelay",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "id",
"type": "bytes32"
}
],
"name": "getOperationState",
"outputs": [
{
"internalType": "enum TimelockControllerUpgradeable.OperationState",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
}
],
"name": "getRoleAdmin",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "id",
"type": "bytes32"
}
],
"name": "getTimestamp",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "grantRole",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "hasRole",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "target",
"type": "address"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
{
"internalType": "bytes32",
"name": "predecessor",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "salt",
"type": "bytes32"
}
],
"name": "hashOperation",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "pure",
"type": "function"
},
{
"inputs": [
{
"internalType": "address[]",
"name": "targets",
"type": "address[]"
},
{
"internalType": "uint256[]",
"name": "values",
"type": "uint256[]"
},
{
"internalType": "bytes[]",
"name": "payloads",
"type": "bytes[]"
},
{
"internalType": "bytes32",
"name": "predecessor",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "salt",
"type": "bytes32"
}
],
"name": "hashOperationBatch",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "pure",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "minDelay",
"type": "uint256"
},
{
"internalType": "address[]",
"name": "proposers",
"type": "address[]"
},
{
"internalType": "address[]",
"name": "executors",
"type": "address[]"
},
{
"internalType": "address",
"name": "admin",
"type": "address"
}
],
"name": "initialize",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "id",
"type": "bytes32"
}
],
"name": "isOperation",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "id",
"type": "bytes32"
}
],
"name": "isOperationDone",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "id",
"type": "bytes32"
}
],
"name": "isOperationPending",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "id",
"type": "bytes32"
}
],
"name": "isOperationReady",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "uint256[]",
"name": "",
"type": "uint256[]"
},
{
"internalType": "uint256[]",
"name": "",
"type": "uint256[]"
},
{
"internalType": "bytes",
"name": "",
"type": "bytes"
}
],
"name": "onERC1155BatchReceived",
"outputs": [
{
"internalType": "bytes4",
"name": "",
"type": "bytes4"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "uint256",
"name": "",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "",
"type": "bytes"
}
],
"name": "onERC1155Received",
"outputs": [
{
"internalType": "bytes4",
"name": "",
"type": "bytes4"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "uint256",
"name": "",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "",
"type": "bytes"
}
],
"name": "onERC721Received",
"outputs": [
{
"internalType": "bytes4",
"name": "",
"type": "bytes4"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"internalType": "address",
"name": "callerConfirmation",
"type": "address"
}
],
"name": "renounceRole",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "revokeRole",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "target",
"type": "address"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
{
"internalType": "bytes32",
"name": "predecessor",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "salt",
"type": "bytes32"
},
{
"internalType": "uint256",
"name": "delay",
"type": "uint256"
}
],
"name": "schedule",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address[]",
"name": "targets",
"type": "address[]"
},
{
"internalType": "uint256[]",
"name": "values",
"type": "uint256[]"
},
{
"internalType": "bytes[]",
"name": "payloads",
"type": "bytes[]"
},
{
"internalType": "bytes32",
"name": "predecessor",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "salt",
"type": "bytes32"
},
{
"internalType": "uint256",
"name": "delay",
"type": "uint256"
}
],
"name": "scheduleBatch",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes4",
"name": "interfaceId",
"type": "bytes4"
}
],
"name": "supportsInterface",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "newDelay",
"type": "uint256"
}
],
"name": "updateDelay",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"stateMutability": "payable",
"type": "receive"
}
],
"bytecode": "0x6080604052348015600e575f5ffd5b50611e108061001c5f395ff3fe6080604052600436106101bd575f3560e01c80638065657f116100f2578063bc197c8111610092578063d547741f11610062578063d547741f14610547578063e38335e514610566578063f23a6e6114610579578063f27a0c92146105a4575f5ffd5b8063bc197c81146104a7578063c4c4c7b3146104d2578063c4d252f5146104f1578063d45c443514610510575f5ffd5b806391d14854116100cd57806391d1485414610423578063a217fddf14610442578063b08e51c014610455578063b1c5f42714610488575f5ffd5b80638065657f146103c55780638f2a0bb0146103e45780638f61f4f514610403575f5ffd5b80632ab0f5291161015d57806336568abe1161013857806336568abe1461033c578063584b153e1461035b57806364d623531461037a5780637958004c14610399575f5ffd5b80632ab0f529146102df5780632f2ff15d146102fe57806331d507501461031d575f5ffd5b8063134008d311610198578063134008d31461024b57806313bc9f201461025e578063150b7a021461027d578063248a9ca3146102c0575f5ffd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f5ffd5b366101c457005b5f5ffd5b3480156101d3575f5ffd5b506101e76101e2366004611468565b6105d7565b005b3480156101f4575f5ffd5b506102086102033660046114d6565b610698565b60405190151581526020015b60405180910390f35b348015610228575f5ffd5b5061023d5f516020611dbb5f395f51905f5281565b604051908152602001610214565b6101e76102593660046114fd565b6106a8565b348015610269575f5ffd5b50610208610278366004611563565b610747565b348015610288575f5ffd5b506102a7610297366004611629565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610214565b3480156102cb575f5ffd5b5061023d6102da366004611563565b61076c565b3480156102ea575f5ffd5b506102086102f9366004611563565b61078c565b348015610309575f5ffd5b506101e761031836600461168c565b610794565b348015610328575f5ffd5b50610208610337366004611563565b6107b6565b348015610347575f5ffd5b506101e761035636600461168c565b6107da565b348015610366575f5ffd5b50610208610375366004611563565b610812565b348015610385575f5ffd5b506101e7610394366004611563565b610857565b3480156103a4575f5ffd5b506103b86103b3366004611563565b6108db565b60405161021491906116ca565b3480156103d0575f5ffd5b5061023d6103df3660046114fd565b61092f565b3480156103ef575f5ffd5b506101e76103fe366004611730565b61096d565b34801561040e575f5ffd5b5061023d5f516020611d9b5f395f51905f5281565b34801561042e575f5ffd5b5061020861043d36600461168c565b610ae6565b34801561044d575f5ffd5b5061023d5f81565b348015610460575f5ffd5b5061023d7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610493575f5ffd5b5061023d6104a23660046117e2565b610b1c565b3480156104b2575f5ffd5b506102a76104c1366004611918565b63bc197c8160e01b95945050505050565b3480156104dd575f5ffd5b506101e76104ec366004611a26565b610b60565b3480156104fc575f5ffd5b506101e761050b366004611563565b610c5c565b34801561051b575f5ffd5b5061023d61052a366004611563565b5f9081525f516020611d5b5f395f51905f52602052604090205490565b348015610552575f5ffd5b506101e761056136600461168c565b610d15565b6101e76105743660046117e2565b610d31565b348015610584575f5ffd5b506102a7610593366004611aa2565b63f23a6e6160e01b95945050505050565b3480156105af575f5ffd5b507f9a37c2aa9d186a0969ff8a8267bf4e07e864c2f2768f5040949e28a624fb36015461023d565b5f516020611d9b5f395f51905f526105ee81610e9f565b5f6105fd89898989898961092f565b90506106098184610eac565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161064496959493929190611b1d565b60405180910390a3831561068d57807f20fda5fd27a1ea7bf5b9567f143ac5470bb059374a27e8f67cb44f946f6d03878560405161068491815260200190565b60405180910390a25b505050505050505050565b5f6106a282610f6b565b92915050565b5f516020611dbb5f395f51905f526106c0815f610ae6565b6106ce576106ce8133610f9f565b5f6106dd88888888888861092f565b90506106e98185610fdc565b6106f58888888861102a565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161072c9493929190611b59565b60405180910390a361073d8161109e565b5050505050505050565b5f60025b610754836108db565b6003811115610765576107656116b6565b1492915050565b5f9081525f516020611d7b5f395f51905f52602052604090206001015490565b5f600361074b565b61079d8261076c565b6107a681610e9f565b6107b083836110d5565b50505050565b5f806107c1836108db565b60038111156107d2576107d26116b6565b141592915050565b6001600160a01b03811633146108035760405163334bd91960e11b815260040160405180910390fd5b61080d8282611176565b505050565b5f5f61081d836108db565b90506001816003811115610833576108336116b6565b14806108505750600281600381111561084e5761084e6116b6565b145b9392505050565b5f516020611d5b5f395f51905f52333081146108965760405163e2850c5960e01b81526001600160a01b03821660048201526024015b60405180910390fd5b600182015460408051918252602082018590527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a15060010155565b5f8181525f516020611d5b5f395f51905f526020526040812054805f0361090457505f92915050565b600181036109155750600392915050565b428111156109265750600192915050565b50600292915050565b5f86868686868660405160200161094b96959493929190611b1d565b6040516020818303038152906040528051906020012090509695505050505050565b5f516020611d9b5f395f51905f5261098481610e9f565b88871415806109935750888514155b156109c5576040516001624fcdef60e01b03198152600481018a9052602481018690526044810188905260640161088d565b5f6109d68b8b8b8b8b8b8b8b610b1c565b90506109e28184610eac565b5f5b8a811015610a975780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610a2157610a21611b8a565b9050602002016020810190610a369190611b9e565b8d8d86818110610a4857610a48611b8a565b905060200201358c8c87818110610a6157610a61611b8a565b9050602002810190610a739190611bb7565b8c8b604051610a8796959493929190611b1d565b60405180910390a36001016109e4565b508315610ad957807f20fda5fd27a1ea7bf5b9567f143ac5470bb059374a27e8f67cb44f946f6d038785604051610ad091815260200190565b60405180910390a25b5050505050505050505050565b5f9182525f516020611d7b5f395f51905f52602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f8888888888888888604051602001610b3c989796959493929190611c8d565b60405160208183030381529060405280519060200120905098975050505050505050565b5f610b696111ef565b805490915060ff600160401b82041615906001600160401b03165f81158015610b8f5750825b90505f826001600160401b03166001148015610baa5750303b155b905081158015610bb8575080155b15610bd65760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610c0057845460ff60401b1916600160401b1785555b610c0c89898989611217565b831561068d57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610c8681610e9f565b5f516020611d5b5f395f51905f52610c9d83610812565b610cd95782610cac600261122b565b610cb6600161122b565b604051635ead8eb560e01b8152600481019390935217602482015260440161088d565b5f838152602082905260408082208290555184917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a2505050565b610d1e8261076c565b610d2781610e9f565b6107b08383611176565b5f516020611dbb5f395f51905f52610d49815f610ae6565b610d5757610d578133610f9f565b8786141580610d665750878414155b15610d98576040516001624fcdef60e01b0319815260048101899052602481018590526044810187905260640161088d565b5f610da98a8a8a8a8a8a8a8a610b1c565b9050610db58185610fdc565b5f5b89811015610e89575f8b8b83818110610dd257610dd2611b8a565b9050602002016020810190610de79190611b9e565b90505f8a8a84818110610dfc57610dfc611b8a565b905060200201359050365f8a8a86818110610e1957610e19611b8a565b9050602002810190610e2b9190611bb7565b91509150610e3b8484848461102a565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b5886868686604051610e729493929190611b59565b60405180910390a350505050806001019050610db7565b50610e938161109e565b50505050505050505050565b610ea98133610f9f565b50565b5f516020611d5b5f395f51905f52610ec3836107b6565b15610ef45782610ed25f61122b565b604051635ead8eb560e01b81526004810192909252602482015260440161088d565b5f610f1d7f9a37c2aa9d186a0969ff8a8267bf4e07e864c2f2768f5040949e28a624fb36015490565b905080831015610f4a57604051635433660960e01b8152600481018490526024810182905260440161088d565b610f548342611d2c565b5f9485526020929092525060409092209190915550565b5f6001600160e01b03198216630271189760e51b14806106a257506301ffc9a760e01b6001600160e01b03198316146106a2565b610fa98282610ae6565b610fd85760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161088d565b5050565b610fe582610747565b610ff45781610ed2600261122b565b801580159061100957506110078161078c565b155b15610fd85760405163121534c360e31b81526004810182905260240161088d565b5f5f856001600160a01b0316858585604051611047929190611d4b565b5f6040518083038185875af1925050503d805f8114611081576040519150601f19603f3d011682016040523d82523d5f602084013e611086565b606091505b5091509150611095828261124d565b50505050505050565b5f516020611d5b5f395f51905f526110b582610747565b6110c45781610ed2600261122b565b5f9182526020526040902060019055565b5f5f516020611d7b5f395f51905f526110ee8484610ae6565b61116d575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556111233390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506106a2565b5f9150506106a2565b5f5f516020611d7b5f395f51905f5261118f8484610ae6565b1561116d575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506106a2565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006106a2565b61121f61128a565b6107b0848484846112b1565b5f81600381111561123e5761123e6116b6565b600160ff919091161b92915050565b6060821561125c5750806106a2565b8151156112715761126c826113e8565b6106a2565b60405163d6bda27560e01b815260040160405180910390fd5b6112926113f0565b6112af57604051631afcd79f60e31b815260040160405180910390fd5b565b6112b961128a565b5f516020611d5b5f395f51905f526112d15f306110d5565b506001600160a01b038216156112ed576112eb5f836110d5565b505b5f5b8451811015611368576113285f516020611d9b5f395f51905f5286838151811061131b5761131b611b8a565b60200260200101516110d5565b5061135f7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78386838151811061131b5761131b611b8a565b506001016112ef565b505f5b83518110156113a0576113975f516020611dbb5f395f51905f5285838151811061131b5761131b611b8a565b5060010161136b565b5060018101859055604080515f8152602081018790527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a15050505050565b805160208201fd5b5f6113f96111ef565b54600160401b900460ff16919050565b80356001600160a01b038116811461141f575f5ffd5b919050565b5f5f83601f840112611434575f5ffd5b5081356001600160401b0381111561144a575f5ffd5b602083019150836020828501011115611461575f5ffd5b9250929050565b5f5f5f5f5f5f5f60c0888a03121561147e575f5ffd5b61148788611409565b96506020880135955060408801356001600160401b038111156114a8575f5ffd5b6114b48a828b01611424565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f602082840312156114e6575f5ffd5b81356001600160e01b031981168114610850575f5ffd5b5f5f5f5f5f5f60a08789031215611512575f5ffd5b61151b87611409565b95506020870135945060408701356001600160401b0381111561153c575f5ffd5b61154889828a01611424565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611573575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156115b6576115b661157a565b604052919050565b5f82601f8301126115cd575f5ffd5b81356001600160401b038111156115e6576115e661157a565b6115f9601f8201601f191660200161158e565b81815284602083860101111561160d575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f5f5f6080858703121561163c575f5ffd5b61164585611409565b935061165360208601611409565b92506040850135915060608501356001600160401b03811115611674575f5ffd5b611680878288016115be565b91505092959194509250565b5f5f6040838503121561169d575f5ffd5b823591506116ad60208401611409565b90509250929050565b634e487b7160e01b5f52602160045260245ffd5b60208101600483106116ea57634e487b7160e01b5f52602160045260245ffd5b91905290565b5f5f83601f840112611700575f5ffd5b5081356001600160401b03811115611716575f5ffd5b6020830191508360208260051b8501011115611461575f5ffd5b5f5f5f5f5f5f5f5f5f60c08a8c031215611748575f5ffd5b89356001600160401b0381111561175d575f5ffd5b6117698c828d016116f0565b909a5098505060208a01356001600160401b03811115611787575f5ffd5b6117938c828d016116f0565b90985096505060408a01356001600160401b038111156117b1575f5ffd5b6117bd8c828d016116f0565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f5f5f5f5f5f5f5f60a0898b0312156117f9575f5ffd5b88356001600160401b0381111561180e575f5ffd5b61181a8b828c016116f0565b90995097505060208901356001600160401b03811115611838575f5ffd5b6118448b828c016116f0565b90975095505060408901356001600160401b03811115611862575f5ffd5b61186e8b828c016116f0565b999c989b509699959896976060870135966080013595509350505050565b5f6001600160401b038211156118a4576118a461157a565b5060051b60200190565b5f82601f8301126118bd575f5ffd5b81356118d06118cb8261188c565b61158e565b8082825260208201915060208360051b8601019250858311156118f1575f5ffd5b602085015b8381101561190e5780358352602092830192016118f6565b5095945050505050565b5f5f5f5f5f60a0868803121561192c575f5ffd5b61193586611409565b945061194360208701611409565b935060408601356001600160401b0381111561195d575f5ffd5b611969888289016118ae565b93505060608601356001600160401b03811115611984575f5ffd5b611990888289016118ae565b92505060808601356001600160401b038111156119ab575f5ffd5b6119b7888289016115be565b9150509295509295909350565b5f82601f8301126119d3575f5ffd5b81356119e16118cb8261188c565b8082825260208201915060208360051b860101925085831115611a02575f5ffd5b602085015b8381101561190e57611a1881611409565b835260209283019201611a07565b5f5f5f5f60808587031215611a39575f5ffd5b8435935060208501356001600160401b03811115611a55575f5ffd5b611a61878288016119c4565b93505060408501356001600160401b03811115611a7c575f5ffd5b611a88878288016119c4565b925050611a9760608601611409565b905092959194509250565b5f5f5f5f5f60a08688031215611ab6575f5ffd5b611abf86611409565b9450611acd60208701611409565b9350604086013592506060860135915060808601356001600160401b038111156119ab575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60018060a01b038716815285602082015260a060408201525f611b4460a083018688611af5565b60608301949094525060800152949350505050565b60018060a01b0385168152836020820152606060408201525f611b80606083018486611af5565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611bae575f5ffd5b61085082611409565b5f5f8335601e19843603018112611bcc575f5ffd5b8301803591506001600160401b03821115611be5575f5ffd5b602001915036819003821315611461575f5ffd5b5f8383855260208501945060208460051b820101835f5b86811015611c8157838303601f19018852813536879003601e19018112611c35575f5ffd5b86016020810190356001600160401b03811115611c50575f5ffd5b803603821315611c5e575f5ffd5b611c69858284611af5565b60209a8b019a90955093909301925050600101611c10565b50909695505050505050565b60a080825281018890525f8960c08301825b8b811015611ccd576001600160a01b03611cb884611409565b16825260209283019290910190600101611c9f565b5083810360208501528881526001600160fb1b03891115611cec575f5ffd5b8860051b9150818a60208301370182810360209081016040850152611d149082018789611bf9565b60608401959095525050608001529695505050505050565b808201808211156106a257634e487b7160e01b5f52601160045260245ffd5b818382375f910190815291905056fe9a37c2aa9d186a0969ff8a8267bf4e07e864c2f2768f5040949e28a624fb360002dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800b09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63a264697066735822122029338e94b39d2df468baa3981ad2691473593f70d7c2e29f0c57958dd1f8a27564736f6c634300081f0033",
"deployedBytecode": "0x6080604052600436106101bd575f3560e01c80638065657f116100f2578063bc197c8111610092578063d547741f11610062578063d547741f14610547578063e38335e514610566578063f23a6e6114610579578063f27a0c92146105a4575f5ffd5b8063bc197c81146104a7578063c4c4c7b3146104d2578063c4d252f5146104f1578063d45c443514610510575f5ffd5b806391d14854116100cd57806391d1485414610423578063a217fddf14610442578063b08e51c014610455578063b1c5f42714610488575f5ffd5b80638065657f146103c55780638f2a0bb0146103e45780638f61f4f514610403575f5ffd5b80632ab0f5291161015d57806336568abe1161013857806336568abe1461033c578063584b153e1461035b57806364d623531461037a5780637958004c14610399575f5ffd5b80632ab0f529146102df5780632f2ff15d146102fe57806331d507501461031d575f5ffd5b8063134008d311610198578063134008d31461024b57806313bc9f201461025e578063150b7a021461027d578063248a9ca3146102c0575f5ffd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f5ffd5b366101c457005b5f5ffd5b3480156101d3575f5ffd5b506101e76101e2366004611468565b6105d7565b005b3480156101f4575f5ffd5b506102086102033660046114d6565b610698565b60405190151581526020015b60405180910390f35b348015610228575f5ffd5b5061023d5f516020611dbb5f395f51905f5281565b604051908152602001610214565b6101e76102593660046114fd565b6106a8565b348015610269575f5ffd5b50610208610278366004611563565b610747565b348015610288575f5ffd5b506102a7610297366004611629565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610214565b3480156102cb575f5ffd5b5061023d6102da366004611563565b61076c565b3480156102ea575f5ffd5b506102086102f9366004611563565b61078c565b348015610309575f5ffd5b506101e761031836600461168c565b610794565b348015610328575f5ffd5b50610208610337366004611563565b6107b6565b348015610347575f5ffd5b506101e761035636600461168c565b6107da565b348015610366575f5ffd5b50610208610375366004611563565b610812565b348015610385575f5ffd5b506101e7610394366004611563565b610857565b3480156103a4575f5ffd5b506103b86103b3366004611563565b6108db565b60405161021491906116ca565b3480156103d0575f5ffd5b5061023d6103df3660046114fd565b61092f565b3480156103ef575f5ffd5b506101e76103fe366004611730565b61096d565b34801561040e575f5ffd5b5061023d5f516020611d9b5f395f51905f5281565b34801561042e575f5ffd5b5061020861043d36600461168c565b610ae6565b34801561044d575f5ffd5b5061023d5f81565b348015610460575f5ffd5b5061023d7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610493575f5ffd5b5061023d6104a23660046117e2565b610b1c565b3480156104b2575f5ffd5b506102a76104c1366004611918565b63bc197c8160e01b95945050505050565b3480156104dd575f5ffd5b506101e76104ec366004611a26565b610b60565b3480156104fc575f5ffd5b506101e761050b366004611563565b610c5c565b34801561051b575f5ffd5b5061023d61052a366004611563565b5f9081525f516020611d5b5f395f51905f52602052604090205490565b348015610552575f5ffd5b506101e761056136600461168c565b610d15565b6101e76105743660046117e2565b610d31565b348015610584575f5ffd5b506102a7610593366004611aa2565b63f23a6e6160e01b95945050505050565b3480156105af575f5ffd5b507f9a37c2aa9d186a0969ff8a8267bf4e07e864c2f2768f5040949e28a624fb36015461023d565b5f516020611d9b5f395f51905f526105ee81610e9f565b5f6105fd89898989898961092f565b90506106098184610eac565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161064496959493929190611b1d565b60405180910390a3831561068d57807f20fda5fd27a1ea7bf5b9567f143ac5470bb059374a27e8f67cb44f946f6d03878560405161068491815260200190565b60405180910390a25b505050505050505050565b5f6106a282610f6b565b92915050565b5f516020611dbb5f395f51905f526106c0815f610ae6565b6106ce576106ce8133610f9f565b5f6106dd88888888888861092f565b90506106e98185610fdc565b6106f58888888861102a565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161072c9493929190611b59565b60405180910390a361073d8161109e565b5050505050505050565b5f60025b610754836108db565b6003811115610765576107656116b6565b1492915050565b5f9081525f516020611d7b5f395f51905f52602052604090206001015490565b5f600361074b565b61079d8261076c565b6107a681610e9f565b6107b083836110d5565b50505050565b5f806107c1836108db565b60038111156107d2576107d26116b6565b141592915050565b6001600160a01b03811633146108035760405163334bd91960e11b815260040160405180910390fd5b61080d8282611176565b505050565b5f5f61081d836108db565b90506001816003811115610833576108336116b6565b14806108505750600281600381111561084e5761084e6116b6565b145b9392505050565b5f516020611d5b5f395f51905f52333081146108965760405163e2850c5960e01b81526001600160a01b03821660048201526024015b60405180910390fd5b600182015460408051918252602082018590527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a15060010155565b5f8181525f516020611d5b5f395f51905f526020526040812054805f0361090457505f92915050565b600181036109155750600392915050565b428111156109265750600192915050565b50600292915050565b5f86868686868660405160200161094b96959493929190611b1d565b6040516020818303038152906040528051906020012090509695505050505050565b5f516020611d9b5f395f51905f5261098481610e9f565b88871415806109935750888514155b156109c5576040516001624fcdef60e01b03198152600481018a9052602481018690526044810188905260640161088d565b5f6109d68b8b8b8b8b8b8b8b610b1c565b90506109e28184610eac565b5f5b8a811015610a975780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610a2157610a21611b8a565b9050602002016020810190610a369190611b9e565b8d8d86818110610a4857610a48611b8a565b905060200201358c8c87818110610a6157610a61611b8a565b9050602002810190610a739190611bb7565b8c8b604051610a8796959493929190611b1d565b60405180910390a36001016109e4565b508315610ad957807f20fda5fd27a1ea7bf5b9567f143ac5470bb059374a27e8f67cb44f946f6d038785604051610ad091815260200190565b60405180910390a25b5050505050505050505050565b5f9182525f516020611d7b5f395f51905f52602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f8888888888888888604051602001610b3c989796959493929190611c8d565b60405160208183030381529060405280519060200120905098975050505050505050565b5f610b696111ef565b805490915060ff600160401b82041615906001600160401b03165f81158015610b8f5750825b90505f826001600160401b03166001148015610baa5750303b155b905081158015610bb8575080155b15610bd65760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610c0057845460ff60401b1916600160401b1785555b610c0c89898989611217565b831561068d57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610c8681610e9f565b5f516020611d5b5f395f51905f52610c9d83610812565b610cd95782610cac600261122b565b610cb6600161122b565b604051635ead8eb560e01b8152600481019390935217602482015260440161088d565b5f838152602082905260408082208290555184917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a2505050565b610d1e8261076c565b610d2781610e9f565b6107b08383611176565b5f516020611dbb5f395f51905f52610d49815f610ae6565b610d5757610d578133610f9f565b8786141580610d665750878414155b15610d98576040516001624fcdef60e01b0319815260048101899052602481018590526044810187905260640161088d565b5f610da98a8a8a8a8a8a8a8a610b1c565b9050610db58185610fdc565b5f5b89811015610e89575f8b8b83818110610dd257610dd2611b8a565b9050602002016020810190610de79190611b9e565b90505f8a8a84818110610dfc57610dfc611b8a565b905060200201359050365f8a8a86818110610e1957610e19611b8a565b9050602002810190610e2b9190611bb7565b91509150610e3b8484848461102a565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b5886868686604051610e729493929190611b59565b60405180910390a350505050806001019050610db7565b50610e938161109e565b50505050505050505050565b610ea98133610f9f565b50565b5f516020611d5b5f395f51905f52610ec3836107b6565b15610ef45782610ed25f61122b565b604051635ead8eb560e01b81526004810192909252602482015260440161088d565b5f610f1d7f9a37c2aa9d186a0969ff8a8267bf4e07e864c2f2768f5040949e28a624fb36015490565b905080831015610f4a57604051635433660960e01b8152600481018490526024810182905260440161088d565b610f548342611d2c565b5f9485526020929092525060409092209190915550565b5f6001600160e01b03198216630271189760e51b14806106a257506301ffc9a760e01b6001600160e01b03198316146106a2565b610fa98282610ae6565b610fd85760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161088d565b5050565b610fe582610747565b610ff45781610ed2600261122b565b801580159061100957506110078161078c565b155b15610fd85760405163121534c360e31b81526004810182905260240161088d565b5f5f856001600160a01b0316858585604051611047929190611d4b565b5f6040518083038185875af1925050503d805f8114611081576040519150601f19603f3d011682016040523d82523d5f602084013e611086565b606091505b5091509150611095828261124d565b50505050505050565b5f516020611d5b5f395f51905f526110b582610747565b6110c45781610ed2600261122b565b5f9182526020526040902060019055565b5f5f516020611d7b5f395f51905f526110ee8484610ae6565b61116d575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556111233390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506106a2565b5f9150506106a2565b5f5f516020611d7b5f395f51905f5261118f8484610ae6565b1561116d575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506106a2565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006106a2565b61121f61128a565b6107b0848484846112b1565b5f81600381111561123e5761123e6116b6565b600160ff919091161b92915050565b6060821561125c5750806106a2565b8151156112715761126c826113e8565b6106a2565b60405163d6bda27560e01b815260040160405180910390fd5b6112926113f0565b6112af57604051631afcd79f60e31b815260040160405180910390fd5b565b6112b961128a565b5f516020611d5b5f395f51905f526112d15f306110d5565b506001600160a01b038216156112ed576112eb5f836110d5565b505b5f5b8451811015611368576113285f516020611d9b5f395f51905f5286838151811061131b5761131b611b8a565b60200260200101516110d5565b5061135f7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78386838151811061131b5761131b611b8a565b506001016112ef565b505f5b83518110156113a0576113975f516020611dbb5f395f51905f5285838151811061131b5761131b611b8a565b5060010161136b565b5060018101859055604080515f8152602081018790527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a15050505050565b805160208201fd5b5f6113f96111ef565b54600160401b900460ff16919050565b80356001600160a01b038116811461141f575f5ffd5b919050565b5f5f83601f840112611434575f5ffd5b5081356001600160401b0381111561144a575f5ffd5b602083019150836020828501011115611461575f5ffd5b9250929050565b5f5f5f5f5f5f5f60c0888a03121561147e575f5ffd5b61148788611409565b96506020880135955060408801356001600160401b038111156114a8575f5ffd5b6114b48a828b01611424565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f602082840312156114e6575f5ffd5b81356001600160e01b031981168114610850575f5ffd5b5f5f5f5f5f5f60a08789031215611512575f5ffd5b61151b87611409565b95506020870135945060408701356001600160401b0381111561153c575f5ffd5b61154889828a01611424565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611573575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156115b6576115b661157a565b604052919050565b5f82601f8301126115cd575f5ffd5b81356001600160401b038111156115e6576115e661157a565b6115f9601f8201601f191660200161158e565b81815284602083860101111561160d575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f5f5f6080858703121561163c575f5ffd5b61164585611409565b935061165360208601611409565b92506040850135915060608501356001600160401b03811115611674575f5ffd5b611680878288016115be565b91505092959194509250565b5f5f6040838503121561169d575f5ffd5b823591506116ad60208401611409565b90509250929050565b634e487b7160e01b5f52602160045260245ffd5b60208101600483106116ea57634e487b7160e01b5f52602160045260245ffd5b91905290565b5f5f83601f840112611700575f5ffd5b5081356001600160401b03811115611716575f5ffd5b6020830191508360208260051b8501011115611461575f5ffd5b5f5f5f5f5f5f5f5f5f60c08a8c031215611748575f5ffd5b89356001600160401b0381111561175d575f5ffd5b6117698c828d016116f0565b909a5098505060208a01356001600160401b03811115611787575f5ffd5b6117938c828d016116f0565b90985096505060408a01356001600160401b038111156117b1575f5ffd5b6117bd8c828d016116f0565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f5f5f5f5f5f5f5f60a0898b0312156117f9575f5ffd5b88356001600160401b0381111561180e575f5ffd5b61181a8b828c016116f0565b90995097505060208901356001600160401b03811115611838575f5ffd5b6118448b828c016116f0565b90975095505060408901356001600160401b03811115611862575f5ffd5b61186e8b828c016116f0565b999c989b509699959896976060870135966080013595509350505050565b5f6001600160401b038211156118a4576118a461157a565b5060051b60200190565b5f82601f8301126118bd575f5ffd5b81356118d06118cb8261188c565b61158e565b8082825260208201915060208360051b8601019250858311156118f1575f5ffd5b602085015b8381101561190e5780358352602092830192016118f6565b5095945050505050565b5f5f5f5f5f60a0868803121561192c