From 218af447c9669ec4b88a15004fe1591726737881 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Sat, 31 Aug 2024 15:13:37 +0700 Subject: [PATCH 01/25] add: setup files for readme --- push-docker/v01/.env | 48 + push-docker/v01/StorageV1.json | 633 +++++++++++++ push-docker/v01/ValidatorV1.json | 1161 ++++++++++++++++++++++++ push-docker/v01/validator_eth_key.json | 21 + push-docker/v02/.env | 47 + push-docker/v02/StorageV1.json | 633 +++++++++++++ push-docker/v02/ValidatorV1.json | 1161 ++++++++++++++++++++++++ push-docker/v02/validator_eth_key.json | 21 + push-docker/v03/.env | 47 + push-docker/v03/StorageV1.json | 633 +++++++++++++ push-docker/v03/ValidatorV1.json | 1161 ++++++++++++++++++++++++ push-docker/v03/validator_eth_key.json | 21 + 12 files changed, 5587 insertions(+) create mode 100644 push-docker/v01/.env create mode 100644 push-docker/v01/StorageV1.json create mode 100644 push-docker/v01/ValidatorV1.json create mode 100644 push-docker/v01/validator_eth_key.json create mode 100644 push-docker/v02/.env create mode 100644 push-docker/v02/StorageV1.json create mode 100644 push-docker/v02/ValidatorV1.json create mode 100644 push-docker/v02/validator_eth_key.json create mode 100644 push-docker/v03/.env create mode 100644 push-docker/v03/StorageV1.json create mode 100644 push-docker/v03/ValidatorV1.json create mode 100644 push-docker/v03/validator_eth_key.json diff --git a/push-docker/v01/.env b/push-docker/v01/.env new file mode 100644 index 0000000..92e1051 --- /dev/null +++ b/push-docker/v01/.env @@ -0,0 +1,48 @@ +######### ENVIRONMENT +PORT=4001 +PUSH_NODES_NET=DEV +RUNNING_ON_MACHINE=mac +LOG_LEVEL=debug + +# DATABASE +DB_HOST=localhost +DB_NAME=vnode1 +DB_USER=2roor +DB_PASS=s1mpl3 +REDIS_URL=redis://redis.local:6379 + +######### Validator +# encrypted private key file +VALIDATOR_PRIVATE_KEY_FILE=validator_eth_key.json +# ! do not store this password on DISK in production, use only as ENV var +VALIDATOR_PRIVATE_KEY_PASS=test + +VALIDATOR_RPC_ENDPOINT=http://localhost:8545 +VALIDATOR_RPC_NETWORK=1337 +# push token smart contract +VALIDATOR_PUSH_TOKEN_ADDRESS=0x5FbDB2315678afecb367f032d93F642f64180aa3 +# validator smart contract +VALIDATOR_CONTRACT_ADDRESS=0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9 +# storage smart contract +STORAGE_CONTRACT_ADDRESS=0x0165878A594ca255338adfa4d48449f69242Eb8F + +# development +# log sql +LOG_SQL_STATEMENTS=true +# no http handler starts +VALIDATOR_DISABLE_ALL_SERVICES=true +# do not fetch blockchain data +VALIDATOR_DISABLE_HISTORY_SYNC=true +# write logs +VALIDATOR_DEBUG_LOG=true +# do not validate payload +VALIDATOR_SKIP_PAYLOAD_VERIFICATION=true +# do not rate limit +VALIDATOR_SKIP_RATE_LIMITER=true +# write custom logs for every query +VALIDATOR_HTTP_LOG=true +# random tokens live forever +VALIDATOR_DISABLE_TOKEN_TIMEOUT=true +######## Validator ENDS + +BLOCK_SCHEDULE=*/15 * * * * * \ No newline at end of file diff --git a/push-docker/v01/StorageV1.json b/push-docker/v01/StorageV1.json new file mode 100644 index 0000000..fa118f3 --- /dev/null +++ b/push-docker/v01/StorageV1.json @@ -0,0 +1,633 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "StorageV1", + "sourceName": "contracts/Storage.sol", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address[]", + "name": "nodeList", + "type": "address[]" + } + ], + "name": "SNodeMappingChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "inputs": [], + "name": "MAX_NODE_ID", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "NULL_NODE", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "NULL_SHARD", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SHARD_COUNT", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress_", + "type": "address" + } + ], + "name": "addNode", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8[]", + "name": "nodeList_", + "type": "uint8[]" + }, + { + "internalType": "uint8[]", + "name": "countersMap_", + "type": "uint8[]" + } + ], + "name": "calculateAvgPerNode", + "outputs": [ + { + "internalType": "uint256", + "name": "avgPerNode_", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "demand_", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "nodeAddr_", + "type": "address[]" + } + ], + "name": "getAllNodeShards", + "outputs": [ + { + "internalType": "uint32[]", + "name": "", + "type": "uint32[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getNodeAddresses", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress_", + "type": "address" + } + ], + "name": "getNodeShardsByAddr", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint16", + "name": "protocolVersion_", + "type": "uint16" + }, + { + "internalType": "address", + "name": "validatorContract_", + "type": "address" + }, + { + "internalType": "uint8", + "name": "rfTarget_", + "type": "uint8" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "mapAddrToNodeId", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "name": "mapNodeIdToAddr", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "name": "mapNodeToShards", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nodeCount", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "nodeIdList", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "rf_", + "type": "uint8" + } + ], + "name": "overrideRf", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "protocolVersion", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress_", + "type": "address" + } + ], + "name": "removeNode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "rf", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rfChangedByAdmin", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rfTarget", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress_", + "type": "address" + }, + { + "internalType": "uint32", + "name": "bitmap_", + "type": "uint32" + } + ], + "name": "setNodeShardsByAddr", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "rfTarget_", + "type": "uint8" + } + ], + "name": "setRfTarget", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "addr_", + "type": "address" + } + ], + "name": "setValidatorContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "shuffle", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "validatorContract", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60a06040523060805234801561001457600080fd5b50608051613bac61004c600039600081816108c30152818161094801528181610b6201528181610be70152610cd10152613bac6000f3fe6080604052600436106102195760003560e01c8063893f5da91161011d578063bac506e0116100b0578063d85707d51161007f578063f143896811610064578063f143896814610667578063f2fde38b1461067c578063fe92fe861461069c57600080fd5b8063d85707d514610629578063e30c39781461064957600080fd5b8063bac506e0146105a2578063cc59a6f4146105bc578063cdf64a76146105dc578063d12be06b146105fc57600080fd5b80639fc8ded3116100ec5780639fc8ded31461051e578063a25d526f14610533578063a5129cd014610562578063b2b99ec91461058257600080fd5b8063893f5da91461048e5780638da5cb5b146104bf57806399439089146104dd5780639d95f1cc146104fe57600080fd5b806345954486116101b0578063633207ae1161017f578063715018a611610164578063715018a61461044f578063720a0fa41461046457806379ba50971461047957600080fd5b8063633207ae146104255780636da49b831461043a57600080fd5b8063459544861461039657806348570569146103c85780634f1ef286146103fd57806352d1902d1461041057600080fd5b80632e949824116101ec5780632e949824146102e657806330cdb2751461030857806333083fe6146103565780633659cfe61461037657600080fd5b806301b9e4381461021e5780631a27e21c1461026b5780632520bf041461028d5780632ae9c600146102b0575b600080fd5b34801561022a57600080fd5b506102516102393660046134d4565b60fe6020526000908152604090205463ffffffff1681565b60405163ffffffff90911681526020015b60405180910390f35b34801561027757600080fd5b5061028b6102863660046134d4565b6106bc565b005b34801561029957600080fd5b506102a261070a565b604051908152602001610262565b3480156102bc57600080fd5b50610102546102d390600160a01b900461ffff1681565b60405161ffff9091168152602001610262565b3480156102f257600080fd5b506102fb610741565b60405161026291906134ef565b34801561031457600080fd5b5061033e6103233660046134d4565b60fd602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610262565b34801561036257600080fd5b50610251610371366004613553565b61082d565b34801561038257600080fd5b5061028b610391366004613553565b6108b9565b3480156103a257600080fd5b506103b66103b136600461356e565b610a34565b60405160ff9091168152602001610262565b3480156103d457600080fd5b506103e86103e3366004613664565b610a68565b60408051928352602083019190915201610262565b61028b61040b3660046136c8565b610b58565b34801561041c57600080fd5b506102a2610cc4565b34801561043157600080fd5b506103b660fe81565b34801561044657600080fd5b5060fc546103b6565b34801561045b57600080fd5b5061028b610d89565b34801561047057600080fd5b506103b6600081565b34801561048557600080fd5b5061028b610d9d565b34801561049a57600080fd5b506103b66104a9366004613553565b60ff602081905260009182526040909120541681565b3480156104cb57600080fd5b506033546001600160a01b031661033e565b3480156104e957600080fd5b506101025461033e906001600160a01b031681565b34801561050a57600080fd5b506103b6610519366004613553565b610e28565b34801561052a57600080fd5b506103b660ff81565b34801561053f57600080fd5b5060fb5461055290610100900460ff1681565b6040519015158152602001610262565b34801561056e57600080fd5b5061028b61057d3660046134d4565b6110fc565b34801561058e57600080fd5b5061028b61059d366004613553565b61117c565b3480156105ae57600080fd5b5060fb546103b69060ff1681565b3480156105c857600080fd5b5061028b6105d736600461376e565b611537565b3480156105e857600080fd5b5061028b6105f7366004613553565b6115d5565b34801561060857600080fd5b5061061c6106173660046137ae565b611600565b604051610262919061383b565b34801561063557600080fd5b5060fb546103b69062010000900460ff1681565b34801561065557600080fd5b506065546001600160a01b031661033e565b34801561067357600080fd5b506103b6602081565b34801561068857600080fd5b5061028b610697366004613553565b6116f3565b3480156106a857600080fd5b5061028b6106b7366004613879565b611764565b6106c4611902565b60fb805462ff000019166201000060ff84169081029190911790915560fc548111156106ef575060fc545b60fb805461ffff191660ff9092169190911761010017905550565b6000610714611902565b60fb5460009061072d90610100900460ff16828061195c565b60fb805461ff001916905560ff1691505090565b60fc5460609060008167ffffffffffffffff81111561076257610762613587565b60405190808252806020026020018201604052801561078b578160200160208202803683370190505b50905060005b8281101561082657600060fc82815481106107ae576107ae6138c5565b600091825260208083208183040154601f9092166101000a90910460ff1680835260fd90915260409091205484519192506001600160a01b0316908490849081106107fb576107fb6138c5565b6001600160a01b0390921660209283029190910190910152508061081e816138f1565b915050610791565b5092915050565b6001600160a01b038116600090815260ff60208190526040822054168061089b5760405162461bcd60e51b815260206004820152600c60248201527f6e6f2073756368206e6f6465000000000000000000000000000000000000000060448201526064015b60405180910390fd5b60ff16600090815260fe602052604090205463ffffffff1692915050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036109465760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610892565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166109a17f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610a0c5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610892565b610a1581611ec3565b60408051600080825260208201909252610a3191839190611ecb565b50565b60fc8181548110610a4457600080fd5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b815160fb54600091829160ff918216918391610a869116602061390a565b905060008215610a9f57610a9a8383613937565b610aa2565b60005b90506000610ab0848461394b565b1115610ac457610ac181600161395f565b90505b6000805b8851811015610b4a576000898281518110610ae557610ae56138c5565b602002602001015190506000898260ff1681518110610b0657610b066138c5565b60200260200101519050848160ff161015610b3557610b2860ff821686613972565b610b32908561395f565b93505b50508080610b42906138f1565b915050610ac8565b509097909650945050505050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610be55760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610892565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610c407f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610cab5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610892565b610cb482611ec3565b610cc082826001611ecb565b5050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610d645760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610892565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610d91611902565b610d9b6000612070565b565b60655433906001600160a01b03168114610e1f5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610892565b610a3181612070565b610102546000906001600160a01b0316331480610e4f57506033546001600160a01b031633145b610e9b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610892565b6001600160a01b038216600090815260ff60208190526040909120541615610f055760405162461bcd60e51b815260206004820152601d60248201527f6164647265737320697320616c726561647920726567697374657265640000006044820152606401610892565b6101005460ff1615801590610f2257506101005460fe60ff909116105b610f6e5760405162461bcd60e51b815260206004820152601a60248201527f6e6f64654964203e2030202626206e6f64654964203c206d61780000000000006044820152606401610892565b610101546000908015610ffc57610101610f89600183613972565b81548110610f9957610f996138c5565b90600052602060002090602091828204019190069054906101000a900460ff169150610101805480610fcd57610fcd613985565b60019003818190600052602060002090602091828204019190066101000a81549060ff0219169055905561102b565b610100805460ff169060006110108361399b565b91906101000a81548160ff021916908360ff16021790555091505b60fc8054600181810190925560208082047f371f36870d18f32a11fea0f144b021c8b407bb50f8e0267c711123f454b963c001805460ff808816601f9095166101000a8581029082021990921691909117909155600083815260fd8352604080822080546001600160a01b038c166001600160a01b031990911681179091558252918352818120805460ff19168517905592835260fe9091528120805463ffffffff19169055906110db90612089565b90506110e98160008061195c565b50506101005460ff16925050505b919050565b611104611902565b60fc5460ff821611156111595760405162461bcd60e51b815260206004820152601b60248201527f7266206973206c696d69746564206279206e6f646520636f756e7400000000006044820152606401610892565b60fb805461010060ff9390931661ffff19909116179190911762ff000019169055565b610102546001600160a01b03163314806111a057506033546001600160a01b031633145b6111ec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610892565b6001600160a01b038116600090815260ff60208181526040832054610101805460018101825594529083047f109ea3cebb188b9c1b9fc5bb3920be60dfdc8699098dff92f3d80daaca747689018054601f9094166101000a918316828102929093021990931617909155806112a35760405162461bcd60e51b815260206004820152601060248201527f6e6f206164647265737320666f756e64000000000000000000000000000000006044820152606401610892565b60fc54600003611317576001600160a01b038216600090815260ff602052604090819020805460ff191690555162461bcd60e51b81526108929060040160208082526010908201527f6e6f206e6f646520696420666f756e6400000000000000000000000000000000604082015260600190565b60ff8116600090815260fe60205260408120805463ffffffff19811690915560fc5463ffffffff909116915b81811015611465578360ff1660fc8281548110611362576113626138c5565b60009182526020918290209181049091015460ff601f9092166101000a9004160361145357611392600183613972565b81146114135760fc6113a5600184613972565b815481106113b5576113b56138c5565b90600052602060002090602091828204019190069054906101000a900460ff1660fc82815481106113e8576113e86138c5565b90600052602060002090602091828204019190066101000a81548160ff021916908360ff1602179055505b60fc80548061142457611424613985565b60019003818190600052602060002090602091828204019190066101000a81549060ff02191690559055611465565b8061145d816138f1565b915050611343565b5060ff8316600090815260fd6020526040812080546001600160a01b0319169055611491600019612089565b604080516001808252818301909252919250600091906020808301908036833701905050905085816000815181106114cb576114cb6138c5565b60200260200101906001600160a01b031690816001600160a01b0316815250507fb338e44b9e4e2d94df983fde422fd91ba2bd6f8182b607b50c968f8161bcf8858160405161151a91906134ef565b60405180910390a161152e8260018661195c565b50505050505050565b61153f611902565b6001600160a01b038216600090815260ff602081905260409091205416806115a95760405162461bcd60e51b815260206004820152601e60248201527f6e6f64652061646472657373206973206e6f74207265676973746572656400006044820152606401610892565b60ff16600090815260fe60205260409020805463ffffffff191663ffffffff9290921691909117905550565b6115dd611902565b61010280546001600160a01b0319166001600160a01b0392909216919091179055565b60606000825167ffffffffffffffff81111561161e5761161e613587565b604051908082528060200260200182016040528015611647578160200160208202803683370190505b50905060005b835181101561082657600060ff600086848151811061166e5761166e6138c5565b6020908102919091018101516001600160a01b0316825281810192909252604090810160009081205460ff1680825260fe9093522054845191925063ffffffff169081908590859081106116c4576116c46138c5565b602002602001019063ffffffff16908163ffffffff1681525050505080806116eb906138f1565b91505061164d565b6116fb611902565b606580546001600160a01b0383166001600160a01b0319909116811790915561172c6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600054610100900460ff16158080156117845750600054600160ff909116105b8061179e5750303b15801561179e575060005460ff166001145b6118105760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610892565b6000805460ff191660011790558015611833576000805461ff0019166101001790555b61183b612120565b61184361218b565b6101008054600160ff1990911617905560fb8054610102805462ff00ff199092166201000060ff871602179092557fffffffffffffffffffff0000000000000000000000000000000000000000000016600160a01b61ffff8716026001600160a01b031916176001600160a01b03851617905580156118fc576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6033546001600160a01b03163314610d9b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610892565b60008060fc8054806020026020016040519081016040528092919081815260200182805480156119c957602002820191906000526020600020906000905b825461010083900a900460ff1681526020600192830181810494850194909303909202910180841161199a5790505b505060fb549394505060ff90921691505060fe811115611a2b5760405162461bcd60e51b815260206004820152600660248201527f62616420726600000000000000000000000000000000000000000000000000006044820152606401610892565b815160ff11611a7c5760405162461bcd60e51b815260206004820152600e60248201527f626164206e6f646520636f756e740000000000000000000000000000000000006044820152606401610892565b6000805b8351811015611acc576000848281518110611a9d57611a9d6138c5565b602002602001015190508260ff168160ff161115611ab9578092505b5080611ac4816138f1565b915050611a80565b5060fe60ff821610611add57600080fd5b6000611aea8260016139ba565b60ff1667ffffffffffffffff811115611b0557611b05613587565b604051908082528060200260200182016040528015611b2e578160200160208202803683370190505b5090506000611b3e8360016139ba565b60ff1667ffffffffffffffff811115611b5957611b59613587565b604051908082528060200260200182016040528015611b82578160200160208202803683370190505b50905060005b8551811015611c59576000868281518110611ba557611ba56138c5565b6020026020010151905060018160ff161015611c035760405162461bcd60e51b815260206004820152601160248201527f6e6f6465732061726520312062617365640000000000000000000000000000006044820152606401610892565b60ff8116600081815260fe6020526040902054845163ffffffff9091169185918110611c3157611c316138c5565b63ffffffff909216602092830291909101909101525080611c51816138f1565b915050611b88565b506000611c6b868385888e8e8e6121ff565b60fc5490915015611ce5576000611c8387868561264b565b9050611c948288838688600061277a565b50600080611ca28984610a68565b90925090505b8015611ce1576000611cbc8a85888a6129a0565b90508015611cd557611cce8183613972565b9150611cdb565b50611ce1565b50611ca8565b5050505b600060015b84518160ff161015611d8a576000858260ff1681518110611d0d57611d0d6138c5565b602002602001015160ff161115611d78576000848260ff1681518110611d3557611d356138c5565b60209081029190910181015160ff8416600090815260fe9092526040909120805463ffffffff191663ffffffff8316179055905082611d738161399b565b935050505b80611d828161399b565b915050611cea565b5060008160ff1667ffffffffffffffff811115611da957611da9613587565b604051908082528060200260200182016040528015611dd2578160200160208202803683370190505b509050600060015b86518160ff161015611e7a576000878260ff1681518110611dfd57611dfd6138c5565b602002602001015160ff161115611e685760ff8116600090815260fd60205260409020546001600160a01b03168383611e35816138f1565b945081518110611e4757611e476138c5565b60200260200101906001600160a01b031690816001600160a01b0316815250505b80611e728161399b565b915050611dda565b507fb338e44b9e4e2d94df983fde422fd91ba2bd6f8182b607b50c968f8161bcf88582604051611eaa91906134ef565b60405180910390a150909b9a5050505050505050505050565b610a31611902565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611f0357611efe83612c7a565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611f5d575060408051601f3d908101601f19168201909252611f5a918101906139d3565b60015b611fcf5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610892565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146120645760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610892565b50611efe838383612d38565b606580546001600160a01b0319169055610a3181612d5d565b60fb54600090610100900460ff1680156120a95760fb805461ff00191690555b60fb5460ff1660006120bb85836139ec565b60fb5490915062010000900460ff16158015906120d9575060008112155b80156120f0575060fb5462010000900460ff168113155b80156120fe575060fc548113155b156121175760fb805460ff191660ff8316179055600192505b50909392505050565b600054610100900460ff16610d9b5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610892565b600054610100900460ff166121f65760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610892565b610d9b33612070565b6060808415801561220e575083155b15612229575050604080516000815260208101909152612640565b83156122be576040805160208082526104208201909252908082016104008036833701905050905060005b602060ff821610156122b65761226a8482612daf565b60ff1660011461227b5760ff61227d565b805b828260ff1681518110612292576122926138c5565b60ff90921660209283029190910190910152806122ae8161399b565b915050612254565b509050612640565b6122c960208761390a565b67ffffffffffffffff8111156122e1576122e1613587565b60405190808252806020026020018201604052801561230a578160200160208202803683370190505b5090506000805b8781101561237d5760005b602060ff8216101561236a57808484612334816138f1565b955081518110612346576123466138c5565b60ff90921660209283029190910190910152806123628161399b565b91505061231c565b5080612375816138f1565b915050612311565b5060005b8a518110156124fe5760008b828151811061239e5761239e6138c5565b602002602001015160ff16905060008b82815181106123bf576123bf6138c5565b6020026020010151905060005b602060ff821610156124bb576123e28282612daf565b60ff16156124a95760001960005b8751811015612439578260ff1688828151811061240f5761240f6138c5565b602002602001015160ff160361242757809150612439565b80612431816138f1565b9150506123f0565b50801961247e57600160ff83161b19831692508c848151811061245e5761245e6138c5565b6020026020010180518091906124739061399b565b60ff169052506124a7565b60ff878281518110612492576124926138c5565b602002602001019060ff16908160ff16815250505b505b806124b38161399b565b9150506123cc565b50808c83815181106124cf576124cf6138c5565b602002602001019063ffffffff16908163ffffffff1681525050505080806124f6906138f1565b915050612381565b506000805b83518110156125525760ff8016848281518110612522576125226138c5565b602002602001015160ff1603612540578161253c816138f1565b9250505b8061254a816138f1565b915050612503565b5060008184516125629190613972565b67ffffffffffffffff81111561257a5761257a613587565b6040519080825280602002602001820160405280156125a3578160200160208202803683370190505b5090506000805b85518110156126375760ff80168682815181106125c9576125c96138c5565b602002602001015160ff1614612625578581815181106125eb576125eb6138c5565b6020026020010151838381518110612605576126056138c5565b60ff9092166020928302919091019091015281612621816138f1565b9250505b8061262f816138f1565b9150506125aa565b50909450505050505b979650505050505050565b6060600061265a8460016139ba565b60ff1667ffffffffffffffff81111561267557612675613587565b60405190808252806020026020018201604052801561269e578160200160208202803683370190505b50905060005b85518110156127715760008682815181106126c1576126c16138c5565b602002602001015190506000858260ff16815181106126e2576126e26138c5565b602002602001015190506000805b602060ff82161015612730576127068382612daf565b60ff1660010361271e578161271a8161399b565b9250505b806127288161399b565b9150506126f0565b5080858460ff1681518110612747576127476138c5565b602002602001019060ff16908160ff16815250505050508080612769906138f1565b9150506126a4565b50949350505050565b6000865160000361278d57506000612996565b6127978686612dc5565b6000805b88518110156129925760008982815181106127b8576127b86138c5565b6020026020010151905060ff80168160ff16036127d55750612980565b60005b89518160ff16101561297d5760008a8260ff16815181106127fb576127fb6138c5565b6020026020010151905060008760ff1611801561283a57508660ff168a8260ff168151811061282c5761282c6138c5565b602002602001015160ff1610155b15612845575061296b565b6000898260ff168151811061285c5761285c6138c5565b6020026020010151905060006128728286612daf565b90508060ff166000036129675760ff8e8781518110612893576128936138c5565b60ff928316602091820292909201015260019086161b82178b8460ff16815181106128c0576128c06138c5565b602002602001019063ffffffff16908163ffffffff16815250508b8360ff16815181106128ef576128ef6138c5565b6020026020010180518091906129049061399b565b60ff1660ff1681525050898360ff1681518110612923576129236138c5565b6020026020010180518091906129389061399b565b60ff1660ff16815250506129528d8d8660ff166001612dec565b8661295c816138f1565b97505050505061297d565b5050505b806129758161399b565b9150506127d8565b50505b8061298a816138f1565b91505061279b565b5090505b9695505050505050565b600084516000036129b357506000612c72565b6129bd8585612dc5565b600080600187516129ce9190613972565b90506129d86134a4565b81831015612c6a5760008884815181106129f4576129f46138c5565b602002602001015190506000898481518110612a1257612a126138c5565b602002602001015190506000888360ff1681518110612a3357612a336138c5565b602002602001015119898360ff1681518110612a5157612a516138c5565b60200260200101518a8560ff1681518110612a6e57612a6e6138c5565b6020026020010151181690508063ffffffff16600014612c47576000612a94828661302a565b9050612ac58a8460ff1681518110612aae57612aae6138c5565b602002602001015182600160ff919091161b191690565b8a8460ff1681518110612ada57612ada6138c5565b602002602001019063ffffffff16908163ffffffff16815250508a8360ff1681518110612b0957612b096138c5565b602002602001018051809190612b1e90613a14565b60ff1660ff1681525050888360ff1681518110612b3d57612b3d6138c5565b602002602001018051809190612b529061399b565b60ff1660ff1681525050612b8a8a8560ff1681518110612b7457612b746138c5565b602002602001015182600160ff919091161b1790565b8a8560ff1681518110612b9f57612b9f6138c5565b602002602001019063ffffffff16908163ffffffff16815250508a8460ff1681518110612bce57612bce6138c5565b602002602001018051809190612be39061399b565b60ff1660ff1681525050888460ff1681518110612c0257612c026138c5565b602002602001018051809190612c179061399b565b60ff16905250612c2a8c8c896001612dec565b612c378c8c886000612dec565b6001975050505050505050612c72565b85612c51816138f1565b9650508480612c5f90613a31565b9550505050506129d8565b600093505050505b949350505050565b6001600160a01b0381163b612cf75760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610892565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b612d4183613152565b600082511180612d4e5750805b15611efe576118fc8383613192565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600163ffffffff831660ff83161c165b92915050565b8151600003612dd2575050565b610cc08282600060018651612de79190613972565b6131be565b818115612ec7575b6000612e018260016139ec565b12158015612e26575060018551612e189190613972565b612e238260016139ec565b13155b8015612eab57508385612e3a8360016139ec565b81518110612e4a57612e4a6138c5565b602002602001015160ff1681518110612e6557612e656138c5565b602002602001015160ff1684868581518110612e8357612e836138c5565b602002602001015160ff1681518110612e9e57612e9e6138c5565b602002602001015160ff16115b15612ec25780612eba81613a48565b915050612df4565b612f95565b6000612ed4600183613a79565b12158015612ef9575060018551612eeb9190613972565b612ef6600183613a79565b13155b8015612f7e57508385612f0d600184613a79565b81518110612f1d57612f1d6138c5565b602002602001015160ff1681518110612f3857612f386138c5565b602002602001015160ff1684868581518110612f5657612f566138c5565b602002602001015160ff1681518110612f7157612f716138c5565b602002602001015160ff16105b15612f955780612f8d81613a99565b915050612ec7565b828114613023576000858281518110612fb057612fb06138c5565b60200260200101519050858481518110612fcc57612fcc6138c5565b6020026020010151868381518110612fe657612fe66138c5565b602002602001019060ff16908160ff16815250508086858151811061300d5761300d6138c5565b602002602001019060ff16908160ff1681525050505b5050505050565b600080805b63ffffffff8516156130955760018086169003613075578084836130528161399b565b945060ff1660208110613067576130676138c5565b60ff90921660209290920201525b60018563ffffffff16901c9450808061308d9061399b565b91505061302f565b60408051426020808301919091527fff0000000000000000000000000000000000000000000000000000000000000060f885811b8216848601527fffffffff0000000000000000000000000000000000000000000000000000000060e08b901b16604185015286901b166045830152825180830360260181526046909201909252805191012060009061312c9060ff85169061394b565b9050848160ff1660208110613143576131436138c5565b60200201519695505050505050565b61315b81612c7a565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606131b78383604051806060016040528060278152602001613b506027913961339d565b9392505050565b81818082036131ce5750506118fc565b6000858760026131de8888613a79565b6131e89190613aae565b6131f290886139ec565b81518110613202576132026138c5565b602002602001015160ff168151811061321d5761321d6138c5565b602002602001015190505b818313613375575b8060ff1686888581518110613247576132476138c5565b602002602001015160ff1681518110613262576132626138c5565b602002602001015160ff161015613285578261327d81613a48565b935050613230565b85878381518110613298576132986138c5565b602002602001015160ff16815181106132b3576132b36138c5565b602002602001015160ff168160ff1610156132da57816132d281613a99565b925050613285565b818313613370578682815181106132f3576132f36138c5565b602002602001015187848151811061330d5761330d6138c5565b6020026020010151888581518110613327576133276138c5565b60200260200101898581518110613340576133406138c5565b60ff9384166020918202929092010152911690528261335e81613a48565b935050818061336c90613a99565b9250505b613228565b8185121561338957613389878787856131be565b8383121561152e5761152e878785876131be565b6060600080856001600160a01b0316856040516133ba9190613b00565b600060405180830381855af49150503d80600081146133f5576040519150601f19603f3d011682016040523d82523d6000602084013e6133fa565b606091505b5091509150612996868383876060831561347557825160000361346e576001600160a01b0385163b61346e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610892565b5081612c72565b612c72838381511561348a5781518083602001fd5b8060405162461bcd60e51b81526004016108929190613b1c565b6040518061040001604052806020906020820280368337509192915050565b803560ff811681146110f757600080fd5b6000602082840312156134e657600080fd5b6131b7826134c3565b6020808252825182820181905260009190848201906040850190845b818110156135305783516001600160a01b03168352928401929184019160010161350b565b50909695505050505050565b80356001600160a01b03811681146110f757600080fd5b60006020828403121561356557600080fd5b6131b78261353c565b60006020828403121561358057600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156135c6576135c6613587565b604052919050565b600067ffffffffffffffff8211156135e8576135e8613587565b5060051b60200190565b600082601f83011261360357600080fd5b81356020613618613613836135ce565b61359d565b82815260059290921b8401810191818101908684111561363757600080fd5b8286015b848110156136595761364c816134c3565b835291830191830161363b565b509695505050505050565b6000806040838503121561367757600080fd5b823567ffffffffffffffff8082111561368f57600080fd5b61369b868387016135f2565b935060208501359150808211156136b157600080fd5b506136be858286016135f2565b9150509250929050565b600080604083850312156136db57600080fd5b6136e48361353c565b915060208084013567ffffffffffffffff8082111561370257600080fd5b818601915086601f83011261371657600080fd5b81358181111561372857613728613587565b61373a601f8201601f1916850161359d565b9150808252878482850101111561375057600080fd5b80848401858401376000848284010152508093505050509250929050565b6000806040838503121561378157600080fd5b61378a8361353c565b9150602083013563ffffffff811681146137a357600080fd5b809150509250929050565b600060208083850312156137c157600080fd5b823567ffffffffffffffff8111156137d857600080fd5b8301601f810185136137e957600080fd5b80356137f7613613826135ce565b81815260059190911b8201830190838101908783111561381657600080fd5b928401925b828410156126405761382c8461353c565b8252928401929084019061381b565b6020808252825182820181905260009190848201906040850190845b8181101561353057835163ffffffff1683529284019291840191600101613857565b60008060006060848603121561388e57600080fd5b833561ffff811681146138a057600080fd5b92506138ae6020850161353c565b91506138bc604085016134c3565b90509250925092565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201613903576139036138db565b5060010190565b8082028115828204841417612dbf57612dbf6138db565b634e487b7160e01b600052601260045260246000fd5b60008261394657613946613921565b500490565b60008261395a5761395a613921565b500690565b80820180821115612dbf57612dbf6138db565b81810381811115612dbf57612dbf6138db565b634e487b7160e01b600052603160045260246000fd5b600060ff821660ff81036139b1576139b16138db565b60010192915050565b60ff8181168382160190811115612dbf57612dbf6138db565b6000602082840312156139e557600080fd5b5051919050565b8082018281126000831280158216821582161715613a0c57613a0c6138db565b505092915050565b600060ff821680613a2757613a276138db565b6000190192915050565b600081613a4057613a406138db565b506000190190565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613903576139036138db565b8181036000831280158383131683831282161715610826576108266138db565b6000600160ff1b8203613a4057613a406138db565b600082613abd57613abd613921565b600160ff1b821460001984141615613ad757613ad76138db565b500590565b60005b83811015613af7578181015183820152602001613adf565b50506000910152565b60008251613b12818460208701613adc565b9190910192915050565b6020815260008251806020840152613b3b816040850160208701613adc565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212208b49979b2f722eba21fe73a725f59b75c53ae7952a13f2732dd8e0c979721d1c64736f6c63430008110033", + "deployedBytecode": "0x6080604052600436106102195760003560e01c8063893f5da91161011d578063bac506e0116100b0578063d85707d51161007f578063f143896811610064578063f143896814610667578063f2fde38b1461067c578063fe92fe861461069c57600080fd5b8063d85707d514610629578063e30c39781461064957600080fd5b8063bac506e0146105a2578063cc59a6f4146105bc578063cdf64a76146105dc578063d12be06b146105fc57600080fd5b80639fc8ded3116100ec5780639fc8ded31461051e578063a25d526f14610533578063a5129cd014610562578063b2b99ec91461058257600080fd5b8063893f5da91461048e5780638da5cb5b146104bf57806399439089146104dd5780639d95f1cc146104fe57600080fd5b806345954486116101b0578063633207ae1161017f578063715018a611610164578063715018a61461044f578063720a0fa41461046457806379ba50971461047957600080fd5b8063633207ae146104255780636da49b831461043a57600080fd5b8063459544861461039657806348570569146103c85780634f1ef286146103fd57806352d1902d1461041057600080fd5b80632e949824116101ec5780632e949824146102e657806330cdb2751461030857806333083fe6146103565780633659cfe61461037657600080fd5b806301b9e4381461021e5780631a27e21c1461026b5780632520bf041461028d5780632ae9c600146102b0575b600080fd5b34801561022a57600080fd5b506102516102393660046134d4565b60fe6020526000908152604090205463ffffffff1681565b60405163ffffffff90911681526020015b60405180910390f35b34801561027757600080fd5b5061028b6102863660046134d4565b6106bc565b005b34801561029957600080fd5b506102a261070a565b604051908152602001610262565b3480156102bc57600080fd5b50610102546102d390600160a01b900461ffff1681565b60405161ffff9091168152602001610262565b3480156102f257600080fd5b506102fb610741565b60405161026291906134ef565b34801561031457600080fd5b5061033e6103233660046134d4565b60fd602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610262565b34801561036257600080fd5b50610251610371366004613553565b61082d565b34801561038257600080fd5b5061028b610391366004613553565b6108b9565b3480156103a257600080fd5b506103b66103b136600461356e565b610a34565b60405160ff9091168152602001610262565b3480156103d457600080fd5b506103e86103e3366004613664565b610a68565b60408051928352602083019190915201610262565b61028b61040b3660046136c8565b610b58565b34801561041c57600080fd5b506102a2610cc4565b34801561043157600080fd5b506103b660fe81565b34801561044657600080fd5b5060fc546103b6565b34801561045b57600080fd5b5061028b610d89565b34801561047057600080fd5b506103b6600081565b34801561048557600080fd5b5061028b610d9d565b34801561049a57600080fd5b506103b66104a9366004613553565b60ff602081905260009182526040909120541681565b3480156104cb57600080fd5b506033546001600160a01b031661033e565b3480156104e957600080fd5b506101025461033e906001600160a01b031681565b34801561050a57600080fd5b506103b6610519366004613553565b610e28565b34801561052a57600080fd5b506103b660ff81565b34801561053f57600080fd5b5060fb5461055290610100900460ff1681565b6040519015158152602001610262565b34801561056e57600080fd5b5061028b61057d3660046134d4565b6110fc565b34801561058e57600080fd5b5061028b61059d366004613553565b61117c565b3480156105ae57600080fd5b5060fb546103b69060ff1681565b3480156105c857600080fd5b5061028b6105d736600461376e565b611537565b3480156105e857600080fd5b5061028b6105f7366004613553565b6115d5565b34801561060857600080fd5b5061061c6106173660046137ae565b611600565b604051610262919061383b565b34801561063557600080fd5b5060fb546103b69062010000900460ff1681565b34801561065557600080fd5b506065546001600160a01b031661033e565b34801561067357600080fd5b506103b6602081565b34801561068857600080fd5b5061028b610697366004613553565b6116f3565b3480156106a857600080fd5b5061028b6106b7366004613879565b611764565b6106c4611902565b60fb805462ff000019166201000060ff84169081029190911790915560fc548111156106ef575060fc545b60fb805461ffff191660ff9092169190911761010017905550565b6000610714611902565b60fb5460009061072d90610100900460ff16828061195c565b60fb805461ff001916905560ff1691505090565b60fc5460609060008167ffffffffffffffff81111561076257610762613587565b60405190808252806020026020018201604052801561078b578160200160208202803683370190505b50905060005b8281101561082657600060fc82815481106107ae576107ae6138c5565b600091825260208083208183040154601f9092166101000a90910460ff1680835260fd90915260409091205484519192506001600160a01b0316908490849081106107fb576107fb6138c5565b6001600160a01b0390921660209283029190910190910152508061081e816138f1565b915050610791565b5092915050565b6001600160a01b038116600090815260ff60208190526040822054168061089b5760405162461bcd60e51b815260206004820152600c60248201527f6e6f2073756368206e6f6465000000000000000000000000000000000000000060448201526064015b60405180910390fd5b60ff16600090815260fe602052604090205463ffffffff1692915050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036109465760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610892565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166109a17f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610a0c5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610892565b610a1581611ec3565b60408051600080825260208201909252610a3191839190611ecb565b50565b60fc8181548110610a4457600080fd5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b815160fb54600091829160ff918216918391610a869116602061390a565b905060008215610a9f57610a9a8383613937565b610aa2565b60005b90506000610ab0848461394b565b1115610ac457610ac181600161395f565b90505b6000805b8851811015610b4a576000898281518110610ae557610ae56138c5565b602002602001015190506000898260ff1681518110610b0657610b066138c5565b60200260200101519050848160ff161015610b3557610b2860ff821686613972565b610b32908561395f565b93505b50508080610b42906138f1565b915050610ac8565b509097909650945050505050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610be55760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610892565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610c407f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610cab5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610892565b610cb482611ec3565b610cc082826001611ecb565b5050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610d645760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610892565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610d91611902565b610d9b6000612070565b565b60655433906001600160a01b03168114610e1f5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610892565b610a3181612070565b610102546000906001600160a01b0316331480610e4f57506033546001600160a01b031633145b610e9b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610892565b6001600160a01b038216600090815260ff60208190526040909120541615610f055760405162461bcd60e51b815260206004820152601d60248201527f6164647265737320697320616c726561647920726567697374657265640000006044820152606401610892565b6101005460ff1615801590610f2257506101005460fe60ff909116105b610f6e5760405162461bcd60e51b815260206004820152601a60248201527f6e6f64654964203e2030202626206e6f64654964203c206d61780000000000006044820152606401610892565b610101546000908015610ffc57610101610f89600183613972565b81548110610f9957610f996138c5565b90600052602060002090602091828204019190069054906101000a900460ff169150610101805480610fcd57610fcd613985565b60019003818190600052602060002090602091828204019190066101000a81549060ff0219169055905561102b565b610100805460ff169060006110108361399b565b91906101000a81548160ff021916908360ff16021790555091505b60fc8054600181810190925560208082047f371f36870d18f32a11fea0f144b021c8b407bb50f8e0267c711123f454b963c001805460ff808816601f9095166101000a8581029082021990921691909117909155600083815260fd8352604080822080546001600160a01b038c166001600160a01b031990911681179091558252918352818120805460ff19168517905592835260fe9091528120805463ffffffff19169055906110db90612089565b90506110e98160008061195c565b50506101005460ff16925050505b919050565b611104611902565b60fc5460ff821611156111595760405162461bcd60e51b815260206004820152601b60248201527f7266206973206c696d69746564206279206e6f646520636f756e7400000000006044820152606401610892565b60fb805461010060ff9390931661ffff19909116179190911762ff000019169055565b610102546001600160a01b03163314806111a057506033546001600160a01b031633145b6111ec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610892565b6001600160a01b038116600090815260ff60208181526040832054610101805460018101825594529083047f109ea3cebb188b9c1b9fc5bb3920be60dfdc8699098dff92f3d80daaca747689018054601f9094166101000a918316828102929093021990931617909155806112a35760405162461bcd60e51b815260206004820152601060248201527f6e6f206164647265737320666f756e64000000000000000000000000000000006044820152606401610892565b60fc54600003611317576001600160a01b038216600090815260ff602052604090819020805460ff191690555162461bcd60e51b81526108929060040160208082526010908201527f6e6f206e6f646520696420666f756e6400000000000000000000000000000000604082015260600190565b60ff8116600090815260fe60205260408120805463ffffffff19811690915560fc5463ffffffff909116915b81811015611465578360ff1660fc8281548110611362576113626138c5565b60009182526020918290209181049091015460ff601f9092166101000a9004160361145357611392600183613972565b81146114135760fc6113a5600184613972565b815481106113b5576113b56138c5565b90600052602060002090602091828204019190069054906101000a900460ff1660fc82815481106113e8576113e86138c5565b90600052602060002090602091828204019190066101000a81548160ff021916908360ff1602179055505b60fc80548061142457611424613985565b60019003818190600052602060002090602091828204019190066101000a81549060ff02191690559055611465565b8061145d816138f1565b915050611343565b5060ff8316600090815260fd6020526040812080546001600160a01b0319169055611491600019612089565b604080516001808252818301909252919250600091906020808301908036833701905050905085816000815181106114cb576114cb6138c5565b60200260200101906001600160a01b031690816001600160a01b0316815250507fb338e44b9e4e2d94df983fde422fd91ba2bd6f8182b607b50c968f8161bcf8858160405161151a91906134ef565b60405180910390a161152e8260018661195c565b50505050505050565b61153f611902565b6001600160a01b038216600090815260ff602081905260409091205416806115a95760405162461bcd60e51b815260206004820152601e60248201527f6e6f64652061646472657373206973206e6f74207265676973746572656400006044820152606401610892565b60ff16600090815260fe60205260409020805463ffffffff191663ffffffff9290921691909117905550565b6115dd611902565b61010280546001600160a01b0319166001600160a01b0392909216919091179055565b60606000825167ffffffffffffffff81111561161e5761161e613587565b604051908082528060200260200182016040528015611647578160200160208202803683370190505b50905060005b835181101561082657600060ff600086848151811061166e5761166e6138c5565b6020908102919091018101516001600160a01b0316825281810192909252604090810160009081205460ff1680825260fe9093522054845191925063ffffffff169081908590859081106116c4576116c46138c5565b602002602001019063ffffffff16908163ffffffff1681525050505080806116eb906138f1565b91505061164d565b6116fb611902565b606580546001600160a01b0383166001600160a01b0319909116811790915561172c6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600054610100900460ff16158080156117845750600054600160ff909116105b8061179e5750303b15801561179e575060005460ff166001145b6118105760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610892565b6000805460ff191660011790558015611833576000805461ff0019166101001790555b61183b612120565b61184361218b565b6101008054600160ff1990911617905560fb8054610102805462ff00ff199092166201000060ff871602179092557fffffffffffffffffffff0000000000000000000000000000000000000000000016600160a01b61ffff8716026001600160a01b031916176001600160a01b03851617905580156118fc576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6033546001600160a01b03163314610d9b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610892565b60008060fc8054806020026020016040519081016040528092919081815260200182805480156119c957602002820191906000526020600020906000905b825461010083900a900460ff1681526020600192830181810494850194909303909202910180841161199a5790505b505060fb549394505060ff90921691505060fe811115611a2b5760405162461bcd60e51b815260206004820152600660248201527f62616420726600000000000000000000000000000000000000000000000000006044820152606401610892565b815160ff11611a7c5760405162461bcd60e51b815260206004820152600e60248201527f626164206e6f646520636f756e740000000000000000000000000000000000006044820152606401610892565b6000805b8351811015611acc576000848281518110611a9d57611a9d6138c5565b602002602001015190508260ff168160ff161115611ab9578092505b5080611ac4816138f1565b915050611a80565b5060fe60ff821610611add57600080fd5b6000611aea8260016139ba565b60ff1667ffffffffffffffff811115611b0557611b05613587565b604051908082528060200260200182016040528015611b2e578160200160208202803683370190505b5090506000611b3e8360016139ba565b60ff1667ffffffffffffffff811115611b5957611b59613587565b604051908082528060200260200182016040528015611b82578160200160208202803683370190505b50905060005b8551811015611c59576000868281518110611ba557611ba56138c5565b6020026020010151905060018160ff161015611c035760405162461bcd60e51b815260206004820152601160248201527f6e6f6465732061726520312062617365640000000000000000000000000000006044820152606401610892565b60ff8116600081815260fe6020526040902054845163ffffffff9091169185918110611c3157611c316138c5565b63ffffffff909216602092830291909101909101525080611c51816138f1565b915050611b88565b506000611c6b868385888e8e8e6121ff565b60fc5490915015611ce5576000611c8387868561264b565b9050611c948288838688600061277a565b50600080611ca28984610a68565b90925090505b8015611ce1576000611cbc8a85888a6129a0565b90508015611cd557611cce8183613972565b9150611cdb565b50611ce1565b50611ca8565b5050505b600060015b84518160ff161015611d8a576000858260ff1681518110611d0d57611d0d6138c5565b602002602001015160ff161115611d78576000848260ff1681518110611d3557611d356138c5565b60209081029190910181015160ff8416600090815260fe9092526040909120805463ffffffff191663ffffffff8316179055905082611d738161399b565b935050505b80611d828161399b565b915050611cea565b5060008160ff1667ffffffffffffffff811115611da957611da9613587565b604051908082528060200260200182016040528015611dd2578160200160208202803683370190505b509050600060015b86518160ff161015611e7a576000878260ff1681518110611dfd57611dfd6138c5565b602002602001015160ff161115611e685760ff8116600090815260fd60205260409020546001600160a01b03168383611e35816138f1565b945081518110611e4757611e476138c5565b60200260200101906001600160a01b031690816001600160a01b0316815250505b80611e728161399b565b915050611dda565b507fb338e44b9e4e2d94df983fde422fd91ba2bd6f8182b607b50c968f8161bcf88582604051611eaa91906134ef565b60405180910390a150909b9a5050505050505050505050565b610a31611902565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611f0357611efe83612c7a565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611f5d575060408051601f3d908101601f19168201909252611f5a918101906139d3565b60015b611fcf5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610892565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146120645760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610892565b50611efe838383612d38565b606580546001600160a01b0319169055610a3181612d5d565b60fb54600090610100900460ff1680156120a95760fb805461ff00191690555b60fb5460ff1660006120bb85836139ec565b60fb5490915062010000900460ff16158015906120d9575060008112155b80156120f0575060fb5462010000900460ff168113155b80156120fe575060fc548113155b156121175760fb805460ff191660ff8316179055600192505b50909392505050565b600054610100900460ff16610d9b5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610892565b600054610100900460ff166121f65760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610892565b610d9b33612070565b6060808415801561220e575083155b15612229575050604080516000815260208101909152612640565b83156122be576040805160208082526104208201909252908082016104008036833701905050905060005b602060ff821610156122b65761226a8482612daf565b60ff1660011461227b5760ff61227d565b805b828260ff1681518110612292576122926138c5565b60ff90921660209283029190910190910152806122ae8161399b565b915050612254565b509050612640565b6122c960208761390a565b67ffffffffffffffff8111156122e1576122e1613587565b60405190808252806020026020018201604052801561230a578160200160208202803683370190505b5090506000805b8781101561237d5760005b602060ff8216101561236a57808484612334816138f1565b955081518110612346576123466138c5565b60ff90921660209283029190910190910152806123628161399b565b91505061231c565b5080612375816138f1565b915050612311565b5060005b8a518110156124fe5760008b828151811061239e5761239e6138c5565b602002602001015160ff16905060008b82815181106123bf576123bf6138c5565b6020026020010151905060005b602060ff821610156124bb576123e28282612daf565b60ff16156124a95760001960005b8751811015612439578260ff1688828151811061240f5761240f6138c5565b602002602001015160ff160361242757809150612439565b80612431816138f1565b9150506123f0565b50801961247e57600160ff83161b19831692508c848151811061245e5761245e6138c5565b6020026020010180518091906124739061399b565b60ff169052506124a7565b60ff878281518110612492576124926138c5565b602002602001019060ff16908160ff16815250505b505b806124b38161399b565b9150506123cc565b50808c83815181106124cf576124cf6138c5565b602002602001019063ffffffff16908163ffffffff1681525050505080806124f6906138f1565b915050612381565b506000805b83518110156125525760ff8016848281518110612522576125226138c5565b602002602001015160ff1603612540578161253c816138f1565b9250505b8061254a816138f1565b915050612503565b5060008184516125629190613972565b67ffffffffffffffff81111561257a5761257a613587565b6040519080825280602002602001820160405280156125a3578160200160208202803683370190505b5090506000805b85518110156126375760ff80168682815181106125c9576125c96138c5565b602002602001015160ff1614612625578581815181106125eb576125eb6138c5565b6020026020010151838381518110612605576126056138c5565b60ff9092166020928302919091019091015281612621816138f1565b9250505b8061262f816138f1565b9150506125aa565b50909450505050505b979650505050505050565b6060600061265a8460016139ba565b60ff1667ffffffffffffffff81111561267557612675613587565b60405190808252806020026020018201604052801561269e578160200160208202803683370190505b50905060005b85518110156127715760008682815181106126c1576126c16138c5565b602002602001015190506000858260ff16815181106126e2576126e26138c5565b602002602001015190506000805b602060ff82161015612730576127068382612daf565b60ff1660010361271e578161271a8161399b565b9250505b806127288161399b565b9150506126f0565b5080858460ff1681518110612747576127476138c5565b602002602001019060ff16908160ff16815250505050508080612769906138f1565b9150506126a4565b50949350505050565b6000865160000361278d57506000612996565b6127978686612dc5565b6000805b88518110156129925760008982815181106127b8576127b86138c5565b6020026020010151905060ff80168160ff16036127d55750612980565b60005b89518160ff16101561297d5760008a8260ff16815181106127fb576127fb6138c5565b6020026020010151905060008760ff1611801561283a57508660ff168a8260ff168151811061282c5761282c6138c5565b602002602001015160ff1610155b15612845575061296b565b6000898260ff168151811061285c5761285c6138c5565b6020026020010151905060006128728286612daf565b90508060ff166000036129675760ff8e8781518110612893576128936138c5565b60ff928316602091820292909201015260019086161b82178b8460ff16815181106128c0576128c06138c5565b602002602001019063ffffffff16908163ffffffff16815250508b8360ff16815181106128ef576128ef6138c5565b6020026020010180518091906129049061399b565b60ff1660ff1681525050898360ff1681518110612923576129236138c5565b6020026020010180518091906129389061399b565b60ff1660ff16815250506129528d8d8660ff166001612dec565b8661295c816138f1565b97505050505061297d565b5050505b806129758161399b565b9150506127d8565b50505b8061298a816138f1565b91505061279b565b5090505b9695505050505050565b600084516000036129b357506000612c72565b6129bd8585612dc5565b600080600187516129ce9190613972565b90506129d86134a4565b81831015612c6a5760008884815181106129f4576129f46138c5565b602002602001015190506000898481518110612a1257612a126138c5565b602002602001015190506000888360ff1681518110612a3357612a336138c5565b602002602001015119898360ff1681518110612a5157612a516138c5565b60200260200101518a8560ff1681518110612a6e57612a6e6138c5565b6020026020010151181690508063ffffffff16600014612c47576000612a94828661302a565b9050612ac58a8460ff1681518110612aae57612aae6138c5565b602002602001015182600160ff919091161b191690565b8a8460ff1681518110612ada57612ada6138c5565b602002602001019063ffffffff16908163ffffffff16815250508a8360ff1681518110612b0957612b096138c5565b602002602001018051809190612b1e90613a14565b60ff1660ff1681525050888360ff1681518110612b3d57612b3d6138c5565b602002602001018051809190612b529061399b565b60ff1660ff1681525050612b8a8a8560ff1681518110612b7457612b746138c5565b602002602001015182600160ff919091161b1790565b8a8560ff1681518110612b9f57612b9f6138c5565b602002602001019063ffffffff16908163ffffffff16815250508a8460ff1681518110612bce57612bce6138c5565b602002602001018051809190612be39061399b565b60ff1660ff1681525050888460ff1681518110612c0257612c026138c5565b602002602001018051809190612c179061399b565b60ff16905250612c2a8c8c896001612dec565b612c378c8c886000612dec565b6001975050505050505050612c72565b85612c51816138f1565b9650508480612c5f90613a31565b9550505050506129d8565b600093505050505b949350505050565b6001600160a01b0381163b612cf75760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610892565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b612d4183613152565b600082511180612d4e5750805b15611efe576118fc8383613192565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600163ffffffff831660ff83161c165b92915050565b8151600003612dd2575050565b610cc08282600060018651612de79190613972565b6131be565b818115612ec7575b6000612e018260016139ec565b12158015612e26575060018551612e189190613972565b612e238260016139ec565b13155b8015612eab57508385612e3a8360016139ec565b81518110612e4a57612e4a6138c5565b602002602001015160ff1681518110612e6557612e656138c5565b602002602001015160ff1684868581518110612e8357612e836138c5565b602002602001015160ff1681518110612e9e57612e9e6138c5565b602002602001015160ff16115b15612ec25780612eba81613a48565b915050612df4565b612f95565b6000612ed4600183613a79565b12158015612ef9575060018551612eeb9190613972565b612ef6600183613a79565b13155b8015612f7e57508385612f0d600184613a79565b81518110612f1d57612f1d6138c5565b602002602001015160ff1681518110612f3857612f386138c5565b602002602001015160ff1684868581518110612f5657612f566138c5565b602002602001015160ff1681518110612f7157612f716138c5565b602002602001015160ff16105b15612f955780612f8d81613a99565b915050612ec7565b828114613023576000858281518110612fb057612fb06138c5565b60200260200101519050858481518110612fcc57612fcc6138c5565b6020026020010151868381518110612fe657612fe66138c5565b602002602001019060ff16908160ff16815250508086858151811061300d5761300d6138c5565b602002602001019060ff16908160ff1681525050505b5050505050565b600080805b63ffffffff8516156130955760018086169003613075578084836130528161399b565b945060ff1660208110613067576130676138c5565b60ff90921660209290920201525b60018563ffffffff16901c9450808061308d9061399b565b91505061302f565b60408051426020808301919091527fff0000000000000000000000000000000000000000000000000000000000000060f885811b8216848601527fffffffff0000000000000000000000000000000000000000000000000000000060e08b901b16604185015286901b166045830152825180830360260181526046909201909252805191012060009061312c9060ff85169061394b565b9050848160ff1660208110613143576131436138c5565b60200201519695505050505050565b61315b81612c7a565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606131b78383604051806060016040528060278152602001613b506027913961339d565b9392505050565b81818082036131ce5750506118fc565b6000858760026131de8888613a79565b6131e89190613aae565b6131f290886139ec565b81518110613202576132026138c5565b602002602001015160ff168151811061321d5761321d6138c5565b602002602001015190505b818313613375575b8060ff1686888581518110613247576132476138c5565b602002602001015160ff1681518110613262576132626138c5565b602002602001015160ff161015613285578261327d81613a48565b935050613230565b85878381518110613298576132986138c5565b602002602001015160ff16815181106132b3576132b36138c5565b602002602001015160ff168160ff1610156132da57816132d281613a99565b925050613285565b818313613370578682815181106132f3576132f36138c5565b602002602001015187848151811061330d5761330d6138c5565b6020026020010151888581518110613327576133276138c5565b60200260200101898581518110613340576133406138c5565b60ff9384166020918202929092010152911690528261335e81613a48565b935050818061336c90613a99565b9250505b613228565b8185121561338957613389878787856131be565b8383121561152e5761152e878785876131be565b6060600080856001600160a01b0316856040516133ba9190613b00565b600060405180830381855af49150503d80600081146133f5576040519150601f19603f3d011682016040523d82523d6000602084013e6133fa565b606091505b5091509150612996868383876060831561347557825160000361346e576001600160a01b0385163b61346e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610892565b5081612c72565b612c72838381511561348a5781518083602001fd5b8060405162461bcd60e51b81526004016108929190613b1c565b6040518061040001604052806020906020820280368337509192915050565b803560ff811681146110f757600080fd5b6000602082840312156134e657600080fd5b6131b7826134c3565b6020808252825182820181905260009190848201906040850190845b818110156135305783516001600160a01b03168352928401929184019160010161350b565b50909695505050505050565b80356001600160a01b03811681146110f757600080fd5b60006020828403121561356557600080fd5b6131b78261353c565b60006020828403121561358057600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156135c6576135c6613587565b604052919050565b600067ffffffffffffffff8211156135e8576135e8613587565b5060051b60200190565b600082601f83011261360357600080fd5b81356020613618613613836135ce565b61359d565b82815260059290921b8401810191818101908684111561363757600080fd5b8286015b848110156136595761364c816134c3565b835291830191830161363b565b509695505050505050565b6000806040838503121561367757600080fd5b823567ffffffffffffffff8082111561368f57600080fd5b61369b868387016135f2565b935060208501359150808211156136b157600080fd5b506136be858286016135f2565b9150509250929050565b600080604083850312156136db57600080fd5b6136e48361353c565b915060208084013567ffffffffffffffff8082111561370257600080fd5b818601915086601f83011261371657600080fd5b81358181111561372857613728613587565b61373a601f8201601f1916850161359d565b9150808252878482850101111561375057600080fd5b80848401858401376000848284010152508093505050509250929050565b6000806040838503121561378157600080fd5b61378a8361353c565b9150602083013563ffffffff811681146137a357600080fd5b809150509250929050565b600060208083850312156137c157600080fd5b823567ffffffffffffffff8111156137d857600080fd5b8301601f810185136137e957600080fd5b80356137f7613613826135ce565b81815260059190911b8201830190838101908783111561381657600080fd5b928401925b828410156126405761382c8461353c565b8252928401929084019061381b565b6020808252825182820181905260009190848201906040850190845b8181101561353057835163ffffffff1683529284019291840191600101613857565b60008060006060848603121561388e57600080fd5b833561ffff811681146138a057600080fd5b92506138ae6020850161353c565b91506138bc604085016134c3565b90509250925092565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201613903576139036138db565b5060010190565b8082028115828204841417612dbf57612dbf6138db565b634e487b7160e01b600052601260045260246000fd5b60008261394657613946613921565b500490565b60008261395a5761395a613921565b500690565b80820180821115612dbf57612dbf6138db565b81810381811115612dbf57612dbf6138db565b634e487b7160e01b600052603160045260246000fd5b600060ff821660ff81036139b1576139b16138db565b60010192915050565b60ff8181168382160190811115612dbf57612dbf6138db565b6000602082840312156139e557600080fd5b5051919050565b8082018281126000831280158216821582161715613a0c57613a0c6138db565b505092915050565b600060ff821680613a2757613a276138db565b6000190192915050565b600081613a4057613a406138db565b506000190190565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613903576139036138db565b8181036000831280158383131683831282161715610826576108266138db565b6000600160ff1b8203613a4057613a406138db565b600082613abd57613abd613921565b600160ff1b821460001984141615613ad757613ad76138db565b500590565b60005b83811015613af7578181015183820152602001613adf565b50506000910152565b60008251613b12818460208701613adc565b9190910192915050565b6020815260008251806020840152613b3b816040850160208701613adc565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212208b49979b2f722eba21fe73a725f59b75c53ae7952a13f2732dd8e0c979721d1c64736f6c63430008110033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/push-docker/v01/ValidatorV1.json b/push-docker/v01/ValidatorV1.json new file mode 100644 index 0000000..dbecf31 --- /dev/null +++ b/push-docker/v01/ValidatorV1.json @@ -0,0 +1,1161 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ValidatorV1", + "sourceName": "contracts/Validator.sol", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint16", + "name": "valPerBlock", + "type": "uint16" + }, + { + "indexed": false, + "internalType": "uint16", + "name": "valPerBlockTarget", + "type": "uint16" + } + ], + "name": "BlockParamsUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "ownerWallet", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "nodeWallet", + "type": "address" + }, + { + "indexed": false, + "internalType": "enum ValidatorV1.NodeType", + "name": "nodeType", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "nodeTokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "nodeApiBaseUrl", + "type": "string" + } + ], + "name": "NodeAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "nodeWallet", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "reporterWallet", + "type": "address" + }, + { + "indexed": false, + "internalType": "address[]", + "name": "voters", + "type": "address[]" + }, + { + "indexed": false, + "internalType": "enum ValidatorV1.VoteAction", + "name": "voteAction", + "type": "uint8" + } + ], + "name": "NodeReported", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "nodeWallet", + "type": "address" + }, + { + "indexed": false, + "internalType": "enum ValidatorV1.NodeStatus", + "name": "nodeStatus", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "nodeTokens", + "type": "uint256" + } + ], + "name": "NodeStatusChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint16", + "name": "nodeRandomMinCount", + "type": "uint16" + }, + { + "indexed": false, + "internalType": "uint16", + "name": "nodeRandomPingCount", + "type": "uint16" + } + ], + "name": "RandomParamsUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "inputs": [], + "name": "BAN_PERCENT", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "REPORTS_BEFORE_SLASH_S", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "REPORTS_BEFORE_SLASH_V", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "REPORT_THRESHOLD_PER_BLOCK", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SLASHES_BEFORE_BAN_S", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SLASHES_BEFORE_BAN_V", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SLASH_PERCENT", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "VERSION", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "dnodes", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getActiveVNodes", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "nodeWallet", + "type": "address" + }, + { + "internalType": "string", + "name": "nodeApiBaseUrl", + "type": "string" + } + ], + "internalType": "struct ValidatorV1.ActiveValidator[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDNodes", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDNodesLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_nodeWallet", + "type": "address" + } + ], + "name": "getNodeInfo", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "ownerWallet", + "type": "address" + }, + { + "internalType": "address", + "name": "nodeWallet", + "type": "address" + }, + { + "internalType": "enum ValidatorV1.NodeType", + "name": "nodeType", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "nodeTokens", + "type": "uint256" + }, + { + "internalType": "string", + "name": "nodeApiBaseUrl", + "type": "string" + }, + { + "components": [ + { + "internalType": "uint16", + "name": "reportCounter", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "slashCounter", + "type": "uint16" + }, + { + "internalType": "uint128[]", + "name": "reportedInBlocks", + "type": "uint128[]" + }, + { + "internalType": "address[]", + "name": "reportedBy", + "type": "address[]" + }, + { + "internalType": "uint128[]", + "name": "reportedKeys", + "type": "uint128[]" + } + ], + "internalType": "struct ValidatorV1.NodeCounters", + "name": "counters", + "type": "tuple" + }, + { + "internalType": "enum ValidatorV1.NodeStatus", + "name": "status", + "type": "uint8" + } + ], + "internalType": "struct ValidatorV1.NodeInfo", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getSNodes", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getSNodesLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVNodes", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVNodesLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint16", + "name": "protocolVersion_", + "type": "uint16" + }, + { + "internalType": "address", + "name": "pushToken_", + "type": "address" + }, + { + "internalType": "uint16", + "name": "valPerBlockTarget_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "nodeRandomMinCount_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "nodeRandomPingCount_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "REPORTS_BEFORE_SLASH_V_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "REPORTS_BEFORE_SLASH_S_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "SLASHES_BEFORE_BAN_V_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "SLASHES_BEFORE_BAN_S_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "SLASH_PERCENT_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "BAN_PERCENT_", + "type": "uint16" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "minStakeD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minStakeS", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minStakeV", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "nodeMap", + "outputs": [ + { + "internalType": "address", + "name": "ownerWallet", + "type": "address" + }, + { + "internalType": "address", + "name": "nodeWallet", + "type": "address" + }, + { + "internalType": "enum ValidatorV1.NodeType", + "name": "nodeType", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "nodeTokens", + "type": "uint256" + }, + { + "internalType": "string", + "name": "nodeApiBaseUrl", + "type": "string" + }, + { + "components": [ + { + "internalType": "uint16", + "name": "reportCounter", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "slashCounter", + "type": "uint16" + }, + { + "internalType": "uint128[]", + "name": "reportedInBlocks", + "type": "uint128[]" + }, + { + "internalType": "address[]", + "name": "reportedBy", + "type": "address[]" + }, + { + "internalType": "uint128[]", + "name": "reportedKeys", + "type": "uint128[]" + } + ], + "internalType": "struct ValidatorV1.NodeCounters", + "name": "counters", + "type": "tuple" + }, + { + "internalType": "enum ValidatorV1.NodeStatus", + "name": "status", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nodeRandomMinCount", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nodeRandomPingCount", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "protocolVersion", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from_", + "type": "address" + }, + { + "internalType": "address", + "name": "to_", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount_", + "type": "uint256" + } + ], + "name": "redistributeStaked", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeTokens_", + "type": "uint256" + }, + { + "internalType": "enum ValidatorV1.NodeType", + "name": "nodeType_", + "type": "uint8" + }, + { + "internalType": "string", + "name": "nodeApiBaseUrl_", + "type": "string" + }, + { + "internalType": "address", + "name": "nodeWallet_", + "type": "address" + } + ], + "name": "registerNodeAndStake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum ValidatorV1.NodeType", + "name": "targetNodeType_", + "type": "uint8" + }, + { + "internalType": "bytes", + "name": "voteBlob_", + "type": "bytes" + }, + { + "internalType": "bytes[]", + "name": "signatures_", + "type": "bytes[]" + } + ], + "name": "reportNode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "addr_", + "type": "address" + } + ], + "name": "setStorageContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "snodes", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "storageContract", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalFees", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalStaked", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to_", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount_", + "type": "uint256" + } + ], + "name": "unstakeFees", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeWallet_", + "type": "address" + } + ], + "name": "unstakeNode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint16", + "name": "valPerBlockTarget_", + "type": "uint16" + } + ], + "name": "updateBlockParams", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint16", + "name": "nodeRandomMinCount_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "nodeRandomPingCount_", + "type": "uint16" + } + ], + "name": "updateRandomParams", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "valPerBlock", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "valPerBlockTarget", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "vnodes", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "vnodesActive", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60a06040523060805234801561001457600080fd5b50608051615c436200004d60003960008181610db901528181610e3e015281816111a80152818161122d01526113170152615c436000f3fe60806040526004361061031e5760003560e01c80637f6e29de116101a5578063bdb860ea116100ec578063e67a5d7811610095578063f6e8913d1161006f578063f6e8913d146108b2578063f7714eb9146108d7578063fdd9344c146108fe578063ffa1ad741461092057600080fd5b8063e67a5d781461085c578063f108f5b61461087c578063f2fde38b1461089257600080fd5b8063dc38b0a2116100c6578063dc38b0a214610808578063dd6f8f9014610828578063e30c39781461083e57600080fd5b8063bdb860ea146107b2578063c993d861146107c8578063ce3e7e91146107e857600080fd5b8063931127a01161014e578063adf1daa611610128578063adf1daa614610750578063b10064eb14610772578063b27b154d1461079257600080fd5b8063931127a0146106fa578063974c5b411461071b5780639c30db5c1461073057600080fd5b806384f21a441161017f57806384f21a441461069a5780638b8f631f146106bc5780638da5cb5b146106dc57600080fd5b80637f6e29de14610658578063817b1cd21461066e57806381ebc5061461068557600080fd5b80633659cfe61161026957806365cdbaea11610212578063715018a6116101ec578063715018a61461061357806379ba5097146106285780637c4981c81461063d57600080fd5b806365cdbaea146105ae5780636dcd3af2146105d75780636ddf344a146105f757600080fd5b806352d1902d1161024357806352d1902d1461054c578063569c876214610561578063582115fb1461058157600080fd5b80633659cfe6146104e65780633a688a2f146105065780634f1ef2861461053957600080fd5b80631acf7629116102cb57806324212b86116102a557806324212b86146104855780632ae9c6001461049b578063339f334b146104b657600080fd5b80631acf76291461041657806323b8ac5d1461043857806323deecfe1461046357600080fd5b8063125c6c98116102fc578063125c6c98146103b957806313114a9d146103dd57806315aa7b06146103f457600080fd5b8063011f59a014610323578063024f38cb1461035d57806311ce026714610380575b600080fd5b34801561032f57600080fd5b5060ff5461034590600160701b900461ffff1681565b60405161ffff90911681526020015b60405180910390f35b34801561036957600080fd5b5060ff5461034590640100000000900461ffff1681565b34801561038c57600080fd5b50610101546103a1906001600160a01b031681565b6040516001600160a01b039091168152602001610354565b3480156103c557600080fd5b506103cf60fc5481565b604051908152602001610354565b3480156103e957600080fd5b506103cf6101085481565b34801561040057600080fd5b50610409610976565b6040516103549190614fd2565b34801561042257600080fd5b50610436610431366004614ffa565b6109d9565b005b34801561044457600080fd5b5060ff54610345906c01000000000000000000000000900461ffff1681565b34801561046f57600080fd5b5060ff5461034590600160801b900461ffff1681565b34801561049157600080fd5b506103cf60fe5481565b3480156104a757600080fd5b5060fb546103459061ffff1681565b3480156104c257600080fd5b506104d66104d1366004615017565b610b34565b6040519015158152602001610354565b3480156104f257600080fd5b50610436610501366004614ffa565b610daf565b34801561051257600080fd5b50610526610521366004614ffa565b610f2a565b60405161035497969594939291906151a7565b6104366105473660046152d3565b61119e565b34801561055857600080fd5b506103cf61130a565b34801561056d57600080fd5b506103a161057c366004615323565b6113cf565b34801561058d57600080fd5b506105a161059c366004614ffa565b6113fa565b604051610354919061533c565b3480156105ba57600080fd5b5060ff54610345906a0100000000000000000000900461ffff1681565b3480156105e357600080fd5b506104366105f23660046153ea565b6116eb565b34801561060357600080fd5b50610103546103459061ffff1681565b34801561061f57600080fd5b50610436611b1f565b34801561063457600080fd5b50610436611b33565b34801561064957600080fd5b5060ff546103459061ffff1681565b34801561066457600080fd5b50610105546103cf565b34801561067a57600080fd5b506103cf6101075481565b34801561069157600080fd5b50610409611bbe565b3480156106a657600080fd5b506106af611c1f565b60405161035491906154b8565b3480156106c857600080fd5b506103a16106d7366004615323565b611e6e565b3480156106e857600080fd5b506033546001600160a01b03166103a1565b34801561070657600080fd5b5060ff546103459062010000900461ffff1681565b34801561072757600080fd5b50610409611e7f565b34801561073c57600080fd5b5061043661074b366004615544565b611ee0565b34801561075c57600080fd5b5060ff5461034590600160901b900461ffff1681565b34801561077e57600080fd5b5061043661078d3660046155c2565b612775565b34801561079e57600080fd5b506104366107ad3660046156bc565b612daa565b3480156107be57600080fd5b50610104546103cf565b3480156107d457600080fd5b506103a16107e3366004615323565b612e7c565b3480156107f457600080fd5b506104d66108033660046156d7565b612e8d565b34801561081457600080fd5b50610436610823366004614ffa565b61336a565b34801561083457600080fd5b506103cf60fd5481565b34801561084a57600080fd5b506065546001600160a01b03166103a1565b34801561086857600080fd5b50610436610877366004615718565b613395565b34801561088857600080fd5b50610102546103cf565b34801561089e57600080fd5b506104366108ad366004614ffa565b61346a565b3480156108be57600080fd5b5060ff54610345906601000000000000900461ffff1681565b3480156108e357600080fd5b5060ff546103459068010000000000000000900461ffff1681565b34801561090a57600080fd5b5060ff5461034590600160a01b900461ffff1681565b34801561092c57600080fd5b506109696040518060400160405280600581526020017f302e302e3200000000000000000000000000000000000000000000000000000081525081565b604051610354919061574b565b60606101058054806020026020016040519081016040528092919081815260200182805480156109cf57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109b1575b5050505050905090565b6001600160a01b038082166000908152610106602052604090206001810154909116610a4c5760405162461bcd60e51b815260206004820152601460248201527f6e6f646520646f6573206e6f742065786973747300000000000000000000000060448201526064015b60405180910390fd5b80546001600160a01b0316331480610a7d575033610a726033546001600160a01b031690565b6001600160a01b0316145b610ac95760405162461bcd60e51b815260206004820152601d60248201527f6f6e6c79206f776e65722063616e20756e7374616b652061206e6f64650000006044820152606401610a43565b610ad2816134db565b5060088101805460ff1916600490811790915560018201546040516001600160a01b03909116917ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e91610b28919060009061575e565b60405180910390a25050565b6000610b3e6137c6565b6001600160a01b038316610b945760405162461bcd60e51b815260206004820152601260248201527f696e76616c696420746f206164647265737300000000000000000000000000006044820152606401610a43565b60008211610be45760405162461bcd60e51b815260206004820152600e60248201527f696e76616c696420616d6f756e740000000000000000000000000000000000006044820152606401610a43565b610108548211158015610c7c5750610100546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610c54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c789190615779565b8211155b610cc85760405162461bcd60e51b815260206004820152601460248201527f696e73756666696369656e742062616c616e63650000000000000000000000006044820152606401610a43565b6101005460405163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529091169063a9059cbb906044016020604051808303816000875af1158015610d1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d409190615792565b610d8c5760405162461bcd60e51b815260206004820152601260248201527f6661696c656420746f207472616e7366657200000000000000000000000000006044820152606401610a43565b816101086000828254610d9f91906157ca565b9091555060019150505b92915050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610e3c5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610a43565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610e977f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610f025760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610a43565b610f0b81613820565b60408051600080825260208201909252610f2791839190613828565b50565b6101066020526000908152604090208054600182015460028301546003840180546001600160a01b039485169594841694600160a01b90940460ff16939190610f72906157dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9e906157dd565b8015610feb5780601f10610fc057610100808354040283529160200191610feb565b820191906000526020600020905b815481529060010190602001808311610fce57829003601f168201915b50506040805160a08101825260048701805461ffff808216845262010000909104166020808401919091526005890180548551818402810184018752818152999a99949850929650938701945091929183018282801561109c57602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116110595790505b50505050508152602001600282018054806020026020016040519081016040528092919081815260200182805480156110fe57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116110e0575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561118857602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116111455790505b5050509190925250505060089091015460ff1687565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361122b5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610a43565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166112867f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b0316146112f15760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610a43565b6112fa82613820565b61130682826001613828565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113aa5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610a43565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b61010581815481106113e057600080fd5b6000918252602090912001546001600160a01b0316905081565b611402614db9565b6001600160a01b0382811660009081526101066020908152604091829020825160e08101845281548516815260018201549485169281019290925290929091830190600160a01b900460ff16600281111561145f5761145f615043565b600281111561147057611470615043565b81526020016002820154815260200160038201805461148e906157dd565b80601f01602080910402602001604051908101604052809291908181526020018280546114ba906157dd565b80156115075780601f106114dc57610100808354040283529160200191611507565b820191906000526020600020905b8154815290600101906020018083116114ea57829003601f168201915b50505091835250506040805160a08101825260048401805461ffff808216845262010000909104166020838101919091526005860180548551818402810184018752818152968301969495939493860193928301828280156115ba57602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116115775790505b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561161c57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116115fe575b50505050508152602001600382018054806020026020016040519081016040528092919081815260200182805480156116a657602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116116635790505b505050919092525050508152600882015460209091019060ff1660048111156116d1576116d1615043565b60048111156116e2576116e2615043565b90525092915050565b600054610100900460ff161580801561170b5750600054600160ff909116105b806117255750303b158015611725575060005460ff166001145b6117975760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a43565b6000805460ff1916600117905580156117ba576000805461ff0019166101001790555b6117c26139cd565b6117ca613a38565b60fb805461ffff191661ffff8e161790556001600160a01b038b166117ee57600080fd5b61010080546001600160a01b0319166001600160a01b038d1617905561ffff8a1661185b5760405162461bcd60e51b815260206004820152601860248201527f696e76616c69642061747465737465727320616d6f756e7400000000000000006044820152606401610a43565b60ff805461ffff808d16600160801b0271ffff00000000000000000000000000000000199092169190911790915589166118fd5760405162461bcd60e51b815260206004820152602160248201527f696e76616c6964206e6f646552616e646f6d4d696e436f756e7420616d6f756e60448201527f74000000000000000000000000000000000000000000000000000000000000006064820152608401610a43565b60ff805461ffff808c16600160901b027fffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffff9092169190911790915588166119ac5760405162461bcd60e51b815260206004820152602c60248201527f696e76616c6964206e6f646552616e646f6d46696c74657250696e677352657160448201527f756972656420616d6f756e7400000000000000000000000000000000000000006064820152608401610a43565b8760ff60146101000a81548161ffff021916908361ffff160217905550606460fc81905550606460fd81905550606460fe819055508660ff60026101000a81548161ffff021916908361ffff1602179055508560ff60046101000a81548161ffff021916908361ffff1602179055508260ff60066101000a81548161ffff021916908361ffff1602179055508460ff60086101000a81548161ffff021916908361ffff1602179055508360ff600a6101000a81548161ffff021916908361ffff1602179055508160ff600c6101000a81548161ffff021916908361ffff160217905550604260ff60006101000a81548161ffff021916908361ffff160217905550600060ff600e6101000a81548161ffff021916908361ffff1602179055508015611b11576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050505050565b611b276137c6565b611b316000613aa8565b565b60655433906001600160a01b03168114611bb55760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610a43565b610f2781613aa8565b60606101048054806020026020016040519081016040528092919081815260200182805480156109cf576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109b1575050505050905090565b60606000805b61010254811015611ca85760006101028281548110611c4657611c46615817565b60009182526020808320909101546001600160a01b03168083526101069091526040909120600881015491925090611c809060ff16613ac1565b15611c935783611c8f8161582d565b9450505b50508080611ca09061582d565b915050611c25565b5060008167ffffffffffffffff811115611cc457611cc4615214565b604051908082528060200260200182016040528015611d0a57816020015b604080518082019091526000815260606020820152815260200190600190039081611ce25790505b5090506000805b61010254811015611e655760006101028281548110611d3257611d32615817565b60009182526020808320909101546001600160a01b03168083526101069091526040909120600881015491925090611d6c9060ff16613ac1565b611d77575050611e53565b6040805180820190915260018201546001600160a01b03168152600382018054602083019190611da6906157dd565b80601f0160208091040260200160405190810160405280929190818152602001828054611dd2906157dd565b8015611e1f5780601f10611df457610100808354040283529160200191611e1f565b820191906000526020600020905b815481529060010190602001808311611e0257829003601f168201915b5050505050815250858580611e339061582d565b965081518110611e4557611e45615817565b602002602001018190525050505b80611e5d8161582d565b915050611d11565b50909392505050565b61010481815481106113e057600080fd5b60606101028054806020026020016040519081016040528092919081815260200182805480156109cf576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109b1575050505050905090565b6000836002811115611ef457611ef4615043565b03611fa65760fc54841015611f555760405162461bcd60e51b815260206004820152602160248201527f496e73756666696369656e7420636f6c6c61746572616c20666f7220564e4f446044820152604560f81b6064820152608401610a43565b61010280546001810182556000919091527f93bdaa6a4190909b7c3fbe8d42169ffe1cab19f51dfc8db24c71abf849eced4a0180546001600160a01b0319166001600160a01b03831617905561217a565b6001836002811115611fba57611fba615043565b0361206c5760fd5484101561201b5760405162461bcd60e51b815260206004820152602160248201527f496e73756666696369656e7420636f6c6c61746572616c20666f7220534e4f446044820152604560f81b6064820152608401610a43565b61010480546001810182556000919091527f4c0be60200faa20559308cb7b5a1bb3255c16cb1cab91f525b5ae7a03d02fabe0180546001600160a01b0319166001600160a01b03831617905561217a565b600283600281111561208057612080615043565b036121325760fe548410156120e15760405162461bcd60e51b815260206004820152602160248201527f496e73756666696369656e7420636f6c6c61746572616c20666f7220444e4f446044820152604560f81b6064820152608401610a43565b61010580546001810182556000919091527ffc62abc8c0fc47c2d92f5aec99bf8b60f375828e14394d89345cae11a98673710180546001600160a01b0319166001600160a01b03831617905561217a565b60405162461bcd60e51b815260206004820152601560248201527f756e737570706f72746564206e6f6465547970652000000000000000000000006044820152606401610a43565b6001600160a01b0380821660009081526101066020526040902080549091161561220c5760405162461bcd60e51b815260206004820152602560248201527f61206e6f64652077697468207075624b657920697320616c726561647920646560448201527f66696e65640000000000000000000000000000000000000000000000000000006064820152608401610a43565b841561231957610100546040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523360048201523060248201526000916001600160a01b03169063dd62ed3e90604401602060405180830381865afa15801561227b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061229f9190615779565b9050858110156123175760405162461bcd60e51b815260206004820152603260248201527f5f6e6f6465546f6b656e732063616e6e6f74206265207472616e73666572726560448201527f642c20636865636b20616c6c6f77616e636500000000000000000000000000006064820152608401610a43565b505b612321614db9565b3381526001600160a01b03831660208201526040810185600281111561234957612349615043565b9081600281111561235c5761235c615043565b90525060608101869052608081018490526001600160a01b0380841660009081526101066020908152604091829020845181549085166001600160a01b0319918216178255918501516001820180549190951692811683178555928501518594919390927fffffffffffffffffffffff00000000000000000000000000000000000000000090911617600160a01b8360028111156123fc576123fc615043565b0217905550606082015160028201556080820151600382019061241f908261588c565b5060a0820151805160048301805460208085015161ffff908116620100000263ffffffff1990931694169390931717815560408301518051919261246b92600587019290910190614e2d565b5060608201518051612487916002840191602090910190614ee5565b50608082015180516124a3916003840191602090910190614e2d565b50505060c082015160088201805460ff191660018360048111156124c9576124c9615043565b021790555050861590506125de57610100546040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018890526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015612548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256c9190615792565b6125de5760405162461bcd60e51b815260206004820152602560248201527f6661696c656420746f207472616e7366657220746f6b656e7320746f20636f6e60448201527f74726163740000000000000000000000000000000000000000000000000000006064820152608401610a43565b8561010760008282546125f1919061594c565b909155506000905085600281111561260b5761260b615043565b0361261d57612618613afb565b61271e565b600185600281111561263157612631615043565b0361271e57610101546001600160a01b031661268f5760405162461bcd60e51b815260206004820152601b60248201527f6e6f2073746f7261676520636f6e747261637420646566696e656400000000006044820152606401610a43565b610101546040517f9d95f1cc0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152909116908190639d95f1cc906024016020604051808303816000875af11580156126f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271b9190615970565b50505b826001600160a01b0316336001600160a01b03167f67bd55f864dcc77d483ff7567de0889142417ef6d0299753cfd80e4c72ddc5548789886040516127659392919061598b565b60405180910390a3505050505050565b3360009081526101066020526040902060018101546001600160a01b03166127df5760405162461bcd60e51b815260206004820152601060248201527f696e76616c6964207265706f72746572000000000000000000000000000000006044820152606401610a43565b600080835167ffffffffffffffff8111156127fc576127fc615214565b604051908082528060200260200182016040528015612825578160200160208202803683370190505b50905060005b84518110156129b457600073__$7aaf162b34d2533b02434bde51cad0c5c5$__6336de68108888858151811061286357612863615817565b60200260200101516040518363ffffffff1660e01b81526004016128889291906159b3565b602060405180830381865af41580156128a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c991906159d8565b6001600160a01b03808216600090815261010660205260409020600181015492935091166128f85750506129a2565b6000805b8681101561295157836001600160a01b031686828151811061292057612920615817565b60200260200101516001600160a01b03160361293f5760019150612951565b806129498161582d565b9150506128fc565b508015612960575050506129a2565b82858761296c8161582d565b98508151811061297e5761297e615817565b60200260200101906001600160a01b031690816001600160a01b0316815250505050505b806129ac8161582d565b91505061282b565b508351821015612a6a5760008267ffffffffffffffff8111156129d9576129d9615214565b604051908082528060200260200182016040528015612a02578160200160208202803683370190505b50905060005b83811015612a6657828181518110612a2257612a22615817565b6020026020010151828281518110612a3c57612a3c615817565b6001600160a01b039092166020928302919091019091015280612a5e8161582d565b915050612a08565b5090505b6000866002811115612a7e57612a7e615043565b03612c0957600080600087806020019051810190612a9c9190615a0c565b9194509250905060ff8316600114612af65760405162461bcd60e51b815260206004820152601c60248201527f7265706f727420616374696f6e206f6e6c7920737570706f72746564000000006044820152606401610a43565b6001600160a01b038082166000908152610106602052604090206001810154909116612b6f5760405162461bcd60e51b815260206004820152602260248201527f746172676574206e6f64652077616c6c657420646f6573206e6f742065786973604482015261747360f01b6064820152608401610a43565b60006001820154600160a01b900460ff166002811115612b9157612b91615043565b14612bde5760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220564e6f646573000000000000000000006044820152606401610a43565b612bff8460ff166002811115612bf657612bf6615043565b88878487613c61565b5050505050612da2565b6001866002811115612c1d57612c1d615043565b03612da25760008060008088806020019051810190612c3c9190615a53565b9296509094509250905060ff8416600214612c995760405162461bcd60e51b815260206004820152601c60248201527f7265706f727420616374696f6e206f6e6c7920737570706f72746564000000006044820152606401610a43565b6001600160a01b038083166000908152610106602052604090206001810154909116612d125760405162461bcd60e51b815260206004820152602260248201527f746172676574206e6f64652077616c6c657420646f6573206e6f742065786973604482015261747360f01b6064820152608401610a43565b600180820154600160a01b900460ff166002811115612d3357612d33615043565b14612d805760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220534e6f646573000000000000000000006044820152606401610a43565b611b118560ff166002811115612d9857612d98615043565b8988848887613e09565b505050505050565b612db26137c6565b6101025461ffff82161115612e095760405162461bcd60e51b815260206004820152601c60248201527f696e636f72726563742076616c506572426c6f636b5461726765745f000000006044820152606401610a43565b60ff805471ffff000000000000000000000000000000001916600160801b61ffff848116918202929092179283905560408051600160701b909404909216835260208301527f81512b84dc2b38f82b4999b5512a14df033b165371fa51776cce559212bf0a44910160405180910390a150565b61010281815481106113e057600080fd5b6000612e976137c6565b60008211612ee75760405162461bcd60e51b815260206004820152601960248201527f616d6f756e742073686f756c6420626520706f736974697665000000000000006044820152606401610a43565b826001600160a01b0316846001600160a01b031603612f6e5760405162461bcd60e51b815260206004820152602660248201527f63616e6e6f74207472616e73666572206265747765656e2073616d652061646460448201527f72657373657300000000000000000000000000000000000000000000000000006064820152608401610a43565b6001600160a01b03831615801590612f8d57506001600160a01b038416155b156130b45781610108541015612ff55760405162461bcd60e51b815260206004820152602760248201527f66726f6d206e6f64652073686f756c64206861766520656e6f75676820636f6c6044820152661b185d195c985b60ca1b6064820152608401610a43565b6001600160a01b0380841660009081526101066020526040902080549091166130605760405162461bcd60e51b815260206004820152600f60248201527f6d697373696e6720746f206e6f646500000000000000000000000000000000006044820152606401610a43565b82610108600082825461307391906157ca565b9250508190555082610107600082825461308d919061594c565b92505081905550828160020160008282546130a8919061594c565b90915550613360915050565b6001600160a01b038416158015906130d357506001600160a01b038316155b156131ef576001600160a01b0380851660009081526101066020526040902080549091166131435760405162461bcd60e51b815260206004820152601160248201527f6d697373696e672066726f6d206e6f64650000000000000000000000000000006044820152606401610a43565b82816002015410156131a75760405162461bcd60e51b815260206004820152602760248201527f66726f6d206e6f64652073686f756c64206861766520656e6f75676820636f6c6044820152661b185d195c985b60ca1b6064820152608401610a43565b828160020160008282546131bb91906157ca565b925050819055508261010760008282546131d591906157ca565b925050819055508261010860008282546130a8919061594c565b6001600160a01b03808516600090815261010660205260409020805490911661325a5760405162461bcd60e51b815260206004820152601160248201527f6d697373696e672066726f6d206e6f64650000000000000000000000000000006044820152606401610a43565b82816002015410156132be5760405162461bcd60e51b815260206004820152602760248201527f66726f6d206e6f64652073686f756c64206861766520656e6f75676820636f6c6044820152661b185d195c985b60ca1b6064820152608401610a43565b6001600160a01b0380851660009081526101066020526040902082549091166133295760405162461bcd60e51b815260206004820152600f60248201527f6d697373696e6720746f206e6f646500000000000000000000000000000000006044820152606401610a43565b8382600201600082825461333d91906157ca565b9250508190555083816002016000828254613358919061594c565b909155505050505b5060019392505050565b6133726137c6565b61010180546001600160a01b0319166001600160a01b0392909216919091179055565b61339d6137c6565b6101025461ffff8316106133b057600080fd5b6101025461ffff8216106133c357600080fd5b60ff80547fffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffff16600160901b61ffff8581169182027fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1692909217600160a01b928516928302179092556040805192835260208301919091527fcd481667fa77e513c517493174075f0471ec1fe24d57af644377cd1a2572d13d910160405180910390a15050565b6134726137c6565b606580546001600160a01b0383166001600160a01b031990911681179091556134a36033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600281015461010054825460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810184905260009392919091169063a9059cbb906044016020604051808303816000875af115801561353b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061355f9190615792565b6135d15760405162461bcd60e51b815260206004820152602560248201527f6661696c656420746f20747261736665722066756e6473206261636b20746f2060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610a43565b600083600201819055508061010760008282546135ee91906157ca565b92505081905550806101086000828254613608919061594c565b90915550600090506001840154600160a01b900460ff16600281111561363057613630615043565b0361367a57613643600584016000614f3a565b613651600684016000614f5f565b600183015461366c90610102906001600160a01b0316613fb5565b50613675613afb565b610da9565b600180840154600160a01b900460ff16600281111561369b5761369b615043565b03610da957610101546001600160a01b03166136f95760405162461bcd60e51b815260206004820152601b60248201527f6e6f2073746f7261676520636f6e747261637420646566696e656400000000006044820152606401610a43565b6101015460018401546040517fb2b99ec90000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690819063b2b99ec990602401600060405180830381600087803b15801561376057600080fd5b505af1158015613774573d6000803e3d6000fd5b5061378792505050600585016000614f3a565b613795600685016000614f5f565b6137a3600785016000614f3a565b60018401546137be90610104906001600160a01b0316613fb5565b505092915050565b6033546001600160a01b03163314611b315760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a43565b610f276137c6565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156138605761385b836140e1565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156138ba575060408051601f3d908101601f191682019092526138b791810190615779565b60015b61392c5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610a43565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146139c15760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610a43565b5061385b83838361419f565b600054610100900460ff16611b315760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610a43565b600054610100900460ff16613aa35760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610a43565b611b31335b606580546001600160a01b0319169055610f27816141ca565b60006004826004811115613ad757613ad7615043565b1480613af457506003826004811115613af257613af2615043565b145b1592915050565b6000805b61010254811015613b825760006101028281548110613b2057613b20615817565b60009182526020808320909101546001600160a01b03168083526101069091526040909120600881015491925090613b5a9060ff16613ac1565b15613b6d5783613b6981615aa9565b9450505b50508080613b7a9061582d565b915050613aff565b50610103805461ffff191661ffff83811691821790925560ff548392600160801b9091041690811015613bb3578091505b60ff5461ffff808316600160701b909204161115613bd057600080fd5b60ff5461ffff838116600160701b909204161461385b5760ff80547fffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffff16600160701b61ffff858116918202929092179092556040805192835290831660208301527f81512b84dc2b38f82b4999b5512a14df033b165371fa51776cce559212bf0a44910160405180910390a1505050565b6000806001840154600160a01b900460ff166002811115613c8457613c84615043565b14613cd15760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220564e6f646573000000000000000000006044820152606401610a43565b60ff54606490613cef9061ffff80821691600160701b900416615aca565b613cf99190615afe565b61ffff1684511015613d4d5760405162461bcd60e51b815260206004820152601460248201527f73696720636f756e7420697320746f6f206c6f770000000000000000000000006044820152606401610a43565b600883015460ff166004816004811115613d6957613d69615043565b1480613d8657506003816004811115613d8457613d84615043565b145b15613d95576000915050613e00565b613da48787868887600061421c565b60ff54600485015461ffff620100009092048216911610613dc957613dc98685614892565b60ff5460048501546801000000000000000090910461ffff908116620100009092041610613dfa57613dfa84614af0565b60009150505b95945050505050565b6000600180850154600160a01b900460ff166002811115613e2c57613e2c615043565b14613e795760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220534e6f646573000000000000000000006044820152606401610a43565b60ff54606490613e979061ffff80821691600160701b900416615aca565b613ea19190615afe565b61ffff1685511015613ef55760405162461bcd60e51b815260206004820152601460248201527f73696720636f756e7420697320746f6f206c6f770000000000000000000000006044820152606401610a43565b600884015460ff166004816004811115613f1157613f11615043565b1480613f2e57506003816004811115613f2c57613f2c615043565b145b15613f3d576000915050613fab565b613f4b88888789888861421c565b60ff54600486015461ffff6401000000009092048216911610613f7257613f728786614892565b60ff5460048601546a010000000000000000000090910461ffff908116620100009092041610613fa557613fa585614af0565b60009150505b9695505050505050565b8154600090815b818110156140d657836001600160a01b0316858281548110613fe057613fe0615817565b6000918252602090912001546001600160a01b0316036140c4576140056001836157ca565b811461408657846140176001846157ca565b8154811061402757614027615817565b9060005260206000200160009054906101000a90046001600160a01b031685828154811061405757614057615817565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b8480548061409657614096615b1f565b600082815260209020810160001990810180546001600160a01b03191690550190555060019150610da99050565b806140ce8161582d565b915050613fbc565b506000949350505050565b6001600160a01b0381163b61415e5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610a43565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6141a883614b97565b6000825111806141b55750805b1561385b576141c48383614bd7565b50505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000846004016001018054806020026020016040519081016040528092919081815260200182805480156142a157602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f0104928301926001038202915080841161425e5790505b505083519394506000925050505b81811015614343578281815181106142c9576142c9615817565b60200260200101516001600160801b0316856001600160801b0316036143315760405162461bcd60e51b815260206004820152601060248201527f626c6f636b206973206e6f74206e6577000000000000000000000000000000006044820152606401610a43565b8061433b8161582d565b9150506142af565b50600180870154600160a01b900460ff16600281111561436557614365615043565b0361453057826001600160801b03166000036143c35760405162461bcd60e51b815260206004820152601760248201527f73746f72616765206b65792069732072657175697265640000000000000000006044820152606401610a43565b60008660040160030180548060200260200160405190810160405280929190818152602001828054801561444857602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116144055790505b505083519394506000925050505b818110156144ea5782818151811061447057614470615817565b60200260200101516001600160801b0316866001600160801b0316036144d85760405162461bcd60e51b815260206004820152601660248201527f73746f72616765206b6579206973206e6f74206e6577000000000000000000006044820152606401610a43565b806144e28161582d565b915050614456565b505050600786018054600180820183556000928352602090922060028204018054929091166010026101000a6001600160801b0381810219909316928616029190911790555b60048601805461ffff1690600061454683615aa9565b825461010092830a61ffff818102199092169290911602179091556005880180546001818101835560009283526020808420600284040180549390921660100290940a6001600160801b0381810219909316928a1602919091179055600689018054604080518286028101860190915281815292945091929091908301828280156145fa57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116145dc575b505083519394506000925050505b87518110156146fe5760005b828110156146eb5783818151811061462e5761462e615817565b60200260200101516001600160a01b031689838151811061465157614651615817565b60200260200101516001600160a01b031614801561469b575060006001600160a01b031689838151811061468757614687615817565b60200260200101516001600160a01b031614155b156146d95760008983815181106146b4576146b4615817565b60200260200101906001600160a01b031690816001600160a01b0316815250506146eb565b806146e38161582d565b915050614614565b50806146f68161582d565b915050614608565b5060005b87518110156147ab57600088828151811061471f5761471f615817565b6020026020010151905060006001600160a01b0316816001600160a01b031614614798578960040160020189838151811061475c5761475c615817565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790555b50806147a38161582d565b915050614702565b506000600889015460ff1660048111156147c7576147c7615043565b036147dc5760088801805460ff191660011790555b600180890154908a01546040517f19d5f3972073c7002111a82b2a44db11e739567a002445f2e3db8ab96fe6645f92614827926001600160a01b03918216929116908b908f90615b35565b60405180910390a16001880154600889015460028a01546040516001600160a01b03909316927ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e9261487e9260ff9091169161575e565b60405180910390a250505050505050505050565b60ff5460009081906148b39084906601000000000000900461ffff16614c03565b600685018054604080516020808402820181019092528281529496509294506000939283018282801561490f57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116148f1575b5050505050905060008083118015614928575060008251115b156149d25781516149399084615b7b565b905060005b82518110156149d0576000610106600085848151811061496057614960615817565b6020908102919091018101516001600160a01b0390811683529082019290925260400160002080549092501661499657506149be565b828160020160008282546149aa919061594c565b909155506149ba905083866157ca565b9450505b806149c88161582d565b91505061493e565b505b828660020160008282546149e6919061594c565b909155506149fa9050600686016000614f5f565b6000600886015460ff166004811115614a1557614a15615043565b1480614a3957506001600886015460ff166004811115614a3757614a37615043565b145b15614a4e5760088501805460ff191660021790555b60048501805461ffff191680825562010000900461ffff16906002614a7283615aa9565b91906101000a81548161ffff021916908361ffff160217905550508460010160009054906101000a90046001600160a01b03166001600160a01b03167ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e600286604051614ae092919061575e565b60405180910390a2505050505050565b60ff546000908190614b179084906c01000000000000000000000000900461ffff16614c03565b9092509050614b25836134db565b5060048301805463ffff00001916905560088301805460ff1916600390811790915560018401546040516001600160a01b03909116917ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e91614b8a919060009061575e565b60405180910390a2505050565b614ba0816140e1565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060614bfc8383604051806060016040528060278152602001615be760279139614ca5565b9392505050565b60008060648363ffffffff161115614c5d5760405162461bcd60e51b815260206004820181905260248201527f70657263656e746167652073686f756c6420626520696e205b302c203130305d6044820152606401610a43565b60028401546064614c6e8582615b8f565b614c7e9063ffffffff1683615bb3565b614c889190615b7b565b9250614c9483826157ca565b600286018490559150509250929050565b6060600080856001600160a01b031685604051614cc29190615bca565b600060405180830381855af49150503d8060008114614cfd576040519150601f19603f3d011682016040523d82523d6000602084013e614d02565b606091505b5091509150613fab8683838760608315614d7d578251600003614d76576001600160a01b0385163b614d765760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a43565b5081614d87565b614d878383614d8f565b949350505050565b815115614d9f5781518083602001fd5b8060405162461bcd60e51b8152600401610a43919061574b565b6040805160e081018252600080825260208201819052909182019081526020016000815260200160608152602001614e216040518060a00160405280600061ffff168152602001600061ffff1681526020016060815260200160608152602001606081525090565b81526020016000905290565b82805482825590600052602060002090600101600290048101928215614ed55791602002820160005b83821115614ea057835183826101000a8154816001600160801b0302191690836001600160801b031602179055509260200192601001602081600f01049283019260010302614e56565b8015614ed35782816101000a8154906001600160801b030219169055601001602081600f01049283019260010302614ea0565b505b50614ee1929150614f79565b5090565b828054828255906000526020600020908101928215614ed5579160200282015b82811115614ed557825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614f05565b508054600082556001016002900490600052602060002090810190610f279190614f79565b5080546000825590600052602060002090810190610f2791905b5b80821115614ee15760008155600101614f7a565b600081518084526020808501945080840160005b83811015614fc75781516001600160a01b031687529582019590820190600101614fa2565b509495945050505050565b602081526000614bfc6020830184614f8e565b6001600160a01b0381168114610f2757600080fd5b60006020828403121561500c57600080fd5b8135614bfc81614fe5565b6000806040838503121561502a57600080fd5b823561503581614fe5565b946020939093013593505050565b634e487b7160e01b600052602160045260246000fd5b60038110610f2757610f27615043565b60005b8381101561508457818101518382015260200161506c565b50506000910152565b600081518084526150a5816020860160208601615069565b601f01601f19169290920160200192915050565b600081518084526020808501945080840160005b83811015614fc75781516001600160801b0316875295820195908201906001016150cd565b600061ffff8083511684526020818185015116818601526040840151915060a0604086015261512460a08601836150b9565b60608581015187830391880191909152805180835290830193506000918301905b8083101561516e5784516001600160a01b03168252938301936001929092019190830190615145565b5060808601519350868103608088015261518881856150b9565b979650505050505050565b600581106151a3576151a3615043565b9052565b6001600160a01b0388811682528716602082015260006151c687615059565b86604083015285606083015260e060808301526151e660e083018661508d565b82810360a08401526151f881866150f2565b91505061520860c0830184615193565b98975050505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561525357615253615214565b604052919050565b600067ffffffffffffffff83111561527557615275615214565b615288601f8401601f191660200161522a565b905082815283838301111561529c57600080fd5b828260208301376000602084830101529392505050565b600082601f8301126152c457600080fd5b614bfc8383356020850161525b565b600080604083850312156152e657600080fd5b82356152f181614fe5565b9150602083013567ffffffffffffffff81111561530d57600080fd5b615319858286016152b3565b9150509250929050565b60006020828403121561533557600080fd5b5035919050565b6020815260006001600160a01b0380845116602084015280602085015116604084015250604083015161536e81615059565b8060608401525060608301516080830152608083015160e060a084015261539961010084018261508d565b905060a0840151601f198483030160c08501526153b682826150f2565b91505060c08401516153cb60e0850182615193565b509392505050565b803561ffff811681146153e557600080fd5b919050565b60008060008060008060008060008060006101608c8e03121561540c57600080fd5b6154158c6153d3565b9a5060208c013561542581614fe5565b995061543360408d016153d3565b985061544160608d016153d3565b975061544f60808d016153d3565b965061545d60a08d016153d3565b955061546b60c08d016153d3565b945061547960e08d016153d3565b93506154886101008d016153d3565b92506154976101208d016153d3565b91506154a66101408d016153d3565b90509295989b509295989b9093969950565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101561552757888303603f19018552815180516001600160a01b031684528701518784018790526155148785018261508d565b95880195935050908601906001016154df565b509098975050505050505050565b8035600381106153e557600080fd5b6000806000806080858703121561555a57600080fd5b8435935061556a60208601615535565b9250604085013567ffffffffffffffff81111561558657600080fd5b8501601f8101871361559757600080fd5b6155a68782356020840161525b565b92505060608501356155b781614fe5565b939692955090935050565b6000806000606084860312156155d757600080fd5b6155e084615535565b925060208085013567ffffffffffffffff808211156155fe57600080fd5b61560a888389016152b3565b9450604087013591508082111561562057600080fd5b818701915087601f83011261563457600080fd5b81358181111561564657615646615214565b8060051b61565585820161522a565b918252838101850191858101908b84111561566f57600080fd5b86860192505b838310156156ab5782358581111561568d5760008081fd5b61569b8d89838a01016152b3565b8352509186019190860190615675565b809750505050505050509250925092565b6000602082840312156156ce57600080fd5b614bfc826153d3565b6000806000606084860312156156ec57600080fd5b83356156f781614fe5565b9250602084013561570781614fe5565b929592945050506040919091013590565b6000806040838503121561572b57600080fd5b615734836153d3565b9150615742602084016153d3565b90509250929050565b602081526000614bfc602083018461508d565b6040810161576c8285615193565b8260208301529392505050565b60006020828403121561578b57600080fd5b5051919050565b6000602082840312156157a457600080fd5b81518015158114614bfc57600080fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610da957610da96157b4565b600181811c908216806157f157607f821691505b60208210810361581157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b60006001820161583f5761583f6157b4565b5060010190565b601f82111561385b57600081815260208120601f850160051c8101602086101561586d5750805b601f850160051c820191505b81811015612da257828155600101615879565b815167ffffffffffffffff8111156158a6576158a6615214565b6158ba816158b484546157dd565b84615846565b602080601f8311600181146158ef57600084156158d75750858301515b600019600386901b1c1916600185901b178555612da2565b600085815260208120601f198616915b8281101561591e578886015182559484019460019091019084016158ff565b508582101561593c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610da957610da96157b4565b805160ff811681146153e557600080fd5b60006020828403121561598257600080fd5b614bfc8261595f565b61599484615059565b838152826020820152606060408201526000613e00606083018461508d565b6040815260006159c6604083018561508d565b8281036020840152613e00818561508d565b6000602082840312156159ea57600080fd5b8151614bfc81614fe5565b80516001600160801b03811681146153e557600080fd5b600080600060608486031215615a2157600080fd5b615a2a8461595f565b9250615a38602085016159f5565b91506040840151615a4881614fe5565b809150509250925092565b60008060008060808587031215615a6957600080fd5b615a728561595f565b9350615a80602086016159f5565b92506040850151615a9081614fe5565b9150615a9e606086016159f5565b905092959194509250565b600061ffff808316818103615ac057615ac06157b4565b6001019392505050565b61ffff8181168382160280821691908281146137be576137be6157b4565b634e487b7160e01b600052601260045260246000fd5b600061ffff80841680615b1357615b13615ae8565b92169190910492915050565b634e487b7160e01b600052603160045260246000fd5b60006001600160a01b03808716835280861660208401525060806040830152615b616080830185614f8e565b9050615b6c83615059565b82606083015295945050505050565b600082615b8a57615b8a615ae8565b500490565b63ffffffff828116828216039080821115615bac57615bac6157b4565b5092915050565b8082028115828204841417610da957610da96157b4565b60008251615bdc818460208701615069565b919091019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122019aa0081e69056404e40023f916698c2b116cb83388048dea2cf1b230e45ab7b64736f6c63430008110033", + "deployedBytecode": "0x60806040526004361061031e5760003560e01c80637f6e29de116101a5578063bdb860ea116100ec578063e67a5d7811610095578063f6e8913d1161006f578063f6e8913d146108b2578063f7714eb9146108d7578063fdd9344c146108fe578063ffa1ad741461092057600080fd5b8063e67a5d781461085c578063f108f5b61461087c578063f2fde38b1461089257600080fd5b8063dc38b0a2116100c6578063dc38b0a214610808578063dd6f8f9014610828578063e30c39781461083e57600080fd5b8063bdb860ea146107b2578063c993d861146107c8578063ce3e7e91146107e857600080fd5b8063931127a01161014e578063adf1daa611610128578063adf1daa614610750578063b10064eb14610772578063b27b154d1461079257600080fd5b8063931127a0146106fa578063974c5b411461071b5780639c30db5c1461073057600080fd5b806384f21a441161017f57806384f21a441461069a5780638b8f631f146106bc5780638da5cb5b146106dc57600080fd5b80637f6e29de14610658578063817b1cd21461066e57806381ebc5061461068557600080fd5b80633659cfe61161026957806365cdbaea11610212578063715018a6116101ec578063715018a61461061357806379ba5097146106285780637c4981c81461063d57600080fd5b806365cdbaea146105ae5780636dcd3af2146105d75780636ddf344a146105f757600080fd5b806352d1902d1161024357806352d1902d1461054c578063569c876214610561578063582115fb1461058157600080fd5b80633659cfe6146104e65780633a688a2f146105065780634f1ef2861461053957600080fd5b80631acf7629116102cb57806324212b86116102a557806324212b86146104855780632ae9c6001461049b578063339f334b146104b657600080fd5b80631acf76291461041657806323b8ac5d1461043857806323deecfe1461046357600080fd5b8063125c6c98116102fc578063125c6c98146103b957806313114a9d146103dd57806315aa7b06146103f457600080fd5b8063011f59a014610323578063024f38cb1461035d57806311ce026714610380575b600080fd5b34801561032f57600080fd5b5060ff5461034590600160701b900461ffff1681565b60405161ffff90911681526020015b60405180910390f35b34801561036957600080fd5b5060ff5461034590640100000000900461ffff1681565b34801561038c57600080fd5b50610101546103a1906001600160a01b031681565b6040516001600160a01b039091168152602001610354565b3480156103c557600080fd5b506103cf60fc5481565b604051908152602001610354565b3480156103e957600080fd5b506103cf6101085481565b34801561040057600080fd5b50610409610976565b6040516103549190614fd2565b34801561042257600080fd5b50610436610431366004614ffa565b6109d9565b005b34801561044457600080fd5b5060ff54610345906c01000000000000000000000000900461ffff1681565b34801561046f57600080fd5b5060ff5461034590600160801b900461ffff1681565b34801561049157600080fd5b506103cf60fe5481565b3480156104a757600080fd5b5060fb546103459061ffff1681565b3480156104c257600080fd5b506104d66104d1366004615017565b610b34565b6040519015158152602001610354565b3480156104f257600080fd5b50610436610501366004614ffa565b610daf565b34801561051257600080fd5b50610526610521366004614ffa565b610f2a565b60405161035497969594939291906151a7565b6104366105473660046152d3565b61119e565b34801561055857600080fd5b506103cf61130a565b34801561056d57600080fd5b506103a161057c366004615323565b6113cf565b34801561058d57600080fd5b506105a161059c366004614ffa565b6113fa565b604051610354919061533c565b3480156105ba57600080fd5b5060ff54610345906a0100000000000000000000900461ffff1681565b3480156105e357600080fd5b506104366105f23660046153ea565b6116eb565b34801561060357600080fd5b50610103546103459061ffff1681565b34801561061f57600080fd5b50610436611b1f565b34801561063457600080fd5b50610436611b33565b34801561064957600080fd5b5060ff546103459061ffff1681565b34801561066457600080fd5b50610105546103cf565b34801561067a57600080fd5b506103cf6101075481565b34801561069157600080fd5b50610409611bbe565b3480156106a657600080fd5b506106af611c1f565b60405161035491906154b8565b3480156106c857600080fd5b506103a16106d7366004615323565b611e6e565b3480156106e857600080fd5b506033546001600160a01b03166103a1565b34801561070657600080fd5b5060ff546103459062010000900461ffff1681565b34801561072757600080fd5b50610409611e7f565b34801561073c57600080fd5b5061043661074b366004615544565b611ee0565b34801561075c57600080fd5b5060ff5461034590600160901b900461ffff1681565b34801561077e57600080fd5b5061043661078d3660046155c2565b612775565b34801561079e57600080fd5b506104366107ad3660046156bc565b612daa565b3480156107be57600080fd5b50610104546103cf565b3480156107d457600080fd5b506103a16107e3366004615323565b612e7c565b3480156107f457600080fd5b506104d66108033660046156d7565b612e8d565b34801561081457600080fd5b50610436610823366004614ffa565b61336a565b34801561083457600080fd5b506103cf60fd5481565b34801561084a57600080fd5b506065546001600160a01b03166103a1565b34801561086857600080fd5b50610436610877366004615718565b613395565b34801561088857600080fd5b50610102546103cf565b34801561089e57600080fd5b506104366108ad366004614ffa565b61346a565b3480156108be57600080fd5b5060ff54610345906601000000000000900461ffff1681565b3480156108e357600080fd5b5060ff546103459068010000000000000000900461ffff1681565b34801561090a57600080fd5b5060ff5461034590600160a01b900461ffff1681565b34801561092c57600080fd5b506109696040518060400160405280600581526020017f302e302e3200000000000000000000000000000000000000000000000000000081525081565b604051610354919061574b565b60606101058054806020026020016040519081016040528092919081815260200182805480156109cf57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109b1575b5050505050905090565b6001600160a01b038082166000908152610106602052604090206001810154909116610a4c5760405162461bcd60e51b815260206004820152601460248201527f6e6f646520646f6573206e6f742065786973747300000000000000000000000060448201526064015b60405180910390fd5b80546001600160a01b0316331480610a7d575033610a726033546001600160a01b031690565b6001600160a01b0316145b610ac95760405162461bcd60e51b815260206004820152601d60248201527f6f6e6c79206f776e65722063616e20756e7374616b652061206e6f64650000006044820152606401610a43565b610ad2816134db565b5060088101805460ff1916600490811790915560018201546040516001600160a01b03909116917ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e91610b28919060009061575e565b60405180910390a25050565b6000610b3e6137c6565b6001600160a01b038316610b945760405162461bcd60e51b815260206004820152601260248201527f696e76616c696420746f206164647265737300000000000000000000000000006044820152606401610a43565b60008211610be45760405162461bcd60e51b815260206004820152600e60248201527f696e76616c696420616d6f756e740000000000000000000000000000000000006044820152606401610a43565b610108548211158015610c7c5750610100546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610c54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c789190615779565b8211155b610cc85760405162461bcd60e51b815260206004820152601460248201527f696e73756666696369656e742062616c616e63650000000000000000000000006044820152606401610a43565b6101005460405163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529091169063a9059cbb906044016020604051808303816000875af1158015610d1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d409190615792565b610d8c5760405162461bcd60e51b815260206004820152601260248201527f6661696c656420746f207472616e7366657200000000000000000000000000006044820152606401610a43565b816101086000828254610d9f91906157ca565b9091555060019150505b92915050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610e3c5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610a43565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610e977f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610f025760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610a43565b610f0b81613820565b60408051600080825260208201909252610f2791839190613828565b50565b6101066020526000908152604090208054600182015460028301546003840180546001600160a01b039485169594841694600160a01b90940460ff16939190610f72906157dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9e906157dd565b8015610feb5780601f10610fc057610100808354040283529160200191610feb565b820191906000526020600020905b815481529060010190602001808311610fce57829003601f168201915b50506040805160a08101825260048701805461ffff808216845262010000909104166020808401919091526005890180548551818402810184018752818152999a99949850929650938701945091929183018282801561109c57602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116110595790505b50505050508152602001600282018054806020026020016040519081016040528092919081815260200182805480156110fe57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116110e0575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561118857602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116111455790505b5050509190925250505060089091015460ff1687565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361122b5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610a43565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166112867f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b0316146112f15760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610a43565b6112fa82613820565b61130682826001613828565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113aa5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610a43565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b61010581815481106113e057600080fd5b6000918252602090912001546001600160a01b0316905081565b611402614db9565b6001600160a01b0382811660009081526101066020908152604091829020825160e08101845281548516815260018201549485169281019290925290929091830190600160a01b900460ff16600281111561145f5761145f615043565b600281111561147057611470615043565b81526020016002820154815260200160038201805461148e906157dd565b80601f01602080910402602001604051908101604052809291908181526020018280546114ba906157dd565b80156115075780601f106114dc57610100808354040283529160200191611507565b820191906000526020600020905b8154815290600101906020018083116114ea57829003601f168201915b50505091835250506040805160a08101825260048401805461ffff808216845262010000909104166020838101919091526005860180548551818402810184018752818152968301969495939493860193928301828280156115ba57602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116115775790505b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561161c57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116115fe575b50505050508152602001600382018054806020026020016040519081016040528092919081815260200182805480156116a657602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116116635790505b505050919092525050508152600882015460209091019060ff1660048111156116d1576116d1615043565b60048111156116e2576116e2615043565b90525092915050565b600054610100900460ff161580801561170b5750600054600160ff909116105b806117255750303b158015611725575060005460ff166001145b6117975760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a43565b6000805460ff1916600117905580156117ba576000805461ff0019166101001790555b6117c26139cd565b6117ca613a38565b60fb805461ffff191661ffff8e161790556001600160a01b038b166117ee57600080fd5b61010080546001600160a01b0319166001600160a01b038d1617905561ffff8a1661185b5760405162461bcd60e51b815260206004820152601860248201527f696e76616c69642061747465737465727320616d6f756e7400000000000000006044820152606401610a43565b60ff805461ffff808d16600160801b0271ffff00000000000000000000000000000000199092169190911790915589166118fd5760405162461bcd60e51b815260206004820152602160248201527f696e76616c6964206e6f646552616e646f6d4d696e436f756e7420616d6f756e60448201527f74000000000000000000000000000000000000000000000000000000000000006064820152608401610a43565b60ff805461ffff808c16600160901b027fffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffff9092169190911790915588166119ac5760405162461bcd60e51b815260206004820152602c60248201527f696e76616c6964206e6f646552616e646f6d46696c74657250696e677352657160448201527f756972656420616d6f756e7400000000000000000000000000000000000000006064820152608401610a43565b8760ff60146101000a81548161ffff021916908361ffff160217905550606460fc81905550606460fd81905550606460fe819055508660ff60026101000a81548161ffff021916908361ffff1602179055508560ff60046101000a81548161ffff021916908361ffff1602179055508260ff60066101000a81548161ffff021916908361ffff1602179055508460ff60086101000a81548161ffff021916908361ffff1602179055508360ff600a6101000a81548161ffff021916908361ffff1602179055508160ff600c6101000a81548161ffff021916908361ffff160217905550604260ff60006101000a81548161ffff021916908361ffff160217905550600060ff600e6101000a81548161ffff021916908361ffff1602179055508015611b11576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050505050565b611b276137c6565b611b316000613aa8565b565b60655433906001600160a01b03168114611bb55760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610a43565b610f2781613aa8565b60606101048054806020026020016040519081016040528092919081815260200182805480156109cf576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109b1575050505050905090565b60606000805b61010254811015611ca85760006101028281548110611c4657611c46615817565b60009182526020808320909101546001600160a01b03168083526101069091526040909120600881015491925090611c809060ff16613ac1565b15611c935783611c8f8161582d565b9450505b50508080611ca09061582d565b915050611c25565b5060008167ffffffffffffffff811115611cc457611cc4615214565b604051908082528060200260200182016040528015611d0a57816020015b604080518082019091526000815260606020820152815260200190600190039081611ce25790505b5090506000805b61010254811015611e655760006101028281548110611d3257611d32615817565b60009182526020808320909101546001600160a01b03168083526101069091526040909120600881015491925090611d6c9060ff16613ac1565b611d77575050611e53565b6040805180820190915260018201546001600160a01b03168152600382018054602083019190611da6906157dd565b80601f0160208091040260200160405190810160405280929190818152602001828054611dd2906157dd565b8015611e1f5780601f10611df457610100808354040283529160200191611e1f565b820191906000526020600020905b815481529060010190602001808311611e0257829003601f168201915b5050505050815250858580611e339061582d565b965081518110611e4557611e45615817565b602002602001018190525050505b80611e5d8161582d565b915050611d11565b50909392505050565b61010481815481106113e057600080fd5b60606101028054806020026020016040519081016040528092919081815260200182805480156109cf576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109b1575050505050905090565b6000836002811115611ef457611ef4615043565b03611fa65760fc54841015611f555760405162461bcd60e51b815260206004820152602160248201527f496e73756666696369656e7420636f6c6c61746572616c20666f7220564e4f446044820152604560f81b6064820152608401610a43565b61010280546001810182556000919091527f93bdaa6a4190909b7c3fbe8d42169ffe1cab19f51dfc8db24c71abf849eced4a0180546001600160a01b0319166001600160a01b03831617905561217a565b6001836002811115611fba57611fba615043565b0361206c5760fd5484101561201b5760405162461bcd60e51b815260206004820152602160248201527f496e73756666696369656e7420636f6c6c61746572616c20666f7220534e4f446044820152604560f81b6064820152608401610a43565b61010480546001810182556000919091527f4c0be60200faa20559308cb7b5a1bb3255c16cb1cab91f525b5ae7a03d02fabe0180546001600160a01b0319166001600160a01b03831617905561217a565b600283600281111561208057612080615043565b036121325760fe548410156120e15760405162461bcd60e51b815260206004820152602160248201527f496e73756666696369656e7420636f6c6c61746572616c20666f7220444e4f446044820152604560f81b6064820152608401610a43565b61010580546001810182556000919091527ffc62abc8c0fc47c2d92f5aec99bf8b60f375828e14394d89345cae11a98673710180546001600160a01b0319166001600160a01b03831617905561217a565b60405162461bcd60e51b815260206004820152601560248201527f756e737570706f72746564206e6f6465547970652000000000000000000000006044820152606401610a43565b6001600160a01b0380821660009081526101066020526040902080549091161561220c5760405162461bcd60e51b815260206004820152602560248201527f61206e6f64652077697468207075624b657920697320616c726561647920646560448201527f66696e65640000000000000000000000000000000000000000000000000000006064820152608401610a43565b841561231957610100546040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523360048201523060248201526000916001600160a01b03169063dd62ed3e90604401602060405180830381865afa15801561227b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061229f9190615779565b9050858110156123175760405162461bcd60e51b815260206004820152603260248201527f5f6e6f6465546f6b656e732063616e6e6f74206265207472616e73666572726560448201527f642c20636865636b20616c6c6f77616e636500000000000000000000000000006064820152608401610a43565b505b612321614db9565b3381526001600160a01b03831660208201526040810185600281111561234957612349615043565b9081600281111561235c5761235c615043565b90525060608101869052608081018490526001600160a01b0380841660009081526101066020908152604091829020845181549085166001600160a01b0319918216178255918501516001820180549190951692811683178555928501518594919390927fffffffffffffffffffffff00000000000000000000000000000000000000000090911617600160a01b8360028111156123fc576123fc615043565b0217905550606082015160028201556080820151600382019061241f908261588c565b5060a0820151805160048301805460208085015161ffff908116620100000263ffffffff1990931694169390931717815560408301518051919261246b92600587019290910190614e2d565b5060608201518051612487916002840191602090910190614ee5565b50608082015180516124a3916003840191602090910190614e2d565b50505060c082015160088201805460ff191660018360048111156124c9576124c9615043565b021790555050861590506125de57610100546040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018890526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015612548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256c9190615792565b6125de5760405162461bcd60e51b815260206004820152602560248201527f6661696c656420746f207472616e7366657220746f6b656e7320746f20636f6e60448201527f74726163740000000000000000000000000000000000000000000000000000006064820152608401610a43565b8561010760008282546125f1919061594c565b909155506000905085600281111561260b5761260b615043565b0361261d57612618613afb565b61271e565b600185600281111561263157612631615043565b0361271e57610101546001600160a01b031661268f5760405162461bcd60e51b815260206004820152601b60248201527f6e6f2073746f7261676520636f6e747261637420646566696e656400000000006044820152606401610a43565b610101546040517f9d95f1cc0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152909116908190639d95f1cc906024016020604051808303816000875af11580156126f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271b9190615970565b50505b826001600160a01b0316336001600160a01b03167f67bd55f864dcc77d483ff7567de0889142417ef6d0299753cfd80e4c72ddc5548789886040516127659392919061598b565b60405180910390a3505050505050565b3360009081526101066020526040902060018101546001600160a01b03166127df5760405162461bcd60e51b815260206004820152601060248201527f696e76616c6964207265706f72746572000000000000000000000000000000006044820152606401610a43565b600080835167ffffffffffffffff8111156127fc576127fc615214565b604051908082528060200260200182016040528015612825578160200160208202803683370190505b50905060005b84518110156129b457600073__$7aaf162b34d2533b02434bde51cad0c5c5$__6336de68108888858151811061286357612863615817565b60200260200101516040518363ffffffff1660e01b81526004016128889291906159b3565b602060405180830381865af41580156128a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c991906159d8565b6001600160a01b03808216600090815261010660205260409020600181015492935091166128f85750506129a2565b6000805b8681101561295157836001600160a01b031686828151811061292057612920615817565b60200260200101516001600160a01b03160361293f5760019150612951565b806129498161582d565b9150506128fc565b508015612960575050506129a2565b82858761296c8161582d565b98508151811061297e5761297e615817565b60200260200101906001600160a01b031690816001600160a01b0316815250505050505b806129ac8161582d565b91505061282b565b508351821015612a6a5760008267ffffffffffffffff8111156129d9576129d9615214565b604051908082528060200260200182016040528015612a02578160200160208202803683370190505b50905060005b83811015612a6657828181518110612a2257612a22615817565b6020026020010151828281518110612a3c57612a3c615817565b6001600160a01b039092166020928302919091019091015280612a5e8161582d565b915050612a08565b5090505b6000866002811115612a7e57612a7e615043565b03612c0957600080600087806020019051810190612a9c9190615a0c565b9194509250905060ff8316600114612af65760405162461bcd60e51b815260206004820152601c60248201527f7265706f727420616374696f6e206f6e6c7920737570706f72746564000000006044820152606401610a43565b6001600160a01b038082166000908152610106602052604090206001810154909116612b6f5760405162461bcd60e51b815260206004820152602260248201527f746172676574206e6f64652077616c6c657420646f6573206e6f742065786973604482015261747360f01b6064820152608401610a43565b60006001820154600160a01b900460ff166002811115612b9157612b91615043565b14612bde5760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220564e6f646573000000000000000000006044820152606401610a43565b612bff8460ff166002811115612bf657612bf6615043565b88878487613c61565b5050505050612da2565b6001866002811115612c1d57612c1d615043565b03612da25760008060008088806020019051810190612c3c9190615a53565b9296509094509250905060ff8416600214612c995760405162461bcd60e51b815260206004820152601c60248201527f7265706f727420616374696f6e206f6e6c7920737570706f72746564000000006044820152606401610a43565b6001600160a01b038083166000908152610106602052604090206001810154909116612d125760405162461bcd60e51b815260206004820152602260248201527f746172676574206e6f64652077616c6c657420646f6573206e6f742065786973604482015261747360f01b6064820152608401610a43565b600180820154600160a01b900460ff166002811115612d3357612d33615043565b14612d805760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220534e6f646573000000000000000000006044820152606401610a43565b611b118560ff166002811115612d9857612d98615043565b8988848887613e09565b505050505050565b612db26137c6565b6101025461ffff82161115612e095760405162461bcd60e51b815260206004820152601c60248201527f696e636f72726563742076616c506572426c6f636b5461726765745f000000006044820152606401610a43565b60ff805471ffff000000000000000000000000000000001916600160801b61ffff848116918202929092179283905560408051600160701b909404909216835260208301527f81512b84dc2b38f82b4999b5512a14df033b165371fa51776cce559212bf0a44910160405180910390a150565b61010281815481106113e057600080fd5b6000612e976137c6565b60008211612ee75760405162461bcd60e51b815260206004820152601960248201527f616d6f756e742073686f756c6420626520706f736974697665000000000000006044820152606401610a43565b826001600160a01b0316846001600160a01b031603612f6e5760405162461bcd60e51b815260206004820152602660248201527f63616e6e6f74207472616e73666572206265747765656e2073616d652061646460448201527f72657373657300000000000000000000000000000000000000000000000000006064820152608401610a43565b6001600160a01b03831615801590612f8d57506001600160a01b038416155b156130b45781610108541015612ff55760405162461bcd60e51b815260206004820152602760248201527f66726f6d206e6f64652073686f756c64206861766520656e6f75676820636f6c6044820152661b185d195c985b60ca1b6064820152608401610a43565b6001600160a01b0380841660009081526101066020526040902080549091166130605760405162461bcd60e51b815260206004820152600f60248201527f6d697373696e6720746f206e6f646500000000000000000000000000000000006044820152606401610a43565b82610108600082825461307391906157ca565b9250508190555082610107600082825461308d919061594c565b92505081905550828160020160008282546130a8919061594c565b90915550613360915050565b6001600160a01b038416158015906130d357506001600160a01b038316155b156131ef576001600160a01b0380851660009081526101066020526040902080549091166131435760405162461bcd60e51b815260206004820152601160248201527f6d697373696e672066726f6d206e6f64650000000000000000000000000000006044820152606401610a43565b82816002015410156131a75760405162461bcd60e51b815260206004820152602760248201527f66726f6d206e6f64652073686f756c64206861766520656e6f75676820636f6c6044820152661b185d195c985b60ca1b6064820152608401610a43565b828160020160008282546131bb91906157ca565b925050819055508261010760008282546131d591906157ca565b925050819055508261010860008282546130a8919061594c565b6001600160a01b03808516600090815261010660205260409020805490911661325a5760405162461bcd60e51b815260206004820152601160248201527f6d697373696e672066726f6d206e6f64650000000000000000000000000000006044820152606401610a43565b82816002015410156132be5760405162461bcd60e51b815260206004820152602760248201527f66726f6d206e6f64652073686f756c64206861766520656e6f75676820636f6c6044820152661b185d195c985b60ca1b6064820152608401610a43565b6001600160a01b0380851660009081526101066020526040902082549091166133295760405162461bcd60e51b815260206004820152600f60248201527f6d697373696e6720746f206e6f646500000000000000000000000000000000006044820152606401610a43565b8382600201600082825461333d91906157ca565b9250508190555083816002016000828254613358919061594c565b909155505050505b5060019392505050565b6133726137c6565b61010180546001600160a01b0319166001600160a01b0392909216919091179055565b61339d6137c6565b6101025461ffff8316106133b057600080fd5b6101025461ffff8216106133c357600080fd5b60ff80547fffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffff16600160901b61ffff8581169182027fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1692909217600160a01b928516928302179092556040805192835260208301919091527fcd481667fa77e513c517493174075f0471ec1fe24d57af644377cd1a2572d13d910160405180910390a15050565b6134726137c6565b606580546001600160a01b0383166001600160a01b031990911681179091556134a36033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600281015461010054825460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810184905260009392919091169063a9059cbb906044016020604051808303816000875af115801561353b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061355f9190615792565b6135d15760405162461bcd60e51b815260206004820152602560248201527f6661696c656420746f20747261736665722066756e6473206261636b20746f2060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610a43565b600083600201819055508061010760008282546135ee91906157ca565b92505081905550806101086000828254613608919061594c565b90915550600090506001840154600160a01b900460ff16600281111561363057613630615043565b0361367a57613643600584016000614f3a565b613651600684016000614f5f565b600183015461366c90610102906001600160a01b0316613fb5565b50613675613afb565b610da9565b600180840154600160a01b900460ff16600281111561369b5761369b615043565b03610da957610101546001600160a01b03166136f95760405162461bcd60e51b815260206004820152601b60248201527f6e6f2073746f7261676520636f6e747261637420646566696e656400000000006044820152606401610a43565b6101015460018401546040517fb2b99ec90000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690819063b2b99ec990602401600060405180830381600087803b15801561376057600080fd5b505af1158015613774573d6000803e3d6000fd5b5061378792505050600585016000614f3a565b613795600685016000614f5f565b6137a3600785016000614f3a565b60018401546137be90610104906001600160a01b0316613fb5565b505092915050565b6033546001600160a01b03163314611b315760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a43565b610f276137c6565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156138605761385b836140e1565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156138ba575060408051601f3d908101601f191682019092526138b791810190615779565b60015b61392c5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610a43565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146139c15760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610a43565b5061385b83838361419f565b600054610100900460ff16611b315760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610a43565b600054610100900460ff16613aa35760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610a43565b611b31335b606580546001600160a01b0319169055610f27816141ca565b60006004826004811115613ad757613ad7615043565b1480613af457506003826004811115613af257613af2615043565b145b1592915050565b6000805b61010254811015613b825760006101028281548110613b2057613b20615817565b60009182526020808320909101546001600160a01b03168083526101069091526040909120600881015491925090613b5a9060ff16613ac1565b15613b6d5783613b6981615aa9565b9450505b50508080613b7a9061582d565b915050613aff565b50610103805461ffff191661ffff83811691821790925560ff548392600160801b9091041690811015613bb3578091505b60ff5461ffff808316600160701b909204161115613bd057600080fd5b60ff5461ffff838116600160701b909204161461385b5760ff80547fffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffff16600160701b61ffff858116918202929092179092556040805192835290831660208301527f81512b84dc2b38f82b4999b5512a14df033b165371fa51776cce559212bf0a44910160405180910390a1505050565b6000806001840154600160a01b900460ff166002811115613c8457613c84615043565b14613cd15760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220564e6f646573000000000000000000006044820152606401610a43565b60ff54606490613cef9061ffff80821691600160701b900416615aca565b613cf99190615afe565b61ffff1684511015613d4d5760405162461bcd60e51b815260206004820152601460248201527f73696720636f756e7420697320746f6f206c6f770000000000000000000000006044820152606401610a43565b600883015460ff166004816004811115613d6957613d69615043565b1480613d8657506003816004811115613d8457613d84615043565b145b15613d95576000915050613e00565b613da48787868887600061421c565b60ff54600485015461ffff620100009092048216911610613dc957613dc98685614892565b60ff5460048501546801000000000000000090910461ffff908116620100009092041610613dfa57613dfa84614af0565b60009150505b95945050505050565b6000600180850154600160a01b900460ff166002811115613e2c57613e2c615043565b14613e795760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220534e6f646573000000000000000000006044820152606401610a43565b60ff54606490613e979061ffff80821691600160701b900416615aca565b613ea19190615afe565b61ffff1685511015613ef55760405162461bcd60e51b815260206004820152601460248201527f73696720636f756e7420697320746f6f206c6f770000000000000000000000006044820152606401610a43565b600884015460ff166004816004811115613f1157613f11615043565b1480613f2e57506003816004811115613f2c57613f2c615043565b145b15613f3d576000915050613fab565b613f4b88888789888861421c565b60ff54600486015461ffff6401000000009092048216911610613f7257613f728786614892565b60ff5460048601546a010000000000000000000090910461ffff908116620100009092041610613fa557613fa585614af0565b60009150505b9695505050505050565b8154600090815b818110156140d657836001600160a01b0316858281548110613fe057613fe0615817565b6000918252602090912001546001600160a01b0316036140c4576140056001836157ca565b811461408657846140176001846157ca565b8154811061402757614027615817565b9060005260206000200160009054906101000a90046001600160a01b031685828154811061405757614057615817565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b8480548061409657614096615b1f565b600082815260209020810160001990810180546001600160a01b03191690550190555060019150610da99050565b806140ce8161582d565b915050613fbc565b506000949350505050565b6001600160a01b0381163b61415e5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610a43565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6141a883614b97565b6000825111806141b55750805b1561385b576141c48383614bd7565b50505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000846004016001018054806020026020016040519081016040528092919081815260200182805480156142a157602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f0104928301926001038202915080841161425e5790505b505083519394506000925050505b81811015614343578281815181106142c9576142c9615817565b60200260200101516001600160801b0316856001600160801b0316036143315760405162461bcd60e51b815260206004820152601060248201527f626c6f636b206973206e6f74206e6577000000000000000000000000000000006044820152606401610a43565b8061433b8161582d565b9150506142af565b50600180870154600160a01b900460ff16600281111561436557614365615043565b0361453057826001600160801b03166000036143c35760405162461bcd60e51b815260206004820152601760248201527f73746f72616765206b65792069732072657175697265640000000000000000006044820152606401610a43565b60008660040160030180548060200260200160405190810160405280929190818152602001828054801561444857602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116144055790505b505083519394506000925050505b818110156144ea5782818151811061447057614470615817565b60200260200101516001600160801b0316866001600160801b0316036144d85760405162461bcd60e51b815260206004820152601660248201527f73746f72616765206b6579206973206e6f74206e6577000000000000000000006044820152606401610a43565b806144e28161582d565b915050614456565b505050600786018054600180820183556000928352602090922060028204018054929091166010026101000a6001600160801b0381810219909316928616029190911790555b60048601805461ffff1690600061454683615aa9565b825461010092830a61ffff818102199092169290911602179091556005880180546001818101835560009283526020808420600284040180549390921660100290940a6001600160801b0381810219909316928a1602919091179055600689018054604080518286028101860190915281815292945091929091908301828280156145fa57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116145dc575b505083519394506000925050505b87518110156146fe5760005b828110156146eb5783818151811061462e5761462e615817565b60200260200101516001600160a01b031689838151811061465157614651615817565b60200260200101516001600160a01b031614801561469b575060006001600160a01b031689838151811061468757614687615817565b60200260200101516001600160a01b031614155b156146d95760008983815181106146b4576146b4615817565b60200260200101906001600160a01b031690816001600160a01b0316815250506146eb565b806146e38161582d565b915050614614565b50806146f68161582d565b915050614608565b5060005b87518110156147ab57600088828151811061471f5761471f615817565b6020026020010151905060006001600160a01b0316816001600160a01b031614614798578960040160020189838151811061475c5761475c615817565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790555b50806147a38161582d565b915050614702565b506000600889015460ff1660048111156147c7576147c7615043565b036147dc5760088801805460ff191660011790555b600180890154908a01546040517f19d5f3972073c7002111a82b2a44db11e739567a002445f2e3db8ab96fe6645f92614827926001600160a01b03918216929116908b908f90615b35565b60405180910390a16001880154600889015460028a01546040516001600160a01b03909316927ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e9261487e9260ff9091169161575e565b60405180910390a250505050505050505050565b60ff5460009081906148b39084906601000000000000900461ffff16614c03565b600685018054604080516020808402820181019092528281529496509294506000939283018282801561490f57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116148f1575b5050505050905060008083118015614928575060008251115b156149d25781516149399084615b7b565b905060005b82518110156149d0576000610106600085848151811061496057614960615817565b6020908102919091018101516001600160a01b0390811683529082019290925260400160002080549092501661499657506149be565b828160020160008282546149aa919061594c565b909155506149ba905083866157ca565b9450505b806149c88161582d565b91505061493e565b505b828660020160008282546149e6919061594c565b909155506149fa9050600686016000614f5f565b6000600886015460ff166004811115614a1557614a15615043565b1480614a3957506001600886015460ff166004811115614a3757614a37615043565b145b15614a4e5760088501805460ff191660021790555b60048501805461ffff191680825562010000900461ffff16906002614a7283615aa9565b91906101000a81548161ffff021916908361ffff160217905550508460010160009054906101000a90046001600160a01b03166001600160a01b03167ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e600286604051614ae092919061575e565b60405180910390a2505050505050565b60ff546000908190614b179084906c01000000000000000000000000900461ffff16614c03565b9092509050614b25836134db565b5060048301805463ffff00001916905560088301805460ff1916600390811790915560018401546040516001600160a01b03909116917ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e91614b8a919060009061575e565b60405180910390a2505050565b614ba0816140e1565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060614bfc8383604051806060016040528060278152602001615be760279139614ca5565b9392505050565b60008060648363ffffffff161115614c5d5760405162461bcd60e51b815260206004820181905260248201527f70657263656e746167652073686f756c6420626520696e205b302c203130305d6044820152606401610a43565b60028401546064614c6e8582615b8f565b614c7e9063ffffffff1683615bb3565b614c889190615b7b565b9250614c9483826157ca565b600286018490559150509250929050565b6060600080856001600160a01b031685604051614cc29190615bca565b600060405180830381855af49150503d8060008114614cfd576040519150601f19603f3d011682016040523d82523d6000602084013e614d02565b606091505b5091509150613fab8683838760608315614d7d578251600003614d76576001600160a01b0385163b614d765760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a43565b5081614d87565b614d878383614d8f565b949350505050565b815115614d9f5781518083602001fd5b8060405162461bcd60e51b8152600401610a43919061574b565b6040805160e081018252600080825260208201819052909182019081526020016000815260200160608152602001614e216040518060a00160405280600061ffff168152602001600061ffff1681526020016060815260200160608152602001606081525090565b81526020016000905290565b82805482825590600052602060002090600101600290048101928215614ed55791602002820160005b83821115614ea057835183826101000a8154816001600160801b0302191690836001600160801b031602179055509260200192601001602081600f01049283019260010302614e56565b8015614ed35782816101000a8154906001600160801b030219169055601001602081600f01049283019260010302614ea0565b505b50614ee1929150614f79565b5090565b828054828255906000526020600020908101928215614ed5579160200282015b82811115614ed557825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614f05565b508054600082556001016002900490600052602060002090810190610f279190614f79565b5080546000825590600052602060002090810190610f2791905b5b80821115614ee15760008155600101614f7a565b600081518084526020808501945080840160005b83811015614fc75781516001600160a01b031687529582019590820190600101614fa2565b509495945050505050565b602081526000614bfc6020830184614f8e565b6001600160a01b0381168114610f2757600080fd5b60006020828403121561500c57600080fd5b8135614bfc81614fe5565b6000806040838503121561502a57600080fd5b823561503581614fe5565b946020939093013593505050565b634e487b7160e01b600052602160045260246000fd5b60038110610f2757610f27615043565b60005b8381101561508457818101518382015260200161506c565b50506000910152565b600081518084526150a5816020860160208601615069565b601f01601f19169290920160200192915050565b600081518084526020808501945080840160005b83811015614fc75781516001600160801b0316875295820195908201906001016150cd565b600061ffff8083511684526020818185015116818601526040840151915060a0604086015261512460a08601836150b9565b60608581015187830391880191909152805180835290830193506000918301905b8083101561516e5784516001600160a01b03168252938301936001929092019190830190615145565b5060808601519350868103608088015261518881856150b9565b979650505050505050565b600581106151a3576151a3615043565b9052565b6001600160a01b0388811682528716602082015260006151c687615059565b86604083015285606083015260e060808301526151e660e083018661508d565b82810360a08401526151f881866150f2565b91505061520860c0830184615193565b98975050505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561525357615253615214565b604052919050565b600067ffffffffffffffff83111561527557615275615214565b615288601f8401601f191660200161522a565b905082815283838301111561529c57600080fd5b828260208301376000602084830101529392505050565b600082601f8301126152c457600080fd5b614bfc8383356020850161525b565b600080604083850312156152e657600080fd5b82356152f181614fe5565b9150602083013567ffffffffffffffff81111561530d57600080fd5b615319858286016152b3565b9150509250929050565b60006020828403121561533557600080fd5b5035919050565b6020815260006001600160a01b0380845116602084015280602085015116604084015250604083015161536e81615059565b8060608401525060608301516080830152608083015160e060a084015261539961010084018261508d565b905060a0840151601f198483030160c08501526153b682826150f2565b91505060c08401516153cb60e0850182615193565b509392505050565b803561ffff811681146153e557600080fd5b919050565b60008060008060008060008060008060006101608c8e03121561540c57600080fd5b6154158c6153d3565b9a5060208c013561542581614fe5565b995061543360408d016153d3565b985061544160608d016153d3565b975061544f60808d016153d3565b965061545d60a08d016153d3565b955061546b60c08d016153d3565b945061547960e08d016153d3565b93506154886101008d016153d3565b92506154976101208d016153d3565b91506154a66101408d016153d3565b90509295989b509295989b9093969950565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101561552757888303603f19018552815180516001600160a01b031684528701518784018790526155148785018261508d565b95880195935050908601906001016154df565b509098975050505050505050565b8035600381106153e557600080fd5b6000806000806080858703121561555a57600080fd5b8435935061556a60208601615535565b9250604085013567ffffffffffffffff81111561558657600080fd5b8501601f8101871361559757600080fd5b6155a68782356020840161525b565b92505060608501356155b781614fe5565b939692955090935050565b6000806000606084860312156155d757600080fd5b6155e084615535565b925060208085013567ffffffffffffffff808211156155fe57600080fd5b61560a888389016152b3565b9450604087013591508082111561562057600080fd5b818701915087601f83011261563457600080fd5b81358181111561564657615646615214565b8060051b61565585820161522a565b918252838101850191858101908b84111561566f57600080fd5b86860192505b838310156156ab5782358581111561568d5760008081fd5b61569b8d89838a01016152b3565b8352509186019190860190615675565b809750505050505050509250925092565b6000602082840312156156ce57600080fd5b614bfc826153d3565b6000806000606084860312156156ec57600080fd5b83356156f781614fe5565b9250602084013561570781614fe5565b929592945050506040919091013590565b6000806040838503121561572b57600080fd5b615734836153d3565b9150615742602084016153d3565b90509250929050565b602081526000614bfc602083018461508d565b6040810161576c8285615193565b8260208301529392505050565b60006020828403121561578b57600080fd5b5051919050565b6000602082840312156157a457600080fd5b81518015158114614bfc57600080fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610da957610da96157b4565b600181811c908216806157f157607f821691505b60208210810361581157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b60006001820161583f5761583f6157b4565b5060010190565b601f82111561385b57600081815260208120601f850160051c8101602086101561586d5750805b601f850160051c820191505b81811015612da257828155600101615879565b815167ffffffffffffffff8111156158a6576158a6615214565b6158ba816158b484546157dd565b84615846565b602080601f8311600181146158ef57600084156158d75750858301515b600019600386901b1c1916600185901b178555612da2565b600085815260208120601f198616915b8281101561591e578886015182559484019460019091019084016158ff565b508582101561593c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610da957610da96157b4565b805160ff811681146153e557600080fd5b60006020828403121561598257600080fd5b614bfc8261595f565b61599484615059565b838152826020820152606060408201526000613e00606083018461508d565b6040815260006159c6604083018561508d565b8281036020840152613e00818561508d565b6000602082840312156159ea57600080fd5b8151614bfc81614fe5565b80516001600160801b03811681146153e557600080fd5b600080600060608486031215615a2157600080fd5b615a2a8461595f565b9250615a38602085016159f5565b91506040840151615a4881614fe5565b809150509250925092565b60008060008060808587031215615a6957600080fd5b615a728561595f565b9350615a80602086016159f5565b92506040850151615a9081614fe5565b9150615a9e606086016159f5565b905092959194509250565b600061ffff808316818103615ac057615ac06157b4565b6001019392505050565b61ffff8181168382160280821691908281146137be576137be6157b4565b634e487b7160e01b600052601260045260246000fd5b600061ffff80841680615b1357615b13615ae8565b92169190910492915050565b634e487b7160e01b600052603160045260246000fd5b60006001600160a01b03808716835280861660208401525060806040830152615b616080830185614f8e565b9050615b6c83615059565b82606083015295945050505050565b600082615b8a57615b8a615ae8565b500490565b63ffffffff828116828216039080821115615bac57615bac6157b4565b5092915050565b8082028115828204841417610da957610da96157b4565b60008251615bdc818460208701615069565b919091019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122019aa0081e69056404e40023f916698c2b116cb83388048dea2cf1b230e45ab7b64736f6c63430008110033", + "linkReferences": { + "contracts/SigUtil.sol": { + "SigUtil": [ + { + "length": 20, + "start": 10373 + } + ] + } + }, + "deployedLinkReferences": { + "contracts/SigUtil.sol": { + "SigUtil": [ + { + "length": 20, + "start": 10296 + } + ] + } + } +} diff --git a/push-docker/v01/validator_eth_key.json b/push-docker/v01/validator_eth_key.json new file mode 100644 index 0000000..b9f3db6 --- /dev/null +++ b/push-docker/v01/validator_eth_key.json @@ -0,0 +1,21 @@ +{ + "address": "8e12de12c35eabf35b56b04e53c4e468e46727e8", + "id": "9f7a4d01-aa99-49f7-9148-96db20e2d879", + "version": 3, + "Crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "10058e53c5168b6dd9b172288d30c8e0" + }, + "ciphertext": "d1ca778571da887e4402a54b10bc8bc9547160a7021e6d7596059c143d4d1df9", + "kdf": "scrypt", + "kdfparams": { + "salt": "e4d857eab5bef16bad463a8e6900db1fd8aab6ed6afd50c2a6b0413ba8e8df36", + "n": 131072, + "dklen": 32, + "p": 1, + "r": 8 + }, + "mac": "d7c1c2c9c10eb68d5464d394ea7be9a1794e1692798abd0fe132c0426d6750f9" + } +} \ No newline at end of file diff --git a/push-docker/v02/.env b/push-docker/v02/.env new file mode 100644 index 0000000..42c300e --- /dev/null +++ b/push-docker/v02/.env @@ -0,0 +1,47 @@ +######### ENVIRONMENT +PORT=4002 +PUSH_NODES_NET=DEV +RUNNING_ON_MACHINE=mac +LOG_LEVEL=debug + +# DATABASE +DB_HOST=localhost +DB_NAME=vnode2 +DB_USER=2roor +DB_PASS=s1mpl3 + +######### Validator +# encrypted private key file +VALIDATOR_PRIVATE_KEY_FILE=validator_eth_key.json +# ! do not store this password on DISK in production, use only as ENV var +VALIDATOR_PRIVATE_KEY_PASS=test + +VALIDATOR_RPC_ENDPOINT=http://localhost:8545 +VALIDATOR_RPC_NETWORK=1337 +# push token smart contract +VALIDATOR_PUSH_TOKEN_ADDRESS=0x5FbDB2315678afecb367f032d93F642f64180aa3 +# validator smart contract +VALIDATOR_CONTRACT_ADDRESS=0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9 +# storage smart contract +STORAGE_CONTRACT_ADDRESS=0x0165878A594ca255338adfa4d48449f69242Eb8F + +# development +# log sql +LOG_SQL_STATEMENTS=true +# no http handler starts +VALIDATOR_DISABLE_ALL_SERVICES=true +# do not fetch blockchain data +VALIDATOR_DISABLE_HISTORY_SYNC=true +# write logs +VALIDATOR_DEBUG_LOG=true +# do not validate payload +VALIDATOR_SKIP_PAYLOAD_VERIFICATION=true +# do not rate limit +VALIDATOR_SKIP_RATE_LIMITER=true +# write custom logs for every query +VALIDATOR_HTTP_LOG=true +# random tokens live forever +VALIDATOR_DISABLE_TOKEN_TIMEOUT=true +######## Validator ENDS + +BLOCK_SCHEDULE=*/15 * * * * * \ No newline at end of file diff --git a/push-docker/v02/StorageV1.json b/push-docker/v02/StorageV1.json new file mode 100644 index 0000000..fa118f3 --- /dev/null +++ b/push-docker/v02/StorageV1.json @@ -0,0 +1,633 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "StorageV1", + "sourceName": "contracts/Storage.sol", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address[]", + "name": "nodeList", + "type": "address[]" + } + ], + "name": "SNodeMappingChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "inputs": [], + "name": "MAX_NODE_ID", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "NULL_NODE", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "NULL_SHARD", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SHARD_COUNT", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress_", + "type": "address" + } + ], + "name": "addNode", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8[]", + "name": "nodeList_", + "type": "uint8[]" + }, + { + "internalType": "uint8[]", + "name": "countersMap_", + "type": "uint8[]" + } + ], + "name": "calculateAvgPerNode", + "outputs": [ + { + "internalType": "uint256", + "name": "avgPerNode_", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "demand_", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "nodeAddr_", + "type": "address[]" + } + ], + "name": "getAllNodeShards", + "outputs": [ + { + "internalType": "uint32[]", + "name": "", + "type": "uint32[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getNodeAddresses", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress_", + "type": "address" + } + ], + "name": "getNodeShardsByAddr", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint16", + "name": "protocolVersion_", + "type": "uint16" + }, + { + "internalType": "address", + "name": "validatorContract_", + "type": "address" + }, + { + "internalType": "uint8", + "name": "rfTarget_", + "type": "uint8" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "mapAddrToNodeId", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "name": "mapNodeIdToAddr", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "name": "mapNodeToShards", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nodeCount", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "nodeIdList", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "rf_", + "type": "uint8" + } + ], + "name": "overrideRf", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "protocolVersion", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress_", + "type": "address" + } + ], + "name": "removeNode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "rf", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rfChangedByAdmin", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rfTarget", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress_", + "type": "address" + }, + { + "internalType": "uint32", + "name": "bitmap_", + "type": "uint32" + } + ], + "name": "setNodeShardsByAddr", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "rfTarget_", + "type": "uint8" + } + ], + "name": "setRfTarget", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "addr_", + "type": "address" + } + ], + "name": "setValidatorContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "shuffle", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "validatorContract", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60a06040523060805234801561001457600080fd5b50608051613bac61004c600039600081816108c30152818161094801528181610b6201528181610be70152610cd10152613bac6000f3fe6080604052600436106102195760003560e01c8063893f5da91161011d578063bac506e0116100b0578063d85707d51161007f578063f143896811610064578063f143896814610667578063f2fde38b1461067c578063fe92fe861461069c57600080fd5b8063d85707d514610629578063e30c39781461064957600080fd5b8063bac506e0146105a2578063cc59a6f4146105bc578063cdf64a76146105dc578063d12be06b146105fc57600080fd5b80639fc8ded3116100ec5780639fc8ded31461051e578063a25d526f14610533578063a5129cd014610562578063b2b99ec91461058257600080fd5b8063893f5da91461048e5780638da5cb5b146104bf57806399439089146104dd5780639d95f1cc146104fe57600080fd5b806345954486116101b0578063633207ae1161017f578063715018a611610164578063715018a61461044f578063720a0fa41461046457806379ba50971461047957600080fd5b8063633207ae146104255780636da49b831461043a57600080fd5b8063459544861461039657806348570569146103c85780634f1ef286146103fd57806352d1902d1461041057600080fd5b80632e949824116101ec5780632e949824146102e657806330cdb2751461030857806333083fe6146103565780633659cfe61461037657600080fd5b806301b9e4381461021e5780631a27e21c1461026b5780632520bf041461028d5780632ae9c600146102b0575b600080fd5b34801561022a57600080fd5b506102516102393660046134d4565b60fe6020526000908152604090205463ffffffff1681565b60405163ffffffff90911681526020015b60405180910390f35b34801561027757600080fd5b5061028b6102863660046134d4565b6106bc565b005b34801561029957600080fd5b506102a261070a565b604051908152602001610262565b3480156102bc57600080fd5b50610102546102d390600160a01b900461ffff1681565b60405161ffff9091168152602001610262565b3480156102f257600080fd5b506102fb610741565b60405161026291906134ef565b34801561031457600080fd5b5061033e6103233660046134d4565b60fd602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610262565b34801561036257600080fd5b50610251610371366004613553565b61082d565b34801561038257600080fd5b5061028b610391366004613553565b6108b9565b3480156103a257600080fd5b506103b66103b136600461356e565b610a34565b60405160ff9091168152602001610262565b3480156103d457600080fd5b506103e86103e3366004613664565b610a68565b60408051928352602083019190915201610262565b61028b61040b3660046136c8565b610b58565b34801561041c57600080fd5b506102a2610cc4565b34801561043157600080fd5b506103b660fe81565b34801561044657600080fd5b5060fc546103b6565b34801561045b57600080fd5b5061028b610d89565b34801561047057600080fd5b506103b6600081565b34801561048557600080fd5b5061028b610d9d565b34801561049a57600080fd5b506103b66104a9366004613553565b60ff602081905260009182526040909120541681565b3480156104cb57600080fd5b506033546001600160a01b031661033e565b3480156104e957600080fd5b506101025461033e906001600160a01b031681565b34801561050a57600080fd5b506103b6610519366004613553565b610e28565b34801561052a57600080fd5b506103b660ff81565b34801561053f57600080fd5b5060fb5461055290610100900460ff1681565b6040519015158152602001610262565b34801561056e57600080fd5b5061028b61057d3660046134d4565b6110fc565b34801561058e57600080fd5b5061028b61059d366004613553565b61117c565b3480156105ae57600080fd5b5060fb546103b69060ff1681565b3480156105c857600080fd5b5061028b6105d736600461376e565b611537565b3480156105e857600080fd5b5061028b6105f7366004613553565b6115d5565b34801561060857600080fd5b5061061c6106173660046137ae565b611600565b604051610262919061383b565b34801561063557600080fd5b5060fb546103b69062010000900460ff1681565b34801561065557600080fd5b506065546001600160a01b031661033e565b34801561067357600080fd5b506103b6602081565b34801561068857600080fd5b5061028b610697366004613553565b6116f3565b3480156106a857600080fd5b5061028b6106b7366004613879565b611764565b6106c4611902565b60fb805462ff000019166201000060ff84169081029190911790915560fc548111156106ef575060fc545b60fb805461ffff191660ff9092169190911761010017905550565b6000610714611902565b60fb5460009061072d90610100900460ff16828061195c565b60fb805461ff001916905560ff1691505090565b60fc5460609060008167ffffffffffffffff81111561076257610762613587565b60405190808252806020026020018201604052801561078b578160200160208202803683370190505b50905060005b8281101561082657600060fc82815481106107ae576107ae6138c5565b600091825260208083208183040154601f9092166101000a90910460ff1680835260fd90915260409091205484519192506001600160a01b0316908490849081106107fb576107fb6138c5565b6001600160a01b0390921660209283029190910190910152508061081e816138f1565b915050610791565b5092915050565b6001600160a01b038116600090815260ff60208190526040822054168061089b5760405162461bcd60e51b815260206004820152600c60248201527f6e6f2073756368206e6f6465000000000000000000000000000000000000000060448201526064015b60405180910390fd5b60ff16600090815260fe602052604090205463ffffffff1692915050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036109465760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610892565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166109a17f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610a0c5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610892565b610a1581611ec3565b60408051600080825260208201909252610a3191839190611ecb565b50565b60fc8181548110610a4457600080fd5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b815160fb54600091829160ff918216918391610a869116602061390a565b905060008215610a9f57610a9a8383613937565b610aa2565b60005b90506000610ab0848461394b565b1115610ac457610ac181600161395f565b90505b6000805b8851811015610b4a576000898281518110610ae557610ae56138c5565b602002602001015190506000898260ff1681518110610b0657610b066138c5565b60200260200101519050848160ff161015610b3557610b2860ff821686613972565b610b32908561395f565b93505b50508080610b42906138f1565b915050610ac8565b509097909650945050505050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610be55760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610892565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610c407f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610cab5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610892565b610cb482611ec3565b610cc082826001611ecb565b5050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610d645760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610892565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610d91611902565b610d9b6000612070565b565b60655433906001600160a01b03168114610e1f5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610892565b610a3181612070565b610102546000906001600160a01b0316331480610e4f57506033546001600160a01b031633145b610e9b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610892565b6001600160a01b038216600090815260ff60208190526040909120541615610f055760405162461bcd60e51b815260206004820152601d60248201527f6164647265737320697320616c726561647920726567697374657265640000006044820152606401610892565b6101005460ff1615801590610f2257506101005460fe60ff909116105b610f6e5760405162461bcd60e51b815260206004820152601a60248201527f6e6f64654964203e2030202626206e6f64654964203c206d61780000000000006044820152606401610892565b610101546000908015610ffc57610101610f89600183613972565b81548110610f9957610f996138c5565b90600052602060002090602091828204019190069054906101000a900460ff169150610101805480610fcd57610fcd613985565b60019003818190600052602060002090602091828204019190066101000a81549060ff0219169055905561102b565b610100805460ff169060006110108361399b565b91906101000a81548160ff021916908360ff16021790555091505b60fc8054600181810190925560208082047f371f36870d18f32a11fea0f144b021c8b407bb50f8e0267c711123f454b963c001805460ff808816601f9095166101000a8581029082021990921691909117909155600083815260fd8352604080822080546001600160a01b038c166001600160a01b031990911681179091558252918352818120805460ff19168517905592835260fe9091528120805463ffffffff19169055906110db90612089565b90506110e98160008061195c565b50506101005460ff16925050505b919050565b611104611902565b60fc5460ff821611156111595760405162461bcd60e51b815260206004820152601b60248201527f7266206973206c696d69746564206279206e6f646520636f756e7400000000006044820152606401610892565b60fb805461010060ff9390931661ffff19909116179190911762ff000019169055565b610102546001600160a01b03163314806111a057506033546001600160a01b031633145b6111ec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610892565b6001600160a01b038116600090815260ff60208181526040832054610101805460018101825594529083047f109ea3cebb188b9c1b9fc5bb3920be60dfdc8699098dff92f3d80daaca747689018054601f9094166101000a918316828102929093021990931617909155806112a35760405162461bcd60e51b815260206004820152601060248201527f6e6f206164647265737320666f756e64000000000000000000000000000000006044820152606401610892565b60fc54600003611317576001600160a01b038216600090815260ff602052604090819020805460ff191690555162461bcd60e51b81526108929060040160208082526010908201527f6e6f206e6f646520696420666f756e6400000000000000000000000000000000604082015260600190565b60ff8116600090815260fe60205260408120805463ffffffff19811690915560fc5463ffffffff909116915b81811015611465578360ff1660fc8281548110611362576113626138c5565b60009182526020918290209181049091015460ff601f9092166101000a9004160361145357611392600183613972565b81146114135760fc6113a5600184613972565b815481106113b5576113b56138c5565b90600052602060002090602091828204019190069054906101000a900460ff1660fc82815481106113e8576113e86138c5565b90600052602060002090602091828204019190066101000a81548160ff021916908360ff1602179055505b60fc80548061142457611424613985565b60019003818190600052602060002090602091828204019190066101000a81549060ff02191690559055611465565b8061145d816138f1565b915050611343565b5060ff8316600090815260fd6020526040812080546001600160a01b0319169055611491600019612089565b604080516001808252818301909252919250600091906020808301908036833701905050905085816000815181106114cb576114cb6138c5565b60200260200101906001600160a01b031690816001600160a01b0316815250507fb338e44b9e4e2d94df983fde422fd91ba2bd6f8182b607b50c968f8161bcf8858160405161151a91906134ef565b60405180910390a161152e8260018661195c565b50505050505050565b61153f611902565b6001600160a01b038216600090815260ff602081905260409091205416806115a95760405162461bcd60e51b815260206004820152601e60248201527f6e6f64652061646472657373206973206e6f74207265676973746572656400006044820152606401610892565b60ff16600090815260fe60205260409020805463ffffffff191663ffffffff9290921691909117905550565b6115dd611902565b61010280546001600160a01b0319166001600160a01b0392909216919091179055565b60606000825167ffffffffffffffff81111561161e5761161e613587565b604051908082528060200260200182016040528015611647578160200160208202803683370190505b50905060005b835181101561082657600060ff600086848151811061166e5761166e6138c5565b6020908102919091018101516001600160a01b0316825281810192909252604090810160009081205460ff1680825260fe9093522054845191925063ffffffff169081908590859081106116c4576116c46138c5565b602002602001019063ffffffff16908163ffffffff1681525050505080806116eb906138f1565b91505061164d565b6116fb611902565b606580546001600160a01b0383166001600160a01b0319909116811790915561172c6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600054610100900460ff16158080156117845750600054600160ff909116105b8061179e5750303b15801561179e575060005460ff166001145b6118105760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610892565b6000805460ff191660011790558015611833576000805461ff0019166101001790555b61183b612120565b61184361218b565b6101008054600160ff1990911617905560fb8054610102805462ff00ff199092166201000060ff871602179092557fffffffffffffffffffff0000000000000000000000000000000000000000000016600160a01b61ffff8716026001600160a01b031916176001600160a01b03851617905580156118fc576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6033546001600160a01b03163314610d9b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610892565b60008060fc8054806020026020016040519081016040528092919081815260200182805480156119c957602002820191906000526020600020906000905b825461010083900a900460ff1681526020600192830181810494850194909303909202910180841161199a5790505b505060fb549394505060ff90921691505060fe811115611a2b5760405162461bcd60e51b815260206004820152600660248201527f62616420726600000000000000000000000000000000000000000000000000006044820152606401610892565b815160ff11611a7c5760405162461bcd60e51b815260206004820152600e60248201527f626164206e6f646520636f756e740000000000000000000000000000000000006044820152606401610892565b6000805b8351811015611acc576000848281518110611a9d57611a9d6138c5565b602002602001015190508260ff168160ff161115611ab9578092505b5080611ac4816138f1565b915050611a80565b5060fe60ff821610611add57600080fd5b6000611aea8260016139ba565b60ff1667ffffffffffffffff811115611b0557611b05613587565b604051908082528060200260200182016040528015611b2e578160200160208202803683370190505b5090506000611b3e8360016139ba565b60ff1667ffffffffffffffff811115611b5957611b59613587565b604051908082528060200260200182016040528015611b82578160200160208202803683370190505b50905060005b8551811015611c59576000868281518110611ba557611ba56138c5565b6020026020010151905060018160ff161015611c035760405162461bcd60e51b815260206004820152601160248201527f6e6f6465732061726520312062617365640000000000000000000000000000006044820152606401610892565b60ff8116600081815260fe6020526040902054845163ffffffff9091169185918110611c3157611c316138c5565b63ffffffff909216602092830291909101909101525080611c51816138f1565b915050611b88565b506000611c6b868385888e8e8e6121ff565b60fc5490915015611ce5576000611c8387868561264b565b9050611c948288838688600061277a565b50600080611ca28984610a68565b90925090505b8015611ce1576000611cbc8a85888a6129a0565b90508015611cd557611cce8183613972565b9150611cdb565b50611ce1565b50611ca8565b5050505b600060015b84518160ff161015611d8a576000858260ff1681518110611d0d57611d0d6138c5565b602002602001015160ff161115611d78576000848260ff1681518110611d3557611d356138c5565b60209081029190910181015160ff8416600090815260fe9092526040909120805463ffffffff191663ffffffff8316179055905082611d738161399b565b935050505b80611d828161399b565b915050611cea565b5060008160ff1667ffffffffffffffff811115611da957611da9613587565b604051908082528060200260200182016040528015611dd2578160200160208202803683370190505b509050600060015b86518160ff161015611e7a576000878260ff1681518110611dfd57611dfd6138c5565b602002602001015160ff161115611e685760ff8116600090815260fd60205260409020546001600160a01b03168383611e35816138f1565b945081518110611e4757611e476138c5565b60200260200101906001600160a01b031690816001600160a01b0316815250505b80611e728161399b565b915050611dda565b507fb338e44b9e4e2d94df983fde422fd91ba2bd6f8182b607b50c968f8161bcf88582604051611eaa91906134ef565b60405180910390a150909b9a5050505050505050505050565b610a31611902565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611f0357611efe83612c7a565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611f5d575060408051601f3d908101601f19168201909252611f5a918101906139d3565b60015b611fcf5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610892565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146120645760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610892565b50611efe838383612d38565b606580546001600160a01b0319169055610a3181612d5d565b60fb54600090610100900460ff1680156120a95760fb805461ff00191690555b60fb5460ff1660006120bb85836139ec565b60fb5490915062010000900460ff16158015906120d9575060008112155b80156120f0575060fb5462010000900460ff168113155b80156120fe575060fc548113155b156121175760fb805460ff191660ff8316179055600192505b50909392505050565b600054610100900460ff16610d9b5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610892565b600054610100900460ff166121f65760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610892565b610d9b33612070565b6060808415801561220e575083155b15612229575050604080516000815260208101909152612640565b83156122be576040805160208082526104208201909252908082016104008036833701905050905060005b602060ff821610156122b65761226a8482612daf565b60ff1660011461227b5760ff61227d565b805b828260ff1681518110612292576122926138c5565b60ff90921660209283029190910190910152806122ae8161399b565b915050612254565b509050612640565b6122c960208761390a565b67ffffffffffffffff8111156122e1576122e1613587565b60405190808252806020026020018201604052801561230a578160200160208202803683370190505b5090506000805b8781101561237d5760005b602060ff8216101561236a57808484612334816138f1565b955081518110612346576123466138c5565b60ff90921660209283029190910190910152806123628161399b565b91505061231c565b5080612375816138f1565b915050612311565b5060005b8a518110156124fe5760008b828151811061239e5761239e6138c5565b602002602001015160ff16905060008b82815181106123bf576123bf6138c5565b6020026020010151905060005b602060ff821610156124bb576123e28282612daf565b60ff16156124a95760001960005b8751811015612439578260ff1688828151811061240f5761240f6138c5565b602002602001015160ff160361242757809150612439565b80612431816138f1565b9150506123f0565b50801961247e57600160ff83161b19831692508c848151811061245e5761245e6138c5565b6020026020010180518091906124739061399b565b60ff169052506124a7565b60ff878281518110612492576124926138c5565b602002602001019060ff16908160ff16815250505b505b806124b38161399b565b9150506123cc565b50808c83815181106124cf576124cf6138c5565b602002602001019063ffffffff16908163ffffffff1681525050505080806124f6906138f1565b915050612381565b506000805b83518110156125525760ff8016848281518110612522576125226138c5565b602002602001015160ff1603612540578161253c816138f1565b9250505b8061254a816138f1565b915050612503565b5060008184516125629190613972565b67ffffffffffffffff81111561257a5761257a613587565b6040519080825280602002602001820160405280156125a3578160200160208202803683370190505b5090506000805b85518110156126375760ff80168682815181106125c9576125c96138c5565b602002602001015160ff1614612625578581815181106125eb576125eb6138c5565b6020026020010151838381518110612605576126056138c5565b60ff9092166020928302919091019091015281612621816138f1565b9250505b8061262f816138f1565b9150506125aa565b50909450505050505b979650505050505050565b6060600061265a8460016139ba565b60ff1667ffffffffffffffff81111561267557612675613587565b60405190808252806020026020018201604052801561269e578160200160208202803683370190505b50905060005b85518110156127715760008682815181106126c1576126c16138c5565b602002602001015190506000858260ff16815181106126e2576126e26138c5565b602002602001015190506000805b602060ff82161015612730576127068382612daf565b60ff1660010361271e578161271a8161399b565b9250505b806127288161399b565b9150506126f0565b5080858460ff1681518110612747576127476138c5565b602002602001019060ff16908160ff16815250505050508080612769906138f1565b9150506126a4565b50949350505050565b6000865160000361278d57506000612996565b6127978686612dc5565b6000805b88518110156129925760008982815181106127b8576127b86138c5565b6020026020010151905060ff80168160ff16036127d55750612980565b60005b89518160ff16101561297d5760008a8260ff16815181106127fb576127fb6138c5565b6020026020010151905060008760ff1611801561283a57508660ff168a8260ff168151811061282c5761282c6138c5565b602002602001015160ff1610155b15612845575061296b565b6000898260ff168151811061285c5761285c6138c5565b6020026020010151905060006128728286612daf565b90508060ff166000036129675760ff8e8781518110612893576128936138c5565b60ff928316602091820292909201015260019086161b82178b8460ff16815181106128c0576128c06138c5565b602002602001019063ffffffff16908163ffffffff16815250508b8360ff16815181106128ef576128ef6138c5565b6020026020010180518091906129049061399b565b60ff1660ff1681525050898360ff1681518110612923576129236138c5565b6020026020010180518091906129389061399b565b60ff1660ff16815250506129528d8d8660ff166001612dec565b8661295c816138f1565b97505050505061297d565b5050505b806129758161399b565b9150506127d8565b50505b8061298a816138f1565b91505061279b565b5090505b9695505050505050565b600084516000036129b357506000612c72565b6129bd8585612dc5565b600080600187516129ce9190613972565b90506129d86134a4565b81831015612c6a5760008884815181106129f4576129f46138c5565b602002602001015190506000898481518110612a1257612a126138c5565b602002602001015190506000888360ff1681518110612a3357612a336138c5565b602002602001015119898360ff1681518110612a5157612a516138c5565b60200260200101518a8560ff1681518110612a6e57612a6e6138c5565b6020026020010151181690508063ffffffff16600014612c47576000612a94828661302a565b9050612ac58a8460ff1681518110612aae57612aae6138c5565b602002602001015182600160ff919091161b191690565b8a8460ff1681518110612ada57612ada6138c5565b602002602001019063ffffffff16908163ffffffff16815250508a8360ff1681518110612b0957612b096138c5565b602002602001018051809190612b1e90613a14565b60ff1660ff1681525050888360ff1681518110612b3d57612b3d6138c5565b602002602001018051809190612b529061399b565b60ff1660ff1681525050612b8a8a8560ff1681518110612b7457612b746138c5565b602002602001015182600160ff919091161b1790565b8a8560ff1681518110612b9f57612b9f6138c5565b602002602001019063ffffffff16908163ffffffff16815250508a8460ff1681518110612bce57612bce6138c5565b602002602001018051809190612be39061399b565b60ff1660ff1681525050888460ff1681518110612c0257612c026138c5565b602002602001018051809190612c179061399b565b60ff16905250612c2a8c8c896001612dec565b612c378c8c886000612dec565b6001975050505050505050612c72565b85612c51816138f1565b9650508480612c5f90613a31565b9550505050506129d8565b600093505050505b949350505050565b6001600160a01b0381163b612cf75760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610892565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b612d4183613152565b600082511180612d4e5750805b15611efe576118fc8383613192565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600163ffffffff831660ff83161c165b92915050565b8151600003612dd2575050565b610cc08282600060018651612de79190613972565b6131be565b818115612ec7575b6000612e018260016139ec565b12158015612e26575060018551612e189190613972565b612e238260016139ec565b13155b8015612eab57508385612e3a8360016139ec565b81518110612e4a57612e4a6138c5565b602002602001015160ff1681518110612e6557612e656138c5565b602002602001015160ff1684868581518110612e8357612e836138c5565b602002602001015160ff1681518110612e9e57612e9e6138c5565b602002602001015160ff16115b15612ec25780612eba81613a48565b915050612df4565b612f95565b6000612ed4600183613a79565b12158015612ef9575060018551612eeb9190613972565b612ef6600183613a79565b13155b8015612f7e57508385612f0d600184613a79565b81518110612f1d57612f1d6138c5565b602002602001015160ff1681518110612f3857612f386138c5565b602002602001015160ff1684868581518110612f5657612f566138c5565b602002602001015160ff1681518110612f7157612f716138c5565b602002602001015160ff16105b15612f955780612f8d81613a99565b915050612ec7565b828114613023576000858281518110612fb057612fb06138c5565b60200260200101519050858481518110612fcc57612fcc6138c5565b6020026020010151868381518110612fe657612fe66138c5565b602002602001019060ff16908160ff16815250508086858151811061300d5761300d6138c5565b602002602001019060ff16908160ff1681525050505b5050505050565b600080805b63ffffffff8516156130955760018086169003613075578084836130528161399b565b945060ff1660208110613067576130676138c5565b60ff90921660209290920201525b60018563ffffffff16901c9450808061308d9061399b565b91505061302f565b60408051426020808301919091527fff0000000000000000000000000000000000000000000000000000000000000060f885811b8216848601527fffffffff0000000000000000000000000000000000000000000000000000000060e08b901b16604185015286901b166045830152825180830360260181526046909201909252805191012060009061312c9060ff85169061394b565b9050848160ff1660208110613143576131436138c5565b60200201519695505050505050565b61315b81612c7a565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606131b78383604051806060016040528060278152602001613b506027913961339d565b9392505050565b81818082036131ce5750506118fc565b6000858760026131de8888613a79565b6131e89190613aae565b6131f290886139ec565b81518110613202576132026138c5565b602002602001015160ff168151811061321d5761321d6138c5565b602002602001015190505b818313613375575b8060ff1686888581518110613247576132476138c5565b602002602001015160ff1681518110613262576132626138c5565b602002602001015160ff161015613285578261327d81613a48565b935050613230565b85878381518110613298576132986138c5565b602002602001015160ff16815181106132b3576132b36138c5565b602002602001015160ff168160ff1610156132da57816132d281613a99565b925050613285565b818313613370578682815181106132f3576132f36138c5565b602002602001015187848151811061330d5761330d6138c5565b6020026020010151888581518110613327576133276138c5565b60200260200101898581518110613340576133406138c5565b60ff9384166020918202929092010152911690528261335e81613a48565b935050818061336c90613a99565b9250505b613228565b8185121561338957613389878787856131be565b8383121561152e5761152e878785876131be565b6060600080856001600160a01b0316856040516133ba9190613b00565b600060405180830381855af49150503d80600081146133f5576040519150601f19603f3d011682016040523d82523d6000602084013e6133fa565b606091505b5091509150612996868383876060831561347557825160000361346e576001600160a01b0385163b61346e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610892565b5081612c72565b612c72838381511561348a5781518083602001fd5b8060405162461bcd60e51b81526004016108929190613b1c565b6040518061040001604052806020906020820280368337509192915050565b803560ff811681146110f757600080fd5b6000602082840312156134e657600080fd5b6131b7826134c3565b6020808252825182820181905260009190848201906040850190845b818110156135305783516001600160a01b03168352928401929184019160010161350b565b50909695505050505050565b80356001600160a01b03811681146110f757600080fd5b60006020828403121561356557600080fd5b6131b78261353c565b60006020828403121561358057600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156135c6576135c6613587565b604052919050565b600067ffffffffffffffff8211156135e8576135e8613587565b5060051b60200190565b600082601f83011261360357600080fd5b81356020613618613613836135ce565b61359d565b82815260059290921b8401810191818101908684111561363757600080fd5b8286015b848110156136595761364c816134c3565b835291830191830161363b565b509695505050505050565b6000806040838503121561367757600080fd5b823567ffffffffffffffff8082111561368f57600080fd5b61369b868387016135f2565b935060208501359150808211156136b157600080fd5b506136be858286016135f2565b9150509250929050565b600080604083850312156136db57600080fd5b6136e48361353c565b915060208084013567ffffffffffffffff8082111561370257600080fd5b818601915086601f83011261371657600080fd5b81358181111561372857613728613587565b61373a601f8201601f1916850161359d565b9150808252878482850101111561375057600080fd5b80848401858401376000848284010152508093505050509250929050565b6000806040838503121561378157600080fd5b61378a8361353c565b9150602083013563ffffffff811681146137a357600080fd5b809150509250929050565b600060208083850312156137c157600080fd5b823567ffffffffffffffff8111156137d857600080fd5b8301601f810185136137e957600080fd5b80356137f7613613826135ce565b81815260059190911b8201830190838101908783111561381657600080fd5b928401925b828410156126405761382c8461353c565b8252928401929084019061381b565b6020808252825182820181905260009190848201906040850190845b8181101561353057835163ffffffff1683529284019291840191600101613857565b60008060006060848603121561388e57600080fd5b833561ffff811681146138a057600080fd5b92506138ae6020850161353c565b91506138bc604085016134c3565b90509250925092565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201613903576139036138db565b5060010190565b8082028115828204841417612dbf57612dbf6138db565b634e487b7160e01b600052601260045260246000fd5b60008261394657613946613921565b500490565b60008261395a5761395a613921565b500690565b80820180821115612dbf57612dbf6138db565b81810381811115612dbf57612dbf6138db565b634e487b7160e01b600052603160045260246000fd5b600060ff821660ff81036139b1576139b16138db565b60010192915050565b60ff8181168382160190811115612dbf57612dbf6138db565b6000602082840312156139e557600080fd5b5051919050565b8082018281126000831280158216821582161715613a0c57613a0c6138db565b505092915050565b600060ff821680613a2757613a276138db565b6000190192915050565b600081613a4057613a406138db565b506000190190565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613903576139036138db565b8181036000831280158383131683831282161715610826576108266138db565b6000600160ff1b8203613a4057613a406138db565b600082613abd57613abd613921565b600160ff1b821460001984141615613ad757613ad76138db565b500590565b60005b83811015613af7578181015183820152602001613adf565b50506000910152565b60008251613b12818460208701613adc565b9190910192915050565b6020815260008251806020840152613b3b816040850160208701613adc565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212208b49979b2f722eba21fe73a725f59b75c53ae7952a13f2732dd8e0c979721d1c64736f6c63430008110033", + "deployedBytecode": "0x6080604052600436106102195760003560e01c8063893f5da91161011d578063bac506e0116100b0578063d85707d51161007f578063f143896811610064578063f143896814610667578063f2fde38b1461067c578063fe92fe861461069c57600080fd5b8063d85707d514610629578063e30c39781461064957600080fd5b8063bac506e0146105a2578063cc59a6f4146105bc578063cdf64a76146105dc578063d12be06b146105fc57600080fd5b80639fc8ded3116100ec5780639fc8ded31461051e578063a25d526f14610533578063a5129cd014610562578063b2b99ec91461058257600080fd5b8063893f5da91461048e5780638da5cb5b146104bf57806399439089146104dd5780639d95f1cc146104fe57600080fd5b806345954486116101b0578063633207ae1161017f578063715018a611610164578063715018a61461044f578063720a0fa41461046457806379ba50971461047957600080fd5b8063633207ae146104255780636da49b831461043a57600080fd5b8063459544861461039657806348570569146103c85780634f1ef286146103fd57806352d1902d1461041057600080fd5b80632e949824116101ec5780632e949824146102e657806330cdb2751461030857806333083fe6146103565780633659cfe61461037657600080fd5b806301b9e4381461021e5780631a27e21c1461026b5780632520bf041461028d5780632ae9c600146102b0575b600080fd5b34801561022a57600080fd5b506102516102393660046134d4565b60fe6020526000908152604090205463ffffffff1681565b60405163ffffffff90911681526020015b60405180910390f35b34801561027757600080fd5b5061028b6102863660046134d4565b6106bc565b005b34801561029957600080fd5b506102a261070a565b604051908152602001610262565b3480156102bc57600080fd5b50610102546102d390600160a01b900461ffff1681565b60405161ffff9091168152602001610262565b3480156102f257600080fd5b506102fb610741565b60405161026291906134ef565b34801561031457600080fd5b5061033e6103233660046134d4565b60fd602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610262565b34801561036257600080fd5b50610251610371366004613553565b61082d565b34801561038257600080fd5b5061028b610391366004613553565b6108b9565b3480156103a257600080fd5b506103b66103b136600461356e565b610a34565b60405160ff9091168152602001610262565b3480156103d457600080fd5b506103e86103e3366004613664565b610a68565b60408051928352602083019190915201610262565b61028b61040b3660046136c8565b610b58565b34801561041c57600080fd5b506102a2610cc4565b34801561043157600080fd5b506103b660fe81565b34801561044657600080fd5b5060fc546103b6565b34801561045b57600080fd5b5061028b610d89565b34801561047057600080fd5b506103b6600081565b34801561048557600080fd5b5061028b610d9d565b34801561049a57600080fd5b506103b66104a9366004613553565b60ff602081905260009182526040909120541681565b3480156104cb57600080fd5b506033546001600160a01b031661033e565b3480156104e957600080fd5b506101025461033e906001600160a01b031681565b34801561050a57600080fd5b506103b6610519366004613553565b610e28565b34801561052a57600080fd5b506103b660ff81565b34801561053f57600080fd5b5060fb5461055290610100900460ff1681565b6040519015158152602001610262565b34801561056e57600080fd5b5061028b61057d3660046134d4565b6110fc565b34801561058e57600080fd5b5061028b61059d366004613553565b61117c565b3480156105ae57600080fd5b5060fb546103b69060ff1681565b3480156105c857600080fd5b5061028b6105d736600461376e565b611537565b3480156105e857600080fd5b5061028b6105f7366004613553565b6115d5565b34801561060857600080fd5b5061061c6106173660046137ae565b611600565b604051610262919061383b565b34801561063557600080fd5b5060fb546103b69062010000900460ff1681565b34801561065557600080fd5b506065546001600160a01b031661033e565b34801561067357600080fd5b506103b6602081565b34801561068857600080fd5b5061028b610697366004613553565b6116f3565b3480156106a857600080fd5b5061028b6106b7366004613879565b611764565b6106c4611902565b60fb805462ff000019166201000060ff84169081029190911790915560fc548111156106ef575060fc545b60fb805461ffff191660ff9092169190911761010017905550565b6000610714611902565b60fb5460009061072d90610100900460ff16828061195c565b60fb805461ff001916905560ff1691505090565b60fc5460609060008167ffffffffffffffff81111561076257610762613587565b60405190808252806020026020018201604052801561078b578160200160208202803683370190505b50905060005b8281101561082657600060fc82815481106107ae576107ae6138c5565b600091825260208083208183040154601f9092166101000a90910460ff1680835260fd90915260409091205484519192506001600160a01b0316908490849081106107fb576107fb6138c5565b6001600160a01b0390921660209283029190910190910152508061081e816138f1565b915050610791565b5092915050565b6001600160a01b038116600090815260ff60208190526040822054168061089b5760405162461bcd60e51b815260206004820152600c60248201527f6e6f2073756368206e6f6465000000000000000000000000000000000000000060448201526064015b60405180910390fd5b60ff16600090815260fe602052604090205463ffffffff1692915050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036109465760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610892565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166109a17f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610a0c5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610892565b610a1581611ec3565b60408051600080825260208201909252610a3191839190611ecb565b50565b60fc8181548110610a4457600080fd5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b815160fb54600091829160ff918216918391610a869116602061390a565b905060008215610a9f57610a9a8383613937565b610aa2565b60005b90506000610ab0848461394b565b1115610ac457610ac181600161395f565b90505b6000805b8851811015610b4a576000898281518110610ae557610ae56138c5565b602002602001015190506000898260ff1681518110610b0657610b066138c5565b60200260200101519050848160ff161015610b3557610b2860ff821686613972565b610b32908561395f565b93505b50508080610b42906138f1565b915050610ac8565b509097909650945050505050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610be55760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610892565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610c407f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610cab5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610892565b610cb482611ec3565b610cc082826001611ecb565b5050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610d645760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610892565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610d91611902565b610d9b6000612070565b565b60655433906001600160a01b03168114610e1f5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610892565b610a3181612070565b610102546000906001600160a01b0316331480610e4f57506033546001600160a01b031633145b610e9b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610892565b6001600160a01b038216600090815260ff60208190526040909120541615610f055760405162461bcd60e51b815260206004820152601d60248201527f6164647265737320697320616c726561647920726567697374657265640000006044820152606401610892565b6101005460ff1615801590610f2257506101005460fe60ff909116105b610f6e5760405162461bcd60e51b815260206004820152601a60248201527f6e6f64654964203e2030202626206e6f64654964203c206d61780000000000006044820152606401610892565b610101546000908015610ffc57610101610f89600183613972565b81548110610f9957610f996138c5565b90600052602060002090602091828204019190069054906101000a900460ff169150610101805480610fcd57610fcd613985565b60019003818190600052602060002090602091828204019190066101000a81549060ff0219169055905561102b565b610100805460ff169060006110108361399b565b91906101000a81548160ff021916908360ff16021790555091505b60fc8054600181810190925560208082047f371f36870d18f32a11fea0f144b021c8b407bb50f8e0267c711123f454b963c001805460ff808816601f9095166101000a8581029082021990921691909117909155600083815260fd8352604080822080546001600160a01b038c166001600160a01b031990911681179091558252918352818120805460ff19168517905592835260fe9091528120805463ffffffff19169055906110db90612089565b90506110e98160008061195c565b50506101005460ff16925050505b919050565b611104611902565b60fc5460ff821611156111595760405162461bcd60e51b815260206004820152601b60248201527f7266206973206c696d69746564206279206e6f646520636f756e7400000000006044820152606401610892565b60fb805461010060ff9390931661ffff19909116179190911762ff000019169055565b610102546001600160a01b03163314806111a057506033546001600160a01b031633145b6111ec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610892565b6001600160a01b038116600090815260ff60208181526040832054610101805460018101825594529083047f109ea3cebb188b9c1b9fc5bb3920be60dfdc8699098dff92f3d80daaca747689018054601f9094166101000a918316828102929093021990931617909155806112a35760405162461bcd60e51b815260206004820152601060248201527f6e6f206164647265737320666f756e64000000000000000000000000000000006044820152606401610892565b60fc54600003611317576001600160a01b038216600090815260ff602052604090819020805460ff191690555162461bcd60e51b81526108929060040160208082526010908201527f6e6f206e6f646520696420666f756e6400000000000000000000000000000000604082015260600190565b60ff8116600090815260fe60205260408120805463ffffffff19811690915560fc5463ffffffff909116915b81811015611465578360ff1660fc8281548110611362576113626138c5565b60009182526020918290209181049091015460ff601f9092166101000a9004160361145357611392600183613972565b81146114135760fc6113a5600184613972565b815481106113b5576113b56138c5565b90600052602060002090602091828204019190069054906101000a900460ff1660fc82815481106113e8576113e86138c5565b90600052602060002090602091828204019190066101000a81548160ff021916908360ff1602179055505b60fc80548061142457611424613985565b60019003818190600052602060002090602091828204019190066101000a81549060ff02191690559055611465565b8061145d816138f1565b915050611343565b5060ff8316600090815260fd6020526040812080546001600160a01b0319169055611491600019612089565b604080516001808252818301909252919250600091906020808301908036833701905050905085816000815181106114cb576114cb6138c5565b60200260200101906001600160a01b031690816001600160a01b0316815250507fb338e44b9e4e2d94df983fde422fd91ba2bd6f8182b607b50c968f8161bcf8858160405161151a91906134ef565b60405180910390a161152e8260018661195c565b50505050505050565b61153f611902565b6001600160a01b038216600090815260ff602081905260409091205416806115a95760405162461bcd60e51b815260206004820152601e60248201527f6e6f64652061646472657373206973206e6f74207265676973746572656400006044820152606401610892565b60ff16600090815260fe60205260409020805463ffffffff191663ffffffff9290921691909117905550565b6115dd611902565b61010280546001600160a01b0319166001600160a01b0392909216919091179055565b60606000825167ffffffffffffffff81111561161e5761161e613587565b604051908082528060200260200182016040528015611647578160200160208202803683370190505b50905060005b835181101561082657600060ff600086848151811061166e5761166e6138c5565b6020908102919091018101516001600160a01b0316825281810192909252604090810160009081205460ff1680825260fe9093522054845191925063ffffffff169081908590859081106116c4576116c46138c5565b602002602001019063ffffffff16908163ffffffff1681525050505080806116eb906138f1565b91505061164d565b6116fb611902565b606580546001600160a01b0383166001600160a01b0319909116811790915561172c6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600054610100900460ff16158080156117845750600054600160ff909116105b8061179e5750303b15801561179e575060005460ff166001145b6118105760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610892565b6000805460ff191660011790558015611833576000805461ff0019166101001790555b61183b612120565b61184361218b565b6101008054600160ff1990911617905560fb8054610102805462ff00ff199092166201000060ff871602179092557fffffffffffffffffffff0000000000000000000000000000000000000000000016600160a01b61ffff8716026001600160a01b031916176001600160a01b03851617905580156118fc576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6033546001600160a01b03163314610d9b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610892565b60008060fc8054806020026020016040519081016040528092919081815260200182805480156119c957602002820191906000526020600020906000905b825461010083900a900460ff1681526020600192830181810494850194909303909202910180841161199a5790505b505060fb549394505060ff90921691505060fe811115611a2b5760405162461bcd60e51b815260206004820152600660248201527f62616420726600000000000000000000000000000000000000000000000000006044820152606401610892565b815160ff11611a7c5760405162461bcd60e51b815260206004820152600e60248201527f626164206e6f646520636f756e740000000000000000000000000000000000006044820152606401610892565b6000805b8351811015611acc576000848281518110611a9d57611a9d6138c5565b602002602001015190508260ff168160ff161115611ab9578092505b5080611ac4816138f1565b915050611a80565b5060fe60ff821610611add57600080fd5b6000611aea8260016139ba565b60ff1667ffffffffffffffff811115611b0557611b05613587565b604051908082528060200260200182016040528015611b2e578160200160208202803683370190505b5090506000611b3e8360016139ba565b60ff1667ffffffffffffffff811115611b5957611b59613587565b604051908082528060200260200182016040528015611b82578160200160208202803683370190505b50905060005b8551811015611c59576000868281518110611ba557611ba56138c5565b6020026020010151905060018160ff161015611c035760405162461bcd60e51b815260206004820152601160248201527f6e6f6465732061726520312062617365640000000000000000000000000000006044820152606401610892565b60ff8116600081815260fe6020526040902054845163ffffffff9091169185918110611c3157611c316138c5565b63ffffffff909216602092830291909101909101525080611c51816138f1565b915050611b88565b506000611c6b868385888e8e8e6121ff565b60fc5490915015611ce5576000611c8387868561264b565b9050611c948288838688600061277a565b50600080611ca28984610a68565b90925090505b8015611ce1576000611cbc8a85888a6129a0565b90508015611cd557611cce8183613972565b9150611cdb565b50611ce1565b50611ca8565b5050505b600060015b84518160ff161015611d8a576000858260ff1681518110611d0d57611d0d6138c5565b602002602001015160ff161115611d78576000848260ff1681518110611d3557611d356138c5565b60209081029190910181015160ff8416600090815260fe9092526040909120805463ffffffff191663ffffffff8316179055905082611d738161399b565b935050505b80611d828161399b565b915050611cea565b5060008160ff1667ffffffffffffffff811115611da957611da9613587565b604051908082528060200260200182016040528015611dd2578160200160208202803683370190505b509050600060015b86518160ff161015611e7a576000878260ff1681518110611dfd57611dfd6138c5565b602002602001015160ff161115611e685760ff8116600090815260fd60205260409020546001600160a01b03168383611e35816138f1565b945081518110611e4757611e476138c5565b60200260200101906001600160a01b031690816001600160a01b0316815250505b80611e728161399b565b915050611dda565b507fb338e44b9e4e2d94df983fde422fd91ba2bd6f8182b607b50c968f8161bcf88582604051611eaa91906134ef565b60405180910390a150909b9a5050505050505050505050565b610a31611902565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611f0357611efe83612c7a565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611f5d575060408051601f3d908101601f19168201909252611f5a918101906139d3565b60015b611fcf5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610892565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146120645760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610892565b50611efe838383612d38565b606580546001600160a01b0319169055610a3181612d5d565b60fb54600090610100900460ff1680156120a95760fb805461ff00191690555b60fb5460ff1660006120bb85836139ec565b60fb5490915062010000900460ff16158015906120d9575060008112155b80156120f0575060fb5462010000900460ff168113155b80156120fe575060fc548113155b156121175760fb805460ff191660ff8316179055600192505b50909392505050565b600054610100900460ff16610d9b5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610892565b600054610100900460ff166121f65760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610892565b610d9b33612070565b6060808415801561220e575083155b15612229575050604080516000815260208101909152612640565b83156122be576040805160208082526104208201909252908082016104008036833701905050905060005b602060ff821610156122b65761226a8482612daf565b60ff1660011461227b5760ff61227d565b805b828260ff1681518110612292576122926138c5565b60ff90921660209283029190910190910152806122ae8161399b565b915050612254565b509050612640565b6122c960208761390a565b67ffffffffffffffff8111156122e1576122e1613587565b60405190808252806020026020018201604052801561230a578160200160208202803683370190505b5090506000805b8781101561237d5760005b602060ff8216101561236a57808484612334816138f1565b955081518110612346576123466138c5565b60ff90921660209283029190910190910152806123628161399b565b91505061231c565b5080612375816138f1565b915050612311565b5060005b8a518110156124fe5760008b828151811061239e5761239e6138c5565b602002602001015160ff16905060008b82815181106123bf576123bf6138c5565b6020026020010151905060005b602060ff821610156124bb576123e28282612daf565b60ff16156124a95760001960005b8751811015612439578260ff1688828151811061240f5761240f6138c5565b602002602001015160ff160361242757809150612439565b80612431816138f1565b9150506123f0565b50801961247e57600160ff83161b19831692508c848151811061245e5761245e6138c5565b6020026020010180518091906124739061399b565b60ff169052506124a7565b60ff878281518110612492576124926138c5565b602002602001019060ff16908160ff16815250505b505b806124b38161399b565b9150506123cc565b50808c83815181106124cf576124cf6138c5565b602002602001019063ffffffff16908163ffffffff1681525050505080806124f6906138f1565b915050612381565b506000805b83518110156125525760ff8016848281518110612522576125226138c5565b602002602001015160ff1603612540578161253c816138f1565b9250505b8061254a816138f1565b915050612503565b5060008184516125629190613972565b67ffffffffffffffff81111561257a5761257a613587565b6040519080825280602002602001820160405280156125a3578160200160208202803683370190505b5090506000805b85518110156126375760ff80168682815181106125c9576125c96138c5565b602002602001015160ff1614612625578581815181106125eb576125eb6138c5565b6020026020010151838381518110612605576126056138c5565b60ff9092166020928302919091019091015281612621816138f1565b9250505b8061262f816138f1565b9150506125aa565b50909450505050505b979650505050505050565b6060600061265a8460016139ba565b60ff1667ffffffffffffffff81111561267557612675613587565b60405190808252806020026020018201604052801561269e578160200160208202803683370190505b50905060005b85518110156127715760008682815181106126c1576126c16138c5565b602002602001015190506000858260ff16815181106126e2576126e26138c5565b602002602001015190506000805b602060ff82161015612730576127068382612daf565b60ff1660010361271e578161271a8161399b565b9250505b806127288161399b565b9150506126f0565b5080858460ff1681518110612747576127476138c5565b602002602001019060ff16908160ff16815250505050508080612769906138f1565b9150506126a4565b50949350505050565b6000865160000361278d57506000612996565b6127978686612dc5565b6000805b88518110156129925760008982815181106127b8576127b86138c5565b6020026020010151905060ff80168160ff16036127d55750612980565b60005b89518160ff16101561297d5760008a8260ff16815181106127fb576127fb6138c5565b6020026020010151905060008760ff1611801561283a57508660ff168a8260ff168151811061282c5761282c6138c5565b602002602001015160ff1610155b15612845575061296b565b6000898260ff168151811061285c5761285c6138c5565b6020026020010151905060006128728286612daf565b90508060ff166000036129675760ff8e8781518110612893576128936138c5565b60ff928316602091820292909201015260019086161b82178b8460ff16815181106128c0576128c06138c5565b602002602001019063ffffffff16908163ffffffff16815250508b8360ff16815181106128ef576128ef6138c5565b6020026020010180518091906129049061399b565b60ff1660ff1681525050898360ff1681518110612923576129236138c5565b6020026020010180518091906129389061399b565b60ff1660ff16815250506129528d8d8660ff166001612dec565b8661295c816138f1565b97505050505061297d565b5050505b806129758161399b565b9150506127d8565b50505b8061298a816138f1565b91505061279b565b5090505b9695505050505050565b600084516000036129b357506000612c72565b6129bd8585612dc5565b600080600187516129ce9190613972565b90506129d86134a4565b81831015612c6a5760008884815181106129f4576129f46138c5565b602002602001015190506000898481518110612a1257612a126138c5565b602002602001015190506000888360ff1681518110612a3357612a336138c5565b602002602001015119898360ff1681518110612a5157612a516138c5565b60200260200101518a8560ff1681518110612a6e57612a6e6138c5565b6020026020010151181690508063ffffffff16600014612c47576000612a94828661302a565b9050612ac58a8460ff1681518110612aae57612aae6138c5565b602002602001015182600160ff919091161b191690565b8a8460ff1681518110612ada57612ada6138c5565b602002602001019063ffffffff16908163ffffffff16815250508a8360ff1681518110612b0957612b096138c5565b602002602001018051809190612b1e90613a14565b60ff1660ff1681525050888360ff1681518110612b3d57612b3d6138c5565b602002602001018051809190612b529061399b565b60ff1660ff1681525050612b8a8a8560ff1681518110612b7457612b746138c5565b602002602001015182600160ff919091161b1790565b8a8560ff1681518110612b9f57612b9f6138c5565b602002602001019063ffffffff16908163ffffffff16815250508a8460ff1681518110612bce57612bce6138c5565b602002602001018051809190612be39061399b565b60ff1660ff1681525050888460ff1681518110612c0257612c026138c5565b602002602001018051809190612c179061399b565b60ff16905250612c2a8c8c896001612dec565b612c378c8c886000612dec565b6001975050505050505050612c72565b85612c51816138f1565b9650508480612c5f90613a31565b9550505050506129d8565b600093505050505b949350505050565b6001600160a01b0381163b612cf75760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610892565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b612d4183613152565b600082511180612d4e5750805b15611efe576118fc8383613192565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600163ffffffff831660ff83161c165b92915050565b8151600003612dd2575050565b610cc08282600060018651612de79190613972565b6131be565b818115612ec7575b6000612e018260016139ec565b12158015612e26575060018551612e189190613972565b612e238260016139ec565b13155b8015612eab57508385612e3a8360016139ec565b81518110612e4a57612e4a6138c5565b602002602001015160ff1681518110612e6557612e656138c5565b602002602001015160ff1684868581518110612e8357612e836138c5565b602002602001015160ff1681518110612e9e57612e9e6138c5565b602002602001015160ff16115b15612ec25780612eba81613a48565b915050612df4565b612f95565b6000612ed4600183613a79565b12158015612ef9575060018551612eeb9190613972565b612ef6600183613a79565b13155b8015612f7e57508385612f0d600184613a79565b81518110612f1d57612f1d6138c5565b602002602001015160ff1681518110612f3857612f386138c5565b602002602001015160ff1684868581518110612f5657612f566138c5565b602002602001015160ff1681518110612f7157612f716138c5565b602002602001015160ff16105b15612f955780612f8d81613a99565b915050612ec7565b828114613023576000858281518110612fb057612fb06138c5565b60200260200101519050858481518110612fcc57612fcc6138c5565b6020026020010151868381518110612fe657612fe66138c5565b602002602001019060ff16908160ff16815250508086858151811061300d5761300d6138c5565b602002602001019060ff16908160ff1681525050505b5050505050565b600080805b63ffffffff8516156130955760018086169003613075578084836130528161399b565b945060ff1660208110613067576130676138c5565b60ff90921660209290920201525b60018563ffffffff16901c9450808061308d9061399b565b91505061302f565b60408051426020808301919091527fff0000000000000000000000000000000000000000000000000000000000000060f885811b8216848601527fffffffff0000000000000000000000000000000000000000000000000000000060e08b901b16604185015286901b166045830152825180830360260181526046909201909252805191012060009061312c9060ff85169061394b565b9050848160ff1660208110613143576131436138c5565b60200201519695505050505050565b61315b81612c7a565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606131b78383604051806060016040528060278152602001613b506027913961339d565b9392505050565b81818082036131ce5750506118fc565b6000858760026131de8888613a79565b6131e89190613aae565b6131f290886139ec565b81518110613202576132026138c5565b602002602001015160ff168151811061321d5761321d6138c5565b602002602001015190505b818313613375575b8060ff1686888581518110613247576132476138c5565b602002602001015160ff1681518110613262576132626138c5565b602002602001015160ff161015613285578261327d81613a48565b935050613230565b85878381518110613298576132986138c5565b602002602001015160ff16815181106132b3576132b36138c5565b602002602001015160ff168160ff1610156132da57816132d281613a99565b925050613285565b818313613370578682815181106132f3576132f36138c5565b602002602001015187848151811061330d5761330d6138c5565b6020026020010151888581518110613327576133276138c5565b60200260200101898581518110613340576133406138c5565b60ff9384166020918202929092010152911690528261335e81613a48565b935050818061336c90613a99565b9250505b613228565b8185121561338957613389878787856131be565b8383121561152e5761152e878785876131be565b6060600080856001600160a01b0316856040516133ba9190613b00565b600060405180830381855af49150503d80600081146133f5576040519150601f19603f3d011682016040523d82523d6000602084013e6133fa565b606091505b5091509150612996868383876060831561347557825160000361346e576001600160a01b0385163b61346e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610892565b5081612c72565b612c72838381511561348a5781518083602001fd5b8060405162461bcd60e51b81526004016108929190613b1c565b6040518061040001604052806020906020820280368337509192915050565b803560ff811681146110f757600080fd5b6000602082840312156134e657600080fd5b6131b7826134c3565b6020808252825182820181905260009190848201906040850190845b818110156135305783516001600160a01b03168352928401929184019160010161350b565b50909695505050505050565b80356001600160a01b03811681146110f757600080fd5b60006020828403121561356557600080fd5b6131b78261353c565b60006020828403121561358057600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156135c6576135c6613587565b604052919050565b600067ffffffffffffffff8211156135e8576135e8613587565b5060051b60200190565b600082601f83011261360357600080fd5b81356020613618613613836135ce565b61359d565b82815260059290921b8401810191818101908684111561363757600080fd5b8286015b848110156136595761364c816134c3565b835291830191830161363b565b509695505050505050565b6000806040838503121561367757600080fd5b823567ffffffffffffffff8082111561368f57600080fd5b61369b868387016135f2565b935060208501359150808211156136b157600080fd5b506136be858286016135f2565b9150509250929050565b600080604083850312156136db57600080fd5b6136e48361353c565b915060208084013567ffffffffffffffff8082111561370257600080fd5b818601915086601f83011261371657600080fd5b81358181111561372857613728613587565b61373a601f8201601f1916850161359d565b9150808252878482850101111561375057600080fd5b80848401858401376000848284010152508093505050509250929050565b6000806040838503121561378157600080fd5b61378a8361353c565b9150602083013563ffffffff811681146137a357600080fd5b809150509250929050565b600060208083850312156137c157600080fd5b823567ffffffffffffffff8111156137d857600080fd5b8301601f810185136137e957600080fd5b80356137f7613613826135ce565b81815260059190911b8201830190838101908783111561381657600080fd5b928401925b828410156126405761382c8461353c565b8252928401929084019061381b565b6020808252825182820181905260009190848201906040850190845b8181101561353057835163ffffffff1683529284019291840191600101613857565b60008060006060848603121561388e57600080fd5b833561ffff811681146138a057600080fd5b92506138ae6020850161353c565b91506138bc604085016134c3565b90509250925092565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201613903576139036138db565b5060010190565b8082028115828204841417612dbf57612dbf6138db565b634e487b7160e01b600052601260045260246000fd5b60008261394657613946613921565b500490565b60008261395a5761395a613921565b500690565b80820180821115612dbf57612dbf6138db565b81810381811115612dbf57612dbf6138db565b634e487b7160e01b600052603160045260246000fd5b600060ff821660ff81036139b1576139b16138db565b60010192915050565b60ff8181168382160190811115612dbf57612dbf6138db565b6000602082840312156139e557600080fd5b5051919050565b8082018281126000831280158216821582161715613a0c57613a0c6138db565b505092915050565b600060ff821680613a2757613a276138db565b6000190192915050565b600081613a4057613a406138db565b506000190190565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613903576139036138db565b8181036000831280158383131683831282161715610826576108266138db565b6000600160ff1b8203613a4057613a406138db565b600082613abd57613abd613921565b600160ff1b821460001984141615613ad757613ad76138db565b500590565b60005b83811015613af7578181015183820152602001613adf565b50506000910152565b60008251613b12818460208701613adc565b9190910192915050565b6020815260008251806020840152613b3b816040850160208701613adc565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212208b49979b2f722eba21fe73a725f59b75c53ae7952a13f2732dd8e0c979721d1c64736f6c63430008110033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/push-docker/v02/ValidatorV1.json b/push-docker/v02/ValidatorV1.json new file mode 100644 index 0000000..dbecf31 --- /dev/null +++ b/push-docker/v02/ValidatorV1.json @@ -0,0 +1,1161 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ValidatorV1", + "sourceName": "contracts/Validator.sol", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint16", + "name": "valPerBlock", + "type": "uint16" + }, + { + "indexed": false, + "internalType": "uint16", + "name": "valPerBlockTarget", + "type": "uint16" + } + ], + "name": "BlockParamsUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "ownerWallet", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "nodeWallet", + "type": "address" + }, + { + "indexed": false, + "internalType": "enum ValidatorV1.NodeType", + "name": "nodeType", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "nodeTokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "nodeApiBaseUrl", + "type": "string" + } + ], + "name": "NodeAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "nodeWallet", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "reporterWallet", + "type": "address" + }, + { + "indexed": false, + "internalType": "address[]", + "name": "voters", + "type": "address[]" + }, + { + "indexed": false, + "internalType": "enum ValidatorV1.VoteAction", + "name": "voteAction", + "type": "uint8" + } + ], + "name": "NodeReported", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "nodeWallet", + "type": "address" + }, + { + "indexed": false, + "internalType": "enum ValidatorV1.NodeStatus", + "name": "nodeStatus", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "nodeTokens", + "type": "uint256" + } + ], + "name": "NodeStatusChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint16", + "name": "nodeRandomMinCount", + "type": "uint16" + }, + { + "indexed": false, + "internalType": "uint16", + "name": "nodeRandomPingCount", + "type": "uint16" + } + ], + "name": "RandomParamsUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "inputs": [], + "name": "BAN_PERCENT", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "REPORTS_BEFORE_SLASH_S", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "REPORTS_BEFORE_SLASH_V", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "REPORT_THRESHOLD_PER_BLOCK", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SLASHES_BEFORE_BAN_S", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SLASHES_BEFORE_BAN_V", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SLASH_PERCENT", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "VERSION", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "dnodes", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getActiveVNodes", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "nodeWallet", + "type": "address" + }, + { + "internalType": "string", + "name": "nodeApiBaseUrl", + "type": "string" + } + ], + "internalType": "struct ValidatorV1.ActiveValidator[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDNodes", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDNodesLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_nodeWallet", + "type": "address" + } + ], + "name": "getNodeInfo", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "ownerWallet", + "type": "address" + }, + { + "internalType": "address", + "name": "nodeWallet", + "type": "address" + }, + { + "internalType": "enum ValidatorV1.NodeType", + "name": "nodeType", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "nodeTokens", + "type": "uint256" + }, + { + "internalType": "string", + "name": "nodeApiBaseUrl", + "type": "string" + }, + { + "components": [ + { + "internalType": "uint16", + "name": "reportCounter", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "slashCounter", + "type": "uint16" + }, + { + "internalType": "uint128[]", + "name": "reportedInBlocks", + "type": "uint128[]" + }, + { + "internalType": "address[]", + "name": "reportedBy", + "type": "address[]" + }, + { + "internalType": "uint128[]", + "name": "reportedKeys", + "type": "uint128[]" + } + ], + "internalType": "struct ValidatorV1.NodeCounters", + "name": "counters", + "type": "tuple" + }, + { + "internalType": "enum ValidatorV1.NodeStatus", + "name": "status", + "type": "uint8" + } + ], + "internalType": "struct ValidatorV1.NodeInfo", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getSNodes", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getSNodesLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVNodes", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVNodesLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint16", + "name": "protocolVersion_", + "type": "uint16" + }, + { + "internalType": "address", + "name": "pushToken_", + "type": "address" + }, + { + "internalType": "uint16", + "name": "valPerBlockTarget_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "nodeRandomMinCount_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "nodeRandomPingCount_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "REPORTS_BEFORE_SLASH_V_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "REPORTS_BEFORE_SLASH_S_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "SLASHES_BEFORE_BAN_V_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "SLASHES_BEFORE_BAN_S_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "SLASH_PERCENT_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "BAN_PERCENT_", + "type": "uint16" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "minStakeD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minStakeS", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minStakeV", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "nodeMap", + "outputs": [ + { + "internalType": "address", + "name": "ownerWallet", + "type": "address" + }, + { + "internalType": "address", + "name": "nodeWallet", + "type": "address" + }, + { + "internalType": "enum ValidatorV1.NodeType", + "name": "nodeType", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "nodeTokens", + "type": "uint256" + }, + { + "internalType": "string", + "name": "nodeApiBaseUrl", + "type": "string" + }, + { + "components": [ + { + "internalType": "uint16", + "name": "reportCounter", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "slashCounter", + "type": "uint16" + }, + { + "internalType": "uint128[]", + "name": "reportedInBlocks", + "type": "uint128[]" + }, + { + "internalType": "address[]", + "name": "reportedBy", + "type": "address[]" + }, + { + "internalType": "uint128[]", + "name": "reportedKeys", + "type": "uint128[]" + } + ], + "internalType": "struct ValidatorV1.NodeCounters", + "name": "counters", + "type": "tuple" + }, + { + "internalType": "enum ValidatorV1.NodeStatus", + "name": "status", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nodeRandomMinCount", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nodeRandomPingCount", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "protocolVersion", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from_", + "type": "address" + }, + { + "internalType": "address", + "name": "to_", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount_", + "type": "uint256" + } + ], + "name": "redistributeStaked", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeTokens_", + "type": "uint256" + }, + { + "internalType": "enum ValidatorV1.NodeType", + "name": "nodeType_", + "type": "uint8" + }, + { + "internalType": "string", + "name": "nodeApiBaseUrl_", + "type": "string" + }, + { + "internalType": "address", + "name": "nodeWallet_", + "type": "address" + } + ], + "name": "registerNodeAndStake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum ValidatorV1.NodeType", + "name": "targetNodeType_", + "type": "uint8" + }, + { + "internalType": "bytes", + "name": "voteBlob_", + "type": "bytes" + }, + { + "internalType": "bytes[]", + "name": "signatures_", + "type": "bytes[]" + } + ], + "name": "reportNode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "addr_", + "type": "address" + } + ], + "name": "setStorageContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "snodes", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "storageContract", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalFees", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalStaked", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to_", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount_", + "type": "uint256" + } + ], + "name": "unstakeFees", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeWallet_", + "type": "address" + } + ], + "name": "unstakeNode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint16", + "name": "valPerBlockTarget_", + "type": "uint16" + } + ], + "name": "updateBlockParams", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint16", + "name": "nodeRandomMinCount_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "nodeRandomPingCount_", + "type": "uint16" + } + ], + "name": "updateRandomParams", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "valPerBlock", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "valPerBlockTarget", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "vnodes", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "vnodesActive", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60a06040523060805234801561001457600080fd5b50608051615c436200004d60003960008181610db901528181610e3e015281816111a80152818161122d01526113170152615c436000f3fe60806040526004361061031e5760003560e01c80637f6e29de116101a5578063bdb860ea116100ec578063e67a5d7811610095578063f6e8913d1161006f578063f6e8913d146108b2578063f7714eb9146108d7578063fdd9344c146108fe578063ffa1ad741461092057600080fd5b8063e67a5d781461085c578063f108f5b61461087c578063f2fde38b1461089257600080fd5b8063dc38b0a2116100c6578063dc38b0a214610808578063dd6f8f9014610828578063e30c39781461083e57600080fd5b8063bdb860ea146107b2578063c993d861146107c8578063ce3e7e91146107e857600080fd5b8063931127a01161014e578063adf1daa611610128578063adf1daa614610750578063b10064eb14610772578063b27b154d1461079257600080fd5b8063931127a0146106fa578063974c5b411461071b5780639c30db5c1461073057600080fd5b806384f21a441161017f57806384f21a441461069a5780638b8f631f146106bc5780638da5cb5b146106dc57600080fd5b80637f6e29de14610658578063817b1cd21461066e57806381ebc5061461068557600080fd5b80633659cfe61161026957806365cdbaea11610212578063715018a6116101ec578063715018a61461061357806379ba5097146106285780637c4981c81461063d57600080fd5b806365cdbaea146105ae5780636dcd3af2146105d75780636ddf344a146105f757600080fd5b806352d1902d1161024357806352d1902d1461054c578063569c876214610561578063582115fb1461058157600080fd5b80633659cfe6146104e65780633a688a2f146105065780634f1ef2861461053957600080fd5b80631acf7629116102cb57806324212b86116102a557806324212b86146104855780632ae9c6001461049b578063339f334b146104b657600080fd5b80631acf76291461041657806323b8ac5d1461043857806323deecfe1461046357600080fd5b8063125c6c98116102fc578063125c6c98146103b957806313114a9d146103dd57806315aa7b06146103f457600080fd5b8063011f59a014610323578063024f38cb1461035d57806311ce026714610380575b600080fd5b34801561032f57600080fd5b5060ff5461034590600160701b900461ffff1681565b60405161ffff90911681526020015b60405180910390f35b34801561036957600080fd5b5060ff5461034590640100000000900461ffff1681565b34801561038c57600080fd5b50610101546103a1906001600160a01b031681565b6040516001600160a01b039091168152602001610354565b3480156103c557600080fd5b506103cf60fc5481565b604051908152602001610354565b3480156103e957600080fd5b506103cf6101085481565b34801561040057600080fd5b50610409610976565b6040516103549190614fd2565b34801561042257600080fd5b50610436610431366004614ffa565b6109d9565b005b34801561044457600080fd5b5060ff54610345906c01000000000000000000000000900461ffff1681565b34801561046f57600080fd5b5060ff5461034590600160801b900461ffff1681565b34801561049157600080fd5b506103cf60fe5481565b3480156104a757600080fd5b5060fb546103459061ffff1681565b3480156104c257600080fd5b506104d66104d1366004615017565b610b34565b6040519015158152602001610354565b3480156104f257600080fd5b50610436610501366004614ffa565b610daf565b34801561051257600080fd5b50610526610521366004614ffa565b610f2a565b60405161035497969594939291906151a7565b6104366105473660046152d3565b61119e565b34801561055857600080fd5b506103cf61130a565b34801561056d57600080fd5b506103a161057c366004615323565b6113cf565b34801561058d57600080fd5b506105a161059c366004614ffa565b6113fa565b604051610354919061533c565b3480156105ba57600080fd5b5060ff54610345906a0100000000000000000000900461ffff1681565b3480156105e357600080fd5b506104366105f23660046153ea565b6116eb565b34801561060357600080fd5b50610103546103459061ffff1681565b34801561061f57600080fd5b50610436611b1f565b34801561063457600080fd5b50610436611b33565b34801561064957600080fd5b5060ff546103459061ffff1681565b34801561066457600080fd5b50610105546103cf565b34801561067a57600080fd5b506103cf6101075481565b34801561069157600080fd5b50610409611bbe565b3480156106a657600080fd5b506106af611c1f565b60405161035491906154b8565b3480156106c857600080fd5b506103a16106d7366004615323565b611e6e565b3480156106e857600080fd5b506033546001600160a01b03166103a1565b34801561070657600080fd5b5060ff546103459062010000900461ffff1681565b34801561072757600080fd5b50610409611e7f565b34801561073c57600080fd5b5061043661074b366004615544565b611ee0565b34801561075c57600080fd5b5060ff5461034590600160901b900461ffff1681565b34801561077e57600080fd5b5061043661078d3660046155c2565b612775565b34801561079e57600080fd5b506104366107ad3660046156bc565b612daa565b3480156107be57600080fd5b50610104546103cf565b3480156107d457600080fd5b506103a16107e3366004615323565b612e7c565b3480156107f457600080fd5b506104d66108033660046156d7565b612e8d565b34801561081457600080fd5b50610436610823366004614ffa565b61336a565b34801561083457600080fd5b506103cf60fd5481565b34801561084a57600080fd5b506065546001600160a01b03166103a1565b34801561086857600080fd5b50610436610877366004615718565b613395565b34801561088857600080fd5b50610102546103cf565b34801561089e57600080fd5b506104366108ad366004614ffa565b61346a565b3480156108be57600080fd5b5060ff54610345906601000000000000900461ffff1681565b3480156108e357600080fd5b5060ff546103459068010000000000000000900461ffff1681565b34801561090a57600080fd5b5060ff5461034590600160a01b900461ffff1681565b34801561092c57600080fd5b506109696040518060400160405280600581526020017f302e302e3200000000000000000000000000000000000000000000000000000081525081565b604051610354919061574b565b60606101058054806020026020016040519081016040528092919081815260200182805480156109cf57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109b1575b5050505050905090565b6001600160a01b038082166000908152610106602052604090206001810154909116610a4c5760405162461bcd60e51b815260206004820152601460248201527f6e6f646520646f6573206e6f742065786973747300000000000000000000000060448201526064015b60405180910390fd5b80546001600160a01b0316331480610a7d575033610a726033546001600160a01b031690565b6001600160a01b0316145b610ac95760405162461bcd60e51b815260206004820152601d60248201527f6f6e6c79206f776e65722063616e20756e7374616b652061206e6f64650000006044820152606401610a43565b610ad2816134db565b5060088101805460ff1916600490811790915560018201546040516001600160a01b03909116917ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e91610b28919060009061575e565b60405180910390a25050565b6000610b3e6137c6565b6001600160a01b038316610b945760405162461bcd60e51b815260206004820152601260248201527f696e76616c696420746f206164647265737300000000000000000000000000006044820152606401610a43565b60008211610be45760405162461bcd60e51b815260206004820152600e60248201527f696e76616c696420616d6f756e740000000000000000000000000000000000006044820152606401610a43565b610108548211158015610c7c5750610100546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610c54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c789190615779565b8211155b610cc85760405162461bcd60e51b815260206004820152601460248201527f696e73756666696369656e742062616c616e63650000000000000000000000006044820152606401610a43565b6101005460405163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529091169063a9059cbb906044016020604051808303816000875af1158015610d1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d409190615792565b610d8c5760405162461bcd60e51b815260206004820152601260248201527f6661696c656420746f207472616e7366657200000000000000000000000000006044820152606401610a43565b816101086000828254610d9f91906157ca565b9091555060019150505b92915050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610e3c5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610a43565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610e977f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610f025760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610a43565b610f0b81613820565b60408051600080825260208201909252610f2791839190613828565b50565b6101066020526000908152604090208054600182015460028301546003840180546001600160a01b039485169594841694600160a01b90940460ff16939190610f72906157dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9e906157dd565b8015610feb5780601f10610fc057610100808354040283529160200191610feb565b820191906000526020600020905b815481529060010190602001808311610fce57829003601f168201915b50506040805160a08101825260048701805461ffff808216845262010000909104166020808401919091526005890180548551818402810184018752818152999a99949850929650938701945091929183018282801561109c57602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116110595790505b50505050508152602001600282018054806020026020016040519081016040528092919081815260200182805480156110fe57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116110e0575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561118857602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116111455790505b5050509190925250505060089091015460ff1687565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361122b5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610a43565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166112867f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b0316146112f15760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610a43565b6112fa82613820565b61130682826001613828565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113aa5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610a43565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b61010581815481106113e057600080fd5b6000918252602090912001546001600160a01b0316905081565b611402614db9565b6001600160a01b0382811660009081526101066020908152604091829020825160e08101845281548516815260018201549485169281019290925290929091830190600160a01b900460ff16600281111561145f5761145f615043565b600281111561147057611470615043565b81526020016002820154815260200160038201805461148e906157dd565b80601f01602080910402602001604051908101604052809291908181526020018280546114ba906157dd565b80156115075780601f106114dc57610100808354040283529160200191611507565b820191906000526020600020905b8154815290600101906020018083116114ea57829003601f168201915b50505091835250506040805160a08101825260048401805461ffff808216845262010000909104166020838101919091526005860180548551818402810184018752818152968301969495939493860193928301828280156115ba57602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116115775790505b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561161c57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116115fe575b50505050508152602001600382018054806020026020016040519081016040528092919081815260200182805480156116a657602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116116635790505b505050919092525050508152600882015460209091019060ff1660048111156116d1576116d1615043565b60048111156116e2576116e2615043565b90525092915050565b600054610100900460ff161580801561170b5750600054600160ff909116105b806117255750303b158015611725575060005460ff166001145b6117975760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a43565b6000805460ff1916600117905580156117ba576000805461ff0019166101001790555b6117c26139cd565b6117ca613a38565b60fb805461ffff191661ffff8e161790556001600160a01b038b166117ee57600080fd5b61010080546001600160a01b0319166001600160a01b038d1617905561ffff8a1661185b5760405162461bcd60e51b815260206004820152601860248201527f696e76616c69642061747465737465727320616d6f756e7400000000000000006044820152606401610a43565b60ff805461ffff808d16600160801b0271ffff00000000000000000000000000000000199092169190911790915589166118fd5760405162461bcd60e51b815260206004820152602160248201527f696e76616c6964206e6f646552616e646f6d4d696e436f756e7420616d6f756e60448201527f74000000000000000000000000000000000000000000000000000000000000006064820152608401610a43565b60ff805461ffff808c16600160901b027fffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffff9092169190911790915588166119ac5760405162461bcd60e51b815260206004820152602c60248201527f696e76616c6964206e6f646552616e646f6d46696c74657250696e677352657160448201527f756972656420616d6f756e7400000000000000000000000000000000000000006064820152608401610a43565b8760ff60146101000a81548161ffff021916908361ffff160217905550606460fc81905550606460fd81905550606460fe819055508660ff60026101000a81548161ffff021916908361ffff1602179055508560ff60046101000a81548161ffff021916908361ffff1602179055508260ff60066101000a81548161ffff021916908361ffff1602179055508460ff60086101000a81548161ffff021916908361ffff1602179055508360ff600a6101000a81548161ffff021916908361ffff1602179055508160ff600c6101000a81548161ffff021916908361ffff160217905550604260ff60006101000a81548161ffff021916908361ffff160217905550600060ff600e6101000a81548161ffff021916908361ffff1602179055508015611b11576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050505050565b611b276137c6565b611b316000613aa8565b565b60655433906001600160a01b03168114611bb55760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610a43565b610f2781613aa8565b60606101048054806020026020016040519081016040528092919081815260200182805480156109cf576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109b1575050505050905090565b60606000805b61010254811015611ca85760006101028281548110611c4657611c46615817565b60009182526020808320909101546001600160a01b03168083526101069091526040909120600881015491925090611c809060ff16613ac1565b15611c935783611c8f8161582d565b9450505b50508080611ca09061582d565b915050611c25565b5060008167ffffffffffffffff811115611cc457611cc4615214565b604051908082528060200260200182016040528015611d0a57816020015b604080518082019091526000815260606020820152815260200190600190039081611ce25790505b5090506000805b61010254811015611e655760006101028281548110611d3257611d32615817565b60009182526020808320909101546001600160a01b03168083526101069091526040909120600881015491925090611d6c9060ff16613ac1565b611d77575050611e53565b6040805180820190915260018201546001600160a01b03168152600382018054602083019190611da6906157dd565b80601f0160208091040260200160405190810160405280929190818152602001828054611dd2906157dd565b8015611e1f5780601f10611df457610100808354040283529160200191611e1f565b820191906000526020600020905b815481529060010190602001808311611e0257829003601f168201915b5050505050815250858580611e339061582d565b965081518110611e4557611e45615817565b602002602001018190525050505b80611e5d8161582d565b915050611d11565b50909392505050565b61010481815481106113e057600080fd5b60606101028054806020026020016040519081016040528092919081815260200182805480156109cf576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109b1575050505050905090565b6000836002811115611ef457611ef4615043565b03611fa65760fc54841015611f555760405162461bcd60e51b815260206004820152602160248201527f496e73756666696369656e7420636f6c6c61746572616c20666f7220564e4f446044820152604560f81b6064820152608401610a43565b61010280546001810182556000919091527f93bdaa6a4190909b7c3fbe8d42169ffe1cab19f51dfc8db24c71abf849eced4a0180546001600160a01b0319166001600160a01b03831617905561217a565b6001836002811115611fba57611fba615043565b0361206c5760fd5484101561201b5760405162461bcd60e51b815260206004820152602160248201527f496e73756666696369656e7420636f6c6c61746572616c20666f7220534e4f446044820152604560f81b6064820152608401610a43565b61010480546001810182556000919091527f4c0be60200faa20559308cb7b5a1bb3255c16cb1cab91f525b5ae7a03d02fabe0180546001600160a01b0319166001600160a01b03831617905561217a565b600283600281111561208057612080615043565b036121325760fe548410156120e15760405162461bcd60e51b815260206004820152602160248201527f496e73756666696369656e7420636f6c6c61746572616c20666f7220444e4f446044820152604560f81b6064820152608401610a43565b61010580546001810182556000919091527ffc62abc8c0fc47c2d92f5aec99bf8b60f375828e14394d89345cae11a98673710180546001600160a01b0319166001600160a01b03831617905561217a565b60405162461bcd60e51b815260206004820152601560248201527f756e737570706f72746564206e6f6465547970652000000000000000000000006044820152606401610a43565b6001600160a01b0380821660009081526101066020526040902080549091161561220c5760405162461bcd60e51b815260206004820152602560248201527f61206e6f64652077697468207075624b657920697320616c726561647920646560448201527f66696e65640000000000000000000000000000000000000000000000000000006064820152608401610a43565b841561231957610100546040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523360048201523060248201526000916001600160a01b03169063dd62ed3e90604401602060405180830381865afa15801561227b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061229f9190615779565b9050858110156123175760405162461bcd60e51b815260206004820152603260248201527f5f6e6f6465546f6b656e732063616e6e6f74206265207472616e73666572726560448201527f642c20636865636b20616c6c6f77616e636500000000000000000000000000006064820152608401610a43565b505b612321614db9565b3381526001600160a01b03831660208201526040810185600281111561234957612349615043565b9081600281111561235c5761235c615043565b90525060608101869052608081018490526001600160a01b0380841660009081526101066020908152604091829020845181549085166001600160a01b0319918216178255918501516001820180549190951692811683178555928501518594919390927fffffffffffffffffffffff00000000000000000000000000000000000000000090911617600160a01b8360028111156123fc576123fc615043565b0217905550606082015160028201556080820151600382019061241f908261588c565b5060a0820151805160048301805460208085015161ffff908116620100000263ffffffff1990931694169390931717815560408301518051919261246b92600587019290910190614e2d565b5060608201518051612487916002840191602090910190614ee5565b50608082015180516124a3916003840191602090910190614e2d565b50505060c082015160088201805460ff191660018360048111156124c9576124c9615043565b021790555050861590506125de57610100546040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018890526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015612548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256c9190615792565b6125de5760405162461bcd60e51b815260206004820152602560248201527f6661696c656420746f207472616e7366657220746f6b656e7320746f20636f6e60448201527f74726163740000000000000000000000000000000000000000000000000000006064820152608401610a43565b8561010760008282546125f1919061594c565b909155506000905085600281111561260b5761260b615043565b0361261d57612618613afb565b61271e565b600185600281111561263157612631615043565b0361271e57610101546001600160a01b031661268f5760405162461bcd60e51b815260206004820152601b60248201527f6e6f2073746f7261676520636f6e747261637420646566696e656400000000006044820152606401610a43565b610101546040517f9d95f1cc0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152909116908190639d95f1cc906024016020604051808303816000875af11580156126f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271b9190615970565b50505b826001600160a01b0316336001600160a01b03167f67bd55f864dcc77d483ff7567de0889142417ef6d0299753cfd80e4c72ddc5548789886040516127659392919061598b565b60405180910390a3505050505050565b3360009081526101066020526040902060018101546001600160a01b03166127df5760405162461bcd60e51b815260206004820152601060248201527f696e76616c6964207265706f72746572000000000000000000000000000000006044820152606401610a43565b600080835167ffffffffffffffff8111156127fc576127fc615214565b604051908082528060200260200182016040528015612825578160200160208202803683370190505b50905060005b84518110156129b457600073__$7aaf162b34d2533b02434bde51cad0c5c5$__6336de68108888858151811061286357612863615817565b60200260200101516040518363ffffffff1660e01b81526004016128889291906159b3565b602060405180830381865af41580156128a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c991906159d8565b6001600160a01b03808216600090815261010660205260409020600181015492935091166128f85750506129a2565b6000805b8681101561295157836001600160a01b031686828151811061292057612920615817565b60200260200101516001600160a01b03160361293f5760019150612951565b806129498161582d565b9150506128fc565b508015612960575050506129a2565b82858761296c8161582d565b98508151811061297e5761297e615817565b60200260200101906001600160a01b031690816001600160a01b0316815250505050505b806129ac8161582d565b91505061282b565b508351821015612a6a5760008267ffffffffffffffff8111156129d9576129d9615214565b604051908082528060200260200182016040528015612a02578160200160208202803683370190505b50905060005b83811015612a6657828181518110612a2257612a22615817565b6020026020010151828281518110612a3c57612a3c615817565b6001600160a01b039092166020928302919091019091015280612a5e8161582d565b915050612a08565b5090505b6000866002811115612a7e57612a7e615043565b03612c0957600080600087806020019051810190612a9c9190615a0c565b9194509250905060ff8316600114612af65760405162461bcd60e51b815260206004820152601c60248201527f7265706f727420616374696f6e206f6e6c7920737570706f72746564000000006044820152606401610a43565b6001600160a01b038082166000908152610106602052604090206001810154909116612b6f5760405162461bcd60e51b815260206004820152602260248201527f746172676574206e6f64652077616c6c657420646f6573206e6f742065786973604482015261747360f01b6064820152608401610a43565b60006001820154600160a01b900460ff166002811115612b9157612b91615043565b14612bde5760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220564e6f646573000000000000000000006044820152606401610a43565b612bff8460ff166002811115612bf657612bf6615043565b88878487613c61565b5050505050612da2565b6001866002811115612c1d57612c1d615043565b03612da25760008060008088806020019051810190612c3c9190615a53565b9296509094509250905060ff8416600214612c995760405162461bcd60e51b815260206004820152601c60248201527f7265706f727420616374696f6e206f6e6c7920737570706f72746564000000006044820152606401610a43565b6001600160a01b038083166000908152610106602052604090206001810154909116612d125760405162461bcd60e51b815260206004820152602260248201527f746172676574206e6f64652077616c6c657420646f6573206e6f742065786973604482015261747360f01b6064820152608401610a43565b600180820154600160a01b900460ff166002811115612d3357612d33615043565b14612d805760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220534e6f646573000000000000000000006044820152606401610a43565b611b118560ff166002811115612d9857612d98615043565b8988848887613e09565b505050505050565b612db26137c6565b6101025461ffff82161115612e095760405162461bcd60e51b815260206004820152601c60248201527f696e636f72726563742076616c506572426c6f636b5461726765745f000000006044820152606401610a43565b60ff805471ffff000000000000000000000000000000001916600160801b61ffff848116918202929092179283905560408051600160701b909404909216835260208301527f81512b84dc2b38f82b4999b5512a14df033b165371fa51776cce559212bf0a44910160405180910390a150565b61010281815481106113e057600080fd5b6000612e976137c6565b60008211612ee75760405162461bcd60e51b815260206004820152601960248201527f616d6f756e742073686f756c6420626520706f736974697665000000000000006044820152606401610a43565b826001600160a01b0316846001600160a01b031603612f6e5760405162461bcd60e51b815260206004820152602660248201527f63616e6e6f74207472616e73666572206265747765656e2073616d652061646460448201527f72657373657300000000000000000000000000000000000000000000000000006064820152608401610a43565b6001600160a01b03831615801590612f8d57506001600160a01b038416155b156130b45781610108541015612ff55760405162461bcd60e51b815260206004820152602760248201527f66726f6d206e6f64652073686f756c64206861766520656e6f75676820636f6c6044820152661b185d195c985b60ca1b6064820152608401610a43565b6001600160a01b0380841660009081526101066020526040902080549091166130605760405162461bcd60e51b815260206004820152600f60248201527f6d697373696e6720746f206e6f646500000000000000000000000000000000006044820152606401610a43565b82610108600082825461307391906157ca565b9250508190555082610107600082825461308d919061594c565b92505081905550828160020160008282546130a8919061594c565b90915550613360915050565b6001600160a01b038416158015906130d357506001600160a01b038316155b156131ef576001600160a01b0380851660009081526101066020526040902080549091166131435760405162461bcd60e51b815260206004820152601160248201527f6d697373696e672066726f6d206e6f64650000000000000000000000000000006044820152606401610a43565b82816002015410156131a75760405162461bcd60e51b815260206004820152602760248201527f66726f6d206e6f64652073686f756c64206861766520656e6f75676820636f6c6044820152661b185d195c985b60ca1b6064820152608401610a43565b828160020160008282546131bb91906157ca565b925050819055508261010760008282546131d591906157ca565b925050819055508261010860008282546130a8919061594c565b6001600160a01b03808516600090815261010660205260409020805490911661325a5760405162461bcd60e51b815260206004820152601160248201527f6d697373696e672066726f6d206e6f64650000000000000000000000000000006044820152606401610a43565b82816002015410156132be5760405162461bcd60e51b815260206004820152602760248201527f66726f6d206e6f64652073686f756c64206861766520656e6f75676820636f6c6044820152661b185d195c985b60ca1b6064820152608401610a43565b6001600160a01b0380851660009081526101066020526040902082549091166133295760405162461bcd60e51b815260206004820152600f60248201527f6d697373696e6720746f206e6f646500000000000000000000000000000000006044820152606401610a43565b8382600201600082825461333d91906157ca565b9250508190555083816002016000828254613358919061594c565b909155505050505b5060019392505050565b6133726137c6565b61010180546001600160a01b0319166001600160a01b0392909216919091179055565b61339d6137c6565b6101025461ffff8316106133b057600080fd5b6101025461ffff8216106133c357600080fd5b60ff80547fffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffff16600160901b61ffff8581169182027fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1692909217600160a01b928516928302179092556040805192835260208301919091527fcd481667fa77e513c517493174075f0471ec1fe24d57af644377cd1a2572d13d910160405180910390a15050565b6134726137c6565b606580546001600160a01b0383166001600160a01b031990911681179091556134a36033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600281015461010054825460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810184905260009392919091169063a9059cbb906044016020604051808303816000875af115801561353b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061355f9190615792565b6135d15760405162461bcd60e51b815260206004820152602560248201527f6661696c656420746f20747261736665722066756e6473206261636b20746f2060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610a43565b600083600201819055508061010760008282546135ee91906157ca565b92505081905550806101086000828254613608919061594c565b90915550600090506001840154600160a01b900460ff16600281111561363057613630615043565b0361367a57613643600584016000614f3a565b613651600684016000614f5f565b600183015461366c90610102906001600160a01b0316613fb5565b50613675613afb565b610da9565b600180840154600160a01b900460ff16600281111561369b5761369b615043565b03610da957610101546001600160a01b03166136f95760405162461bcd60e51b815260206004820152601b60248201527f6e6f2073746f7261676520636f6e747261637420646566696e656400000000006044820152606401610a43565b6101015460018401546040517fb2b99ec90000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690819063b2b99ec990602401600060405180830381600087803b15801561376057600080fd5b505af1158015613774573d6000803e3d6000fd5b5061378792505050600585016000614f3a565b613795600685016000614f5f565b6137a3600785016000614f3a565b60018401546137be90610104906001600160a01b0316613fb5565b505092915050565b6033546001600160a01b03163314611b315760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a43565b610f276137c6565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156138605761385b836140e1565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156138ba575060408051601f3d908101601f191682019092526138b791810190615779565b60015b61392c5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610a43565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146139c15760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610a43565b5061385b83838361419f565b600054610100900460ff16611b315760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610a43565b600054610100900460ff16613aa35760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610a43565b611b31335b606580546001600160a01b0319169055610f27816141ca565b60006004826004811115613ad757613ad7615043565b1480613af457506003826004811115613af257613af2615043565b145b1592915050565b6000805b61010254811015613b825760006101028281548110613b2057613b20615817565b60009182526020808320909101546001600160a01b03168083526101069091526040909120600881015491925090613b5a9060ff16613ac1565b15613b6d5783613b6981615aa9565b9450505b50508080613b7a9061582d565b915050613aff565b50610103805461ffff191661ffff83811691821790925560ff548392600160801b9091041690811015613bb3578091505b60ff5461ffff808316600160701b909204161115613bd057600080fd5b60ff5461ffff838116600160701b909204161461385b5760ff80547fffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffff16600160701b61ffff858116918202929092179092556040805192835290831660208301527f81512b84dc2b38f82b4999b5512a14df033b165371fa51776cce559212bf0a44910160405180910390a1505050565b6000806001840154600160a01b900460ff166002811115613c8457613c84615043565b14613cd15760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220564e6f646573000000000000000000006044820152606401610a43565b60ff54606490613cef9061ffff80821691600160701b900416615aca565b613cf99190615afe565b61ffff1684511015613d4d5760405162461bcd60e51b815260206004820152601460248201527f73696720636f756e7420697320746f6f206c6f770000000000000000000000006044820152606401610a43565b600883015460ff166004816004811115613d6957613d69615043565b1480613d8657506003816004811115613d8457613d84615043565b145b15613d95576000915050613e00565b613da48787868887600061421c565b60ff54600485015461ffff620100009092048216911610613dc957613dc98685614892565b60ff5460048501546801000000000000000090910461ffff908116620100009092041610613dfa57613dfa84614af0565b60009150505b95945050505050565b6000600180850154600160a01b900460ff166002811115613e2c57613e2c615043565b14613e795760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220534e6f646573000000000000000000006044820152606401610a43565b60ff54606490613e979061ffff80821691600160701b900416615aca565b613ea19190615afe565b61ffff1685511015613ef55760405162461bcd60e51b815260206004820152601460248201527f73696720636f756e7420697320746f6f206c6f770000000000000000000000006044820152606401610a43565b600884015460ff166004816004811115613f1157613f11615043565b1480613f2e57506003816004811115613f2c57613f2c615043565b145b15613f3d576000915050613fab565b613f4b88888789888861421c565b60ff54600486015461ffff6401000000009092048216911610613f7257613f728786614892565b60ff5460048601546a010000000000000000000090910461ffff908116620100009092041610613fa557613fa585614af0565b60009150505b9695505050505050565b8154600090815b818110156140d657836001600160a01b0316858281548110613fe057613fe0615817565b6000918252602090912001546001600160a01b0316036140c4576140056001836157ca565b811461408657846140176001846157ca565b8154811061402757614027615817565b9060005260206000200160009054906101000a90046001600160a01b031685828154811061405757614057615817565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b8480548061409657614096615b1f565b600082815260209020810160001990810180546001600160a01b03191690550190555060019150610da99050565b806140ce8161582d565b915050613fbc565b506000949350505050565b6001600160a01b0381163b61415e5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610a43565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6141a883614b97565b6000825111806141b55750805b1561385b576141c48383614bd7565b50505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000846004016001018054806020026020016040519081016040528092919081815260200182805480156142a157602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f0104928301926001038202915080841161425e5790505b505083519394506000925050505b81811015614343578281815181106142c9576142c9615817565b60200260200101516001600160801b0316856001600160801b0316036143315760405162461bcd60e51b815260206004820152601060248201527f626c6f636b206973206e6f74206e6577000000000000000000000000000000006044820152606401610a43565b8061433b8161582d565b9150506142af565b50600180870154600160a01b900460ff16600281111561436557614365615043565b0361453057826001600160801b03166000036143c35760405162461bcd60e51b815260206004820152601760248201527f73746f72616765206b65792069732072657175697265640000000000000000006044820152606401610a43565b60008660040160030180548060200260200160405190810160405280929190818152602001828054801561444857602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116144055790505b505083519394506000925050505b818110156144ea5782818151811061447057614470615817565b60200260200101516001600160801b0316866001600160801b0316036144d85760405162461bcd60e51b815260206004820152601660248201527f73746f72616765206b6579206973206e6f74206e6577000000000000000000006044820152606401610a43565b806144e28161582d565b915050614456565b505050600786018054600180820183556000928352602090922060028204018054929091166010026101000a6001600160801b0381810219909316928616029190911790555b60048601805461ffff1690600061454683615aa9565b825461010092830a61ffff818102199092169290911602179091556005880180546001818101835560009283526020808420600284040180549390921660100290940a6001600160801b0381810219909316928a1602919091179055600689018054604080518286028101860190915281815292945091929091908301828280156145fa57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116145dc575b505083519394506000925050505b87518110156146fe5760005b828110156146eb5783818151811061462e5761462e615817565b60200260200101516001600160a01b031689838151811061465157614651615817565b60200260200101516001600160a01b031614801561469b575060006001600160a01b031689838151811061468757614687615817565b60200260200101516001600160a01b031614155b156146d95760008983815181106146b4576146b4615817565b60200260200101906001600160a01b031690816001600160a01b0316815250506146eb565b806146e38161582d565b915050614614565b50806146f68161582d565b915050614608565b5060005b87518110156147ab57600088828151811061471f5761471f615817565b6020026020010151905060006001600160a01b0316816001600160a01b031614614798578960040160020189838151811061475c5761475c615817565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790555b50806147a38161582d565b915050614702565b506000600889015460ff1660048111156147c7576147c7615043565b036147dc5760088801805460ff191660011790555b600180890154908a01546040517f19d5f3972073c7002111a82b2a44db11e739567a002445f2e3db8ab96fe6645f92614827926001600160a01b03918216929116908b908f90615b35565b60405180910390a16001880154600889015460028a01546040516001600160a01b03909316927ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e9261487e9260ff9091169161575e565b60405180910390a250505050505050505050565b60ff5460009081906148b39084906601000000000000900461ffff16614c03565b600685018054604080516020808402820181019092528281529496509294506000939283018282801561490f57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116148f1575b5050505050905060008083118015614928575060008251115b156149d25781516149399084615b7b565b905060005b82518110156149d0576000610106600085848151811061496057614960615817565b6020908102919091018101516001600160a01b0390811683529082019290925260400160002080549092501661499657506149be565b828160020160008282546149aa919061594c565b909155506149ba905083866157ca565b9450505b806149c88161582d565b91505061493e565b505b828660020160008282546149e6919061594c565b909155506149fa9050600686016000614f5f565b6000600886015460ff166004811115614a1557614a15615043565b1480614a3957506001600886015460ff166004811115614a3757614a37615043565b145b15614a4e5760088501805460ff191660021790555b60048501805461ffff191680825562010000900461ffff16906002614a7283615aa9565b91906101000a81548161ffff021916908361ffff160217905550508460010160009054906101000a90046001600160a01b03166001600160a01b03167ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e600286604051614ae092919061575e565b60405180910390a2505050505050565b60ff546000908190614b179084906c01000000000000000000000000900461ffff16614c03565b9092509050614b25836134db565b5060048301805463ffff00001916905560088301805460ff1916600390811790915560018401546040516001600160a01b03909116917ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e91614b8a919060009061575e565b60405180910390a2505050565b614ba0816140e1565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060614bfc8383604051806060016040528060278152602001615be760279139614ca5565b9392505050565b60008060648363ffffffff161115614c5d5760405162461bcd60e51b815260206004820181905260248201527f70657263656e746167652073686f756c6420626520696e205b302c203130305d6044820152606401610a43565b60028401546064614c6e8582615b8f565b614c7e9063ffffffff1683615bb3565b614c889190615b7b565b9250614c9483826157ca565b600286018490559150509250929050565b6060600080856001600160a01b031685604051614cc29190615bca565b600060405180830381855af49150503d8060008114614cfd576040519150601f19603f3d011682016040523d82523d6000602084013e614d02565b606091505b5091509150613fab8683838760608315614d7d578251600003614d76576001600160a01b0385163b614d765760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a43565b5081614d87565b614d878383614d8f565b949350505050565b815115614d9f5781518083602001fd5b8060405162461bcd60e51b8152600401610a43919061574b565b6040805160e081018252600080825260208201819052909182019081526020016000815260200160608152602001614e216040518060a00160405280600061ffff168152602001600061ffff1681526020016060815260200160608152602001606081525090565b81526020016000905290565b82805482825590600052602060002090600101600290048101928215614ed55791602002820160005b83821115614ea057835183826101000a8154816001600160801b0302191690836001600160801b031602179055509260200192601001602081600f01049283019260010302614e56565b8015614ed35782816101000a8154906001600160801b030219169055601001602081600f01049283019260010302614ea0565b505b50614ee1929150614f79565b5090565b828054828255906000526020600020908101928215614ed5579160200282015b82811115614ed557825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614f05565b508054600082556001016002900490600052602060002090810190610f279190614f79565b5080546000825590600052602060002090810190610f2791905b5b80821115614ee15760008155600101614f7a565b600081518084526020808501945080840160005b83811015614fc75781516001600160a01b031687529582019590820190600101614fa2565b509495945050505050565b602081526000614bfc6020830184614f8e565b6001600160a01b0381168114610f2757600080fd5b60006020828403121561500c57600080fd5b8135614bfc81614fe5565b6000806040838503121561502a57600080fd5b823561503581614fe5565b946020939093013593505050565b634e487b7160e01b600052602160045260246000fd5b60038110610f2757610f27615043565b60005b8381101561508457818101518382015260200161506c565b50506000910152565b600081518084526150a5816020860160208601615069565b601f01601f19169290920160200192915050565b600081518084526020808501945080840160005b83811015614fc75781516001600160801b0316875295820195908201906001016150cd565b600061ffff8083511684526020818185015116818601526040840151915060a0604086015261512460a08601836150b9565b60608581015187830391880191909152805180835290830193506000918301905b8083101561516e5784516001600160a01b03168252938301936001929092019190830190615145565b5060808601519350868103608088015261518881856150b9565b979650505050505050565b600581106151a3576151a3615043565b9052565b6001600160a01b0388811682528716602082015260006151c687615059565b86604083015285606083015260e060808301526151e660e083018661508d565b82810360a08401526151f881866150f2565b91505061520860c0830184615193565b98975050505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561525357615253615214565b604052919050565b600067ffffffffffffffff83111561527557615275615214565b615288601f8401601f191660200161522a565b905082815283838301111561529c57600080fd5b828260208301376000602084830101529392505050565b600082601f8301126152c457600080fd5b614bfc8383356020850161525b565b600080604083850312156152e657600080fd5b82356152f181614fe5565b9150602083013567ffffffffffffffff81111561530d57600080fd5b615319858286016152b3565b9150509250929050565b60006020828403121561533557600080fd5b5035919050565b6020815260006001600160a01b0380845116602084015280602085015116604084015250604083015161536e81615059565b8060608401525060608301516080830152608083015160e060a084015261539961010084018261508d565b905060a0840151601f198483030160c08501526153b682826150f2565b91505060c08401516153cb60e0850182615193565b509392505050565b803561ffff811681146153e557600080fd5b919050565b60008060008060008060008060008060006101608c8e03121561540c57600080fd5b6154158c6153d3565b9a5060208c013561542581614fe5565b995061543360408d016153d3565b985061544160608d016153d3565b975061544f60808d016153d3565b965061545d60a08d016153d3565b955061546b60c08d016153d3565b945061547960e08d016153d3565b93506154886101008d016153d3565b92506154976101208d016153d3565b91506154a66101408d016153d3565b90509295989b509295989b9093969950565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101561552757888303603f19018552815180516001600160a01b031684528701518784018790526155148785018261508d565b95880195935050908601906001016154df565b509098975050505050505050565b8035600381106153e557600080fd5b6000806000806080858703121561555a57600080fd5b8435935061556a60208601615535565b9250604085013567ffffffffffffffff81111561558657600080fd5b8501601f8101871361559757600080fd5b6155a68782356020840161525b565b92505060608501356155b781614fe5565b939692955090935050565b6000806000606084860312156155d757600080fd5b6155e084615535565b925060208085013567ffffffffffffffff808211156155fe57600080fd5b61560a888389016152b3565b9450604087013591508082111561562057600080fd5b818701915087601f83011261563457600080fd5b81358181111561564657615646615214565b8060051b61565585820161522a565b918252838101850191858101908b84111561566f57600080fd5b86860192505b838310156156ab5782358581111561568d5760008081fd5b61569b8d89838a01016152b3565b8352509186019190860190615675565b809750505050505050509250925092565b6000602082840312156156ce57600080fd5b614bfc826153d3565b6000806000606084860312156156ec57600080fd5b83356156f781614fe5565b9250602084013561570781614fe5565b929592945050506040919091013590565b6000806040838503121561572b57600080fd5b615734836153d3565b9150615742602084016153d3565b90509250929050565b602081526000614bfc602083018461508d565b6040810161576c8285615193565b8260208301529392505050565b60006020828403121561578b57600080fd5b5051919050565b6000602082840312156157a457600080fd5b81518015158114614bfc57600080fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610da957610da96157b4565b600181811c908216806157f157607f821691505b60208210810361581157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b60006001820161583f5761583f6157b4565b5060010190565b601f82111561385b57600081815260208120601f850160051c8101602086101561586d5750805b601f850160051c820191505b81811015612da257828155600101615879565b815167ffffffffffffffff8111156158a6576158a6615214565b6158ba816158b484546157dd565b84615846565b602080601f8311600181146158ef57600084156158d75750858301515b600019600386901b1c1916600185901b178555612da2565b600085815260208120601f198616915b8281101561591e578886015182559484019460019091019084016158ff565b508582101561593c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610da957610da96157b4565b805160ff811681146153e557600080fd5b60006020828403121561598257600080fd5b614bfc8261595f565b61599484615059565b838152826020820152606060408201526000613e00606083018461508d565b6040815260006159c6604083018561508d565b8281036020840152613e00818561508d565b6000602082840312156159ea57600080fd5b8151614bfc81614fe5565b80516001600160801b03811681146153e557600080fd5b600080600060608486031215615a2157600080fd5b615a2a8461595f565b9250615a38602085016159f5565b91506040840151615a4881614fe5565b809150509250925092565b60008060008060808587031215615a6957600080fd5b615a728561595f565b9350615a80602086016159f5565b92506040850151615a9081614fe5565b9150615a9e606086016159f5565b905092959194509250565b600061ffff808316818103615ac057615ac06157b4565b6001019392505050565b61ffff8181168382160280821691908281146137be576137be6157b4565b634e487b7160e01b600052601260045260246000fd5b600061ffff80841680615b1357615b13615ae8565b92169190910492915050565b634e487b7160e01b600052603160045260246000fd5b60006001600160a01b03808716835280861660208401525060806040830152615b616080830185614f8e565b9050615b6c83615059565b82606083015295945050505050565b600082615b8a57615b8a615ae8565b500490565b63ffffffff828116828216039080821115615bac57615bac6157b4565b5092915050565b8082028115828204841417610da957610da96157b4565b60008251615bdc818460208701615069565b919091019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122019aa0081e69056404e40023f916698c2b116cb83388048dea2cf1b230e45ab7b64736f6c63430008110033", + "deployedBytecode": "0x60806040526004361061031e5760003560e01c80637f6e29de116101a5578063bdb860ea116100ec578063e67a5d7811610095578063f6e8913d1161006f578063f6e8913d146108b2578063f7714eb9146108d7578063fdd9344c146108fe578063ffa1ad741461092057600080fd5b8063e67a5d781461085c578063f108f5b61461087c578063f2fde38b1461089257600080fd5b8063dc38b0a2116100c6578063dc38b0a214610808578063dd6f8f9014610828578063e30c39781461083e57600080fd5b8063bdb860ea146107b2578063c993d861146107c8578063ce3e7e91146107e857600080fd5b8063931127a01161014e578063adf1daa611610128578063adf1daa614610750578063b10064eb14610772578063b27b154d1461079257600080fd5b8063931127a0146106fa578063974c5b411461071b5780639c30db5c1461073057600080fd5b806384f21a441161017f57806384f21a441461069a5780638b8f631f146106bc5780638da5cb5b146106dc57600080fd5b80637f6e29de14610658578063817b1cd21461066e57806381ebc5061461068557600080fd5b80633659cfe61161026957806365cdbaea11610212578063715018a6116101ec578063715018a61461061357806379ba5097146106285780637c4981c81461063d57600080fd5b806365cdbaea146105ae5780636dcd3af2146105d75780636ddf344a146105f757600080fd5b806352d1902d1161024357806352d1902d1461054c578063569c876214610561578063582115fb1461058157600080fd5b80633659cfe6146104e65780633a688a2f146105065780634f1ef2861461053957600080fd5b80631acf7629116102cb57806324212b86116102a557806324212b86146104855780632ae9c6001461049b578063339f334b146104b657600080fd5b80631acf76291461041657806323b8ac5d1461043857806323deecfe1461046357600080fd5b8063125c6c98116102fc578063125c6c98146103b957806313114a9d146103dd57806315aa7b06146103f457600080fd5b8063011f59a014610323578063024f38cb1461035d57806311ce026714610380575b600080fd5b34801561032f57600080fd5b5060ff5461034590600160701b900461ffff1681565b60405161ffff90911681526020015b60405180910390f35b34801561036957600080fd5b5060ff5461034590640100000000900461ffff1681565b34801561038c57600080fd5b50610101546103a1906001600160a01b031681565b6040516001600160a01b039091168152602001610354565b3480156103c557600080fd5b506103cf60fc5481565b604051908152602001610354565b3480156103e957600080fd5b506103cf6101085481565b34801561040057600080fd5b50610409610976565b6040516103549190614fd2565b34801561042257600080fd5b50610436610431366004614ffa565b6109d9565b005b34801561044457600080fd5b5060ff54610345906c01000000000000000000000000900461ffff1681565b34801561046f57600080fd5b5060ff5461034590600160801b900461ffff1681565b34801561049157600080fd5b506103cf60fe5481565b3480156104a757600080fd5b5060fb546103459061ffff1681565b3480156104c257600080fd5b506104d66104d1366004615017565b610b34565b6040519015158152602001610354565b3480156104f257600080fd5b50610436610501366004614ffa565b610daf565b34801561051257600080fd5b50610526610521366004614ffa565b610f2a565b60405161035497969594939291906151a7565b6104366105473660046152d3565b61119e565b34801561055857600080fd5b506103cf61130a565b34801561056d57600080fd5b506103a161057c366004615323565b6113cf565b34801561058d57600080fd5b506105a161059c366004614ffa565b6113fa565b604051610354919061533c565b3480156105ba57600080fd5b5060ff54610345906a0100000000000000000000900461ffff1681565b3480156105e357600080fd5b506104366105f23660046153ea565b6116eb565b34801561060357600080fd5b50610103546103459061ffff1681565b34801561061f57600080fd5b50610436611b1f565b34801561063457600080fd5b50610436611b33565b34801561064957600080fd5b5060ff546103459061ffff1681565b34801561066457600080fd5b50610105546103cf565b34801561067a57600080fd5b506103cf6101075481565b34801561069157600080fd5b50610409611bbe565b3480156106a657600080fd5b506106af611c1f565b60405161035491906154b8565b3480156106c857600080fd5b506103a16106d7366004615323565b611e6e565b3480156106e857600080fd5b506033546001600160a01b03166103a1565b34801561070657600080fd5b5060ff546103459062010000900461ffff1681565b34801561072757600080fd5b50610409611e7f565b34801561073c57600080fd5b5061043661074b366004615544565b611ee0565b34801561075c57600080fd5b5060ff5461034590600160901b900461ffff1681565b34801561077e57600080fd5b5061043661078d3660046155c2565b612775565b34801561079e57600080fd5b506104366107ad3660046156bc565b612daa565b3480156107be57600080fd5b50610104546103cf565b3480156107d457600080fd5b506103a16107e3366004615323565b612e7c565b3480156107f457600080fd5b506104d66108033660046156d7565b612e8d565b34801561081457600080fd5b50610436610823366004614ffa565b61336a565b34801561083457600080fd5b506103cf60fd5481565b34801561084a57600080fd5b506065546001600160a01b03166103a1565b34801561086857600080fd5b50610436610877366004615718565b613395565b34801561088857600080fd5b50610102546103cf565b34801561089e57600080fd5b506104366108ad366004614ffa565b61346a565b3480156108be57600080fd5b5060ff54610345906601000000000000900461ffff1681565b3480156108e357600080fd5b5060ff546103459068010000000000000000900461ffff1681565b34801561090a57600080fd5b5060ff5461034590600160a01b900461ffff1681565b34801561092c57600080fd5b506109696040518060400160405280600581526020017f302e302e3200000000000000000000000000000000000000000000000000000081525081565b604051610354919061574b565b60606101058054806020026020016040519081016040528092919081815260200182805480156109cf57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109b1575b5050505050905090565b6001600160a01b038082166000908152610106602052604090206001810154909116610a4c5760405162461bcd60e51b815260206004820152601460248201527f6e6f646520646f6573206e6f742065786973747300000000000000000000000060448201526064015b60405180910390fd5b80546001600160a01b0316331480610a7d575033610a726033546001600160a01b031690565b6001600160a01b0316145b610ac95760405162461bcd60e51b815260206004820152601d60248201527f6f6e6c79206f776e65722063616e20756e7374616b652061206e6f64650000006044820152606401610a43565b610ad2816134db565b5060088101805460ff1916600490811790915560018201546040516001600160a01b03909116917ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e91610b28919060009061575e565b60405180910390a25050565b6000610b3e6137c6565b6001600160a01b038316610b945760405162461bcd60e51b815260206004820152601260248201527f696e76616c696420746f206164647265737300000000000000000000000000006044820152606401610a43565b60008211610be45760405162461bcd60e51b815260206004820152600e60248201527f696e76616c696420616d6f756e740000000000000000000000000000000000006044820152606401610a43565b610108548211158015610c7c5750610100546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610c54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c789190615779565b8211155b610cc85760405162461bcd60e51b815260206004820152601460248201527f696e73756666696369656e742062616c616e63650000000000000000000000006044820152606401610a43565b6101005460405163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529091169063a9059cbb906044016020604051808303816000875af1158015610d1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d409190615792565b610d8c5760405162461bcd60e51b815260206004820152601260248201527f6661696c656420746f207472616e7366657200000000000000000000000000006044820152606401610a43565b816101086000828254610d9f91906157ca565b9091555060019150505b92915050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610e3c5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610a43565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610e977f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610f025760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610a43565b610f0b81613820565b60408051600080825260208201909252610f2791839190613828565b50565b6101066020526000908152604090208054600182015460028301546003840180546001600160a01b039485169594841694600160a01b90940460ff16939190610f72906157dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9e906157dd565b8015610feb5780601f10610fc057610100808354040283529160200191610feb565b820191906000526020600020905b815481529060010190602001808311610fce57829003601f168201915b50506040805160a08101825260048701805461ffff808216845262010000909104166020808401919091526005890180548551818402810184018752818152999a99949850929650938701945091929183018282801561109c57602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116110595790505b50505050508152602001600282018054806020026020016040519081016040528092919081815260200182805480156110fe57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116110e0575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561118857602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116111455790505b5050509190925250505060089091015460ff1687565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361122b5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610a43565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166112867f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b0316146112f15760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610a43565b6112fa82613820565b61130682826001613828565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113aa5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610a43565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b61010581815481106113e057600080fd5b6000918252602090912001546001600160a01b0316905081565b611402614db9565b6001600160a01b0382811660009081526101066020908152604091829020825160e08101845281548516815260018201549485169281019290925290929091830190600160a01b900460ff16600281111561145f5761145f615043565b600281111561147057611470615043565b81526020016002820154815260200160038201805461148e906157dd565b80601f01602080910402602001604051908101604052809291908181526020018280546114ba906157dd565b80156115075780601f106114dc57610100808354040283529160200191611507565b820191906000526020600020905b8154815290600101906020018083116114ea57829003601f168201915b50505091835250506040805160a08101825260048401805461ffff808216845262010000909104166020838101919091526005860180548551818402810184018752818152968301969495939493860193928301828280156115ba57602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116115775790505b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561161c57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116115fe575b50505050508152602001600382018054806020026020016040519081016040528092919081815260200182805480156116a657602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116116635790505b505050919092525050508152600882015460209091019060ff1660048111156116d1576116d1615043565b60048111156116e2576116e2615043565b90525092915050565b600054610100900460ff161580801561170b5750600054600160ff909116105b806117255750303b158015611725575060005460ff166001145b6117975760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a43565b6000805460ff1916600117905580156117ba576000805461ff0019166101001790555b6117c26139cd565b6117ca613a38565b60fb805461ffff191661ffff8e161790556001600160a01b038b166117ee57600080fd5b61010080546001600160a01b0319166001600160a01b038d1617905561ffff8a1661185b5760405162461bcd60e51b815260206004820152601860248201527f696e76616c69642061747465737465727320616d6f756e7400000000000000006044820152606401610a43565b60ff805461ffff808d16600160801b0271ffff00000000000000000000000000000000199092169190911790915589166118fd5760405162461bcd60e51b815260206004820152602160248201527f696e76616c6964206e6f646552616e646f6d4d696e436f756e7420616d6f756e60448201527f74000000000000000000000000000000000000000000000000000000000000006064820152608401610a43565b60ff805461ffff808c16600160901b027fffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffff9092169190911790915588166119ac5760405162461bcd60e51b815260206004820152602c60248201527f696e76616c6964206e6f646552616e646f6d46696c74657250696e677352657160448201527f756972656420616d6f756e7400000000000000000000000000000000000000006064820152608401610a43565b8760ff60146101000a81548161ffff021916908361ffff160217905550606460fc81905550606460fd81905550606460fe819055508660ff60026101000a81548161ffff021916908361ffff1602179055508560ff60046101000a81548161ffff021916908361ffff1602179055508260ff60066101000a81548161ffff021916908361ffff1602179055508460ff60086101000a81548161ffff021916908361ffff1602179055508360ff600a6101000a81548161ffff021916908361ffff1602179055508160ff600c6101000a81548161ffff021916908361ffff160217905550604260ff60006101000a81548161ffff021916908361ffff160217905550600060ff600e6101000a81548161ffff021916908361ffff1602179055508015611b11576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050505050565b611b276137c6565b611b316000613aa8565b565b60655433906001600160a01b03168114611bb55760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610a43565b610f2781613aa8565b60606101048054806020026020016040519081016040528092919081815260200182805480156109cf576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109b1575050505050905090565b60606000805b61010254811015611ca85760006101028281548110611c4657611c46615817565b60009182526020808320909101546001600160a01b03168083526101069091526040909120600881015491925090611c809060ff16613ac1565b15611c935783611c8f8161582d565b9450505b50508080611ca09061582d565b915050611c25565b5060008167ffffffffffffffff811115611cc457611cc4615214565b604051908082528060200260200182016040528015611d0a57816020015b604080518082019091526000815260606020820152815260200190600190039081611ce25790505b5090506000805b61010254811015611e655760006101028281548110611d3257611d32615817565b60009182526020808320909101546001600160a01b03168083526101069091526040909120600881015491925090611d6c9060ff16613ac1565b611d77575050611e53565b6040805180820190915260018201546001600160a01b03168152600382018054602083019190611da6906157dd565b80601f0160208091040260200160405190810160405280929190818152602001828054611dd2906157dd565b8015611e1f5780601f10611df457610100808354040283529160200191611e1f565b820191906000526020600020905b815481529060010190602001808311611e0257829003601f168201915b5050505050815250858580611e339061582d565b965081518110611e4557611e45615817565b602002602001018190525050505b80611e5d8161582d565b915050611d11565b50909392505050565b61010481815481106113e057600080fd5b60606101028054806020026020016040519081016040528092919081815260200182805480156109cf576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109b1575050505050905090565b6000836002811115611ef457611ef4615043565b03611fa65760fc54841015611f555760405162461bcd60e51b815260206004820152602160248201527f496e73756666696369656e7420636f6c6c61746572616c20666f7220564e4f446044820152604560f81b6064820152608401610a43565b61010280546001810182556000919091527f93bdaa6a4190909b7c3fbe8d42169ffe1cab19f51dfc8db24c71abf849eced4a0180546001600160a01b0319166001600160a01b03831617905561217a565b6001836002811115611fba57611fba615043565b0361206c5760fd5484101561201b5760405162461bcd60e51b815260206004820152602160248201527f496e73756666696369656e7420636f6c6c61746572616c20666f7220534e4f446044820152604560f81b6064820152608401610a43565b61010480546001810182556000919091527f4c0be60200faa20559308cb7b5a1bb3255c16cb1cab91f525b5ae7a03d02fabe0180546001600160a01b0319166001600160a01b03831617905561217a565b600283600281111561208057612080615043565b036121325760fe548410156120e15760405162461bcd60e51b815260206004820152602160248201527f496e73756666696369656e7420636f6c6c61746572616c20666f7220444e4f446044820152604560f81b6064820152608401610a43565b61010580546001810182556000919091527ffc62abc8c0fc47c2d92f5aec99bf8b60f375828e14394d89345cae11a98673710180546001600160a01b0319166001600160a01b03831617905561217a565b60405162461bcd60e51b815260206004820152601560248201527f756e737570706f72746564206e6f6465547970652000000000000000000000006044820152606401610a43565b6001600160a01b0380821660009081526101066020526040902080549091161561220c5760405162461bcd60e51b815260206004820152602560248201527f61206e6f64652077697468207075624b657920697320616c726561647920646560448201527f66696e65640000000000000000000000000000000000000000000000000000006064820152608401610a43565b841561231957610100546040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523360048201523060248201526000916001600160a01b03169063dd62ed3e90604401602060405180830381865afa15801561227b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061229f9190615779565b9050858110156123175760405162461bcd60e51b815260206004820152603260248201527f5f6e6f6465546f6b656e732063616e6e6f74206265207472616e73666572726560448201527f642c20636865636b20616c6c6f77616e636500000000000000000000000000006064820152608401610a43565b505b612321614db9565b3381526001600160a01b03831660208201526040810185600281111561234957612349615043565b9081600281111561235c5761235c615043565b90525060608101869052608081018490526001600160a01b0380841660009081526101066020908152604091829020845181549085166001600160a01b0319918216178255918501516001820180549190951692811683178555928501518594919390927fffffffffffffffffffffff00000000000000000000000000000000000000000090911617600160a01b8360028111156123fc576123fc615043565b0217905550606082015160028201556080820151600382019061241f908261588c565b5060a0820151805160048301805460208085015161ffff908116620100000263ffffffff1990931694169390931717815560408301518051919261246b92600587019290910190614e2d565b5060608201518051612487916002840191602090910190614ee5565b50608082015180516124a3916003840191602090910190614e2d565b50505060c082015160088201805460ff191660018360048111156124c9576124c9615043565b021790555050861590506125de57610100546040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018890526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015612548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256c9190615792565b6125de5760405162461bcd60e51b815260206004820152602560248201527f6661696c656420746f207472616e7366657220746f6b656e7320746f20636f6e60448201527f74726163740000000000000000000000000000000000000000000000000000006064820152608401610a43565b8561010760008282546125f1919061594c565b909155506000905085600281111561260b5761260b615043565b0361261d57612618613afb565b61271e565b600185600281111561263157612631615043565b0361271e57610101546001600160a01b031661268f5760405162461bcd60e51b815260206004820152601b60248201527f6e6f2073746f7261676520636f6e747261637420646566696e656400000000006044820152606401610a43565b610101546040517f9d95f1cc0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152909116908190639d95f1cc906024016020604051808303816000875af11580156126f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271b9190615970565b50505b826001600160a01b0316336001600160a01b03167f67bd55f864dcc77d483ff7567de0889142417ef6d0299753cfd80e4c72ddc5548789886040516127659392919061598b565b60405180910390a3505050505050565b3360009081526101066020526040902060018101546001600160a01b03166127df5760405162461bcd60e51b815260206004820152601060248201527f696e76616c6964207265706f72746572000000000000000000000000000000006044820152606401610a43565b600080835167ffffffffffffffff8111156127fc576127fc615214565b604051908082528060200260200182016040528015612825578160200160208202803683370190505b50905060005b84518110156129b457600073__$7aaf162b34d2533b02434bde51cad0c5c5$__6336de68108888858151811061286357612863615817565b60200260200101516040518363ffffffff1660e01b81526004016128889291906159b3565b602060405180830381865af41580156128a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c991906159d8565b6001600160a01b03808216600090815261010660205260409020600181015492935091166128f85750506129a2565b6000805b8681101561295157836001600160a01b031686828151811061292057612920615817565b60200260200101516001600160a01b03160361293f5760019150612951565b806129498161582d565b9150506128fc565b508015612960575050506129a2565b82858761296c8161582d565b98508151811061297e5761297e615817565b60200260200101906001600160a01b031690816001600160a01b0316815250505050505b806129ac8161582d565b91505061282b565b508351821015612a6a5760008267ffffffffffffffff8111156129d9576129d9615214565b604051908082528060200260200182016040528015612a02578160200160208202803683370190505b50905060005b83811015612a6657828181518110612a2257612a22615817565b6020026020010151828281518110612a3c57612a3c615817565b6001600160a01b039092166020928302919091019091015280612a5e8161582d565b915050612a08565b5090505b6000866002811115612a7e57612a7e615043565b03612c0957600080600087806020019051810190612a9c9190615a0c565b9194509250905060ff8316600114612af65760405162461bcd60e51b815260206004820152601c60248201527f7265706f727420616374696f6e206f6e6c7920737570706f72746564000000006044820152606401610a43565b6001600160a01b038082166000908152610106602052604090206001810154909116612b6f5760405162461bcd60e51b815260206004820152602260248201527f746172676574206e6f64652077616c6c657420646f6573206e6f742065786973604482015261747360f01b6064820152608401610a43565b60006001820154600160a01b900460ff166002811115612b9157612b91615043565b14612bde5760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220564e6f646573000000000000000000006044820152606401610a43565b612bff8460ff166002811115612bf657612bf6615043565b88878487613c61565b5050505050612da2565b6001866002811115612c1d57612c1d615043565b03612da25760008060008088806020019051810190612c3c9190615a53565b9296509094509250905060ff8416600214612c995760405162461bcd60e51b815260206004820152601c60248201527f7265706f727420616374696f6e206f6e6c7920737570706f72746564000000006044820152606401610a43565b6001600160a01b038083166000908152610106602052604090206001810154909116612d125760405162461bcd60e51b815260206004820152602260248201527f746172676574206e6f64652077616c6c657420646f6573206e6f742065786973604482015261747360f01b6064820152608401610a43565b600180820154600160a01b900460ff166002811115612d3357612d33615043565b14612d805760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220534e6f646573000000000000000000006044820152606401610a43565b611b118560ff166002811115612d9857612d98615043565b8988848887613e09565b505050505050565b612db26137c6565b6101025461ffff82161115612e095760405162461bcd60e51b815260206004820152601c60248201527f696e636f72726563742076616c506572426c6f636b5461726765745f000000006044820152606401610a43565b60ff805471ffff000000000000000000000000000000001916600160801b61ffff848116918202929092179283905560408051600160701b909404909216835260208301527f81512b84dc2b38f82b4999b5512a14df033b165371fa51776cce559212bf0a44910160405180910390a150565b61010281815481106113e057600080fd5b6000612e976137c6565b60008211612ee75760405162461bcd60e51b815260206004820152601960248201527f616d6f756e742073686f756c6420626520706f736974697665000000000000006044820152606401610a43565b826001600160a01b0316846001600160a01b031603612f6e5760405162461bcd60e51b815260206004820152602660248201527f63616e6e6f74207472616e73666572206265747765656e2073616d652061646460448201527f72657373657300000000000000000000000000000000000000000000000000006064820152608401610a43565b6001600160a01b03831615801590612f8d57506001600160a01b038416155b156130b45781610108541015612ff55760405162461bcd60e51b815260206004820152602760248201527f66726f6d206e6f64652073686f756c64206861766520656e6f75676820636f6c6044820152661b185d195c985b60ca1b6064820152608401610a43565b6001600160a01b0380841660009081526101066020526040902080549091166130605760405162461bcd60e51b815260206004820152600f60248201527f6d697373696e6720746f206e6f646500000000000000000000000000000000006044820152606401610a43565b82610108600082825461307391906157ca565b9250508190555082610107600082825461308d919061594c565b92505081905550828160020160008282546130a8919061594c565b90915550613360915050565b6001600160a01b038416158015906130d357506001600160a01b038316155b156131ef576001600160a01b0380851660009081526101066020526040902080549091166131435760405162461bcd60e51b815260206004820152601160248201527f6d697373696e672066726f6d206e6f64650000000000000000000000000000006044820152606401610a43565b82816002015410156131a75760405162461bcd60e51b815260206004820152602760248201527f66726f6d206e6f64652073686f756c64206861766520656e6f75676820636f6c6044820152661b185d195c985b60ca1b6064820152608401610a43565b828160020160008282546131bb91906157ca565b925050819055508261010760008282546131d591906157ca565b925050819055508261010860008282546130a8919061594c565b6001600160a01b03808516600090815261010660205260409020805490911661325a5760405162461bcd60e51b815260206004820152601160248201527f6d697373696e672066726f6d206e6f64650000000000000000000000000000006044820152606401610a43565b82816002015410156132be5760405162461bcd60e51b815260206004820152602760248201527f66726f6d206e6f64652073686f756c64206861766520656e6f75676820636f6c6044820152661b185d195c985b60ca1b6064820152608401610a43565b6001600160a01b0380851660009081526101066020526040902082549091166133295760405162461bcd60e51b815260206004820152600f60248201527f6d697373696e6720746f206e6f646500000000000000000000000000000000006044820152606401610a43565b8382600201600082825461333d91906157ca565b9250508190555083816002016000828254613358919061594c565b909155505050505b5060019392505050565b6133726137c6565b61010180546001600160a01b0319166001600160a01b0392909216919091179055565b61339d6137c6565b6101025461ffff8316106133b057600080fd5b6101025461ffff8216106133c357600080fd5b60ff80547fffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffff16600160901b61ffff8581169182027fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1692909217600160a01b928516928302179092556040805192835260208301919091527fcd481667fa77e513c517493174075f0471ec1fe24d57af644377cd1a2572d13d910160405180910390a15050565b6134726137c6565b606580546001600160a01b0383166001600160a01b031990911681179091556134a36033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600281015461010054825460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810184905260009392919091169063a9059cbb906044016020604051808303816000875af115801561353b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061355f9190615792565b6135d15760405162461bcd60e51b815260206004820152602560248201527f6661696c656420746f20747261736665722066756e6473206261636b20746f2060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610a43565b600083600201819055508061010760008282546135ee91906157ca565b92505081905550806101086000828254613608919061594c565b90915550600090506001840154600160a01b900460ff16600281111561363057613630615043565b0361367a57613643600584016000614f3a565b613651600684016000614f5f565b600183015461366c90610102906001600160a01b0316613fb5565b50613675613afb565b610da9565b600180840154600160a01b900460ff16600281111561369b5761369b615043565b03610da957610101546001600160a01b03166136f95760405162461bcd60e51b815260206004820152601b60248201527f6e6f2073746f7261676520636f6e747261637420646566696e656400000000006044820152606401610a43565b6101015460018401546040517fb2b99ec90000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690819063b2b99ec990602401600060405180830381600087803b15801561376057600080fd5b505af1158015613774573d6000803e3d6000fd5b5061378792505050600585016000614f3a565b613795600685016000614f5f565b6137a3600785016000614f3a565b60018401546137be90610104906001600160a01b0316613fb5565b505092915050565b6033546001600160a01b03163314611b315760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a43565b610f276137c6565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156138605761385b836140e1565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156138ba575060408051601f3d908101601f191682019092526138b791810190615779565b60015b61392c5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610a43565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146139c15760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610a43565b5061385b83838361419f565b600054610100900460ff16611b315760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610a43565b600054610100900460ff16613aa35760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610a43565b611b31335b606580546001600160a01b0319169055610f27816141ca565b60006004826004811115613ad757613ad7615043565b1480613af457506003826004811115613af257613af2615043565b145b1592915050565b6000805b61010254811015613b825760006101028281548110613b2057613b20615817565b60009182526020808320909101546001600160a01b03168083526101069091526040909120600881015491925090613b5a9060ff16613ac1565b15613b6d5783613b6981615aa9565b9450505b50508080613b7a9061582d565b915050613aff565b50610103805461ffff191661ffff83811691821790925560ff548392600160801b9091041690811015613bb3578091505b60ff5461ffff808316600160701b909204161115613bd057600080fd5b60ff5461ffff838116600160701b909204161461385b5760ff80547fffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffff16600160701b61ffff858116918202929092179092556040805192835290831660208301527f81512b84dc2b38f82b4999b5512a14df033b165371fa51776cce559212bf0a44910160405180910390a1505050565b6000806001840154600160a01b900460ff166002811115613c8457613c84615043565b14613cd15760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220564e6f646573000000000000000000006044820152606401610a43565b60ff54606490613cef9061ffff80821691600160701b900416615aca565b613cf99190615afe565b61ffff1684511015613d4d5760405162461bcd60e51b815260206004820152601460248201527f73696720636f756e7420697320746f6f206c6f770000000000000000000000006044820152606401610a43565b600883015460ff166004816004811115613d6957613d69615043565b1480613d8657506003816004811115613d8457613d84615043565b145b15613d95576000915050613e00565b613da48787868887600061421c565b60ff54600485015461ffff620100009092048216911610613dc957613dc98685614892565b60ff5460048501546801000000000000000090910461ffff908116620100009092041610613dfa57613dfa84614af0565b60009150505b95945050505050565b6000600180850154600160a01b900460ff166002811115613e2c57613e2c615043565b14613e795760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220534e6f646573000000000000000000006044820152606401610a43565b60ff54606490613e979061ffff80821691600160701b900416615aca565b613ea19190615afe565b61ffff1685511015613ef55760405162461bcd60e51b815260206004820152601460248201527f73696720636f756e7420697320746f6f206c6f770000000000000000000000006044820152606401610a43565b600884015460ff166004816004811115613f1157613f11615043565b1480613f2e57506003816004811115613f2c57613f2c615043565b145b15613f3d576000915050613fab565b613f4b88888789888861421c565b60ff54600486015461ffff6401000000009092048216911610613f7257613f728786614892565b60ff5460048601546a010000000000000000000090910461ffff908116620100009092041610613fa557613fa585614af0565b60009150505b9695505050505050565b8154600090815b818110156140d657836001600160a01b0316858281548110613fe057613fe0615817565b6000918252602090912001546001600160a01b0316036140c4576140056001836157ca565b811461408657846140176001846157ca565b8154811061402757614027615817565b9060005260206000200160009054906101000a90046001600160a01b031685828154811061405757614057615817565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b8480548061409657614096615b1f565b600082815260209020810160001990810180546001600160a01b03191690550190555060019150610da99050565b806140ce8161582d565b915050613fbc565b506000949350505050565b6001600160a01b0381163b61415e5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610a43565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6141a883614b97565b6000825111806141b55750805b1561385b576141c48383614bd7565b50505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000846004016001018054806020026020016040519081016040528092919081815260200182805480156142a157602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f0104928301926001038202915080841161425e5790505b505083519394506000925050505b81811015614343578281815181106142c9576142c9615817565b60200260200101516001600160801b0316856001600160801b0316036143315760405162461bcd60e51b815260206004820152601060248201527f626c6f636b206973206e6f74206e6577000000000000000000000000000000006044820152606401610a43565b8061433b8161582d565b9150506142af565b50600180870154600160a01b900460ff16600281111561436557614365615043565b0361453057826001600160801b03166000036143c35760405162461bcd60e51b815260206004820152601760248201527f73746f72616765206b65792069732072657175697265640000000000000000006044820152606401610a43565b60008660040160030180548060200260200160405190810160405280929190818152602001828054801561444857602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116144055790505b505083519394506000925050505b818110156144ea5782818151811061447057614470615817565b60200260200101516001600160801b0316866001600160801b0316036144d85760405162461bcd60e51b815260206004820152601660248201527f73746f72616765206b6579206973206e6f74206e6577000000000000000000006044820152606401610a43565b806144e28161582d565b915050614456565b505050600786018054600180820183556000928352602090922060028204018054929091166010026101000a6001600160801b0381810219909316928616029190911790555b60048601805461ffff1690600061454683615aa9565b825461010092830a61ffff818102199092169290911602179091556005880180546001818101835560009283526020808420600284040180549390921660100290940a6001600160801b0381810219909316928a1602919091179055600689018054604080518286028101860190915281815292945091929091908301828280156145fa57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116145dc575b505083519394506000925050505b87518110156146fe5760005b828110156146eb5783818151811061462e5761462e615817565b60200260200101516001600160a01b031689838151811061465157614651615817565b60200260200101516001600160a01b031614801561469b575060006001600160a01b031689838151811061468757614687615817565b60200260200101516001600160a01b031614155b156146d95760008983815181106146b4576146b4615817565b60200260200101906001600160a01b031690816001600160a01b0316815250506146eb565b806146e38161582d565b915050614614565b50806146f68161582d565b915050614608565b5060005b87518110156147ab57600088828151811061471f5761471f615817565b6020026020010151905060006001600160a01b0316816001600160a01b031614614798578960040160020189838151811061475c5761475c615817565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790555b50806147a38161582d565b915050614702565b506000600889015460ff1660048111156147c7576147c7615043565b036147dc5760088801805460ff191660011790555b600180890154908a01546040517f19d5f3972073c7002111a82b2a44db11e739567a002445f2e3db8ab96fe6645f92614827926001600160a01b03918216929116908b908f90615b35565b60405180910390a16001880154600889015460028a01546040516001600160a01b03909316927ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e9261487e9260ff9091169161575e565b60405180910390a250505050505050505050565b60ff5460009081906148b39084906601000000000000900461ffff16614c03565b600685018054604080516020808402820181019092528281529496509294506000939283018282801561490f57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116148f1575b5050505050905060008083118015614928575060008251115b156149d25781516149399084615b7b565b905060005b82518110156149d0576000610106600085848151811061496057614960615817565b6020908102919091018101516001600160a01b0390811683529082019290925260400160002080549092501661499657506149be565b828160020160008282546149aa919061594c565b909155506149ba905083866157ca565b9450505b806149c88161582d565b91505061493e565b505b828660020160008282546149e6919061594c565b909155506149fa9050600686016000614f5f565b6000600886015460ff166004811115614a1557614a15615043565b1480614a3957506001600886015460ff166004811115614a3757614a37615043565b145b15614a4e5760088501805460ff191660021790555b60048501805461ffff191680825562010000900461ffff16906002614a7283615aa9565b91906101000a81548161ffff021916908361ffff160217905550508460010160009054906101000a90046001600160a01b03166001600160a01b03167ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e600286604051614ae092919061575e565b60405180910390a2505050505050565b60ff546000908190614b179084906c01000000000000000000000000900461ffff16614c03565b9092509050614b25836134db565b5060048301805463ffff00001916905560088301805460ff1916600390811790915560018401546040516001600160a01b03909116917ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e91614b8a919060009061575e565b60405180910390a2505050565b614ba0816140e1565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060614bfc8383604051806060016040528060278152602001615be760279139614ca5565b9392505050565b60008060648363ffffffff161115614c5d5760405162461bcd60e51b815260206004820181905260248201527f70657263656e746167652073686f756c6420626520696e205b302c203130305d6044820152606401610a43565b60028401546064614c6e8582615b8f565b614c7e9063ffffffff1683615bb3565b614c889190615b7b565b9250614c9483826157ca565b600286018490559150509250929050565b6060600080856001600160a01b031685604051614cc29190615bca565b600060405180830381855af49150503d8060008114614cfd576040519150601f19603f3d011682016040523d82523d6000602084013e614d02565b606091505b5091509150613fab8683838760608315614d7d578251600003614d76576001600160a01b0385163b614d765760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a43565b5081614d87565b614d878383614d8f565b949350505050565b815115614d9f5781518083602001fd5b8060405162461bcd60e51b8152600401610a43919061574b565b6040805160e081018252600080825260208201819052909182019081526020016000815260200160608152602001614e216040518060a00160405280600061ffff168152602001600061ffff1681526020016060815260200160608152602001606081525090565b81526020016000905290565b82805482825590600052602060002090600101600290048101928215614ed55791602002820160005b83821115614ea057835183826101000a8154816001600160801b0302191690836001600160801b031602179055509260200192601001602081600f01049283019260010302614e56565b8015614ed35782816101000a8154906001600160801b030219169055601001602081600f01049283019260010302614ea0565b505b50614ee1929150614f79565b5090565b828054828255906000526020600020908101928215614ed5579160200282015b82811115614ed557825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614f05565b508054600082556001016002900490600052602060002090810190610f279190614f79565b5080546000825590600052602060002090810190610f2791905b5b80821115614ee15760008155600101614f7a565b600081518084526020808501945080840160005b83811015614fc75781516001600160a01b031687529582019590820190600101614fa2565b509495945050505050565b602081526000614bfc6020830184614f8e565b6001600160a01b0381168114610f2757600080fd5b60006020828403121561500c57600080fd5b8135614bfc81614fe5565b6000806040838503121561502a57600080fd5b823561503581614fe5565b946020939093013593505050565b634e487b7160e01b600052602160045260246000fd5b60038110610f2757610f27615043565b60005b8381101561508457818101518382015260200161506c565b50506000910152565b600081518084526150a5816020860160208601615069565b601f01601f19169290920160200192915050565b600081518084526020808501945080840160005b83811015614fc75781516001600160801b0316875295820195908201906001016150cd565b600061ffff8083511684526020818185015116818601526040840151915060a0604086015261512460a08601836150b9565b60608581015187830391880191909152805180835290830193506000918301905b8083101561516e5784516001600160a01b03168252938301936001929092019190830190615145565b5060808601519350868103608088015261518881856150b9565b979650505050505050565b600581106151a3576151a3615043565b9052565b6001600160a01b0388811682528716602082015260006151c687615059565b86604083015285606083015260e060808301526151e660e083018661508d565b82810360a08401526151f881866150f2565b91505061520860c0830184615193565b98975050505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561525357615253615214565b604052919050565b600067ffffffffffffffff83111561527557615275615214565b615288601f8401601f191660200161522a565b905082815283838301111561529c57600080fd5b828260208301376000602084830101529392505050565b600082601f8301126152c457600080fd5b614bfc8383356020850161525b565b600080604083850312156152e657600080fd5b82356152f181614fe5565b9150602083013567ffffffffffffffff81111561530d57600080fd5b615319858286016152b3565b9150509250929050565b60006020828403121561533557600080fd5b5035919050565b6020815260006001600160a01b0380845116602084015280602085015116604084015250604083015161536e81615059565b8060608401525060608301516080830152608083015160e060a084015261539961010084018261508d565b905060a0840151601f198483030160c08501526153b682826150f2565b91505060c08401516153cb60e0850182615193565b509392505050565b803561ffff811681146153e557600080fd5b919050565b60008060008060008060008060008060006101608c8e03121561540c57600080fd5b6154158c6153d3565b9a5060208c013561542581614fe5565b995061543360408d016153d3565b985061544160608d016153d3565b975061544f60808d016153d3565b965061545d60a08d016153d3565b955061546b60c08d016153d3565b945061547960e08d016153d3565b93506154886101008d016153d3565b92506154976101208d016153d3565b91506154a66101408d016153d3565b90509295989b509295989b9093969950565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101561552757888303603f19018552815180516001600160a01b031684528701518784018790526155148785018261508d565b95880195935050908601906001016154df565b509098975050505050505050565b8035600381106153e557600080fd5b6000806000806080858703121561555a57600080fd5b8435935061556a60208601615535565b9250604085013567ffffffffffffffff81111561558657600080fd5b8501601f8101871361559757600080fd5b6155a68782356020840161525b565b92505060608501356155b781614fe5565b939692955090935050565b6000806000606084860312156155d757600080fd5b6155e084615535565b925060208085013567ffffffffffffffff808211156155fe57600080fd5b61560a888389016152b3565b9450604087013591508082111561562057600080fd5b818701915087601f83011261563457600080fd5b81358181111561564657615646615214565b8060051b61565585820161522a565b918252838101850191858101908b84111561566f57600080fd5b86860192505b838310156156ab5782358581111561568d5760008081fd5b61569b8d89838a01016152b3565b8352509186019190860190615675565b809750505050505050509250925092565b6000602082840312156156ce57600080fd5b614bfc826153d3565b6000806000606084860312156156ec57600080fd5b83356156f781614fe5565b9250602084013561570781614fe5565b929592945050506040919091013590565b6000806040838503121561572b57600080fd5b615734836153d3565b9150615742602084016153d3565b90509250929050565b602081526000614bfc602083018461508d565b6040810161576c8285615193565b8260208301529392505050565b60006020828403121561578b57600080fd5b5051919050565b6000602082840312156157a457600080fd5b81518015158114614bfc57600080fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610da957610da96157b4565b600181811c908216806157f157607f821691505b60208210810361581157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b60006001820161583f5761583f6157b4565b5060010190565b601f82111561385b57600081815260208120601f850160051c8101602086101561586d5750805b601f850160051c820191505b81811015612da257828155600101615879565b815167ffffffffffffffff8111156158a6576158a6615214565b6158ba816158b484546157dd565b84615846565b602080601f8311600181146158ef57600084156158d75750858301515b600019600386901b1c1916600185901b178555612da2565b600085815260208120601f198616915b8281101561591e578886015182559484019460019091019084016158ff565b508582101561593c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610da957610da96157b4565b805160ff811681146153e557600080fd5b60006020828403121561598257600080fd5b614bfc8261595f565b61599484615059565b838152826020820152606060408201526000613e00606083018461508d565b6040815260006159c6604083018561508d565b8281036020840152613e00818561508d565b6000602082840312156159ea57600080fd5b8151614bfc81614fe5565b80516001600160801b03811681146153e557600080fd5b600080600060608486031215615a2157600080fd5b615a2a8461595f565b9250615a38602085016159f5565b91506040840151615a4881614fe5565b809150509250925092565b60008060008060808587031215615a6957600080fd5b615a728561595f565b9350615a80602086016159f5565b92506040850151615a9081614fe5565b9150615a9e606086016159f5565b905092959194509250565b600061ffff808316818103615ac057615ac06157b4565b6001019392505050565b61ffff8181168382160280821691908281146137be576137be6157b4565b634e487b7160e01b600052601260045260246000fd5b600061ffff80841680615b1357615b13615ae8565b92169190910492915050565b634e487b7160e01b600052603160045260246000fd5b60006001600160a01b03808716835280861660208401525060806040830152615b616080830185614f8e565b9050615b6c83615059565b82606083015295945050505050565b600082615b8a57615b8a615ae8565b500490565b63ffffffff828116828216039080821115615bac57615bac6157b4565b5092915050565b8082028115828204841417610da957610da96157b4565b60008251615bdc818460208701615069565b919091019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122019aa0081e69056404e40023f916698c2b116cb83388048dea2cf1b230e45ab7b64736f6c63430008110033", + "linkReferences": { + "contracts/SigUtil.sol": { + "SigUtil": [ + { + "length": 20, + "start": 10373 + } + ] + } + }, + "deployedLinkReferences": { + "contracts/SigUtil.sol": { + "SigUtil": [ + { + "length": 20, + "start": 10296 + } + ] + } + } +} diff --git a/push-docker/v02/validator_eth_key.json b/push-docker/v02/validator_eth_key.json new file mode 100644 index 0000000..17a99a8 --- /dev/null +++ b/push-docker/v02/validator_eth_key.json @@ -0,0 +1,21 @@ +{ + "address": "fdaeaf7afcfbb4e4d16dc66bd2039fd6004cfce8", + "id": "4989eabc-4ddf-40e8-a10a-a33a33c473bd", + "version": 3, + "Crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "2b7188d0970712198a963df02cd39dad" + }, + "ciphertext": "08f5c05c9c4fb88e5d0fbcb363a191de5671a7ed4f5037b13b4fe48a9985d989", + "kdf": "scrypt", + "kdfparams": { + "salt": "a17b9c6c61996197c44a9ccd5e68258ddc887abeaaa6d7dfb24c240e88a3e42c", + "n": 131072, + "dklen": 32, + "p": 1, + "r": 8 + }, + "mac": "cf0c0ee59f5a8f4a73f64c2c5dd9ad032e1bc5d10c6f83ca381ccd2b1d34eaa5" + } +} \ No newline at end of file diff --git a/push-docker/v03/.env b/push-docker/v03/.env new file mode 100644 index 0000000..b0a657d --- /dev/null +++ b/push-docker/v03/.env @@ -0,0 +1,47 @@ +######### ENVIRONMENT +PORT=4003 +PUSH_NODES_NET=DEV +RUNNING_ON_MACHINE=mac +LOG_LEVEL=debug + +# DATABASE +DB_HOST=localhost +DB_NAME=vnode3 +DB_USER=2roor +DB_PASS=s1mpl3 + +######### Validator +# encrypted private key file +VALIDATOR_PRIVATE_KEY_FILE=validator_eth_key.json +# ! do not store this password on DISK in production, use only as ENV var +VALIDATOR_PRIVATE_KEY_PASS=test + +VALIDATOR_RPC_ENDPOINT=http://localhost:8545 +VALIDATOR_RPC_NETWORK=1337 +# push token smart contract +VALIDATOR_PUSH_TOKEN_ADDRESS=0x5FbDB2315678afecb367f032d93F642f64180aa3 +# validator smart contract +VALIDATOR_CONTRACT_ADDRESS=0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9 +# storage smart contract +STORAGE_CONTRACT_ADDRESS=0x0165878A594ca255338adfa4d48449f69242Eb8F + +# development +# log sql +LOG_SQL_STATEMENTS=true +# no http handler starts +VALIDATOR_DISABLE_ALL_SERVICES=true +# do not fetch blockchain data +VALIDATOR_DISABLE_HISTORY_SYNC=true +# write logs +VALIDATOR_DEBUG_LOG=true +# do not validate payload +VALIDATOR_SKIP_PAYLOAD_VERIFICATION=true +# do not rate limit +VALIDATOR_SKIP_RATE_LIMITER=true +# write custom logs for every query +VALIDATOR_HTTP_LOG=true +# random tokens live forever +VALIDATOR_DISABLE_TOKEN_TIMEOUT=true +######## Validator ENDS + +BLOCK_SCHEDULE=*/15 * * * * * \ No newline at end of file diff --git a/push-docker/v03/StorageV1.json b/push-docker/v03/StorageV1.json new file mode 100644 index 0000000..fa118f3 --- /dev/null +++ b/push-docker/v03/StorageV1.json @@ -0,0 +1,633 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "StorageV1", + "sourceName": "contracts/Storage.sol", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address[]", + "name": "nodeList", + "type": "address[]" + } + ], + "name": "SNodeMappingChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "inputs": [], + "name": "MAX_NODE_ID", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "NULL_NODE", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "NULL_SHARD", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SHARD_COUNT", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress_", + "type": "address" + } + ], + "name": "addNode", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8[]", + "name": "nodeList_", + "type": "uint8[]" + }, + { + "internalType": "uint8[]", + "name": "countersMap_", + "type": "uint8[]" + } + ], + "name": "calculateAvgPerNode", + "outputs": [ + { + "internalType": "uint256", + "name": "avgPerNode_", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "demand_", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "nodeAddr_", + "type": "address[]" + } + ], + "name": "getAllNodeShards", + "outputs": [ + { + "internalType": "uint32[]", + "name": "", + "type": "uint32[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getNodeAddresses", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress_", + "type": "address" + } + ], + "name": "getNodeShardsByAddr", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint16", + "name": "protocolVersion_", + "type": "uint16" + }, + { + "internalType": "address", + "name": "validatorContract_", + "type": "address" + }, + { + "internalType": "uint8", + "name": "rfTarget_", + "type": "uint8" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "mapAddrToNodeId", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "name": "mapNodeIdToAddr", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "name": "mapNodeToShards", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nodeCount", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "nodeIdList", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "rf_", + "type": "uint8" + } + ], + "name": "overrideRf", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "protocolVersion", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress_", + "type": "address" + } + ], + "name": "removeNode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "rf", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rfChangedByAdmin", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rfTarget", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress_", + "type": "address" + }, + { + "internalType": "uint32", + "name": "bitmap_", + "type": "uint32" + } + ], + "name": "setNodeShardsByAddr", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "rfTarget_", + "type": "uint8" + } + ], + "name": "setRfTarget", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "addr_", + "type": "address" + } + ], + "name": "setValidatorContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "shuffle", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "validatorContract", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60a06040523060805234801561001457600080fd5b50608051613bac61004c600039600081816108c30152818161094801528181610b6201528181610be70152610cd10152613bac6000f3fe6080604052600436106102195760003560e01c8063893f5da91161011d578063bac506e0116100b0578063d85707d51161007f578063f143896811610064578063f143896814610667578063f2fde38b1461067c578063fe92fe861461069c57600080fd5b8063d85707d514610629578063e30c39781461064957600080fd5b8063bac506e0146105a2578063cc59a6f4146105bc578063cdf64a76146105dc578063d12be06b146105fc57600080fd5b80639fc8ded3116100ec5780639fc8ded31461051e578063a25d526f14610533578063a5129cd014610562578063b2b99ec91461058257600080fd5b8063893f5da91461048e5780638da5cb5b146104bf57806399439089146104dd5780639d95f1cc146104fe57600080fd5b806345954486116101b0578063633207ae1161017f578063715018a611610164578063715018a61461044f578063720a0fa41461046457806379ba50971461047957600080fd5b8063633207ae146104255780636da49b831461043a57600080fd5b8063459544861461039657806348570569146103c85780634f1ef286146103fd57806352d1902d1461041057600080fd5b80632e949824116101ec5780632e949824146102e657806330cdb2751461030857806333083fe6146103565780633659cfe61461037657600080fd5b806301b9e4381461021e5780631a27e21c1461026b5780632520bf041461028d5780632ae9c600146102b0575b600080fd5b34801561022a57600080fd5b506102516102393660046134d4565b60fe6020526000908152604090205463ffffffff1681565b60405163ffffffff90911681526020015b60405180910390f35b34801561027757600080fd5b5061028b6102863660046134d4565b6106bc565b005b34801561029957600080fd5b506102a261070a565b604051908152602001610262565b3480156102bc57600080fd5b50610102546102d390600160a01b900461ffff1681565b60405161ffff9091168152602001610262565b3480156102f257600080fd5b506102fb610741565b60405161026291906134ef565b34801561031457600080fd5b5061033e6103233660046134d4565b60fd602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610262565b34801561036257600080fd5b50610251610371366004613553565b61082d565b34801561038257600080fd5b5061028b610391366004613553565b6108b9565b3480156103a257600080fd5b506103b66103b136600461356e565b610a34565b60405160ff9091168152602001610262565b3480156103d457600080fd5b506103e86103e3366004613664565b610a68565b60408051928352602083019190915201610262565b61028b61040b3660046136c8565b610b58565b34801561041c57600080fd5b506102a2610cc4565b34801561043157600080fd5b506103b660fe81565b34801561044657600080fd5b5060fc546103b6565b34801561045b57600080fd5b5061028b610d89565b34801561047057600080fd5b506103b6600081565b34801561048557600080fd5b5061028b610d9d565b34801561049a57600080fd5b506103b66104a9366004613553565b60ff602081905260009182526040909120541681565b3480156104cb57600080fd5b506033546001600160a01b031661033e565b3480156104e957600080fd5b506101025461033e906001600160a01b031681565b34801561050a57600080fd5b506103b6610519366004613553565b610e28565b34801561052a57600080fd5b506103b660ff81565b34801561053f57600080fd5b5060fb5461055290610100900460ff1681565b6040519015158152602001610262565b34801561056e57600080fd5b5061028b61057d3660046134d4565b6110fc565b34801561058e57600080fd5b5061028b61059d366004613553565b61117c565b3480156105ae57600080fd5b5060fb546103b69060ff1681565b3480156105c857600080fd5b5061028b6105d736600461376e565b611537565b3480156105e857600080fd5b5061028b6105f7366004613553565b6115d5565b34801561060857600080fd5b5061061c6106173660046137ae565b611600565b604051610262919061383b565b34801561063557600080fd5b5060fb546103b69062010000900460ff1681565b34801561065557600080fd5b506065546001600160a01b031661033e565b34801561067357600080fd5b506103b6602081565b34801561068857600080fd5b5061028b610697366004613553565b6116f3565b3480156106a857600080fd5b5061028b6106b7366004613879565b611764565b6106c4611902565b60fb805462ff000019166201000060ff84169081029190911790915560fc548111156106ef575060fc545b60fb805461ffff191660ff9092169190911761010017905550565b6000610714611902565b60fb5460009061072d90610100900460ff16828061195c565b60fb805461ff001916905560ff1691505090565b60fc5460609060008167ffffffffffffffff81111561076257610762613587565b60405190808252806020026020018201604052801561078b578160200160208202803683370190505b50905060005b8281101561082657600060fc82815481106107ae576107ae6138c5565b600091825260208083208183040154601f9092166101000a90910460ff1680835260fd90915260409091205484519192506001600160a01b0316908490849081106107fb576107fb6138c5565b6001600160a01b0390921660209283029190910190910152508061081e816138f1565b915050610791565b5092915050565b6001600160a01b038116600090815260ff60208190526040822054168061089b5760405162461bcd60e51b815260206004820152600c60248201527f6e6f2073756368206e6f6465000000000000000000000000000000000000000060448201526064015b60405180910390fd5b60ff16600090815260fe602052604090205463ffffffff1692915050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036109465760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610892565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166109a17f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610a0c5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610892565b610a1581611ec3565b60408051600080825260208201909252610a3191839190611ecb565b50565b60fc8181548110610a4457600080fd5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b815160fb54600091829160ff918216918391610a869116602061390a565b905060008215610a9f57610a9a8383613937565b610aa2565b60005b90506000610ab0848461394b565b1115610ac457610ac181600161395f565b90505b6000805b8851811015610b4a576000898281518110610ae557610ae56138c5565b602002602001015190506000898260ff1681518110610b0657610b066138c5565b60200260200101519050848160ff161015610b3557610b2860ff821686613972565b610b32908561395f565b93505b50508080610b42906138f1565b915050610ac8565b509097909650945050505050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610be55760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610892565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610c407f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610cab5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610892565b610cb482611ec3565b610cc082826001611ecb565b5050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610d645760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610892565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610d91611902565b610d9b6000612070565b565b60655433906001600160a01b03168114610e1f5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610892565b610a3181612070565b610102546000906001600160a01b0316331480610e4f57506033546001600160a01b031633145b610e9b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610892565b6001600160a01b038216600090815260ff60208190526040909120541615610f055760405162461bcd60e51b815260206004820152601d60248201527f6164647265737320697320616c726561647920726567697374657265640000006044820152606401610892565b6101005460ff1615801590610f2257506101005460fe60ff909116105b610f6e5760405162461bcd60e51b815260206004820152601a60248201527f6e6f64654964203e2030202626206e6f64654964203c206d61780000000000006044820152606401610892565b610101546000908015610ffc57610101610f89600183613972565b81548110610f9957610f996138c5565b90600052602060002090602091828204019190069054906101000a900460ff169150610101805480610fcd57610fcd613985565b60019003818190600052602060002090602091828204019190066101000a81549060ff0219169055905561102b565b610100805460ff169060006110108361399b565b91906101000a81548160ff021916908360ff16021790555091505b60fc8054600181810190925560208082047f371f36870d18f32a11fea0f144b021c8b407bb50f8e0267c711123f454b963c001805460ff808816601f9095166101000a8581029082021990921691909117909155600083815260fd8352604080822080546001600160a01b038c166001600160a01b031990911681179091558252918352818120805460ff19168517905592835260fe9091528120805463ffffffff19169055906110db90612089565b90506110e98160008061195c565b50506101005460ff16925050505b919050565b611104611902565b60fc5460ff821611156111595760405162461bcd60e51b815260206004820152601b60248201527f7266206973206c696d69746564206279206e6f646520636f756e7400000000006044820152606401610892565b60fb805461010060ff9390931661ffff19909116179190911762ff000019169055565b610102546001600160a01b03163314806111a057506033546001600160a01b031633145b6111ec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610892565b6001600160a01b038116600090815260ff60208181526040832054610101805460018101825594529083047f109ea3cebb188b9c1b9fc5bb3920be60dfdc8699098dff92f3d80daaca747689018054601f9094166101000a918316828102929093021990931617909155806112a35760405162461bcd60e51b815260206004820152601060248201527f6e6f206164647265737320666f756e64000000000000000000000000000000006044820152606401610892565b60fc54600003611317576001600160a01b038216600090815260ff602052604090819020805460ff191690555162461bcd60e51b81526108929060040160208082526010908201527f6e6f206e6f646520696420666f756e6400000000000000000000000000000000604082015260600190565b60ff8116600090815260fe60205260408120805463ffffffff19811690915560fc5463ffffffff909116915b81811015611465578360ff1660fc8281548110611362576113626138c5565b60009182526020918290209181049091015460ff601f9092166101000a9004160361145357611392600183613972565b81146114135760fc6113a5600184613972565b815481106113b5576113b56138c5565b90600052602060002090602091828204019190069054906101000a900460ff1660fc82815481106113e8576113e86138c5565b90600052602060002090602091828204019190066101000a81548160ff021916908360ff1602179055505b60fc80548061142457611424613985565b60019003818190600052602060002090602091828204019190066101000a81549060ff02191690559055611465565b8061145d816138f1565b915050611343565b5060ff8316600090815260fd6020526040812080546001600160a01b0319169055611491600019612089565b604080516001808252818301909252919250600091906020808301908036833701905050905085816000815181106114cb576114cb6138c5565b60200260200101906001600160a01b031690816001600160a01b0316815250507fb338e44b9e4e2d94df983fde422fd91ba2bd6f8182b607b50c968f8161bcf8858160405161151a91906134ef565b60405180910390a161152e8260018661195c565b50505050505050565b61153f611902565b6001600160a01b038216600090815260ff602081905260409091205416806115a95760405162461bcd60e51b815260206004820152601e60248201527f6e6f64652061646472657373206973206e6f74207265676973746572656400006044820152606401610892565b60ff16600090815260fe60205260409020805463ffffffff191663ffffffff9290921691909117905550565b6115dd611902565b61010280546001600160a01b0319166001600160a01b0392909216919091179055565b60606000825167ffffffffffffffff81111561161e5761161e613587565b604051908082528060200260200182016040528015611647578160200160208202803683370190505b50905060005b835181101561082657600060ff600086848151811061166e5761166e6138c5565b6020908102919091018101516001600160a01b0316825281810192909252604090810160009081205460ff1680825260fe9093522054845191925063ffffffff169081908590859081106116c4576116c46138c5565b602002602001019063ffffffff16908163ffffffff1681525050505080806116eb906138f1565b91505061164d565b6116fb611902565b606580546001600160a01b0383166001600160a01b0319909116811790915561172c6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600054610100900460ff16158080156117845750600054600160ff909116105b8061179e5750303b15801561179e575060005460ff166001145b6118105760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610892565b6000805460ff191660011790558015611833576000805461ff0019166101001790555b61183b612120565b61184361218b565b6101008054600160ff1990911617905560fb8054610102805462ff00ff199092166201000060ff871602179092557fffffffffffffffffffff0000000000000000000000000000000000000000000016600160a01b61ffff8716026001600160a01b031916176001600160a01b03851617905580156118fc576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6033546001600160a01b03163314610d9b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610892565b60008060fc8054806020026020016040519081016040528092919081815260200182805480156119c957602002820191906000526020600020906000905b825461010083900a900460ff1681526020600192830181810494850194909303909202910180841161199a5790505b505060fb549394505060ff90921691505060fe811115611a2b5760405162461bcd60e51b815260206004820152600660248201527f62616420726600000000000000000000000000000000000000000000000000006044820152606401610892565b815160ff11611a7c5760405162461bcd60e51b815260206004820152600e60248201527f626164206e6f646520636f756e740000000000000000000000000000000000006044820152606401610892565b6000805b8351811015611acc576000848281518110611a9d57611a9d6138c5565b602002602001015190508260ff168160ff161115611ab9578092505b5080611ac4816138f1565b915050611a80565b5060fe60ff821610611add57600080fd5b6000611aea8260016139ba565b60ff1667ffffffffffffffff811115611b0557611b05613587565b604051908082528060200260200182016040528015611b2e578160200160208202803683370190505b5090506000611b3e8360016139ba565b60ff1667ffffffffffffffff811115611b5957611b59613587565b604051908082528060200260200182016040528015611b82578160200160208202803683370190505b50905060005b8551811015611c59576000868281518110611ba557611ba56138c5565b6020026020010151905060018160ff161015611c035760405162461bcd60e51b815260206004820152601160248201527f6e6f6465732061726520312062617365640000000000000000000000000000006044820152606401610892565b60ff8116600081815260fe6020526040902054845163ffffffff9091169185918110611c3157611c316138c5565b63ffffffff909216602092830291909101909101525080611c51816138f1565b915050611b88565b506000611c6b868385888e8e8e6121ff565b60fc5490915015611ce5576000611c8387868561264b565b9050611c948288838688600061277a565b50600080611ca28984610a68565b90925090505b8015611ce1576000611cbc8a85888a6129a0565b90508015611cd557611cce8183613972565b9150611cdb565b50611ce1565b50611ca8565b5050505b600060015b84518160ff161015611d8a576000858260ff1681518110611d0d57611d0d6138c5565b602002602001015160ff161115611d78576000848260ff1681518110611d3557611d356138c5565b60209081029190910181015160ff8416600090815260fe9092526040909120805463ffffffff191663ffffffff8316179055905082611d738161399b565b935050505b80611d828161399b565b915050611cea565b5060008160ff1667ffffffffffffffff811115611da957611da9613587565b604051908082528060200260200182016040528015611dd2578160200160208202803683370190505b509050600060015b86518160ff161015611e7a576000878260ff1681518110611dfd57611dfd6138c5565b602002602001015160ff161115611e685760ff8116600090815260fd60205260409020546001600160a01b03168383611e35816138f1565b945081518110611e4757611e476138c5565b60200260200101906001600160a01b031690816001600160a01b0316815250505b80611e728161399b565b915050611dda565b507fb338e44b9e4e2d94df983fde422fd91ba2bd6f8182b607b50c968f8161bcf88582604051611eaa91906134ef565b60405180910390a150909b9a5050505050505050505050565b610a31611902565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611f0357611efe83612c7a565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611f5d575060408051601f3d908101601f19168201909252611f5a918101906139d3565b60015b611fcf5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610892565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146120645760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610892565b50611efe838383612d38565b606580546001600160a01b0319169055610a3181612d5d565b60fb54600090610100900460ff1680156120a95760fb805461ff00191690555b60fb5460ff1660006120bb85836139ec565b60fb5490915062010000900460ff16158015906120d9575060008112155b80156120f0575060fb5462010000900460ff168113155b80156120fe575060fc548113155b156121175760fb805460ff191660ff8316179055600192505b50909392505050565b600054610100900460ff16610d9b5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610892565b600054610100900460ff166121f65760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610892565b610d9b33612070565b6060808415801561220e575083155b15612229575050604080516000815260208101909152612640565b83156122be576040805160208082526104208201909252908082016104008036833701905050905060005b602060ff821610156122b65761226a8482612daf565b60ff1660011461227b5760ff61227d565b805b828260ff1681518110612292576122926138c5565b60ff90921660209283029190910190910152806122ae8161399b565b915050612254565b509050612640565b6122c960208761390a565b67ffffffffffffffff8111156122e1576122e1613587565b60405190808252806020026020018201604052801561230a578160200160208202803683370190505b5090506000805b8781101561237d5760005b602060ff8216101561236a57808484612334816138f1565b955081518110612346576123466138c5565b60ff90921660209283029190910190910152806123628161399b565b91505061231c565b5080612375816138f1565b915050612311565b5060005b8a518110156124fe5760008b828151811061239e5761239e6138c5565b602002602001015160ff16905060008b82815181106123bf576123bf6138c5565b6020026020010151905060005b602060ff821610156124bb576123e28282612daf565b60ff16156124a95760001960005b8751811015612439578260ff1688828151811061240f5761240f6138c5565b602002602001015160ff160361242757809150612439565b80612431816138f1565b9150506123f0565b50801961247e57600160ff83161b19831692508c848151811061245e5761245e6138c5565b6020026020010180518091906124739061399b565b60ff169052506124a7565b60ff878281518110612492576124926138c5565b602002602001019060ff16908160ff16815250505b505b806124b38161399b565b9150506123cc565b50808c83815181106124cf576124cf6138c5565b602002602001019063ffffffff16908163ffffffff1681525050505080806124f6906138f1565b915050612381565b506000805b83518110156125525760ff8016848281518110612522576125226138c5565b602002602001015160ff1603612540578161253c816138f1565b9250505b8061254a816138f1565b915050612503565b5060008184516125629190613972565b67ffffffffffffffff81111561257a5761257a613587565b6040519080825280602002602001820160405280156125a3578160200160208202803683370190505b5090506000805b85518110156126375760ff80168682815181106125c9576125c96138c5565b602002602001015160ff1614612625578581815181106125eb576125eb6138c5565b6020026020010151838381518110612605576126056138c5565b60ff9092166020928302919091019091015281612621816138f1565b9250505b8061262f816138f1565b9150506125aa565b50909450505050505b979650505050505050565b6060600061265a8460016139ba565b60ff1667ffffffffffffffff81111561267557612675613587565b60405190808252806020026020018201604052801561269e578160200160208202803683370190505b50905060005b85518110156127715760008682815181106126c1576126c16138c5565b602002602001015190506000858260ff16815181106126e2576126e26138c5565b602002602001015190506000805b602060ff82161015612730576127068382612daf565b60ff1660010361271e578161271a8161399b565b9250505b806127288161399b565b9150506126f0565b5080858460ff1681518110612747576127476138c5565b602002602001019060ff16908160ff16815250505050508080612769906138f1565b9150506126a4565b50949350505050565b6000865160000361278d57506000612996565b6127978686612dc5565b6000805b88518110156129925760008982815181106127b8576127b86138c5565b6020026020010151905060ff80168160ff16036127d55750612980565b60005b89518160ff16101561297d5760008a8260ff16815181106127fb576127fb6138c5565b6020026020010151905060008760ff1611801561283a57508660ff168a8260ff168151811061282c5761282c6138c5565b602002602001015160ff1610155b15612845575061296b565b6000898260ff168151811061285c5761285c6138c5565b6020026020010151905060006128728286612daf565b90508060ff166000036129675760ff8e8781518110612893576128936138c5565b60ff928316602091820292909201015260019086161b82178b8460ff16815181106128c0576128c06138c5565b602002602001019063ffffffff16908163ffffffff16815250508b8360ff16815181106128ef576128ef6138c5565b6020026020010180518091906129049061399b565b60ff1660ff1681525050898360ff1681518110612923576129236138c5565b6020026020010180518091906129389061399b565b60ff1660ff16815250506129528d8d8660ff166001612dec565b8661295c816138f1565b97505050505061297d565b5050505b806129758161399b565b9150506127d8565b50505b8061298a816138f1565b91505061279b565b5090505b9695505050505050565b600084516000036129b357506000612c72565b6129bd8585612dc5565b600080600187516129ce9190613972565b90506129d86134a4565b81831015612c6a5760008884815181106129f4576129f46138c5565b602002602001015190506000898481518110612a1257612a126138c5565b602002602001015190506000888360ff1681518110612a3357612a336138c5565b602002602001015119898360ff1681518110612a5157612a516138c5565b60200260200101518a8560ff1681518110612a6e57612a6e6138c5565b6020026020010151181690508063ffffffff16600014612c47576000612a94828661302a565b9050612ac58a8460ff1681518110612aae57612aae6138c5565b602002602001015182600160ff919091161b191690565b8a8460ff1681518110612ada57612ada6138c5565b602002602001019063ffffffff16908163ffffffff16815250508a8360ff1681518110612b0957612b096138c5565b602002602001018051809190612b1e90613a14565b60ff1660ff1681525050888360ff1681518110612b3d57612b3d6138c5565b602002602001018051809190612b529061399b565b60ff1660ff1681525050612b8a8a8560ff1681518110612b7457612b746138c5565b602002602001015182600160ff919091161b1790565b8a8560ff1681518110612b9f57612b9f6138c5565b602002602001019063ffffffff16908163ffffffff16815250508a8460ff1681518110612bce57612bce6138c5565b602002602001018051809190612be39061399b565b60ff1660ff1681525050888460ff1681518110612c0257612c026138c5565b602002602001018051809190612c179061399b565b60ff16905250612c2a8c8c896001612dec565b612c378c8c886000612dec565b6001975050505050505050612c72565b85612c51816138f1565b9650508480612c5f90613a31565b9550505050506129d8565b600093505050505b949350505050565b6001600160a01b0381163b612cf75760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610892565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b612d4183613152565b600082511180612d4e5750805b15611efe576118fc8383613192565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600163ffffffff831660ff83161c165b92915050565b8151600003612dd2575050565b610cc08282600060018651612de79190613972565b6131be565b818115612ec7575b6000612e018260016139ec565b12158015612e26575060018551612e189190613972565b612e238260016139ec565b13155b8015612eab57508385612e3a8360016139ec565b81518110612e4a57612e4a6138c5565b602002602001015160ff1681518110612e6557612e656138c5565b602002602001015160ff1684868581518110612e8357612e836138c5565b602002602001015160ff1681518110612e9e57612e9e6138c5565b602002602001015160ff16115b15612ec25780612eba81613a48565b915050612df4565b612f95565b6000612ed4600183613a79565b12158015612ef9575060018551612eeb9190613972565b612ef6600183613a79565b13155b8015612f7e57508385612f0d600184613a79565b81518110612f1d57612f1d6138c5565b602002602001015160ff1681518110612f3857612f386138c5565b602002602001015160ff1684868581518110612f5657612f566138c5565b602002602001015160ff1681518110612f7157612f716138c5565b602002602001015160ff16105b15612f955780612f8d81613a99565b915050612ec7565b828114613023576000858281518110612fb057612fb06138c5565b60200260200101519050858481518110612fcc57612fcc6138c5565b6020026020010151868381518110612fe657612fe66138c5565b602002602001019060ff16908160ff16815250508086858151811061300d5761300d6138c5565b602002602001019060ff16908160ff1681525050505b5050505050565b600080805b63ffffffff8516156130955760018086169003613075578084836130528161399b565b945060ff1660208110613067576130676138c5565b60ff90921660209290920201525b60018563ffffffff16901c9450808061308d9061399b565b91505061302f565b60408051426020808301919091527fff0000000000000000000000000000000000000000000000000000000000000060f885811b8216848601527fffffffff0000000000000000000000000000000000000000000000000000000060e08b901b16604185015286901b166045830152825180830360260181526046909201909252805191012060009061312c9060ff85169061394b565b9050848160ff1660208110613143576131436138c5565b60200201519695505050505050565b61315b81612c7a565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606131b78383604051806060016040528060278152602001613b506027913961339d565b9392505050565b81818082036131ce5750506118fc565b6000858760026131de8888613a79565b6131e89190613aae565b6131f290886139ec565b81518110613202576132026138c5565b602002602001015160ff168151811061321d5761321d6138c5565b602002602001015190505b818313613375575b8060ff1686888581518110613247576132476138c5565b602002602001015160ff1681518110613262576132626138c5565b602002602001015160ff161015613285578261327d81613a48565b935050613230565b85878381518110613298576132986138c5565b602002602001015160ff16815181106132b3576132b36138c5565b602002602001015160ff168160ff1610156132da57816132d281613a99565b925050613285565b818313613370578682815181106132f3576132f36138c5565b602002602001015187848151811061330d5761330d6138c5565b6020026020010151888581518110613327576133276138c5565b60200260200101898581518110613340576133406138c5565b60ff9384166020918202929092010152911690528261335e81613a48565b935050818061336c90613a99565b9250505b613228565b8185121561338957613389878787856131be565b8383121561152e5761152e878785876131be565b6060600080856001600160a01b0316856040516133ba9190613b00565b600060405180830381855af49150503d80600081146133f5576040519150601f19603f3d011682016040523d82523d6000602084013e6133fa565b606091505b5091509150612996868383876060831561347557825160000361346e576001600160a01b0385163b61346e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610892565b5081612c72565b612c72838381511561348a5781518083602001fd5b8060405162461bcd60e51b81526004016108929190613b1c565b6040518061040001604052806020906020820280368337509192915050565b803560ff811681146110f757600080fd5b6000602082840312156134e657600080fd5b6131b7826134c3565b6020808252825182820181905260009190848201906040850190845b818110156135305783516001600160a01b03168352928401929184019160010161350b565b50909695505050505050565b80356001600160a01b03811681146110f757600080fd5b60006020828403121561356557600080fd5b6131b78261353c565b60006020828403121561358057600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156135c6576135c6613587565b604052919050565b600067ffffffffffffffff8211156135e8576135e8613587565b5060051b60200190565b600082601f83011261360357600080fd5b81356020613618613613836135ce565b61359d565b82815260059290921b8401810191818101908684111561363757600080fd5b8286015b848110156136595761364c816134c3565b835291830191830161363b565b509695505050505050565b6000806040838503121561367757600080fd5b823567ffffffffffffffff8082111561368f57600080fd5b61369b868387016135f2565b935060208501359150808211156136b157600080fd5b506136be858286016135f2565b9150509250929050565b600080604083850312156136db57600080fd5b6136e48361353c565b915060208084013567ffffffffffffffff8082111561370257600080fd5b818601915086601f83011261371657600080fd5b81358181111561372857613728613587565b61373a601f8201601f1916850161359d565b9150808252878482850101111561375057600080fd5b80848401858401376000848284010152508093505050509250929050565b6000806040838503121561378157600080fd5b61378a8361353c565b9150602083013563ffffffff811681146137a357600080fd5b809150509250929050565b600060208083850312156137c157600080fd5b823567ffffffffffffffff8111156137d857600080fd5b8301601f810185136137e957600080fd5b80356137f7613613826135ce565b81815260059190911b8201830190838101908783111561381657600080fd5b928401925b828410156126405761382c8461353c565b8252928401929084019061381b565b6020808252825182820181905260009190848201906040850190845b8181101561353057835163ffffffff1683529284019291840191600101613857565b60008060006060848603121561388e57600080fd5b833561ffff811681146138a057600080fd5b92506138ae6020850161353c565b91506138bc604085016134c3565b90509250925092565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201613903576139036138db565b5060010190565b8082028115828204841417612dbf57612dbf6138db565b634e487b7160e01b600052601260045260246000fd5b60008261394657613946613921565b500490565b60008261395a5761395a613921565b500690565b80820180821115612dbf57612dbf6138db565b81810381811115612dbf57612dbf6138db565b634e487b7160e01b600052603160045260246000fd5b600060ff821660ff81036139b1576139b16138db565b60010192915050565b60ff8181168382160190811115612dbf57612dbf6138db565b6000602082840312156139e557600080fd5b5051919050565b8082018281126000831280158216821582161715613a0c57613a0c6138db565b505092915050565b600060ff821680613a2757613a276138db565b6000190192915050565b600081613a4057613a406138db565b506000190190565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613903576139036138db565b8181036000831280158383131683831282161715610826576108266138db565b6000600160ff1b8203613a4057613a406138db565b600082613abd57613abd613921565b600160ff1b821460001984141615613ad757613ad76138db565b500590565b60005b83811015613af7578181015183820152602001613adf565b50506000910152565b60008251613b12818460208701613adc565b9190910192915050565b6020815260008251806020840152613b3b816040850160208701613adc565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212208b49979b2f722eba21fe73a725f59b75c53ae7952a13f2732dd8e0c979721d1c64736f6c63430008110033", + "deployedBytecode": "0x6080604052600436106102195760003560e01c8063893f5da91161011d578063bac506e0116100b0578063d85707d51161007f578063f143896811610064578063f143896814610667578063f2fde38b1461067c578063fe92fe861461069c57600080fd5b8063d85707d514610629578063e30c39781461064957600080fd5b8063bac506e0146105a2578063cc59a6f4146105bc578063cdf64a76146105dc578063d12be06b146105fc57600080fd5b80639fc8ded3116100ec5780639fc8ded31461051e578063a25d526f14610533578063a5129cd014610562578063b2b99ec91461058257600080fd5b8063893f5da91461048e5780638da5cb5b146104bf57806399439089146104dd5780639d95f1cc146104fe57600080fd5b806345954486116101b0578063633207ae1161017f578063715018a611610164578063715018a61461044f578063720a0fa41461046457806379ba50971461047957600080fd5b8063633207ae146104255780636da49b831461043a57600080fd5b8063459544861461039657806348570569146103c85780634f1ef286146103fd57806352d1902d1461041057600080fd5b80632e949824116101ec5780632e949824146102e657806330cdb2751461030857806333083fe6146103565780633659cfe61461037657600080fd5b806301b9e4381461021e5780631a27e21c1461026b5780632520bf041461028d5780632ae9c600146102b0575b600080fd5b34801561022a57600080fd5b506102516102393660046134d4565b60fe6020526000908152604090205463ffffffff1681565b60405163ffffffff90911681526020015b60405180910390f35b34801561027757600080fd5b5061028b6102863660046134d4565b6106bc565b005b34801561029957600080fd5b506102a261070a565b604051908152602001610262565b3480156102bc57600080fd5b50610102546102d390600160a01b900461ffff1681565b60405161ffff9091168152602001610262565b3480156102f257600080fd5b506102fb610741565b60405161026291906134ef565b34801561031457600080fd5b5061033e6103233660046134d4565b60fd602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610262565b34801561036257600080fd5b50610251610371366004613553565b61082d565b34801561038257600080fd5b5061028b610391366004613553565b6108b9565b3480156103a257600080fd5b506103b66103b136600461356e565b610a34565b60405160ff9091168152602001610262565b3480156103d457600080fd5b506103e86103e3366004613664565b610a68565b60408051928352602083019190915201610262565b61028b61040b3660046136c8565b610b58565b34801561041c57600080fd5b506102a2610cc4565b34801561043157600080fd5b506103b660fe81565b34801561044657600080fd5b5060fc546103b6565b34801561045b57600080fd5b5061028b610d89565b34801561047057600080fd5b506103b6600081565b34801561048557600080fd5b5061028b610d9d565b34801561049a57600080fd5b506103b66104a9366004613553565b60ff602081905260009182526040909120541681565b3480156104cb57600080fd5b506033546001600160a01b031661033e565b3480156104e957600080fd5b506101025461033e906001600160a01b031681565b34801561050a57600080fd5b506103b6610519366004613553565b610e28565b34801561052a57600080fd5b506103b660ff81565b34801561053f57600080fd5b5060fb5461055290610100900460ff1681565b6040519015158152602001610262565b34801561056e57600080fd5b5061028b61057d3660046134d4565b6110fc565b34801561058e57600080fd5b5061028b61059d366004613553565b61117c565b3480156105ae57600080fd5b5060fb546103b69060ff1681565b3480156105c857600080fd5b5061028b6105d736600461376e565b611537565b3480156105e857600080fd5b5061028b6105f7366004613553565b6115d5565b34801561060857600080fd5b5061061c6106173660046137ae565b611600565b604051610262919061383b565b34801561063557600080fd5b5060fb546103b69062010000900460ff1681565b34801561065557600080fd5b506065546001600160a01b031661033e565b34801561067357600080fd5b506103b6602081565b34801561068857600080fd5b5061028b610697366004613553565b6116f3565b3480156106a857600080fd5b5061028b6106b7366004613879565b611764565b6106c4611902565b60fb805462ff000019166201000060ff84169081029190911790915560fc548111156106ef575060fc545b60fb805461ffff191660ff9092169190911761010017905550565b6000610714611902565b60fb5460009061072d90610100900460ff16828061195c565b60fb805461ff001916905560ff1691505090565b60fc5460609060008167ffffffffffffffff81111561076257610762613587565b60405190808252806020026020018201604052801561078b578160200160208202803683370190505b50905060005b8281101561082657600060fc82815481106107ae576107ae6138c5565b600091825260208083208183040154601f9092166101000a90910460ff1680835260fd90915260409091205484519192506001600160a01b0316908490849081106107fb576107fb6138c5565b6001600160a01b0390921660209283029190910190910152508061081e816138f1565b915050610791565b5092915050565b6001600160a01b038116600090815260ff60208190526040822054168061089b5760405162461bcd60e51b815260206004820152600c60248201527f6e6f2073756368206e6f6465000000000000000000000000000000000000000060448201526064015b60405180910390fd5b60ff16600090815260fe602052604090205463ffffffff1692915050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036109465760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610892565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166109a17f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610a0c5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610892565b610a1581611ec3565b60408051600080825260208201909252610a3191839190611ecb565b50565b60fc8181548110610a4457600080fd5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b815160fb54600091829160ff918216918391610a869116602061390a565b905060008215610a9f57610a9a8383613937565b610aa2565b60005b90506000610ab0848461394b565b1115610ac457610ac181600161395f565b90505b6000805b8851811015610b4a576000898281518110610ae557610ae56138c5565b602002602001015190506000898260ff1681518110610b0657610b066138c5565b60200260200101519050848160ff161015610b3557610b2860ff821686613972565b610b32908561395f565b93505b50508080610b42906138f1565b915050610ac8565b509097909650945050505050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610be55760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610892565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610c407f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610cab5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610892565b610cb482611ec3565b610cc082826001611ecb565b5050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610d645760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610892565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610d91611902565b610d9b6000612070565b565b60655433906001600160a01b03168114610e1f5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610892565b610a3181612070565b610102546000906001600160a01b0316331480610e4f57506033546001600160a01b031633145b610e9b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610892565b6001600160a01b038216600090815260ff60208190526040909120541615610f055760405162461bcd60e51b815260206004820152601d60248201527f6164647265737320697320616c726561647920726567697374657265640000006044820152606401610892565b6101005460ff1615801590610f2257506101005460fe60ff909116105b610f6e5760405162461bcd60e51b815260206004820152601a60248201527f6e6f64654964203e2030202626206e6f64654964203c206d61780000000000006044820152606401610892565b610101546000908015610ffc57610101610f89600183613972565b81548110610f9957610f996138c5565b90600052602060002090602091828204019190069054906101000a900460ff169150610101805480610fcd57610fcd613985565b60019003818190600052602060002090602091828204019190066101000a81549060ff0219169055905561102b565b610100805460ff169060006110108361399b565b91906101000a81548160ff021916908360ff16021790555091505b60fc8054600181810190925560208082047f371f36870d18f32a11fea0f144b021c8b407bb50f8e0267c711123f454b963c001805460ff808816601f9095166101000a8581029082021990921691909117909155600083815260fd8352604080822080546001600160a01b038c166001600160a01b031990911681179091558252918352818120805460ff19168517905592835260fe9091528120805463ffffffff19169055906110db90612089565b90506110e98160008061195c565b50506101005460ff16925050505b919050565b611104611902565b60fc5460ff821611156111595760405162461bcd60e51b815260206004820152601b60248201527f7266206973206c696d69746564206279206e6f646520636f756e7400000000006044820152606401610892565b60fb805461010060ff9390931661ffff19909116179190911762ff000019169055565b610102546001600160a01b03163314806111a057506033546001600160a01b031633145b6111ec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610892565b6001600160a01b038116600090815260ff60208181526040832054610101805460018101825594529083047f109ea3cebb188b9c1b9fc5bb3920be60dfdc8699098dff92f3d80daaca747689018054601f9094166101000a918316828102929093021990931617909155806112a35760405162461bcd60e51b815260206004820152601060248201527f6e6f206164647265737320666f756e64000000000000000000000000000000006044820152606401610892565b60fc54600003611317576001600160a01b038216600090815260ff602052604090819020805460ff191690555162461bcd60e51b81526108929060040160208082526010908201527f6e6f206e6f646520696420666f756e6400000000000000000000000000000000604082015260600190565b60ff8116600090815260fe60205260408120805463ffffffff19811690915560fc5463ffffffff909116915b81811015611465578360ff1660fc8281548110611362576113626138c5565b60009182526020918290209181049091015460ff601f9092166101000a9004160361145357611392600183613972565b81146114135760fc6113a5600184613972565b815481106113b5576113b56138c5565b90600052602060002090602091828204019190069054906101000a900460ff1660fc82815481106113e8576113e86138c5565b90600052602060002090602091828204019190066101000a81548160ff021916908360ff1602179055505b60fc80548061142457611424613985565b60019003818190600052602060002090602091828204019190066101000a81549060ff02191690559055611465565b8061145d816138f1565b915050611343565b5060ff8316600090815260fd6020526040812080546001600160a01b0319169055611491600019612089565b604080516001808252818301909252919250600091906020808301908036833701905050905085816000815181106114cb576114cb6138c5565b60200260200101906001600160a01b031690816001600160a01b0316815250507fb338e44b9e4e2d94df983fde422fd91ba2bd6f8182b607b50c968f8161bcf8858160405161151a91906134ef565b60405180910390a161152e8260018661195c565b50505050505050565b61153f611902565b6001600160a01b038216600090815260ff602081905260409091205416806115a95760405162461bcd60e51b815260206004820152601e60248201527f6e6f64652061646472657373206973206e6f74207265676973746572656400006044820152606401610892565b60ff16600090815260fe60205260409020805463ffffffff191663ffffffff9290921691909117905550565b6115dd611902565b61010280546001600160a01b0319166001600160a01b0392909216919091179055565b60606000825167ffffffffffffffff81111561161e5761161e613587565b604051908082528060200260200182016040528015611647578160200160208202803683370190505b50905060005b835181101561082657600060ff600086848151811061166e5761166e6138c5565b6020908102919091018101516001600160a01b0316825281810192909252604090810160009081205460ff1680825260fe9093522054845191925063ffffffff169081908590859081106116c4576116c46138c5565b602002602001019063ffffffff16908163ffffffff1681525050505080806116eb906138f1565b91505061164d565b6116fb611902565b606580546001600160a01b0383166001600160a01b0319909116811790915561172c6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600054610100900460ff16158080156117845750600054600160ff909116105b8061179e5750303b15801561179e575060005460ff166001145b6118105760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610892565b6000805460ff191660011790558015611833576000805461ff0019166101001790555b61183b612120565b61184361218b565b6101008054600160ff1990911617905560fb8054610102805462ff00ff199092166201000060ff871602179092557fffffffffffffffffffff0000000000000000000000000000000000000000000016600160a01b61ffff8716026001600160a01b031916176001600160a01b03851617905580156118fc576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6033546001600160a01b03163314610d9b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610892565b60008060fc8054806020026020016040519081016040528092919081815260200182805480156119c957602002820191906000526020600020906000905b825461010083900a900460ff1681526020600192830181810494850194909303909202910180841161199a5790505b505060fb549394505060ff90921691505060fe811115611a2b5760405162461bcd60e51b815260206004820152600660248201527f62616420726600000000000000000000000000000000000000000000000000006044820152606401610892565b815160ff11611a7c5760405162461bcd60e51b815260206004820152600e60248201527f626164206e6f646520636f756e740000000000000000000000000000000000006044820152606401610892565b6000805b8351811015611acc576000848281518110611a9d57611a9d6138c5565b602002602001015190508260ff168160ff161115611ab9578092505b5080611ac4816138f1565b915050611a80565b5060fe60ff821610611add57600080fd5b6000611aea8260016139ba565b60ff1667ffffffffffffffff811115611b0557611b05613587565b604051908082528060200260200182016040528015611b2e578160200160208202803683370190505b5090506000611b3e8360016139ba565b60ff1667ffffffffffffffff811115611b5957611b59613587565b604051908082528060200260200182016040528015611b82578160200160208202803683370190505b50905060005b8551811015611c59576000868281518110611ba557611ba56138c5565b6020026020010151905060018160ff161015611c035760405162461bcd60e51b815260206004820152601160248201527f6e6f6465732061726520312062617365640000000000000000000000000000006044820152606401610892565b60ff8116600081815260fe6020526040902054845163ffffffff9091169185918110611c3157611c316138c5565b63ffffffff909216602092830291909101909101525080611c51816138f1565b915050611b88565b506000611c6b868385888e8e8e6121ff565b60fc5490915015611ce5576000611c8387868561264b565b9050611c948288838688600061277a565b50600080611ca28984610a68565b90925090505b8015611ce1576000611cbc8a85888a6129a0565b90508015611cd557611cce8183613972565b9150611cdb565b50611ce1565b50611ca8565b5050505b600060015b84518160ff161015611d8a576000858260ff1681518110611d0d57611d0d6138c5565b602002602001015160ff161115611d78576000848260ff1681518110611d3557611d356138c5565b60209081029190910181015160ff8416600090815260fe9092526040909120805463ffffffff191663ffffffff8316179055905082611d738161399b565b935050505b80611d828161399b565b915050611cea565b5060008160ff1667ffffffffffffffff811115611da957611da9613587565b604051908082528060200260200182016040528015611dd2578160200160208202803683370190505b509050600060015b86518160ff161015611e7a576000878260ff1681518110611dfd57611dfd6138c5565b602002602001015160ff161115611e685760ff8116600090815260fd60205260409020546001600160a01b03168383611e35816138f1565b945081518110611e4757611e476138c5565b60200260200101906001600160a01b031690816001600160a01b0316815250505b80611e728161399b565b915050611dda565b507fb338e44b9e4e2d94df983fde422fd91ba2bd6f8182b607b50c968f8161bcf88582604051611eaa91906134ef565b60405180910390a150909b9a5050505050505050505050565b610a31611902565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611f0357611efe83612c7a565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611f5d575060408051601f3d908101601f19168201909252611f5a918101906139d3565b60015b611fcf5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610892565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146120645760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610892565b50611efe838383612d38565b606580546001600160a01b0319169055610a3181612d5d565b60fb54600090610100900460ff1680156120a95760fb805461ff00191690555b60fb5460ff1660006120bb85836139ec565b60fb5490915062010000900460ff16158015906120d9575060008112155b80156120f0575060fb5462010000900460ff168113155b80156120fe575060fc548113155b156121175760fb805460ff191660ff8316179055600192505b50909392505050565b600054610100900460ff16610d9b5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610892565b600054610100900460ff166121f65760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610892565b610d9b33612070565b6060808415801561220e575083155b15612229575050604080516000815260208101909152612640565b83156122be576040805160208082526104208201909252908082016104008036833701905050905060005b602060ff821610156122b65761226a8482612daf565b60ff1660011461227b5760ff61227d565b805b828260ff1681518110612292576122926138c5565b60ff90921660209283029190910190910152806122ae8161399b565b915050612254565b509050612640565b6122c960208761390a565b67ffffffffffffffff8111156122e1576122e1613587565b60405190808252806020026020018201604052801561230a578160200160208202803683370190505b5090506000805b8781101561237d5760005b602060ff8216101561236a57808484612334816138f1565b955081518110612346576123466138c5565b60ff90921660209283029190910190910152806123628161399b565b91505061231c565b5080612375816138f1565b915050612311565b5060005b8a518110156124fe5760008b828151811061239e5761239e6138c5565b602002602001015160ff16905060008b82815181106123bf576123bf6138c5565b6020026020010151905060005b602060ff821610156124bb576123e28282612daf565b60ff16156124a95760001960005b8751811015612439578260ff1688828151811061240f5761240f6138c5565b602002602001015160ff160361242757809150612439565b80612431816138f1565b9150506123f0565b50801961247e57600160ff83161b19831692508c848151811061245e5761245e6138c5565b6020026020010180518091906124739061399b565b60ff169052506124a7565b60ff878281518110612492576124926138c5565b602002602001019060ff16908160ff16815250505b505b806124b38161399b565b9150506123cc565b50808c83815181106124cf576124cf6138c5565b602002602001019063ffffffff16908163ffffffff1681525050505080806124f6906138f1565b915050612381565b506000805b83518110156125525760ff8016848281518110612522576125226138c5565b602002602001015160ff1603612540578161253c816138f1565b9250505b8061254a816138f1565b915050612503565b5060008184516125629190613972565b67ffffffffffffffff81111561257a5761257a613587565b6040519080825280602002602001820160405280156125a3578160200160208202803683370190505b5090506000805b85518110156126375760ff80168682815181106125c9576125c96138c5565b602002602001015160ff1614612625578581815181106125eb576125eb6138c5565b6020026020010151838381518110612605576126056138c5565b60ff9092166020928302919091019091015281612621816138f1565b9250505b8061262f816138f1565b9150506125aa565b50909450505050505b979650505050505050565b6060600061265a8460016139ba565b60ff1667ffffffffffffffff81111561267557612675613587565b60405190808252806020026020018201604052801561269e578160200160208202803683370190505b50905060005b85518110156127715760008682815181106126c1576126c16138c5565b602002602001015190506000858260ff16815181106126e2576126e26138c5565b602002602001015190506000805b602060ff82161015612730576127068382612daf565b60ff1660010361271e578161271a8161399b565b9250505b806127288161399b565b9150506126f0565b5080858460ff1681518110612747576127476138c5565b602002602001019060ff16908160ff16815250505050508080612769906138f1565b9150506126a4565b50949350505050565b6000865160000361278d57506000612996565b6127978686612dc5565b6000805b88518110156129925760008982815181106127b8576127b86138c5565b6020026020010151905060ff80168160ff16036127d55750612980565b60005b89518160ff16101561297d5760008a8260ff16815181106127fb576127fb6138c5565b6020026020010151905060008760ff1611801561283a57508660ff168a8260ff168151811061282c5761282c6138c5565b602002602001015160ff1610155b15612845575061296b565b6000898260ff168151811061285c5761285c6138c5565b6020026020010151905060006128728286612daf565b90508060ff166000036129675760ff8e8781518110612893576128936138c5565b60ff928316602091820292909201015260019086161b82178b8460ff16815181106128c0576128c06138c5565b602002602001019063ffffffff16908163ffffffff16815250508b8360ff16815181106128ef576128ef6138c5565b6020026020010180518091906129049061399b565b60ff1660ff1681525050898360ff1681518110612923576129236138c5565b6020026020010180518091906129389061399b565b60ff1660ff16815250506129528d8d8660ff166001612dec565b8661295c816138f1565b97505050505061297d565b5050505b806129758161399b565b9150506127d8565b50505b8061298a816138f1565b91505061279b565b5090505b9695505050505050565b600084516000036129b357506000612c72565b6129bd8585612dc5565b600080600187516129ce9190613972565b90506129d86134a4565b81831015612c6a5760008884815181106129f4576129f46138c5565b602002602001015190506000898481518110612a1257612a126138c5565b602002602001015190506000888360ff1681518110612a3357612a336138c5565b602002602001015119898360ff1681518110612a5157612a516138c5565b60200260200101518a8560ff1681518110612a6e57612a6e6138c5565b6020026020010151181690508063ffffffff16600014612c47576000612a94828661302a565b9050612ac58a8460ff1681518110612aae57612aae6138c5565b602002602001015182600160ff919091161b191690565b8a8460ff1681518110612ada57612ada6138c5565b602002602001019063ffffffff16908163ffffffff16815250508a8360ff1681518110612b0957612b096138c5565b602002602001018051809190612b1e90613a14565b60ff1660ff1681525050888360ff1681518110612b3d57612b3d6138c5565b602002602001018051809190612b529061399b565b60ff1660ff1681525050612b8a8a8560ff1681518110612b7457612b746138c5565b602002602001015182600160ff919091161b1790565b8a8560ff1681518110612b9f57612b9f6138c5565b602002602001019063ffffffff16908163ffffffff16815250508a8460ff1681518110612bce57612bce6138c5565b602002602001018051809190612be39061399b565b60ff1660ff1681525050888460ff1681518110612c0257612c026138c5565b602002602001018051809190612c179061399b565b60ff16905250612c2a8c8c896001612dec565b612c378c8c886000612dec565b6001975050505050505050612c72565b85612c51816138f1565b9650508480612c5f90613a31565b9550505050506129d8565b600093505050505b949350505050565b6001600160a01b0381163b612cf75760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610892565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b612d4183613152565b600082511180612d4e5750805b15611efe576118fc8383613192565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600163ffffffff831660ff83161c165b92915050565b8151600003612dd2575050565b610cc08282600060018651612de79190613972565b6131be565b818115612ec7575b6000612e018260016139ec565b12158015612e26575060018551612e189190613972565b612e238260016139ec565b13155b8015612eab57508385612e3a8360016139ec565b81518110612e4a57612e4a6138c5565b602002602001015160ff1681518110612e6557612e656138c5565b602002602001015160ff1684868581518110612e8357612e836138c5565b602002602001015160ff1681518110612e9e57612e9e6138c5565b602002602001015160ff16115b15612ec25780612eba81613a48565b915050612df4565b612f95565b6000612ed4600183613a79565b12158015612ef9575060018551612eeb9190613972565b612ef6600183613a79565b13155b8015612f7e57508385612f0d600184613a79565b81518110612f1d57612f1d6138c5565b602002602001015160ff1681518110612f3857612f386138c5565b602002602001015160ff1684868581518110612f5657612f566138c5565b602002602001015160ff1681518110612f7157612f716138c5565b602002602001015160ff16105b15612f955780612f8d81613a99565b915050612ec7565b828114613023576000858281518110612fb057612fb06138c5565b60200260200101519050858481518110612fcc57612fcc6138c5565b6020026020010151868381518110612fe657612fe66138c5565b602002602001019060ff16908160ff16815250508086858151811061300d5761300d6138c5565b602002602001019060ff16908160ff1681525050505b5050505050565b600080805b63ffffffff8516156130955760018086169003613075578084836130528161399b565b945060ff1660208110613067576130676138c5565b60ff90921660209290920201525b60018563ffffffff16901c9450808061308d9061399b565b91505061302f565b60408051426020808301919091527fff0000000000000000000000000000000000000000000000000000000000000060f885811b8216848601527fffffffff0000000000000000000000000000000000000000000000000000000060e08b901b16604185015286901b166045830152825180830360260181526046909201909252805191012060009061312c9060ff85169061394b565b9050848160ff1660208110613143576131436138c5565b60200201519695505050505050565b61315b81612c7a565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606131b78383604051806060016040528060278152602001613b506027913961339d565b9392505050565b81818082036131ce5750506118fc565b6000858760026131de8888613a79565b6131e89190613aae565b6131f290886139ec565b81518110613202576132026138c5565b602002602001015160ff168151811061321d5761321d6138c5565b602002602001015190505b818313613375575b8060ff1686888581518110613247576132476138c5565b602002602001015160ff1681518110613262576132626138c5565b602002602001015160ff161015613285578261327d81613a48565b935050613230565b85878381518110613298576132986138c5565b602002602001015160ff16815181106132b3576132b36138c5565b602002602001015160ff168160ff1610156132da57816132d281613a99565b925050613285565b818313613370578682815181106132f3576132f36138c5565b602002602001015187848151811061330d5761330d6138c5565b6020026020010151888581518110613327576133276138c5565b60200260200101898581518110613340576133406138c5565b60ff9384166020918202929092010152911690528261335e81613a48565b935050818061336c90613a99565b9250505b613228565b8185121561338957613389878787856131be565b8383121561152e5761152e878785876131be565b6060600080856001600160a01b0316856040516133ba9190613b00565b600060405180830381855af49150503d80600081146133f5576040519150601f19603f3d011682016040523d82523d6000602084013e6133fa565b606091505b5091509150612996868383876060831561347557825160000361346e576001600160a01b0385163b61346e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610892565b5081612c72565b612c72838381511561348a5781518083602001fd5b8060405162461bcd60e51b81526004016108929190613b1c565b6040518061040001604052806020906020820280368337509192915050565b803560ff811681146110f757600080fd5b6000602082840312156134e657600080fd5b6131b7826134c3565b6020808252825182820181905260009190848201906040850190845b818110156135305783516001600160a01b03168352928401929184019160010161350b565b50909695505050505050565b80356001600160a01b03811681146110f757600080fd5b60006020828403121561356557600080fd5b6131b78261353c565b60006020828403121561358057600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156135c6576135c6613587565b604052919050565b600067ffffffffffffffff8211156135e8576135e8613587565b5060051b60200190565b600082601f83011261360357600080fd5b81356020613618613613836135ce565b61359d565b82815260059290921b8401810191818101908684111561363757600080fd5b8286015b848110156136595761364c816134c3565b835291830191830161363b565b509695505050505050565b6000806040838503121561367757600080fd5b823567ffffffffffffffff8082111561368f57600080fd5b61369b868387016135f2565b935060208501359150808211156136b157600080fd5b506136be858286016135f2565b9150509250929050565b600080604083850312156136db57600080fd5b6136e48361353c565b915060208084013567ffffffffffffffff8082111561370257600080fd5b818601915086601f83011261371657600080fd5b81358181111561372857613728613587565b61373a601f8201601f1916850161359d565b9150808252878482850101111561375057600080fd5b80848401858401376000848284010152508093505050509250929050565b6000806040838503121561378157600080fd5b61378a8361353c565b9150602083013563ffffffff811681146137a357600080fd5b809150509250929050565b600060208083850312156137c157600080fd5b823567ffffffffffffffff8111156137d857600080fd5b8301601f810185136137e957600080fd5b80356137f7613613826135ce565b81815260059190911b8201830190838101908783111561381657600080fd5b928401925b828410156126405761382c8461353c565b8252928401929084019061381b565b6020808252825182820181905260009190848201906040850190845b8181101561353057835163ffffffff1683529284019291840191600101613857565b60008060006060848603121561388e57600080fd5b833561ffff811681146138a057600080fd5b92506138ae6020850161353c565b91506138bc604085016134c3565b90509250925092565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201613903576139036138db565b5060010190565b8082028115828204841417612dbf57612dbf6138db565b634e487b7160e01b600052601260045260246000fd5b60008261394657613946613921565b500490565b60008261395a5761395a613921565b500690565b80820180821115612dbf57612dbf6138db565b81810381811115612dbf57612dbf6138db565b634e487b7160e01b600052603160045260246000fd5b600060ff821660ff81036139b1576139b16138db565b60010192915050565b60ff8181168382160190811115612dbf57612dbf6138db565b6000602082840312156139e557600080fd5b5051919050565b8082018281126000831280158216821582161715613a0c57613a0c6138db565b505092915050565b600060ff821680613a2757613a276138db565b6000190192915050565b600081613a4057613a406138db565b506000190190565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613903576139036138db565b8181036000831280158383131683831282161715610826576108266138db565b6000600160ff1b8203613a4057613a406138db565b600082613abd57613abd613921565b600160ff1b821460001984141615613ad757613ad76138db565b500590565b60005b83811015613af7578181015183820152602001613adf565b50506000910152565b60008251613b12818460208701613adc565b9190910192915050565b6020815260008251806020840152613b3b816040850160208701613adc565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212208b49979b2f722eba21fe73a725f59b75c53ae7952a13f2732dd8e0c979721d1c64736f6c63430008110033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/push-docker/v03/ValidatorV1.json b/push-docker/v03/ValidatorV1.json new file mode 100644 index 0000000..dbecf31 --- /dev/null +++ b/push-docker/v03/ValidatorV1.json @@ -0,0 +1,1161 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ValidatorV1", + "sourceName": "contracts/Validator.sol", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint16", + "name": "valPerBlock", + "type": "uint16" + }, + { + "indexed": false, + "internalType": "uint16", + "name": "valPerBlockTarget", + "type": "uint16" + } + ], + "name": "BlockParamsUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "ownerWallet", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "nodeWallet", + "type": "address" + }, + { + "indexed": false, + "internalType": "enum ValidatorV1.NodeType", + "name": "nodeType", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "nodeTokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "nodeApiBaseUrl", + "type": "string" + } + ], + "name": "NodeAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "nodeWallet", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "reporterWallet", + "type": "address" + }, + { + "indexed": false, + "internalType": "address[]", + "name": "voters", + "type": "address[]" + }, + { + "indexed": false, + "internalType": "enum ValidatorV1.VoteAction", + "name": "voteAction", + "type": "uint8" + } + ], + "name": "NodeReported", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "nodeWallet", + "type": "address" + }, + { + "indexed": false, + "internalType": "enum ValidatorV1.NodeStatus", + "name": "nodeStatus", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "nodeTokens", + "type": "uint256" + } + ], + "name": "NodeStatusChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint16", + "name": "nodeRandomMinCount", + "type": "uint16" + }, + { + "indexed": false, + "internalType": "uint16", + "name": "nodeRandomPingCount", + "type": "uint16" + } + ], + "name": "RandomParamsUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "inputs": [], + "name": "BAN_PERCENT", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "REPORTS_BEFORE_SLASH_S", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "REPORTS_BEFORE_SLASH_V", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "REPORT_THRESHOLD_PER_BLOCK", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SLASHES_BEFORE_BAN_S", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SLASHES_BEFORE_BAN_V", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SLASH_PERCENT", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "VERSION", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "dnodes", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getActiveVNodes", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "nodeWallet", + "type": "address" + }, + { + "internalType": "string", + "name": "nodeApiBaseUrl", + "type": "string" + } + ], + "internalType": "struct ValidatorV1.ActiveValidator[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDNodes", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDNodesLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_nodeWallet", + "type": "address" + } + ], + "name": "getNodeInfo", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "ownerWallet", + "type": "address" + }, + { + "internalType": "address", + "name": "nodeWallet", + "type": "address" + }, + { + "internalType": "enum ValidatorV1.NodeType", + "name": "nodeType", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "nodeTokens", + "type": "uint256" + }, + { + "internalType": "string", + "name": "nodeApiBaseUrl", + "type": "string" + }, + { + "components": [ + { + "internalType": "uint16", + "name": "reportCounter", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "slashCounter", + "type": "uint16" + }, + { + "internalType": "uint128[]", + "name": "reportedInBlocks", + "type": "uint128[]" + }, + { + "internalType": "address[]", + "name": "reportedBy", + "type": "address[]" + }, + { + "internalType": "uint128[]", + "name": "reportedKeys", + "type": "uint128[]" + } + ], + "internalType": "struct ValidatorV1.NodeCounters", + "name": "counters", + "type": "tuple" + }, + { + "internalType": "enum ValidatorV1.NodeStatus", + "name": "status", + "type": "uint8" + } + ], + "internalType": "struct ValidatorV1.NodeInfo", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getSNodes", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getSNodesLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVNodes", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVNodesLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint16", + "name": "protocolVersion_", + "type": "uint16" + }, + { + "internalType": "address", + "name": "pushToken_", + "type": "address" + }, + { + "internalType": "uint16", + "name": "valPerBlockTarget_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "nodeRandomMinCount_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "nodeRandomPingCount_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "REPORTS_BEFORE_SLASH_V_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "REPORTS_BEFORE_SLASH_S_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "SLASHES_BEFORE_BAN_V_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "SLASHES_BEFORE_BAN_S_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "SLASH_PERCENT_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "BAN_PERCENT_", + "type": "uint16" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "minStakeD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minStakeS", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minStakeV", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "nodeMap", + "outputs": [ + { + "internalType": "address", + "name": "ownerWallet", + "type": "address" + }, + { + "internalType": "address", + "name": "nodeWallet", + "type": "address" + }, + { + "internalType": "enum ValidatorV1.NodeType", + "name": "nodeType", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "nodeTokens", + "type": "uint256" + }, + { + "internalType": "string", + "name": "nodeApiBaseUrl", + "type": "string" + }, + { + "components": [ + { + "internalType": "uint16", + "name": "reportCounter", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "slashCounter", + "type": "uint16" + }, + { + "internalType": "uint128[]", + "name": "reportedInBlocks", + "type": "uint128[]" + }, + { + "internalType": "address[]", + "name": "reportedBy", + "type": "address[]" + }, + { + "internalType": "uint128[]", + "name": "reportedKeys", + "type": "uint128[]" + } + ], + "internalType": "struct ValidatorV1.NodeCounters", + "name": "counters", + "type": "tuple" + }, + { + "internalType": "enum ValidatorV1.NodeStatus", + "name": "status", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nodeRandomMinCount", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nodeRandomPingCount", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "protocolVersion", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from_", + "type": "address" + }, + { + "internalType": "address", + "name": "to_", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount_", + "type": "uint256" + } + ], + "name": "redistributeStaked", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeTokens_", + "type": "uint256" + }, + { + "internalType": "enum ValidatorV1.NodeType", + "name": "nodeType_", + "type": "uint8" + }, + { + "internalType": "string", + "name": "nodeApiBaseUrl_", + "type": "string" + }, + { + "internalType": "address", + "name": "nodeWallet_", + "type": "address" + } + ], + "name": "registerNodeAndStake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum ValidatorV1.NodeType", + "name": "targetNodeType_", + "type": "uint8" + }, + { + "internalType": "bytes", + "name": "voteBlob_", + "type": "bytes" + }, + { + "internalType": "bytes[]", + "name": "signatures_", + "type": "bytes[]" + } + ], + "name": "reportNode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "addr_", + "type": "address" + } + ], + "name": "setStorageContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "snodes", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "storageContract", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalFees", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalStaked", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to_", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount_", + "type": "uint256" + } + ], + "name": "unstakeFees", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeWallet_", + "type": "address" + } + ], + "name": "unstakeNode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint16", + "name": "valPerBlockTarget_", + "type": "uint16" + } + ], + "name": "updateBlockParams", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint16", + "name": "nodeRandomMinCount_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "nodeRandomPingCount_", + "type": "uint16" + } + ], + "name": "updateRandomParams", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "valPerBlock", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "valPerBlockTarget", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "vnodes", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "vnodesActive", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60a06040523060805234801561001457600080fd5b50608051615c436200004d60003960008181610db901528181610e3e015281816111a80152818161122d01526113170152615c436000f3fe60806040526004361061031e5760003560e01c80637f6e29de116101a5578063bdb860ea116100ec578063e67a5d7811610095578063f6e8913d1161006f578063f6e8913d146108b2578063f7714eb9146108d7578063fdd9344c146108fe578063ffa1ad741461092057600080fd5b8063e67a5d781461085c578063f108f5b61461087c578063f2fde38b1461089257600080fd5b8063dc38b0a2116100c6578063dc38b0a214610808578063dd6f8f9014610828578063e30c39781461083e57600080fd5b8063bdb860ea146107b2578063c993d861146107c8578063ce3e7e91146107e857600080fd5b8063931127a01161014e578063adf1daa611610128578063adf1daa614610750578063b10064eb14610772578063b27b154d1461079257600080fd5b8063931127a0146106fa578063974c5b411461071b5780639c30db5c1461073057600080fd5b806384f21a441161017f57806384f21a441461069a5780638b8f631f146106bc5780638da5cb5b146106dc57600080fd5b80637f6e29de14610658578063817b1cd21461066e57806381ebc5061461068557600080fd5b80633659cfe61161026957806365cdbaea11610212578063715018a6116101ec578063715018a61461061357806379ba5097146106285780637c4981c81461063d57600080fd5b806365cdbaea146105ae5780636dcd3af2146105d75780636ddf344a146105f757600080fd5b806352d1902d1161024357806352d1902d1461054c578063569c876214610561578063582115fb1461058157600080fd5b80633659cfe6146104e65780633a688a2f146105065780634f1ef2861461053957600080fd5b80631acf7629116102cb57806324212b86116102a557806324212b86146104855780632ae9c6001461049b578063339f334b146104b657600080fd5b80631acf76291461041657806323b8ac5d1461043857806323deecfe1461046357600080fd5b8063125c6c98116102fc578063125c6c98146103b957806313114a9d146103dd57806315aa7b06146103f457600080fd5b8063011f59a014610323578063024f38cb1461035d57806311ce026714610380575b600080fd5b34801561032f57600080fd5b5060ff5461034590600160701b900461ffff1681565b60405161ffff90911681526020015b60405180910390f35b34801561036957600080fd5b5060ff5461034590640100000000900461ffff1681565b34801561038c57600080fd5b50610101546103a1906001600160a01b031681565b6040516001600160a01b039091168152602001610354565b3480156103c557600080fd5b506103cf60fc5481565b604051908152602001610354565b3480156103e957600080fd5b506103cf6101085481565b34801561040057600080fd5b50610409610976565b6040516103549190614fd2565b34801561042257600080fd5b50610436610431366004614ffa565b6109d9565b005b34801561044457600080fd5b5060ff54610345906c01000000000000000000000000900461ffff1681565b34801561046f57600080fd5b5060ff5461034590600160801b900461ffff1681565b34801561049157600080fd5b506103cf60fe5481565b3480156104a757600080fd5b5060fb546103459061ffff1681565b3480156104c257600080fd5b506104d66104d1366004615017565b610b34565b6040519015158152602001610354565b3480156104f257600080fd5b50610436610501366004614ffa565b610daf565b34801561051257600080fd5b50610526610521366004614ffa565b610f2a565b60405161035497969594939291906151a7565b6104366105473660046152d3565b61119e565b34801561055857600080fd5b506103cf61130a565b34801561056d57600080fd5b506103a161057c366004615323565b6113cf565b34801561058d57600080fd5b506105a161059c366004614ffa565b6113fa565b604051610354919061533c565b3480156105ba57600080fd5b5060ff54610345906a0100000000000000000000900461ffff1681565b3480156105e357600080fd5b506104366105f23660046153ea565b6116eb565b34801561060357600080fd5b50610103546103459061ffff1681565b34801561061f57600080fd5b50610436611b1f565b34801561063457600080fd5b50610436611b33565b34801561064957600080fd5b5060ff546103459061ffff1681565b34801561066457600080fd5b50610105546103cf565b34801561067a57600080fd5b506103cf6101075481565b34801561069157600080fd5b50610409611bbe565b3480156106a657600080fd5b506106af611c1f565b60405161035491906154b8565b3480156106c857600080fd5b506103a16106d7366004615323565b611e6e565b3480156106e857600080fd5b506033546001600160a01b03166103a1565b34801561070657600080fd5b5060ff546103459062010000900461ffff1681565b34801561072757600080fd5b50610409611e7f565b34801561073c57600080fd5b5061043661074b366004615544565b611ee0565b34801561075c57600080fd5b5060ff5461034590600160901b900461ffff1681565b34801561077e57600080fd5b5061043661078d3660046155c2565b612775565b34801561079e57600080fd5b506104366107ad3660046156bc565b612daa565b3480156107be57600080fd5b50610104546103cf565b3480156107d457600080fd5b506103a16107e3366004615323565b612e7c565b3480156107f457600080fd5b506104d66108033660046156d7565b612e8d565b34801561081457600080fd5b50610436610823366004614ffa565b61336a565b34801561083457600080fd5b506103cf60fd5481565b34801561084a57600080fd5b506065546001600160a01b03166103a1565b34801561086857600080fd5b50610436610877366004615718565b613395565b34801561088857600080fd5b50610102546103cf565b34801561089e57600080fd5b506104366108ad366004614ffa565b61346a565b3480156108be57600080fd5b5060ff54610345906601000000000000900461ffff1681565b3480156108e357600080fd5b5060ff546103459068010000000000000000900461ffff1681565b34801561090a57600080fd5b5060ff5461034590600160a01b900461ffff1681565b34801561092c57600080fd5b506109696040518060400160405280600581526020017f302e302e3200000000000000000000000000000000000000000000000000000081525081565b604051610354919061574b565b60606101058054806020026020016040519081016040528092919081815260200182805480156109cf57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109b1575b5050505050905090565b6001600160a01b038082166000908152610106602052604090206001810154909116610a4c5760405162461bcd60e51b815260206004820152601460248201527f6e6f646520646f6573206e6f742065786973747300000000000000000000000060448201526064015b60405180910390fd5b80546001600160a01b0316331480610a7d575033610a726033546001600160a01b031690565b6001600160a01b0316145b610ac95760405162461bcd60e51b815260206004820152601d60248201527f6f6e6c79206f776e65722063616e20756e7374616b652061206e6f64650000006044820152606401610a43565b610ad2816134db565b5060088101805460ff1916600490811790915560018201546040516001600160a01b03909116917ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e91610b28919060009061575e565b60405180910390a25050565b6000610b3e6137c6565b6001600160a01b038316610b945760405162461bcd60e51b815260206004820152601260248201527f696e76616c696420746f206164647265737300000000000000000000000000006044820152606401610a43565b60008211610be45760405162461bcd60e51b815260206004820152600e60248201527f696e76616c696420616d6f756e740000000000000000000000000000000000006044820152606401610a43565b610108548211158015610c7c5750610100546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610c54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c789190615779565b8211155b610cc85760405162461bcd60e51b815260206004820152601460248201527f696e73756666696369656e742062616c616e63650000000000000000000000006044820152606401610a43565b6101005460405163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529091169063a9059cbb906044016020604051808303816000875af1158015610d1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d409190615792565b610d8c5760405162461bcd60e51b815260206004820152601260248201527f6661696c656420746f207472616e7366657200000000000000000000000000006044820152606401610a43565b816101086000828254610d9f91906157ca565b9091555060019150505b92915050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610e3c5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610a43565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610e977f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610f025760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610a43565b610f0b81613820565b60408051600080825260208201909252610f2791839190613828565b50565b6101066020526000908152604090208054600182015460028301546003840180546001600160a01b039485169594841694600160a01b90940460ff16939190610f72906157dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9e906157dd565b8015610feb5780601f10610fc057610100808354040283529160200191610feb565b820191906000526020600020905b815481529060010190602001808311610fce57829003601f168201915b50506040805160a08101825260048701805461ffff808216845262010000909104166020808401919091526005890180548551818402810184018752818152999a99949850929650938701945091929183018282801561109c57602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116110595790505b50505050508152602001600282018054806020026020016040519081016040528092919081815260200182805480156110fe57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116110e0575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561118857602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116111455790505b5050509190925250505060089091015460ff1687565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361122b5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610a43565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166112867f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b0316146112f15760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610a43565b6112fa82613820565b61130682826001613828565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113aa5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610a43565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b61010581815481106113e057600080fd5b6000918252602090912001546001600160a01b0316905081565b611402614db9565b6001600160a01b0382811660009081526101066020908152604091829020825160e08101845281548516815260018201549485169281019290925290929091830190600160a01b900460ff16600281111561145f5761145f615043565b600281111561147057611470615043565b81526020016002820154815260200160038201805461148e906157dd565b80601f01602080910402602001604051908101604052809291908181526020018280546114ba906157dd565b80156115075780601f106114dc57610100808354040283529160200191611507565b820191906000526020600020905b8154815290600101906020018083116114ea57829003601f168201915b50505091835250506040805160a08101825260048401805461ffff808216845262010000909104166020838101919091526005860180548551818402810184018752818152968301969495939493860193928301828280156115ba57602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116115775790505b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561161c57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116115fe575b50505050508152602001600382018054806020026020016040519081016040528092919081815260200182805480156116a657602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116116635790505b505050919092525050508152600882015460209091019060ff1660048111156116d1576116d1615043565b60048111156116e2576116e2615043565b90525092915050565b600054610100900460ff161580801561170b5750600054600160ff909116105b806117255750303b158015611725575060005460ff166001145b6117975760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a43565b6000805460ff1916600117905580156117ba576000805461ff0019166101001790555b6117c26139cd565b6117ca613a38565b60fb805461ffff191661ffff8e161790556001600160a01b038b166117ee57600080fd5b61010080546001600160a01b0319166001600160a01b038d1617905561ffff8a1661185b5760405162461bcd60e51b815260206004820152601860248201527f696e76616c69642061747465737465727320616d6f756e7400000000000000006044820152606401610a43565b60ff805461ffff808d16600160801b0271ffff00000000000000000000000000000000199092169190911790915589166118fd5760405162461bcd60e51b815260206004820152602160248201527f696e76616c6964206e6f646552616e646f6d4d696e436f756e7420616d6f756e60448201527f74000000000000000000000000000000000000000000000000000000000000006064820152608401610a43565b60ff805461ffff808c16600160901b027fffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffff9092169190911790915588166119ac5760405162461bcd60e51b815260206004820152602c60248201527f696e76616c6964206e6f646552616e646f6d46696c74657250696e677352657160448201527f756972656420616d6f756e7400000000000000000000000000000000000000006064820152608401610a43565b8760ff60146101000a81548161ffff021916908361ffff160217905550606460fc81905550606460fd81905550606460fe819055508660ff60026101000a81548161ffff021916908361ffff1602179055508560ff60046101000a81548161ffff021916908361ffff1602179055508260ff60066101000a81548161ffff021916908361ffff1602179055508460ff60086101000a81548161ffff021916908361ffff1602179055508360ff600a6101000a81548161ffff021916908361ffff1602179055508160ff600c6101000a81548161ffff021916908361ffff160217905550604260ff60006101000a81548161ffff021916908361ffff160217905550600060ff600e6101000a81548161ffff021916908361ffff1602179055508015611b11576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050505050565b611b276137c6565b611b316000613aa8565b565b60655433906001600160a01b03168114611bb55760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610a43565b610f2781613aa8565b60606101048054806020026020016040519081016040528092919081815260200182805480156109cf576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109b1575050505050905090565b60606000805b61010254811015611ca85760006101028281548110611c4657611c46615817565b60009182526020808320909101546001600160a01b03168083526101069091526040909120600881015491925090611c809060ff16613ac1565b15611c935783611c8f8161582d565b9450505b50508080611ca09061582d565b915050611c25565b5060008167ffffffffffffffff811115611cc457611cc4615214565b604051908082528060200260200182016040528015611d0a57816020015b604080518082019091526000815260606020820152815260200190600190039081611ce25790505b5090506000805b61010254811015611e655760006101028281548110611d3257611d32615817565b60009182526020808320909101546001600160a01b03168083526101069091526040909120600881015491925090611d6c9060ff16613ac1565b611d77575050611e53565b6040805180820190915260018201546001600160a01b03168152600382018054602083019190611da6906157dd565b80601f0160208091040260200160405190810160405280929190818152602001828054611dd2906157dd565b8015611e1f5780601f10611df457610100808354040283529160200191611e1f565b820191906000526020600020905b815481529060010190602001808311611e0257829003601f168201915b5050505050815250858580611e339061582d565b965081518110611e4557611e45615817565b602002602001018190525050505b80611e5d8161582d565b915050611d11565b50909392505050565b61010481815481106113e057600080fd5b60606101028054806020026020016040519081016040528092919081815260200182805480156109cf576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109b1575050505050905090565b6000836002811115611ef457611ef4615043565b03611fa65760fc54841015611f555760405162461bcd60e51b815260206004820152602160248201527f496e73756666696369656e7420636f6c6c61746572616c20666f7220564e4f446044820152604560f81b6064820152608401610a43565b61010280546001810182556000919091527f93bdaa6a4190909b7c3fbe8d42169ffe1cab19f51dfc8db24c71abf849eced4a0180546001600160a01b0319166001600160a01b03831617905561217a565b6001836002811115611fba57611fba615043565b0361206c5760fd5484101561201b5760405162461bcd60e51b815260206004820152602160248201527f496e73756666696369656e7420636f6c6c61746572616c20666f7220534e4f446044820152604560f81b6064820152608401610a43565b61010480546001810182556000919091527f4c0be60200faa20559308cb7b5a1bb3255c16cb1cab91f525b5ae7a03d02fabe0180546001600160a01b0319166001600160a01b03831617905561217a565b600283600281111561208057612080615043565b036121325760fe548410156120e15760405162461bcd60e51b815260206004820152602160248201527f496e73756666696369656e7420636f6c6c61746572616c20666f7220444e4f446044820152604560f81b6064820152608401610a43565b61010580546001810182556000919091527ffc62abc8c0fc47c2d92f5aec99bf8b60f375828e14394d89345cae11a98673710180546001600160a01b0319166001600160a01b03831617905561217a565b60405162461bcd60e51b815260206004820152601560248201527f756e737570706f72746564206e6f6465547970652000000000000000000000006044820152606401610a43565b6001600160a01b0380821660009081526101066020526040902080549091161561220c5760405162461bcd60e51b815260206004820152602560248201527f61206e6f64652077697468207075624b657920697320616c726561647920646560448201527f66696e65640000000000000000000000000000000000000000000000000000006064820152608401610a43565b841561231957610100546040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523360048201523060248201526000916001600160a01b03169063dd62ed3e90604401602060405180830381865afa15801561227b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061229f9190615779565b9050858110156123175760405162461bcd60e51b815260206004820152603260248201527f5f6e6f6465546f6b656e732063616e6e6f74206265207472616e73666572726560448201527f642c20636865636b20616c6c6f77616e636500000000000000000000000000006064820152608401610a43565b505b612321614db9565b3381526001600160a01b03831660208201526040810185600281111561234957612349615043565b9081600281111561235c5761235c615043565b90525060608101869052608081018490526001600160a01b0380841660009081526101066020908152604091829020845181549085166001600160a01b0319918216178255918501516001820180549190951692811683178555928501518594919390927fffffffffffffffffffffff00000000000000000000000000000000000000000090911617600160a01b8360028111156123fc576123fc615043565b0217905550606082015160028201556080820151600382019061241f908261588c565b5060a0820151805160048301805460208085015161ffff908116620100000263ffffffff1990931694169390931717815560408301518051919261246b92600587019290910190614e2d565b5060608201518051612487916002840191602090910190614ee5565b50608082015180516124a3916003840191602090910190614e2d565b50505060c082015160088201805460ff191660018360048111156124c9576124c9615043565b021790555050861590506125de57610100546040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018890526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015612548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256c9190615792565b6125de5760405162461bcd60e51b815260206004820152602560248201527f6661696c656420746f207472616e7366657220746f6b656e7320746f20636f6e60448201527f74726163740000000000000000000000000000000000000000000000000000006064820152608401610a43565b8561010760008282546125f1919061594c565b909155506000905085600281111561260b5761260b615043565b0361261d57612618613afb565b61271e565b600185600281111561263157612631615043565b0361271e57610101546001600160a01b031661268f5760405162461bcd60e51b815260206004820152601b60248201527f6e6f2073746f7261676520636f6e747261637420646566696e656400000000006044820152606401610a43565b610101546040517f9d95f1cc0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152909116908190639d95f1cc906024016020604051808303816000875af11580156126f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271b9190615970565b50505b826001600160a01b0316336001600160a01b03167f67bd55f864dcc77d483ff7567de0889142417ef6d0299753cfd80e4c72ddc5548789886040516127659392919061598b565b60405180910390a3505050505050565b3360009081526101066020526040902060018101546001600160a01b03166127df5760405162461bcd60e51b815260206004820152601060248201527f696e76616c6964207265706f72746572000000000000000000000000000000006044820152606401610a43565b600080835167ffffffffffffffff8111156127fc576127fc615214565b604051908082528060200260200182016040528015612825578160200160208202803683370190505b50905060005b84518110156129b457600073__$7aaf162b34d2533b02434bde51cad0c5c5$__6336de68108888858151811061286357612863615817565b60200260200101516040518363ffffffff1660e01b81526004016128889291906159b3565b602060405180830381865af41580156128a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c991906159d8565b6001600160a01b03808216600090815261010660205260409020600181015492935091166128f85750506129a2565b6000805b8681101561295157836001600160a01b031686828151811061292057612920615817565b60200260200101516001600160a01b03160361293f5760019150612951565b806129498161582d565b9150506128fc565b508015612960575050506129a2565b82858761296c8161582d565b98508151811061297e5761297e615817565b60200260200101906001600160a01b031690816001600160a01b0316815250505050505b806129ac8161582d565b91505061282b565b508351821015612a6a5760008267ffffffffffffffff8111156129d9576129d9615214565b604051908082528060200260200182016040528015612a02578160200160208202803683370190505b50905060005b83811015612a6657828181518110612a2257612a22615817565b6020026020010151828281518110612a3c57612a3c615817565b6001600160a01b039092166020928302919091019091015280612a5e8161582d565b915050612a08565b5090505b6000866002811115612a7e57612a7e615043565b03612c0957600080600087806020019051810190612a9c9190615a0c565b9194509250905060ff8316600114612af65760405162461bcd60e51b815260206004820152601c60248201527f7265706f727420616374696f6e206f6e6c7920737570706f72746564000000006044820152606401610a43565b6001600160a01b038082166000908152610106602052604090206001810154909116612b6f5760405162461bcd60e51b815260206004820152602260248201527f746172676574206e6f64652077616c6c657420646f6573206e6f742065786973604482015261747360f01b6064820152608401610a43565b60006001820154600160a01b900460ff166002811115612b9157612b91615043565b14612bde5760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220564e6f646573000000000000000000006044820152606401610a43565b612bff8460ff166002811115612bf657612bf6615043565b88878487613c61565b5050505050612da2565b6001866002811115612c1d57612c1d615043565b03612da25760008060008088806020019051810190612c3c9190615a53565b9296509094509250905060ff8416600214612c995760405162461bcd60e51b815260206004820152601c60248201527f7265706f727420616374696f6e206f6e6c7920737570706f72746564000000006044820152606401610a43565b6001600160a01b038083166000908152610106602052604090206001810154909116612d125760405162461bcd60e51b815260206004820152602260248201527f746172676574206e6f64652077616c6c657420646f6573206e6f742065786973604482015261747360f01b6064820152608401610a43565b600180820154600160a01b900460ff166002811115612d3357612d33615043565b14612d805760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220534e6f646573000000000000000000006044820152606401610a43565b611b118560ff166002811115612d9857612d98615043565b8988848887613e09565b505050505050565b612db26137c6565b6101025461ffff82161115612e095760405162461bcd60e51b815260206004820152601c60248201527f696e636f72726563742076616c506572426c6f636b5461726765745f000000006044820152606401610a43565b60ff805471ffff000000000000000000000000000000001916600160801b61ffff848116918202929092179283905560408051600160701b909404909216835260208301527f81512b84dc2b38f82b4999b5512a14df033b165371fa51776cce559212bf0a44910160405180910390a150565b61010281815481106113e057600080fd5b6000612e976137c6565b60008211612ee75760405162461bcd60e51b815260206004820152601960248201527f616d6f756e742073686f756c6420626520706f736974697665000000000000006044820152606401610a43565b826001600160a01b0316846001600160a01b031603612f6e5760405162461bcd60e51b815260206004820152602660248201527f63616e6e6f74207472616e73666572206265747765656e2073616d652061646460448201527f72657373657300000000000000000000000000000000000000000000000000006064820152608401610a43565b6001600160a01b03831615801590612f8d57506001600160a01b038416155b156130b45781610108541015612ff55760405162461bcd60e51b815260206004820152602760248201527f66726f6d206e6f64652073686f756c64206861766520656e6f75676820636f6c6044820152661b185d195c985b60ca1b6064820152608401610a43565b6001600160a01b0380841660009081526101066020526040902080549091166130605760405162461bcd60e51b815260206004820152600f60248201527f6d697373696e6720746f206e6f646500000000000000000000000000000000006044820152606401610a43565b82610108600082825461307391906157ca565b9250508190555082610107600082825461308d919061594c565b92505081905550828160020160008282546130a8919061594c565b90915550613360915050565b6001600160a01b038416158015906130d357506001600160a01b038316155b156131ef576001600160a01b0380851660009081526101066020526040902080549091166131435760405162461bcd60e51b815260206004820152601160248201527f6d697373696e672066726f6d206e6f64650000000000000000000000000000006044820152606401610a43565b82816002015410156131a75760405162461bcd60e51b815260206004820152602760248201527f66726f6d206e6f64652073686f756c64206861766520656e6f75676820636f6c6044820152661b185d195c985b60ca1b6064820152608401610a43565b828160020160008282546131bb91906157ca565b925050819055508261010760008282546131d591906157ca565b925050819055508261010860008282546130a8919061594c565b6001600160a01b03808516600090815261010660205260409020805490911661325a5760405162461bcd60e51b815260206004820152601160248201527f6d697373696e672066726f6d206e6f64650000000000000000000000000000006044820152606401610a43565b82816002015410156132be5760405162461bcd60e51b815260206004820152602760248201527f66726f6d206e6f64652073686f756c64206861766520656e6f75676820636f6c6044820152661b185d195c985b60ca1b6064820152608401610a43565b6001600160a01b0380851660009081526101066020526040902082549091166133295760405162461bcd60e51b815260206004820152600f60248201527f6d697373696e6720746f206e6f646500000000000000000000000000000000006044820152606401610a43565b8382600201600082825461333d91906157ca565b9250508190555083816002016000828254613358919061594c565b909155505050505b5060019392505050565b6133726137c6565b61010180546001600160a01b0319166001600160a01b0392909216919091179055565b61339d6137c6565b6101025461ffff8316106133b057600080fd5b6101025461ffff8216106133c357600080fd5b60ff80547fffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffff16600160901b61ffff8581169182027fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1692909217600160a01b928516928302179092556040805192835260208301919091527fcd481667fa77e513c517493174075f0471ec1fe24d57af644377cd1a2572d13d910160405180910390a15050565b6134726137c6565b606580546001600160a01b0383166001600160a01b031990911681179091556134a36033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600281015461010054825460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810184905260009392919091169063a9059cbb906044016020604051808303816000875af115801561353b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061355f9190615792565b6135d15760405162461bcd60e51b815260206004820152602560248201527f6661696c656420746f20747261736665722066756e6473206261636b20746f2060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610a43565b600083600201819055508061010760008282546135ee91906157ca565b92505081905550806101086000828254613608919061594c565b90915550600090506001840154600160a01b900460ff16600281111561363057613630615043565b0361367a57613643600584016000614f3a565b613651600684016000614f5f565b600183015461366c90610102906001600160a01b0316613fb5565b50613675613afb565b610da9565b600180840154600160a01b900460ff16600281111561369b5761369b615043565b03610da957610101546001600160a01b03166136f95760405162461bcd60e51b815260206004820152601b60248201527f6e6f2073746f7261676520636f6e747261637420646566696e656400000000006044820152606401610a43565b6101015460018401546040517fb2b99ec90000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690819063b2b99ec990602401600060405180830381600087803b15801561376057600080fd5b505af1158015613774573d6000803e3d6000fd5b5061378792505050600585016000614f3a565b613795600685016000614f5f565b6137a3600785016000614f3a565b60018401546137be90610104906001600160a01b0316613fb5565b505092915050565b6033546001600160a01b03163314611b315760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a43565b610f276137c6565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156138605761385b836140e1565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156138ba575060408051601f3d908101601f191682019092526138b791810190615779565b60015b61392c5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610a43565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146139c15760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610a43565b5061385b83838361419f565b600054610100900460ff16611b315760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610a43565b600054610100900460ff16613aa35760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610a43565b611b31335b606580546001600160a01b0319169055610f27816141ca565b60006004826004811115613ad757613ad7615043565b1480613af457506003826004811115613af257613af2615043565b145b1592915050565b6000805b61010254811015613b825760006101028281548110613b2057613b20615817565b60009182526020808320909101546001600160a01b03168083526101069091526040909120600881015491925090613b5a9060ff16613ac1565b15613b6d5783613b6981615aa9565b9450505b50508080613b7a9061582d565b915050613aff565b50610103805461ffff191661ffff83811691821790925560ff548392600160801b9091041690811015613bb3578091505b60ff5461ffff808316600160701b909204161115613bd057600080fd5b60ff5461ffff838116600160701b909204161461385b5760ff80547fffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffff16600160701b61ffff858116918202929092179092556040805192835290831660208301527f81512b84dc2b38f82b4999b5512a14df033b165371fa51776cce559212bf0a44910160405180910390a1505050565b6000806001840154600160a01b900460ff166002811115613c8457613c84615043565b14613cd15760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220564e6f646573000000000000000000006044820152606401610a43565b60ff54606490613cef9061ffff80821691600160701b900416615aca565b613cf99190615afe565b61ffff1684511015613d4d5760405162461bcd60e51b815260206004820152601460248201527f73696720636f756e7420697320746f6f206c6f770000000000000000000000006044820152606401610a43565b600883015460ff166004816004811115613d6957613d69615043565b1480613d8657506003816004811115613d8457613d84615043565b145b15613d95576000915050613e00565b613da48787868887600061421c565b60ff54600485015461ffff620100009092048216911610613dc957613dc98685614892565b60ff5460048501546801000000000000000090910461ffff908116620100009092041610613dfa57613dfa84614af0565b60009150505b95945050505050565b6000600180850154600160a01b900460ff166002811115613e2c57613e2c615043565b14613e795760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220534e6f646573000000000000000000006044820152606401610a43565b60ff54606490613e979061ffff80821691600160701b900416615aca565b613ea19190615afe565b61ffff1685511015613ef55760405162461bcd60e51b815260206004820152601460248201527f73696720636f756e7420697320746f6f206c6f770000000000000000000000006044820152606401610a43565b600884015460ff166004816004811115613f1157613f11615043565b1480613f2e57506003816004811115613f2c57613f2c615043565b145b15613f3d576000915050613fab565b613f4b88888789888861421c565b60ff54600486015461ffff6401000000009092048216911610613f7257613f728786614892565b60ff5460048601546a010000000000000000000090910461ffff908116620100009092041610613fa557613fa585614af0565b60009150505b9695505050505050565b8154600090815b818110156140d657836001600160a01b0316858281548110613fe057613fe0615817565b6000918252602090912001546001600160a01b0316036140c4576140056001836157ca565b811461408657846140176001846157ca565b8154811061402757614027615817565b9060005260206000200160009054906101000a90046001600160a01b031685828154811061405757614057615817565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b8480548061409657614096615b1f565b600082815260209020810160001990810180546001600160a01b03191690550190555060019150610da99050565b806140ce8161582d565b915050613fbc565b506000949350505050565b6001600160a01b0381163b61415e5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610a43565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6141a883614b97565b6000825111806141b55750805b1561385b576141c48383614bd7565b50505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000846004016001018054806020026020016040519081016040528092919081815260200182805480156142a157602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f0104928301926001038202915080841161425e5790505b505083519394506000925050505b81811015614343578281815181106142c9576142c9615817565b60200260200101516001600160801b0316856001600160801b0316036143315760405162461bcd60e51b815260206004820152601060248201527f626c6f636b206973206e6f74206e6577000000000000000000000000000000006044820152606401610a43565b8061433b8161582d565b9150506142af565b50600180870154600160a01b900460ff16600281111561436557614365615043565b0361453057826001600160801b03166000036143c35760405162461bcd60e51b815260206004820152601760248201527f73746f72616765206b65792069732072657175697265640000000000000000006044820152606401610a43565b60008660040160030180548060200260200160405190810160405280929190818152602001828054801561444857602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116144055790505b505083519394506000925050505b818110156144ea5782818151811061447057614470615817565b60200260200101516001600160801b0316866001600160801b0316036144d85760405162461bcd60e51b815260206004820152601660248201527f73746f72616765206b6579206973206e6f74206e6577000000000000000000006044820152606401610a43565b806144e28161582d565b915050614456565b505050600786018054600180820183556000928352602090922060028204018054929091166010026101000a6001600160801b0381810219909316928616029190911790555b60048601805461ffff1690600061454683615aa9565b825461010092830a61ffff818102199092169290911602179091556005880180546001818101835560009283526020808420600284040180549390921660100290940a6001600160801b0381810219909316928a1602919091179055600689018054604080518286028101860190915281815292945091929091908301828280156145fa57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116145dc575b505083519394506000925050505b87518110156146fe5760005b828110156146eb5783818151811061462e5761462e615817565b60200260200101516001600160a01b031689838151811061465157614651615817565b60200260200101516001600160a01b031614801561469b575060006001600160a01b031689838151811061468757614687615817565b60200260200101516001600160a01b031614155b156146d95760008983815181106146b4576146b4615817565b60200260200101906001600160a01b031690816001600160a01b0316815250506146eb565b806146e38161582d565b915050614614565b50806146f68161582d565b915050614608565b5060005b87518110156147ab57600088828151811061471f5761471f615817565b6020026020010151905060006001600160a01b0316816001600160a01b031614614798578960040160020189838151811061475c5761475c615817565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790555b50806147a38161582d565b915050614702565b506000600889015460ff1660048111156147c7576147c7615043565b036147dc5760088801805460ff191660011790555b600180890154908a01546040517f19d5f3972073c7002111a82b2a44db11e739567a002445f2e3db8ab96fe6645f92614827926001600160a01b03918216929116908b908f90615b35565b60405180910390a16001880154600889015460028a01546040516001600160a01b03909316927ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e9261487e9260ff9091169161575e565b60405180910390a250505050505050505050565b60ff5460009081906148b39084906601000000000000900461ffff16614c03565b600685018054604080516020808402820181019092528281529496509294506000939283018282801561490f57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116148f1575b5050505050905060008083118015614928575060008251115b156149d25781516149399084615b7b565b905060005b82518110156149d0576000610106600085848151811061496057614960615817565b6020908102919091018101516001600160a01b0390811683529082019290925260400160002080549092501661499657506149be565b828160020160008282546149aa919061594c565b909155506149ba905083866157ca565b9450505b806149c88161582d565b91505061493e565b505b828660020160008282546149e6919061594c565b909155506149fa9050600686016000614f5f565b6000600886015460ff166004811115614a1557614a15615043565b1480614a3957506001600886015460ff166004811115614a3757614a37615043565b145b15614a4e5760088501805460ff191660021790555b60048501805461ffff191680825562010000900461ffff16906002614a7283615aa9565b91906101000a81548161ffff021916908361ffff160217905550508460010160009054906101000a90046001600160a01b03166001600160a01b03167ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e600286604051614ae092919061575e565b60405180910390a2505050505050565b60ff546000908190614b179084906c01000000000000000000000000900461ffff16614c03565b9092509050614b25836134db565b5060048301805463ffff00001916905560088301805460ff1916600390811790915560018401546040516001600160a01b03909116917ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e91614b8a919060009061575e565b60405180910390a2505050565b614ba0816140e1565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060614bfc8383604051806060016040528060278152602001615be760279139614ca5565b9392505050565b60008060648363ffffffff161115614c5d5760405162461bcd60e51b815260206004820181905260248201527f70657263656e746167652073686f756c6420626520696e205b302c203130305d6044820152606401610a43565b60028401546064614c6e8582615b8f565b614c7e9063ffffffff1683615bb3565b614c889190615b7b565b9250614c9483826157ca565b600286018490559150509250929050565b6060600080856001600160a01b031685604051614cc29190615bca565b600060405180830381855af49150503d8060008114614cfd576040519150601f19603f3d011682016040523d82523d6000602084013e614d02565b606091505b5091509150613fab8683838760608315614d7d578251600003614d76576001600160a01b0385163b614d765760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a43565b5081614d87565b614d878383614d8f565b949350505050565b815115614d9f5781518083602001fd5b8060405162461bcd60e51b8152600401610a43919061574b565b6040805160e081018252600080825260208201819052909182019081526020016000815260200160608152602001614e216040518060a00160405280600061ffff168152602001600061ffff1681526020016060815260200160608152602001606081525090565b81526020016000905290565b82805482825590600052602060002090600101600290048101928215614ed55791602002820160005b83821115614ea057835183826101000a8154816001600160801b0302191690836001600160801b031602179055509260200192601001602081600f01049283019260010302614e56565b8015614ed35782816101000a8154906001600160801b030219169055601001602081600f01049283019260010302614ea0565b505b50614ee1929150614f79565b5090565b828054828255906000526020600020908101928215614ed5579160200282015b82811115614ed557825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614f05565b508054600082556001016002900490600052602060002090810190610f279190614f79565b5080546000825590600052602060002090810190610f2791905b5b80821115614ee15760008155600101614f7a565b600081518084526020808501945080840160005b83811015614fc75781516001600160a01b031687529582019590820190600101614fa2565b509495945050505050565b602081526000614bfc6020830184614f8e565b6001600160a01b0381168114610f2757600080fd5b60006020828403121561500c57600080fd5b8135614bfc81614fe5565b6000806040838503121561502a57600080fd5b823561503581614fe5565b946020939093013593505050565b634e487b7160e01b600052602160045260246000fd5b60038110610f2757610f27615043565b60005b8381101561508457818101518382015260200161506c565b50506000910152565b600081518084526150a5816020860160208601615069565b601f01601f19169290920160200192915050565b600081518084526020808501945080840160005b83811015614fc75781516001600160801b0316875295820195908201906001016150cd565b600061ffff8083511684526020818185015116818601526040840151915060a0604086015261512460a08601836150b9565b60608581015187830391880191909152805180835290830193506000918301905b8083101561516e5784516001600160a01b03168252938301936001929092019190830190615145565b5060808601519350868103608088015261518881856150b9565b979650505050505050565b600581106151a3576151a3615043565b9052565b6001600160a01b0388811682528716602082015260006151c687615059565b86604083015285606083015260e060808301526151e660e083018661508d565b82810360a08401526151f881866150f2565b91505061520860c0830184615193565b98975050505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561525357615253615214565b604052919050565b600067ffffffffffffffff83111561527557615275615214565b615288601f8401601f191660200161522a565b905082815283838301111561529c57600080fd5b828260208301376000602084830101529392505050565b600082601f8301126152c457600080fd5b614bfc8383356020850161525b565b600080604083850312156152e657600080fd5b82356152f181614fe5565b9150602083013567ffffffffffffffff81111561530d57600080fd5b615319858286016152b3565b9150509250929050565b60006020828403121561533557600080fd5b5035919050565b6020815260006001600160a01b0380845116602084015280602085015116604084015250604083015161536e81615059565b8060608401525060608301516080830152608083015160e060a084015261539961010084018261508d565b905060a0840151601f198483030160c08501526153b682826150f2565b91505060c08401516153cb60e0850182615193565b509392505050565b803561ffff811681146153e557600080fd5b919050565b60008060008060008060008060008060006101608c8e03121561540c57600080fd5b6154158c6153d3565b9a5060208c013561542581614fe5565b995061543360408d016153d3565b985061544160608d016153d3565b975061544f60808d016153d3565b965061545d60a08d016153d3565b955061546b60c08d016153d3565b945061547960e08d016153d3565b93506154886101008d016153d3565b92506154976101208d016153d3565b91506154a66101408d016153d3565b90509295989b509295989b9093969950565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101561552757888303603f19018552815180516001600160a01b031684528701518784018790526155148785018261508d565b95880195935050908601906001016154df565b509098975050505050505050565b8035600381106153e557600080fd5b6000806000806080858703121561555a57600080fd5b8435935061556a60208601615535565b9250604085013567ffffffffffffffff81111561558657600080fd5b8501601f8101871361559757600080fd5b6155a68782356020840161525b565b92505060608501356155b781614fe5565b939692955090935050565b6000806000606084860312156155d757600080fd5b6155e084615535565b925060208085013567ffffffffffffffff808211156155fe57600080fd5b61560a888389016152b3565b9450604087013591508082111561562057600080fd5b818701915087601f83011261563457600080fd5b81358181111561564657615646615214565b8060051b61565585820161522a565b918252838101850191858101908b84111561566f57600080fd5b86860192505b838310156156ab5782358581111561568d5760008081fd5b61569b8d89838a01016152b3565b8352509186019190860190615675565b809750505050505050509250925092565b6000602082840312156156ce57600080fd5b614bfc826153d3565b6000806000606084860312156156ec57600080fd5b83356156f781614fe5565b9250602084013561570781614fe5565b929592945050506040919091013590565b6000806040838503121561572b57600080fd5b615734836153d3565b9150615742602084016153d3565b90509250929050565b602081526000614bfc602083018461508d565b6040810161576c8285615193565b8260208301529392505050565b60006020828403121561578b57600080fd5b5051919050565b6000602082840312156157a457600080fd5b81518015158114614bfc57600080fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610da957610da96157b4565b600181811c908216806157f157607f821691505b60208210810361581157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b60006001820161583f5761583f6157b4565b5060010190565b601f82111561385b57600081815260208120601f850160051c8101602086101561586d5750805b601f850160051c820191505b81811015612da257828155600101615879565b815167ffffffffffffffff8111156158a6576158a6615214565b6158ba816158b484546157dd565b84615846565b602080601f8311600181146158ef57600084156158d75750858301515b600019600386901b1c1916600185901b178555612da2565b600085815260208120601f198616915b8281101561591e578886015182559484019460019091019084016158ff565b508582101561593c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610da957610da96157b4565b805160ff811681146153e557600080fd5b60006020828403121561598257600080fd5b614bfc8261595f565b61599484615059565b838152826020820152606060408201526000613e00606083018461508d565b6040815260006159c6604083018561508d565b8281036020840152613e00818561508d565b6000602082840312156159ea57600080fd5b8151614bfc81614fe5565b80516001600160801b03811681146153e557600080fd5b600080600060608486031215615a2157600080fd5b615a2a8461595f565b9250615a38602085016159f5565b91506040840151615a4881614fe5565b809150509250925092565b60008060008060808587031215615a6957600080fd5b615a728561595f565b9350615a80602086016159f5565b92506040850151615a9081614fe5565b9150615a9e606086016159f5565b905092959194509250565b600061ffff808316818103615ac057615ac06157b4565b6001019392505050565b61ffff8181168382160280821691908281146137be576137be6157b4565b634e487b7160e01b600052601260045260246000fd5b600061ffff80841680615b1357615b13615ae8565b92169190910492915050565b634e487b7160e01b600052603160045260246000fd5b60006001600160a01b03808716835280861660208401525060806040830152615b616080830185614f8e565b9050615b6c83615059565b82606083015295945050505050565b600082615b8a57615b8a615ae8565b500490565b63ffffffff828116828216039080821115615bac57615bac6157b4565b5092915050565b8082028115828204841417610da957610da96157b4565b60008251615bdc818460208701615069565b919091019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122019aa0081e69056404e40023f916698c2b116cb83388048dea2cf1b230e45ab7b64736f6c63430008110033", + "deployedBytecode": "0x60806040526004361061031e5760003560e01c80637f6e29de116101a5578063bdb860ea116100ec578063e67a5d7811610095578063f6e8913d1161006f578063f6e8913d146108b2578063f7714eb9146108d7578063fdd9344c146108fe578063ffa1ad741461092057600080fd5b8063e67a5d781461085c578063f108f5b61461087c578063f2fde38b1461089257600080fd5b8063dc38b0a2116100c6578063dc38b0a214610808578063dd6f8f9014610828578063e30c39781461083e57600080fd5b8063bdb860ea146107b2578063c993d861146107c8578063ce3e7e91146107e857600080fd5b8063931127a01161014e578063adf1daa611610128578063adf1daa614610750578063b10064eb14610772578063b27b154d1461079257600080fd5b8063931127a0146106fa578063974c5b411461071b5780639c30db5c1461073057600080fd5b806384f21a441161017f57806384f21a441461069a5780638b8f631f146106bc5780638da5cb5b146106dc57600080fd5b80637f6e29de14610658578063817b1cd21461066e57806381ebc5061461068557600080fd5b80633659cfe61161026957806365cdbaea11610212578063715018a6116101ec578063715018a61461061357806379ba5097146106285780637c4981c81461063d57600080fd5b806365cdbaea146105ae5780636dcd3af2146105d75780636ddf344a146105f757600080fd5b806352d1902d1161024357806352d1902d1461054c578063569c876214610561578063582115fb1461058157600080fd5b80633659cfe6146104e65780633a688a2f146105065780634f1ef2861461053957600080fd5b80631acf7629116102cb57806324212b86116102a557806324212b86146104855780632ae9c6001461049b578063339f334b146104b657600080fd5b80631acf76291461041657806323b8ac5d1461043857806323deecfe1461046357600080fd5b8063125c6c98116102fc578063125c6c98146103b957806313114a9d146103dd57806315aa7b06146103f457600080fd5b8063011f59a014610323578063024f38cb1461035d57806311ce026714610380575b600080fd5b34801561032f57600080fd5b5060ff5461034590600160701b900461ffff1681565b60405161ffff90911681526020015b60405180910390f35b34801561036957600080fd5b5060ff5461034590640100000000900461ffff1681565b34801561038c57600080fd5b50610101546103a1906001600160a01b031681565b6040516001600160a01b039091168152602001610354565b3480156103c557600080fd5b506103cf60fc5481565b604051908152602001610354565b3480156103e957600080fd5b506103cf6101085481565b34801561040057600080fd5b50610409610976565b6040516103549190614fd2565b34801561042257600080fd5b50610436610431366004614ffa565b6109d9565b005b34801561044457600080fd5b5060ff54610345906c01000000000000000000000000900461ffff1681565b34801561046f57600080fd5b5060ff5461034590600160801b900461ffff1681565b34801561049157600080fd5b506103cf60fe5481565b3480156104a757600080fd5b5060fb546103459061ffff1681565b3480156104c257600080fd5b506104d66104d1366004615017565b610b34565b6040519015158152602001610354565b3480156104f257600080fd5b50610436610501366004614ffa565b610daf565b34801561051257600080fd5b50610526610521366004614ffa565b610f2a565b60405161035497969594939291906151a7565b6104366105473660046152d3565b61119e565b34801561055857600080fd5b506103cf61130a565b34801561056d57600080fd5b506103a161057c366004615323565b6113cf565b34801561058d57600080fd5b506105a161059c366004614ffa565b6113fa565b604051610354919061533c565b3480156105ba57600080fd5b5060ff54610345906a0100000000000000000000900461ffff1681565b3480156105e357600080fd5b506104366105f23660046153ea565b6116eb565b34801561060357600080fd5b50610103546103459061ffff1681565b34801561061f57600080fd5b50610436611b1f565b34801561063457600080fd5b50610436611b33565b34801561064957600080fd5b5060ff546103459061ffff1681565b34801561066457600080fd5b50610105546103cf565b34801561067a57600080fd5b506103cf6101075481565b34801561069157600080fd5b50610409611bbe565b3480156106a657600080fd5b506106af611c1f565b60405161035491906154b8565b3480156106c857600080fd5b506103a16106d7366004615323565b611e6e565b3480156106e857600080fd5b506033546001600160a01b03166103a1565b34801561070657600080fd5b5060ff546103459062010000900461ffff1681565b34801561072757600080fd5b50610409611e7f565b34801561073c57600080fd5b5061043661074b366004615544565b611ee0565b34801561075c57600080fd5b5060ff5461034590600160901b900461ffff1681565b34801561077e57600080fd5b5061043661078d3660046155c2565b612775565b34801561079e57600080fd5b506104366107ad3660046156bc565b612daa565b3480156107be57600080fd5b50610104546103cf565b3480156107d457600080fd5b506103a16107e3366004615323565b612e7c565b3480156107f457600080fd5b506104d66108033660046156d7565b612e8d565b34801561081457600080fd5b50610436610823366004614ffa565b61336a565b34801561083457600080fd5b506103cf60fd5481565b34801561084a57600080fd5b506065546001600160a01b03166103a1565b34801561086857600080fd5b50610436610877366004615718565b613395565b34801561088857600080fd5b50610102546103cf565b34801561089e57600080fd5b506104366108ad366004614ffa565b61346a565b3480156108be57600080fd5b5060ff54610345906601000000000000900461ffff1681565b3480156108e357600080fd5b5060ff546103459068010000000000000000900461ffff1681565b34801561090a57600080fd5b5060ff5461034590600160a01b900461ffff1681565b34801561092c57600080fd5b506109696040518060400160405280600581526020017f302e302e3200000000000000000000000000000000000000000000000000000081525081565b604051610354919061574b565b60606101058054806020026020016040519081016040528092919081815260200182805480156109cf57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109b1575b5050505050905090565b6001600160a01b038082166000908152610106602052604090206001810154909116610a4c5760405162461bcd60e51b815260206004820152601460248201527f6e6f646520646f6573206e6f742065786973747300000000000000000000000060448201526064015b60405180910390fd5b80546001600160a01b0316331480610a7d575033610a726033546001600160a01b031690565b6001600160a01b0316145b610ac95760405162461bcd60e51b815260206004820152601d60248201527f6f6e6c79206f776e65722063616e20756e7374616b652061206e6f64650000006044820152606401610a43565b610ad2816134db565b5060088101805460ff1916600490811790915560018201546040516001600160a01b03909116917ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e91610b28919060009061575e565b60405180910390a25050565b6000610b3e6137c6565b6001600160a01b038316610b945760405162461bcd60e51b815260206004820152601260248201527f696e76616c696420746f206164647265737300000000000000000000000000006044820152606401610a43565b60008211610be45760405162461bcd60e51b815260206004820152600e60248201527f696e76616c696420616d6f756e740000000000000000000000000000000000006044820152606401610a43565b610108548211158015610c7c5750610100546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610c54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c789190615779565b8211155b610cc85760405162461bcd60e51b815260206004820152601460248201527f696e73756666696369656e742062616c616e63650000000000000000000000006044820152606401610a43565b6101005460405163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529091169063a9059cbb906044016020604051808303816000875af1158015610d1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d409190615792565b610d8c5760405162461bcd60e51b815260206004820152601260248201527f6661696c656420746f207472616e7366657200000000000000000000000000006044820152606401610a43565b816101086000828254610d9f91906157ca565b9091555060019150505b92915050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610e3c5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610a43565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610e977f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610f025760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610a43565b610f0b81613820565b60408051600080825260208201909252610f2791839190613828565b50565b6101066020526000908152604090208054600182015460028301546003840180546001600160a01b039485169594841694600160a01b90940460ff16939190610f72906157dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9e906157dd565b8015610feb5780601f10610fc057610100808354040283529160200191610feb565b820191906000526020600020905b815481529060010190602001808311610fce57829003601f168201915b50506040805160a08101825260048701805461ffff808216845262010000909104166020808401919091526005890180548551818402810184018752818152999a99949850929650938701945091929183018282801561109c57602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116110595790505b50505050508152602001600282018054806020026020016040519081016040528092919081815260200182805480156110fe57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116110e0575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561118857602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116111455790505b5050509190925250505060089091015460ff1687565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361122b5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610a43565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166112867f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b0316146112f15760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610a43565b6112fa82613820565b61130682826001613828565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113aa5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610a43565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b61010581815481106113e057600080fd5b6000918252602090912001546001600160a01b0316905081565b611402614db9565b6001600160a01b0382811660009081526101066020908152604091829020825160e08101845281548516815260018201549485169281019290925290929091830190600160a01b900460ff16600281111561145f5761145f615043565b600281111561147057611470615043565b81526020016002820154815260200160038201805461148e906157dd565b80601f01602080910402602001604051908101604052809291908181526020018280546114ba906157dd565b80156115075780601f106114dc57610100808354040283529160200191611507565b820191906000526020600020905b8154815290600101906020018083116114ea57829003601f168201915b50505091835250506040805160a08101825260048401805461ffff808216845262010000909104166020838101919091526005860180548551818402810184018752818152968301969495939493860193928301828280156115ba57602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116115775790505b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561161c57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116115fe575b50505050508152602001600382018054806020026020016040519081016040528092919081815260200182805480156116a657602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116116635790505b505050919092525050508152600882015460209091019060ff1660048111156116d1576116d1615043565b60048111156116e2576116e2615043565b90525092915050565b600054610100900460ff161580801561170b5750600054600160ff909116105b806117255750303b158015611725575060005460ff166001145b6117975760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a43565b6000805460ff1916600117905580156117ba576000805461ff0019166101001790555b6117c26139cd565b6117ca613a38565b60fb805461ffff191661ffff8e161790556001600160a01b038b166117ee57600080fd5b61010080546001600160a01b0319166001600160a01b038d1617905561ffff8a1661185b5760405162461bcd60e51b815260206004820152601860248201527f696e76616c69642061747465737465727320616d6f756e7400000000000000006044820152606401610a43565b60ff805461ffff808d16600160801b0271ffff00000000000000000000000000000000199092169190911790915589166118fd5760405162461bcd60e51b815260206004820152602160248201527f696e76616c6964206e6f646552616e646f6d4d696e436f756e7420616d6f756e60448201527f74000000000000000000000000000000000000000000000000000000000000006064820152608401610a43565b60ff805461ffff808c16600160901b027fffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffff9092169190911790915588166119ac5760405162461bcd60e51b815260206004820152602c60248201527f696e76616c6964206e6f646552616e646f6d46696c74657250696e677352657160448201527f756972656420616d6f756e7400000000000000000000000000000000000000006064820152608401610a43565b8760ff60146101000a81548161ffff021916908361ffff160217905550606460fc81905550606460fd81905550606460fe819055508660ff60026101000a81548161ffff021916908361ffff1602179055508560ff60046101000a81548161ffff021916908361ffff1602179055508260ff60066101000a81548161ffff021916908361ffff1602179055508460ff60086101000a81548161ffff021916908361ffff1602179055508360ff600a6101000a81548161ffff021916908361ffff1602179055508160ff600c6101000a81548161ffff021916908361ffff160217905550604260ff60006101000a81548161ffff021916908361ffff160217905550600060ff600e6101000a81548161ffff021916908361ffff1602179055508015611b11576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050505050565b611b276137c6565b611b316000613aa8565b565b60655433906001600160a01b03168114611bb55760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610a43565b610f2781613aa8565b60606101048054806020026020016040519081016040528092919081815260200182805480156109cf576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109b1575050505050905090565b60606000805b61010254811015611ca85760006101028281548110611c4657611c46615817565b60009182526020808320909101546001600160a01b03168083526101069091526040909120600881015491925090611c809060ff16613ac1565b15611c935783611c8f8161582d565b9450505b50508080611ca09061582d565b915050611c25565b5060008167ffffffffffffffff811115611cc457611cc4615214565b604051908082528060200260200182016040528015611d0a57816020015b604080518082019091526000815260606020820152815260200190600190039081611ce25790505b5090506000805b61010254811015611e655760006101028281548110611d3257611d32615817565b60009182526020808320909101546001600160a01b03168083526101069091526040909120600881015491925090611d6c9060ff16613ac1565b611d77575050611e53565b6040805180820190915260018201546001600160a01b03168152600382018054602083019190611da6906157dd565b80601f0160208091040260200160405190810160405280929190818152602001828054611dd2906157dd565b8015611e1f5780601f10611df457610100808354040283529160200191611e1f565b820191906000526020600020905b815481529060010190602001808311611e0257829003601f168201915b5050505050815250858580611e339061582d565b965081518110611e4557611e45615817565b602002602001018190525050505b80611e5d8161582d565b915050611d11565b50909392505050565b61010481815481106113e057600080fd5b60606101028054806020026020016040519081016040528092919081815260200182805480156109cf576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109b1575050505050905090565b6000836002811115611ef457611ef4615043565b03611fa65760fc54841015611f555760405162461bcd60e51b815260206004820152602160248201527f496e73756666696369656e7420636f6c6c61746572616c20666f7220564e4f446044820152604560f81b6064820152608401610a43565b61010280546001810182556000919091527f93bdaa6a4190909b7c3fbe8d42169ffe1cab19f51dfc8db24c71abf849eced4a0180546001600160a01b0319166001600160a01b03831617905561217a565b6001836002811115611fba57611fba615043565b0361206c5760fd5484101561201b5760405162461bcd60e51b815260206004820152602160248201527f496e73756666696369656e7420636f6c6c61746572616c20666f7220534e4f446044820152604560f81b6064820152608401610a43565b61010480546001810182556000919091527f4c0be60200faa20559308cb7b5a1bb3255c16cb1cab91f525b5ae7a03d02fabe0180546001600160a01b0319166001600160a01b03831617905561217a565b600283600281111561208057612080615043565b036121325760fe548410156120e15760405162461bcd60e51b815260206004820152602160248201527f496e73756666696369656e7420636f6c6c61746572616c20666f7220444e4f446044820152604560f81b6064820152608401610a43565b61010580546001810182556000919091527ffc62abc8c0fc47c2d92f5aec99bf8b60f375828e14394d89345cae11a98673710180546001600160a01b0319166001600160a01b03831617905561217a565b60405162461bcd60e51b815260206004820152601560248201527f756e737570706f72746564206e6f6465547970652000000000000000000000006044820152606401610a43565b6001600160a01b0380821660009081526101066020526040902080549091161561220c5760405162461bcd60e51b815260206004820152602560248201527f61206e6f64652077697468207075624b657920697320616c726561647920646560448201527f66696e65640000000000000000000000000000000000000000000000000000006064820152608401610a43565b841561231957610100546040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523360048201523060248201526000916001600160a01b03169063dd62ed3e90604401602060405180830381865afa15801561227b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061229f9190615779565b9050858110156123175760405162461bcd60e51b815260206004820152603260248201527f5f6e6f6465546f6b656e732063616e6e6f74206265207472616e73666572726560448201527f642c20636865636b20616c6c6f77616e636500000000000000000000000000006064820152608401610a43565b505b612321614db9565b3381526001600160a01b03831660208201526040810185600281111561234957612349615043565b9081600281111561235c5761235c615043565b90525060608101869052608081018490526001600160a01b0380841660009081526101066020908152604091829020845181549085166001600160a01b0319918216178255918501516001820180549190951692811683178555928501518594919390927fffffffffffffffffffffff00000000000000000000000000000000000000000090911617600160a01b8360028111156123fc576123fc615043565b0217905550606082015160028201556080820151600382019061241f908261588c565b5060a0820151805160048301805460208085015161ffff908116620100000263ffffffff1990931694169390931717815560408301518051919261246b92600587019290910190614e2d565b5060608201518051612487916002840191602090910190614ee5565b50608082015180516124a3916003840191602090910190614e2d565b50505060c082015160088201805460ff191660018360048111156124c9576124c9615043565b021790555050861590506125de57610100546040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018890526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015612548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256c9190615792565b6125de5760405162461bcd60e51b815260206004820152602560248201527f6661696c656420746f207472616e7366657220746f6b656e7320746f20636f6e60448201527f74726163740000000000000000000000000000000000000000000000000000006064820152608401610a43565b8561010760008282546125f1919061594c565b909155506000905085600281111561260b5761260b615043565b0361261d57612618613afb565b61271e565b600185600281111561263157612631615043565b0361271e57610101546001600160a01b031661268f5760405162461bcd60e51b815260206004820152601b60248201527f6e6f2073746f7261676520636f6e747261637420646566696e656400000000006044820152606401610a43565b610101546040517f9d95f1cc0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152909116908190639d95f1cc906024016020604051808303816000875af11580156126f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271b9190615970565b50505b826001600160a01b0316336001600160a01b03167f67bd55f864dcc77d483ff7567de0889142417ef6d0299753cfd80e4c72ddc5548789886040516127659392919061598b565b60405180910390a3505050505050565b3360009081526101066020526040902060018101546001600160a01b03166127df5760405162461bcd60e51b815260206004820152601060248201527f696e76616c6964207265706f72746572000000000000000000000000000000006044820152606401610a43565b600080835167ffffffffffffffff8111156127fc576127fc615214565b604051908082528060200260200182016040528015612825578160200160208202803683370190505b50905060005b84518110156129b457600073__$7aaf162b34d2533b02434bde51cad0c5c5$__6336de68108888858151811061286357612863615817565b60200260200101516040518363ffffffff1660e01b81526004016128889291906159b3565b602060405180830381865af41580156128a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c991906159d8565b6001600160a01b03808216600090815261010660205260409020600181015492935091166128f85750506129a2565b6000805b8681101561295157836001600160a01b031686828151811061292057612920615817565b60200260200101516001600160a01b03160361293f5760019150612951565b806129498161582d565b9150506128fc565b508015612960575050506129a2565b82858761296c8161582d565b98508151811061297e5761297e615817565b60200260200101906001600160a01b031690816001600160a01b0316815250505050505b806129ac8161582d565b91505061282b565b508351821015612a6a5760008267ffffffffffffffff8111156129d9576129d9615214565b604051908082528060200260200182016040528015612a02578160200160208202803683370190505b50905060005b83811015612a6657828181518110612a2257612a22615817565b6020026020010151828281518110612a3c57612a3c615817565b6001600160a01b039092166020928302919091019091015280612a5e8161582d565b915050612a08565b5090505b6000866002811115612a7e57612a7e615043565b03612c0957600080600087806020019051810190612a9c9190615a0c565b9194509250905060ff8316600114612af65760405162461bcd60e51b815260206004820152601c60248201527f7265706f727420616374696f6e206f6e6c7920737570706f72746564000000006044820152606401610a43565b6001600160a01b038082166000908152610106602052604090206001810154909116612b6f5760405162461bcd60e51b815260206004820152602260248201527f746172676574206e6f64652077616c6c657420646f6573206e6f742065786973604482015261747360f01b6064820152608401610a43565b60006001820154600160a01b900460ff166002811115612b9157612b91615043565b14612bde5760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220564e6f646573000000000000000000006044820152606401610a43565b612bff8460ff166002811115612bf657612bf6615043565b88878487613c61565b5050505050612da2565b6001866002811115612c1d57612c1d615043565b03612da25760008060008088806020019051810190612c3c9190615a53565b9296509094509250905060ff8416600214612c995760405162461bcd60e51b815260206004820152601c60248201527f7265706f727420616374696f6e206f6e6c7920737570706f72746564000000006044820152606401610a43565b6001600160a01b038083166000908152610106602052604090206001810154909116612d125760405162461bcd60e51b815260206004820152602260248201527f746172676574206e6f64652077616c6c657420646f6573206e6f742065786973604482015261747360f01b6064820152608401610a43565b600180820154600160a01b900460ff166002811115612d3357612d33615043565b14612d805760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220534e6f646573000000000000000000006044820152606401610a43565b611b118560ff166002811115612d9857612d98615043565b8988848887613e09565b505050505050565b612db26137c6565b6101025461ffff82161115612e095760405162461bcd60e51b815260206004820152601c60248201527f696e636f72726563742076616c506572426c6f636b5461726765745f000000006044820152606401610a43565b60ff805471ffff000000000000000000000000000000001916600160801b61ffff848116918202929092179283905560408051600160701b909404909216835260208301527f81512b84dc2b38f82b4999b5512a14df033b165371fa51776cce559212bf0a44910160405180910390a150565b61010281815481106113e057600080fd5b6000612e976137c6565b60008211612ee75760405162461bcd60e51b815260206004820152601960248201527f616d6f756e742073686f756c6420626520706f736974697665000000000000006044820152606401610a43565b826001600160a01b0316846001600160a01b031603612f6e5760405162461bcd60e51b815260206004820152602660248201527f63616e6e6f74207472616e73666572206265747765656e2073616d652061646460448201527f72657373657300000000000000000000000000000000000000000000000000006064820152608401610a43565b6001600160a01b03831615801590612f8d57506001600160a01b038416155b156130b45781610108541015612ff55760405162461bcd60e51b815260206004820152602760248201527f66726f6d206e6f64652073686f756c64206861766520656e6f75676820636f6c6044820152661b185d195c985b60ca1b6064820152608401610a43565b6001600160a01b0380841660009081526101066020526040902080549091166130605760405162461bcd60e51b815260206004820152600f60248201527f6d697373696e6720746f206e6f646500000000000000000000000000000000006044820152606401610a43565b82610108600082825461307391906157ca565b9250508190555082610107600082825461308d919061594c565b92505081905550828160020160008282546130a8919061594c565b90915550613360915050565b6001600160a01b038416158015906130d357506001600160a01b038316155b156131ef576001600160a01b0380851660009081526101066020526040902080549091166131435760405162461bcd60e51b815260206004820152601160248201527f6d697373696e672066726f6d206e6f64650000000000000000000000000000006044820152606401610a43565b82816002015410156131a75760405162461bcd60e51b815260206004820152602760248201527f66726f6d206e6f64652073686f756c64206861766520656e6f75676820636f6c6044820152661b185d195c985b60ca1b6064820152608401610a43565b828160020160008282546131bb91906157ca565b925050819055508261010760008282546131d591906157ca565b925050819055508261010860008282546130a8919061594c565b6001600160a01b03808516600090815261010660205260409020805490911661325a5760405162461bcd60e51b815260206004820152601160248201527f6d697373696e672066726f6d206e6f64650000000000000000000000000000006044820152606401610a43565b82816002015410156132be5760405162461bcd60e51b815260206004820152602760248201527f66726f6d206e6f64652073686f756c64206861766520656e6f75676820636f6c6044820152661b185d195c985b60ca1b6064820152608401610a43565b6001600160a01b0380851660009081526101066020526040902082549091166133295760405162461bcd60e51b815260206004820152600f60248201527f6d697373696e6720746f206e6f646500000000000000000000000000000000006044820152606401610a43565b8382600201600082825461333d91906157ca565b9250508190555083816002016000828254613358919061594c565b909155505050505b5060019392505050565b6133726137c6565b61010180546001600160a01b0319166001600160a01b0392909216919091179055565b61339d6137c6565b6101025461ffff8316106133b057600080fd5b6101025461ffff8216106133c357600080fd5b60ff80547fffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffff16600160901b61ffff8581169182027fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1692909217600160a01b928516928302179092556040805192835260208301919091527fcd481667fa77e513c517493174075f0471ec1fe24d57af644377cd1a2572d13d910160405180910390a15050565b6134726137c6565b606580546001600160a01b0383166001600160a01b031990911681179091556134a36033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600281015461010054825460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810184905260009392919091169063a9059cbb906044016020604051808303816000875af115801561353b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061355f9190615792565b6135d15760405162461bcd60e51b815260206004820152602560248201527f6661696c656420746f20747261736665722066756e6473206261636b20746f2060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610a43565b600083600201819055508061010760008282546135ee91906157ca565b92505081905550806101086000828254613608919061594c565b90915550600090506001840154600160a01b900460ff16600281111561363057613630615043565b0361367a57613643600584016000614f3a565b613651600684016000614f5f565b600183015461366c90610102906001600160a01b0316613fb5565b50613675613afb565b610da9565b600180840154600160a01b900460ff16600281111561369b5761369b615043565b03610da957610101546001600160a01b03166136f95760405162461bcd60e51b815260206004820152601b60248201527f6e6f2073746f7261676520636f6e747261637420646566696e656400000000006044820152606401610a43565b6101015460018401546040517fb2b99ec90000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690819063b2b99ec990602401600060405180830381600087803b15801561376057600080fd5b505af1158015613774573d6000803e3d6000fd5b5061378792505050600585016000614f3a565b613795600685016000614f5f565b6137a3600785016000614f3a565b60018401546137be90610104906001600160a01b0316613fb5565b505092915050565b6033546001600160a01b03163314611b315760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a43565b610f276137c6565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156138605761385b836140e1565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156138ba575060408051601f3d908101601f191682019092526138b791810190615779565b60015b61392c5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610a43565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146139c15760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610a43565b5061385b83838361419f565b600054610100900460ff16611b315760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610a43565b600054610100900460ff16613aa35760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610a43565b611b31335b606580546001600160a01b0319169055610f27816141ca565b60006004826004811115613ad757613ad7615043565b1480613af457506003826004811115613af257613af2615043565b145b1592915050565b6000805b61010254811015613b825760006101028281548110613b2057613b20615817565b60009182526020808320909101546001600160a01b03168083526101069091526040909120600881015491925090613b5a9060ff16613ac1565b15613b6d5783613b6981615aa9565b9450505b50508080613b7a9061582d565b915050613aff565b50610103805461ffff191661ffff83811691821790925560ff548392600160801b9091041690811015613bb3578091505b60ff5461ffff808316600160701b909204161115613bd057600080fd5b60ff5461ffff838116600160701b909204161461385b5760ff80547fffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffff16600160701b61ffff858116918202929092179092556040805192835290831660208301527f81512b84dc2b38f82b4999b5512a14df033b165371fa51776cce559212bf0a44910160405180910390a1505050565b6000806001840154600160a01b900460ff166002811115613c8457613c84615043565b14613cd15760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220564e6f646573000000000000000000006044820152606401610a43565b60ff54606490613cef9061ffff80821691600160701b900416615aca565b613cf99190615afe565b61ffff1684511015613d4d5760405162461bcd60e51b815260206004820152601460248201527f73696720636f756e7420697320746f6f206c6f770000000000000000000000006044820152606401610a43565b600883015460ff166004816004811115613d6957613d69615043565b1480613d8657506003816004811115613d8457613d84615043565b145b15613d95576000915050613e00565b613da48787868887600061421c565b60ff54600485015461ffff620100009092048216911610613dc957613dc98685614892565b60ff5460048501546801000000000000000090910461ffff908116620100009092041610613dfa57613dfa84614af0565b60009150505b95945050505050565b6000600180850154600160a01b900460ff166002811115613e2c57613e2c615043565b14613e795760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220534e6f646573000000000000000000006044820152606401610a43565b60ff54606490613e979061ffff80821691600160701b900416615aca565b613ea19190615afe565b61ffff1685511015613ef55760405162461bcd60e51b815260206004820152601460248201527f73696720636f756e7420697320746f6f206c6f770000000000000000000000006044820152606401610a43565b600884015460ff166004816004811115613f1157613f11615043565b1480613f2e57506003816004811115613f2c57613f2c615043565b145b15613f3d576000915050613fab565b613f4b88888789888861421c565b60ff54600486015461ffff6401000000009092048216911610613f7257613f728786614892565b60ff5460048601546a010000000000000000000090910461ffff908116620100009092041610613fa557613fa585614af0565b60009150505b9695505050505050565b8154600090815b818110156140d657836001600160a01b0316858281548110613fe057613fe0615817565b6000918252602090912001546001600160a01b0316036140c4576140056001836157ca565b811461408657846140176001846157ca565b8154811061402757614027615817565b9060005260206000200160009054906101000a90046001600160a01b031685828154811061405757614057615817565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b8480548061409657614096615b1f565b600082815260209020810160001990810180546001600160a01b03191690550190555060019150610da99050565b806140ce8161582d565b915050613fbc565b506000949350505050565b6001600160a01b0381163b61415e5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610a43565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6141a883614b97565b6000825111806141b55750805b1561385b576141c48383614bd7565b50505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000846004016001018054806020026020016040519081016040528092919081815260200182805480156142a157602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f0104928301926001038202915080841161425e5790505b505083519394506000925050505b81811015614343578281815181106142c9576142c9615817565b60200260200101516001600160801b0316856001600160801b0316036143315760405162461bcd60e51b815260206004820152601060248201527f626c6f636b206973206e6f74206e6577000000000000000000000000000000006044820152606401610a43565b8061433b8161582d565b9150506142af565b50600180870154600160a01b900460ff16600281111561436557614365615043565b0361453057826001600160801b03166000036143c35760405162461bcd60e51b815260206004820152601760248201527f73746f72616765206b65792069732072657175697265640000000000000000006044820152606401610a43565b60008660040160030180548060200260200160405190810160405280929190818152602001828054801561444857602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116144055790505b505083519394506000925050505b818110156144ea5782818151811061447057614470615817565b60200260200101516001600160801b0316866001600160801b0316036144d85760405162461bcd60e51b815260206004820152601660248201527f73746f72616765206b6579206973206e6f74206e6577000000000000000000006044820152606401610a43565b806144e28161582d565b915050614456565b505050600786018054600180820183556000928352602090922060028204018054929091166010026101000a6001600160801b0381810219909316928616029190911790555b60048601805461ffff1690600061454683615aa9565b825461010092830a61ffff818102199092169290911602179091556005880180546001818101835560009283526020808420600284040180549390921660100290940a6001600160801b0381810219909316928a1602919091179055600689018054604080518286028101860190915281815292945091929091908301828280156145fa57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116145dc575b505083519394506000925050505b87518110156146fe5760005b828110156146eb5783818151811061462e5761462e615817565b60200260200101516001600160a01b031689838151811061465157614651615817565b60200260200101516001600160a01b031614801561469b575060006001600160a01b031689838151811061468757614687615817565b60200260200101516001600160a01b031614155b156146d95760008983815181106146b4576146b4615817565b60200260200101906001600160a01b031690816001600160a01b0316815250506146eb565b806146e38161582d565b915050614614565b50806146f68161582d565b915050614608565b5060005b87518110156147ab57600088828151811061471f5761471f615817565b6020026020010151905060006001600160a01b0316816001600160a01b031614614798578960040160020189838151811061475c5761475c615817565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790555b50806147a38161582d565b915050614702565b506000600889015460ff1660048111156147c7576147c7615043565b036147dc5760088801805460ff191660011790555b600180890154908a01546040517f19d5f3972073c7002111a82b2a44db11e739567a002445f2e3db8ab96fe6645f92614827926001600160a01b03918216929116908b908f90615b35565b60405180910390a16001880154600889015460028a01546040516001600160a01b03909316927ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e9261487e9260ff9091169161575e565b60405180910390a250505050505050505050565b60ff5460009081906148b39084906601000000000000900461ffff16614c03565b600685018054604080516020808402820181019092528281529496509294506000939283018282801561490f57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116148f1575b5050505050905060008083118015614928575060008251115b156149d25781516149399084615b7b565b905060005b82518110156149d0576000610106600085848151811061496057614960615817565b6020908102919091018101516001600160a01b0390811683529082019290925260400160002080549092501661499657506149be565b828160020160008282546149aa919061594c565b909155506149ba905083866157ca565b9450505b806149c88161582d565b91505061493e565b505b828660020160008282546149e6919061594c565b909155506149fa9050600686016000614f5f565b6000600886015460ff166004811115614a1557614a15615043565b1480614a3957506001600886015460ff166004811115614a3757614a37615043565b145b15614a4e5760088501805460ff191660021790555b60048501805461ffff191680825562010000900461ffff16906002614a7283615aa9565b91906101000a81548161ffff021916908361ffff160217905550508460010160009054906101000a90046001600160a01b03166001600160a01b03167ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e600286604051614ae092919061575e565b60405180910390a2505050505050565b60ff546000908190614b179084906c01000000000000000000000000900461ffff16614c03565b9092509050614b25836134db565b5060048301805463ffff00001916905560088301805460ff1916600390811790915560018401546040516001600160a01b03909116917ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e91614b8a919060009061575e565b60405180910390a2505050565b614ba0816140e1565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060614bfc8383604051806060016040528060278152602001615be760279139614ca5565b9392505050565b60008060648363ffffffff161115614c5d5760405162461bcd60e51b815260206004820181905260248201527f70657263656e746167652073686f756c6420626520696e205b302c203130305d6044820152606401610a43565b60028401546064614c6e8582615b8f565b614c7e9063ffffffff1683615bb3565b614c889190615b7b565b9250614c9483826157ca565b600286018490559150509250929050565b6060600080856001600160a01b031685604051614cc29190615bca565b600060405180830381855af49150503d8060008114614cfd576040519150601f19603f3d011682016040523d82523d6000602084013e614d02565b606091505b5091509150613fab8683838760608315614d7d578251600003614d76576001600160a01b0385163b614d765760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a43565b5081614d87565b614d878383614d8f565b949350505050565b815115614d9f5781518083602001fd5b8060405162461bcd60e51b8152600401610a43919061574b565b6040805160e081018252600080825260208201819052909182019081526020016000815260200160608152602001614e216040518060a00160405280600061ffff168152602001600061ffff1681526020016060815260200160608152602001606081525090565b81526020016000905290565b82805482825590600052602060002090600101600290048101928215614ed55791602002820160005b83821115614ea057835183826101000a8154816001600160801b0302191690836001600160801b031602179055509260200192601001602081600f01049283019260010302614e56565b8015614ed35782816101000a8154906001600160801b030219169055601001602081600f01049283019260010302614ea0565b505b50614ee1929150614f79565b5090565b828054828255906000526020600020908101928215614ed5579160200282015b82811115614ed557825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614f05565b508054600082556001016002900490600052602060002090810190610f279190614f79565b5080546000825590600052602060002090810190610f2791905b5b80821115614ee15760008155600101614f7a565b600081518084526020808501945080840160005b83811015614fc75781516001600160a01b031687529582019590820190600101614fa2565b509495945050505050565b602081526000614bfc6020830184614f8e565b6001600160a01b0381168114610f2757600080fd5b60006020828403121561500c57600080fd5b8135614bfc81614fe5565b6000806040838503121561502a57600080fd5b823561503581614fe5565b946020939093013593505050565b634e487b7160e01b600052602160045260246000fd5b60038110610f2757610f27615043565b60005b8381101561508457818101518382015260200161506c565b50506000910152565b600081518084526150a5816020860160208601615069565b601f01601f19169290920160200192915050565b600081518084526020808501945080840160005b83811015614fc75781516001600160801b0316875295820195908201906001016150cd565b600061ffff8083511684526020818185015116818601526040840151915060a0604086015261512460a08601836150b9565b60608581015187830391880191909152805180835290830193506000918301905b8083101561516e5784516001600160a01b03168252938301936001929092019190830190615145565b5060808601519350868103608088015261518881856150b9565b979650505050505050565b600581106151a3576151a3615043565b9052565b6001600160a01b0388811682528716602082015260006151c687615059565b86604083015285606083015260e060808301526151e660e083018661508d565b82810360a08401526151f881866150f2565b91505061520860c0830184615193565b98975050505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561525357615253615214565b604052919050565b600067ffffffffffffffff83111561527557615275615214565b615288601f8401601f191660200161522a565b905082815283838301111561529c57600080fd5b828260208301376000602084830101529392505050565b600082601f8301126152c457600080fd5b614bfc8383356020850161525b565b600080604083850312156152e657600080fd5b82356152f181614fe5565b9150602083013567ffffffffffffffff81111561530d57600080fd5b615319858286016152b3565b9150509250929050565b60006020828403121561533557600080fd5b5035919050565b6020815260006001600160a01b0380845116602084015280602085015116604084015250604083015161536e81615059565b8060608401525060608301516080830152608083015160e060a084015261539961010084018261508d565b905060a0840151601f198483030160c08501526153b682826150f2565b91505060c08401516153cb60e0850182615193565b509392505050565b803561ffff811681146153e557600080fd5b919050565b60008060008060008060008060008060006101608c8e03121561540c57600080fd5b6154158c6153d3565b9a5060208c013561542581614fe5565b995061543360408d016153d3565b985061544160608d016153d3565b975061544f60808d016153d3565b965061545d60a08d016153d3565b955061546b60c08d016153d3565b945061547960e08d016153d3565b93506154886101008d016153d3565b92506154976101208d016153d3565b91506154a66101408d016153d3565b90509295989b509295989b9093969950565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101561552757888303603f19018552815180516001600160a01b031684528701518784018790526155148785018261508d565b95880195935050908601906001016154df565b509098975050505050505050565b8035600381106153e557600080fd5b6000806000806080858703121561555a57600080fd5b8435935061556a60208601615535565b9250604085013567ffffffffffffffff81111561558657600080fd5b8501601f8101871361559757600080fd5b6155a68782356020840161525b565b92505060608501356155b781614fe5565b939692955090935050565b6000806000606084860312156155d757600080fd5b6155e084615535565b925060208085013567ffffffffffffffff808211156155fe57600080fd5b61560a888389016152b3565b9450604087013591508082111561562057600080fd5b818701915087601f83011261563457600080fd5b81358181111561564657615646615214565b8060051b61565585820161522a565b918252838101850191858101908b84111561566f57600080fd5b86860192505b838310156156ab5782358581111561568d5760008081fd5b61569b8d89838a01016152b3565b8352509186019190860190615675565b809750505050505050509250925092565b6000602082840312156156ce57600080fd5b614bfc826153d3565b6000806000606084860312156156ec57600080fd5b83356156f781614fe5565b9250602084013561570781614fe5565b929592945050506040919091013590565b6000806040838503121561572b57600080fd5b615734836153d3565b9150615742602084016153d3565b90509250929050565b602081526000614bfc602083018461508d565b6040810161576c8285615193565b8260208301529392505050565b60006020828403121561578b57600080fd5b5051919050565b6000602082840312156157a457600080fd5b81518015158114614bfc57600080fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610da957610da96157b4565b600181811c908216806157f157607f821691505b60208210810361581157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b60006001820161583f5761583f6157b4565b5060010190565b601f82111561385b57600081815260208120601f850160051c8101602086101561586d5750805b601f850160051c820191505b81811015612da257828155600101615879565b815167ffffffffffffffff8111156158a6576158a6615214565b6158ba816158b484546157dd565b84615846565b602080601f8311600181146158ef57600084156158d75750858301515b600019600386901b1c1916600185901b178555612da2565b600085815260208120601f198616915b8281101561591e578886015182559484019460019091019084016158ff565b508582101561593c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610da957610da96157b4565b805160ff811681146153e557600080fd5b60006020828403121561598257600080fd5b614bfc8261595f565b61599484615059565b838152826020820152606060408201526000613e00606083018461508d565b6040815260006159c6604083018561508d565b8281036020840152613e00818561508d565b6000602082840312156159ea57600080fd5b8151614bfc81614fe5565b80516001600160801b03811681146153e557600080fd5b600080600060608486031215615a2157600080fd5b615a2a8461595f565b9250615a38602085016159f5565b91506040840151615a4881614fe5565b809150509250925092565b60008060008060808587031215615a6957600080fd5b615a728561595f565b9350615a80602086016159f5565b92506040850151615a9081614fe5565b9150615a9e606086016159f5565b905092959194509250565b600061ffff808316818103615ac057615ac06157b4565b6001019392505050565b61ffff8181168382160280821691908281146137be576137be6157b4565b634e487b7160e01b600052601260045260246000fd5b600061ffff80841680615b1357615b13615ae8565b92169190910492915050565b634e487b7160e01b600052603160045260246000fd5b60006001600160a01b03808716835280861660208401525060806040830152615b616080830185614f8e565b9050615b6c83615059565b82606083015295945050505050565b600082615b8a57615b8a615ae8565b500490565b63ffffffff828116828216039080821115615bac57615bac6157b4565b5092915050565b8082028115828204841417610da957610da96157b4565b60008251615bdc818460208701615069565b919091019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122019aa0081e69056404e40023f916698c2b116cb83388048dea2cf1b230e45ab7b64736f6c63430008110033", + "linkReferences": { + "contracts/SigUtil.sol": { + "SigUtil": [ + { + "length": 20, + "start": 10373 + } + ] + } + }, + "deployedLinkReferences": { + "contracts/SigUtil.sol": { + "SigUtil": [ + { + "length": 20, + "start": 10296 + } + ] + } + } +} diff --git a/push-docker/v03/validator_eth_key.json b/push-docker/v03/validator_eth_key.json new file mode 100644 index 0000000..f393887 --- /dev/null +++ b/push-docker/v03/validator_eth_key.json @@ -0,0 +1,21 @@ +{ + "address": "98f9d910aef9b3b9a45137af1ca7675ed90a5355", + "id": "84866698-7754-4d12-bffe-9e2193309210", + "version": 3, + "Crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "4e729c0776096b089028d7c9ed849508" + }, + "ciphertext": "6474968f590e9e01236dcaca635c9296a77220a518f2096c0967e9893f6edd5b", + "kdf": "scrypt", + "kdfparams": { + "salt": "6f9daa957f76394aa16959d69ed9a58bbe7cc5a6b8885a4a1b457d8b245cafaa", + "n": 131072, + "dklen": 32, + "p": 1, + "r": 8 + }, + "mac": "25706ef770e5cbab8bca65d88fa8d0a713f0dee49332e0861a481b32e4d85abf" + } +} \ No newline at end of file From 9b8a379d3f123dfb31eae64d401eca874f621718 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Sat, 31 Aug 2024 15:14:00 +0700 Subject: [PATCH 02/25] add: setup files for readme (2) --- docker-compose-v02.yml | 72 ------------------------------------------ docker-compose-v03.yml | 72 ------------------------------------------ 2 files changed, 144 deletions(-) delete mode 100644 docker-compose-v02.yml delete mode 100644 docker-compose-v03.yml diff --git a/docker-compose-v02.yml b/docker-compose-v02.yml deleted file mode 100644 index b6f438e..0000000 --- a/docker-compose-v02.yml +++ /dev/null @@ -1,72 +0,0 @@ -version: '3' -services: - redis-v02: - image: 'redis:latest' - container_name: redis-v02 - restart: always - networks: - - push-shared-network - volumes: - - ./external/redis-v02:/data - - mysql-v02: - image: mysql:5.7.13 - container_name: mysql-v02 - platform: linux/amd64 - command: --default-authentication-plugin=mysql_native_password - restart: always - environment: - MYSQL_ROOT_PASSWORD: 'pass' - MYSQL_DATABASE: vnode2 - MYSQL_USER: 2roor - MYSQL_PASSWORD: s1mpl3 - # Change this to your local path - volumes: - - ./external/mysql-v02:/var/lib/mysql/ - networks: - - push-shared-network - - phpmyadmin-v02: - image: phpmyadmin/phpmyadmin - container_name: phpmyadmin-v02 - depends_on: - - mysql-v02 - environment: - PMA_HOST: mysql-v02 - PMA_PORT: 3306 - PMA_ARBITRARY: 1 - UPLOAD_LIMIT: 300M - ports: - - 8184:80 - restart: always - networks: - - push-shared-network - - ipfs-v02: - container_name: ipfs-v02 - image: ipfs/go-ipfs:latest - volumes: - - ./external/ipfs-v02:/data - networks: - - push-shared-network - - app-v02: - build: . - container_name: app-v02 - ports: - - '4002:4002' - depends_on: - - mysql-v02 - - redis-v02 - - ipfs-v02 - environment: - - CONFIG_DIR=/app/config - - LOG_DIR=/app/config/log - volumes: - - /root/config/v02:/app/config - networks: - - push-shared-network - -networks: - push-shared-network: - external: true \ No newline at end of file diff --git a/docker-compose-v03.yml b/docker-compose-v03.yml deleted file mode 100644 index 63cfec5..0000000 --- a/docker-compose-v03.yml +++ /dev/null @@ -1,72 +0,0 @@ -version: '3' -services: - redis-v03: - image: 'redis:latest' - container_name: redis-v03 - restart: always - networks: - - push-shared-network - volumes: - - ./external/redis-v03:/data - - mysql-v03: - image: mysql:5.7.13 - container_name: mysql-v03 - platform: linux/amd64 - command: --default-authentication-plugin=mysql_native_password - restart: always - environment: - MYSQL_ROOT_PASSWORD: 'pass' - MYSQL_DATABASE: vnode3 - MYSQL_USER: 2roor - MYSQL_PASSWORD: s1mpl3 - # Change this to your local path - volumes: - - ./external/mysql-v03:/var/lib/mysql/ - networks: - - push-shared-network - - phpmyadmin-v03: - image: phpmyadmin/phpmyadmin - container_name: phpmyadmin-v03 - depends_on: - - mysql-v03 - environment: - PMA_HOST: mysql-v03 - PMA_PORT: 3306 - PMA_ARBITRARY: 1 - UPLOAD_LIMIT: 300M - ports: - - 8185:80 - restart: always - networks: - - push-shared-network - - ipfs-v03: - container_name: ipfs-v03 - image: ipfs/go-ipfs:latest - volumes: - - ./external/ipfs-v03:/data - networks: - - push-shared-network - - app-v03: - build: . - container_name: app-v03 - ports: - - '4003:4003' - depends_on: - - mysql-v03 - - redis-v03 - - ipfs-v03 - environment: - - CONFIG_DIR=/app/config - - LOG_DIR=/app/config/log - volumes: - - /root/config/v03:/app/config - networks: - - push-shared-network - -networks: - push-shared-network: - external: true \ No newline at end of file From 18e895d5ce5c4a648d45cd5caaf2bc3eb95be06d Mon Sep 17 00:00:00 2001 From: Igx22 Date: Thu, 5 Sep 2024 18:24:49 +0700 Subject: [PATCH 03/25] fix: docker issues on local env fixed 1. removed yarn install params from Dockerfile 2. moved hardhat to the db's yml 3. added generated ts to the git to avoid calling protobuf or requiring protobuf 4. added missing temp env vars for hardhat (SEPOLIA_RPC_URL, SEPOLIA_PRIVATE_KEY) 5. added Protobuf installation and code generation step to README --- Dockerfile | 2 +- README.md | 42 +- docker-compose.yml | 13 + {push-docker => docker}/v01/StorageV1.json | 0 {push-docker => docker}/v01/ValidatorV1.json | 0 .../v01/validator_eth_key.json | 0 {push-docker => docker}/v02/StorageV1.json | 0 {push-docker => docker}/v02/ValidatorV1.json | 0 .../v02/validator_eth_key.json | 0 {push-docker => docker}/v03/StorageV1.json | 0 {push-docker => docker}/v03/ValidatorV1.json | 0 .../v03/validator_eth_key.json | 0 net.yml | 29 +- push-docker/v01/.env | 48 - push-docker/v02/.env | 47 - push-docker/v03/.env | 47 - src/generated/push/block_pb.d.ts | 541 +++ src/generated/push/block_pb.js | 4098 +++++++++++++++++ src/proto/push/block.proto | 23 +- src/utilz/ethSig.ts | 12 + src/utilz/hashUtil.ts | 1 + tests/block/block.test.ts | 8 +- 22 files changed, 4725 insertions(+), 186 deletions(-) rename {push-docker => docker}/v01/StorageV1.json (100%) rename {push-docker => docker}/v01/ValidatorV1.json (100%) rename {push-docker => docker}/v01/validator_eth_key.json (100%) rename {push-docker => docker}/v02/StorageV1.json (100%) rename {push-docker => docker}/v02/ValidatorV1.json (100%) rename {push-docker => docker}/v02/validator_eth_key.json (100%) rename {push-docker => docker}/v03/StorageV1.json (100%) rename {push-docker => docker}/v03/ValidatorV1.json (100%) rename {push-docker => docker}/v03/validator_eth_key.json (100%) delete mode 100644 push-docker/v01/.env delete mode 100644 push-docker/v02/.env delete mode 100644 push-docker/v03/.env create mode 100644 src/generated/push/block_pb.d.ts create mode 100644 src/generated/push/block_pb.js diff --git a/Dockerfile b/Dockerfile index f8d23f1..ac89662 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ FROM node:20.6.1 WORKDIR /app COPY . . -RUN yarn install --non-interactive --frozen-lockfile +RUN yarn install EXPOSE 4001 EXPOSE 4002 EXPOSE 4003 diff --git a/README.md b/README.md index 6f50ec2..e9dd601 100644 --- a/README.md +++ b/README.md @@ -264,6 +264,30 @@ Please ensure your code adheres to our coding standards and includes appropriate This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details. +## Protobuf modifications +For every edit to /proto/push/block.proto.ts +Please do the following + +- check that protobuf is installed + +```shell +protoc --version +### libprotoc 3.20.3 + +## if missing (for mac) +brew install protobuf@3 +``` + +- regenerate files +```shell +yarn build:proto +``` + +- commit new files + +## generate protobuf +yarn add ts-protoc-gen +yarn build:proto ## Docker (local testing) @@ -292,7 +316,6 @@ Setup docker images for smart-contracts & vnodes ```bash ## create docker network docker network create push-shared-network - ## prepare image for hardhat cd /Users/w/chain/push-node-smart-contracts docker build . -t hardhat-main @@ -305,20 +328,18 @@ docker build . -t vnode-main Run (2 shell tabs recommended) ```bash -## run mysql + redis + phpmyadmin (shell1) +## run mysql + redis + phpmyadmin (shell1) + hardhat ## add up -d for background -export DB_PASS=s1mpl3 -export DB_NAME=vnode1 -export DB_USER=2roor cd /Users/w/chain/push-vnode docker-compose up -## run hardhat + vnode1 + vnode2 + vnode3 (shell2) -## add up -d for background -export DB_PASS=s1mpl3 -export DB_USER=2roor +## run vnode1 + vnode2 + vnode3 (shell2) cd /Users/w/push-vnode +export DB_PASS=s1mpl3 +export DB_USER=2roor docker-compose -f net.yml up + +## up -d for background ``` Check that all docker DNS is online (OPTIONAL) @@ -405,4 +426,5 @@ curl --location 'http://localhost:4001/api/v1/rpc/' \ "params": ["0"], "id": 1 }' -``` \ No newline at end of file +``` + diff --git a/docker-compose.yml b/docker-compose.yml index afbdb65..31b5173 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -52,6 +52,19 @@ services: aliases: - phpmyadmin.local + hardhat: + image: hardhat-main + container_name: hardhat + networks: + push-shared-network: + aliases: + - hardhat.local + ports: + - "8545:8545" + restart: always + environment: + SEPOLIA_RPC_URL: 11 + SEPOLIA_PRIVATE_KEY: AA networks: push-shared-network: diff --git a/push-docker/v01/StorageV1.json b/docker/v01/StorageV1.json similarity index 100% rename from push-docker/v01/StorageV1.json rename to docker/v01/StorageV1.json diff --git a/push-docker/v01/ValidatorV1.json b/docker/v01/ValidatorV1.json similarity index 100% rename from push-docker/v01/ValidatorV1.json rename to docker/v01/ValidatorV1.json diff --git a/push-docker/v01/validator_eth_key.json b/docker/v01/validator_eth_key.json similarity index 100% rename from push-docker/v01/validator_eth_key.json rename to docker/v01/validator_eth_key.json diff --git a/push-docker/v02/StorageV1.json b/docker/v02/StorageV1.json similarity index 100% rename from push-docker/v02/StorageV1.json rename to docker/v02/StorageV1.json diff --git a/push-docker/v02/ValidatorV1.json b/docker/v02/ValidatorV1.json similarity index 100% rename from push-docker/v02/ValidatorV1.json rename to docker/v02/ValidatorV1.json diff --git a/push-docker/v02/validator_eth_key.json b/docker/v02/validator_eth_key.json similarity index 100% rename from push-docker/v02/validator_eth_key.json rename to docker/v02/validator_eth_key.json diff --git a/push-docker/v03/StorageV1.json b/docker/v03/StorageV1.json similarity index 100% rename from push-docker/v03/StorageV1.json rename to docker/v03/StorageV1.json diff --git a/push-docker/v03/ValidatorV1.json b/docker/v03/ValidatorV1.json similarity index 100% rename from push-docker/v03/ValidatorV1.json rename to docker/v03/ValidatorV1.json diff --git a/push-docker/v03/validator_eth_key.json b/docker/v03/validator_eth_key.json similarity index 100% rename from push-docker/v03/validator_eth_key.json rename to docker/v03/validator_eth_key.json diff --git a/net.yml b/net.yml index d6942a1..ffd85a7 100644 --- a/net.yml +++ b/net.yml @@ -1,17 +1,6 @@ version: '3' services: - hardhat: - image: hardhat-main - container_name: hardhat - networks: - push-shared-network: - aliases: - - hardhat.local - ports: - - "8545:8545" - restart: always - vnode1: image: vnode-main container_name: vnode1 @@ -19,8 +8,6 @@ services: push-shared-network: aliases: - vnode1.local - depends_on: - - hardhat environment: DB_NAME: vnode1 PORT: 4001 @@ -33,8 +20,8 @@ services: ports: - "4001:4001" volumes: - - ./push-docker/v01:/config - - ./push-docker/v01/log:/log + - ./docker/v01:/config + - ./docker/v01/log:/log vnode2: @@ -44,8 +31,6 @@ services: push-shared-network: aliases: - vnode2.local - depends_on: - - hardhat environment: DB_NAME: vnode2 PORT: 4001 @@ -58,8 +43,8 @@ services: ports: - "4002:4001" volumes: - - ./push-docker/v02:/config - - ./push-docker/v02/log:/log + - ./docker/v02:/config + - ./docker/v02/log:/log vnode3: @@ -69,8 +54,6 @@ services: push-shared-network: aliases: - vnode3.local - depends_on: - - hardhat environment: DB_NAME: vnode3 PORT: 4001 @@ -83,8 +66,8 @@ services: ports: - "4003:4001" volumes: - - ./push-docker/v03:/config - - ./push-docker/v03/log:/log + - ./docker/v03:/config + - ./docker/v03/log:/log networks: push-shared-network: diff --git a/push-docker/v01/.env b/push-docker/v01/.env deleted file mode 100644 index 92e1051..0000000 --- a/push-docker/v01/.env +++ /dev/null @@ -1,48 +0,0 @@ -######### ENVIRONMENT -PORT=4001 -PUSH_NODES_NET=DEV -RUNNING_ON_MACHINE=mac -LOG_LEVEL=debug - -# DATABASE -DB_HOST=localhost -DB_NAME=vnode1 -DB_USER=2roor -DB_PASS=s1mpl3 -REDIS_URL=redis://redis.local:6379 - -######### Validator -# encrypted private key file -VALIDATOR_PRIVATE_KEY_FILE=validator_eth_key.json -# ! do not store this password on DISK in production, use only as ENV var -VALIDATOR_PRIVATE_KEY_PASS=test - -VALIDATOR_RPC_ENDPOINT=http://localhost:8545 -VALIDATOR_RPC_NETWORK=1337 -# push token smart contract -VALIDATOR_PUSH_TOKEN_ADDRESS=0x5FbDB2315678afecb367f032d93F642f64180aa3 -# validator smart contract -VALIDATOR_CONTRACT_ADDRESS=0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9 -# storage smart contract -STORAGE_CONTRACT_ADDRESS=0x0165878A594ca255338adfa4d48449f69242Eb8F - -# development -# log sql -LOG_SQL_STATEMENTS=true -# no http handler starts -VALIDATOR_DISABLE_ALL_SERVICES=true -# do not fetch blockchain data -VALIDATOR_DISABLE_HISTORY_SYNC=true -# write logs -VALIDATOR_DEBUG_LOG=true -# do not validate payload -VALIDATOR_SKIP_PAYLOAD_VERIFICATION=true -# do not rate limit -VALIDATOR_SKIP_RATE_LIMITER=true -# write custom logs for every query -VALIDATOR_HTTP_LOG=true -# random tokens live forever -VALIDATOR_DISABLE_TOKEN_TIMEOUT=true -######## Validator ENDS - -BLOCK_SCHEDULE=*/15 * * * * * \ No newline at end of file diff --git a/push-docker/v02/.env b/push-docker/v02/.env deleted file mode 100644 index 42c300e..0000000 --- a/push-docker/v02/.env +++ /dev/null @@ -1,47 +0,0 @@ -######### ENVIRONMENT -PORT=4002 -PUSH_NODES_NET=DEV -RUNNING_ON_MACHINE=mac -LOG_LEVEL=debug - -# DATABASE -DB_HOST=localhost -DB_NAME=vnode2 -DB_USER=2roor -DB_PASS=s1mpl3 - -######### Validator -# encrypted private key file -VALIDATOR_PRIVATE_KEY_FILE=validator_eth_key.json -# ! do not store this password on DISK in production, use only as ENV var -VALIDATOR_PRIVATE_KEY_PASS=test - -VALIDATOR_RPC_ENDPOINT=http://localhost:8545 -VALIDATOR_RPC_NETWORK=1337 -# push token smart contract -VALIDATOR_PUSH_TOKEN_ADDRESS=0x5FbDB2315678afecb367f032d93F642f64180aa3 -# validator smart contract -VALIDATOR_CONTRACT_ADDRESS=0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9 -# storage smart contract -STORAGE_CONTRACT_ADDRESS=0x0165878A594ca255338adfa4d48449f69242Eb8F - -# development -# log sql -LOG_SQL_STATEMENTS=true -# no http handler starts -VALIDATOR_DISABLE_ALL_SERVICES=true -# do not fetch blockchain data -VALIDATOR_DISABLE_HISTORY_SYNC=true -# write logs -VALIDATOR_DEBUG_LOG=true -# do not validate payload -VALIDATOR_SKIP_PAYLOAD_VERIFICATION=true -# do not rate limit -VALIDATOR_SKIP_RATE_LIMITER=true -# write custom logs for every query -VALIDATOR_HTTP_LOG=true -# random tokens live forever -VALIDATOR_DISABLE_TOKEN_TIMEOUT=true -######## Validator ENDS - -BLOCK_SCHEDULE=*/15 * * * * * \ No newline at end of file diff --git a/push-docker/v03/.env b/push-docker/v03/.env deleted file mode 100644 index b0a657d..0000000 --- a/push-docker/v03/.env +++ /dev/null @@ -1,47 +0,0 @@ -######### ENVIRONMENT -PORT=4003 -PUSH_NODES_NET=DEV -RUNNING_ON_MACHINE=mac -LOG_LEVEL=debug - -# DATABASE -DB_HOST=localhost -DB_NAME=vnode3 -DB_USER=2roor -DB_PASS=s1mpl3 - -######### Validator -# encrypted private key file -VALIDATOR_PRIVATE_KEY_FILE=validator_eth_key.json -# ! do not store this password on DISK in production, use only as ENV var -VALIDATOR_PRIVATE_KEY_PASS=test - -VALIDATOR_RPC_ENDPOINT=http://localhost:8545 -VALIDATOR_RPC_NETWORK=1337 -# push token smart contract -VALIDATOR_PUSH_TOKEN_ADDRESS=0x5FbDB2315678afecb367f032d93F642f64180aa3 -# validator smart contract -VALIDATOR_CONTRACT_ADDRESS=0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9 -# storage smart contract -STORAGE_CONTRACT_ADDRESS=0x0165878A594ca255338adfa4d48449f69242Eb8F - -# development -# log sql -LOG_SQL_STATEMENTS=true -# no http handler starts -VALIDATOR_DISABLE_ALL_SERVICES=true -# do not fetch blockchain data -VALIDATOR_DISABLE_HISTORY_SYNC=true -# write logs -VALIDATOR_DEBUG_LOG=true -# do not validate payload -VALIDATOR_SKIP_PAYLOAD_VERIFICATION=true -# do not rate limit -VALIDATOR_SKIP_RATE_LIMITER=true -# write custom logs for every query -VALIDATOR_HTTP_LOG=true -# random tokens live forever -VALIDATOR_DISABLE_TOKEN_TIMEOUT=true -######## Validator ENDS - -BLOCK_SCHEDULE=*/15 * * * * * \ No newline at end of file diff --git a/src/generated/push/block_pb.d.ts b/src/generated/push/block_pb.d.ts new file mode 100644 index 0000000..3135ecd --- /dev/null +++ b/src/generated/push/block_pb.d.ts @@ -0,0 +1,541 @@ +// package: push +// file: push/block.proto + +import * as jspb from "google-protobuf"; + +export class DidMapping extends jspb.Message { + getDidmappingMap(): jspb.Map; + clearDidmappingMap(): void; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): DidMapping.AsObject; + static toObject(includeInstance: boolean, msg: DidMapping): DidMapping.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: DidMapping, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): DidMapping; + static deserializeBinaryFromReader(message: DidMapping, reader: jspb.BinaryReader): DidMapping; +} + +export namespace DidMapping { + export type AsObject = { + didmappingMap: Array<[string, string]>, + } +} + +export class TxValidatorData extends jspb.Message { + getVote(): VoteMap[keyof VoteMap]; + setVote(value: VoteMap[keyof VoteMap]): void; + + hasDidmapping(): boolean; + clearDidmapping(): void; + getDidmapping(): DidMapping | undefined; + setDidmapping(value?: DidMapping): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): TxValidatorData.AsObject; + static toObject(includeInstance: boolean, msg: TxValidatorData): TxValidatorData.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: TxValidatorData, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): TxValidatorData; + static deserializeBinaryFromReader(message: TxValidatorData, reader: jspb.BinaryReader): TxValidatorData; +} + +export namespace TxValidatorData { + export type AsObject = { + vote: VoteMap[keyof VoteMap], + didmapping?: DidMapping.AsObject, + } +} + +export class TxAttestorData extends jspb.Message { + getVote(): VoteMap[keyof VoteMap]; + setVote(value: VoteMap[keyof VoteMap]): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): TxAttestorData.AsObject; + static toObject(includeInstance: boolean, msg: TxAttestorData): TxAttestorData.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: TxAttestorData, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): TxAttestorData; + static deserializeBinaryFromReader(message: TxAttestorData, reader: jspb.BinaryReader): TxAttestorData; +} + +export namespace TxAttestorData { + export type AsObject = { + vote: VoteMap[keyof VoteMap], + } +} + +export class TransactionObj extends jspb.Message { + hasTx(): boolean; + clearTx(): void; + getTx(): Transaction | undefined; + setTx(value?: Transaction): void; + + hasValidatordata(): boolean; + clearValidatordata(): void; + getValidatordata(): TxValidatorData | undefined; + setValidatordata(value?: TxValidatorData): void; + + clearAttestordataList(): void; + getAttestordataList(): Array; + setAttestordataList(value: Array): void; + addAttestordata(value?: TxAttestorData, index?: number): TxAttestorData; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): TransactionObj.AsObject; + static toObject(includeInstance: boolean, msg: TransactionObj): TransactionObj.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: TransactionObj, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): TransactionObj; + static deserializeBinaryFromReader(message: TransactionObj, reader: jspb.BinaryReader): TransactionObj; +} + +export namespace TransactionObj { + export type AsObject = { + tx?: Transaction.AsObject, + validatordata?: TxValidatorData.AsObject, + attestordataList: Array, + } +} + +export class Signer extends jspb.Message { + getSig(): Uint8Array | string; + getSig_asU8(): Uint8Array; + getSig_asB64(): string; + setSig(value: Uint8Array | string): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Signer.AsObject; + static toObject(includeInstance: boolean, msg: Signer): Signer.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: Signer, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Signer; + static deserializeBinaryFromReader(message: Signer, reader: jspb.BinaryReader): Signer; +} + +export namespace Signer { + export type AsObject = { + sig: Uint8Array | string, + } +} + +export class Block extends jspb.Message { + getTs(): number; + setTs(value: number): void; + + getAttesttoken(): Uint8Array | string; + getAttesttoken_asU8(): Uint8Array; + getAttesttoken_asB64(): string; + setAttesttoken(value: Uint8Array | string): void; + + clearTxobjList(): void; + getTxobjList(): Array; + setTxobjList(value: Array): void; + addTxobj(value?: TransactionObj, index?: number): TransactionObj; + + clearSignersList(): void; + getSignersList(): Array; + setSignersList(value: Array): void; + addSigners(value?: Signer, index?: number): Signer; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Block.AsObject; + static toObject(includeInstance: boolean, msg: Block): Block.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: Block, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Block; + static deserializeBinaryFromReader(message: Block, reader: jspb.BinaryReader): Block; +} + +export namespace Block { + export type AsObject = { + ts: number, + attesttoken: Uint8Array | string, + txobjList: Array, + signersList: Array, + } +} + +export class AttestorReply extends jspb.Message { + clearAttestordataList(): void; + getAttestordataList(): Array; + setAttestordataList(value: Array): void; + addAttestordata(value?: TxAttestorData, index?: number): TxAttestorData; + + hasSigner(): boolean; + clearSigner(): void; + getSigner(): Signer | undefined; + setSigner(value?: Signer): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): AttestorReply.AsObject; + static toObject(includeInstance: boolean, msg: AttestorReply): AttestorReply.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: AttestorReply, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): AttestorReply; + static deserializeBinaryFromReader(message: AttestorReply, reader: jspb.BinaryReader): AttestorReply; +} + +export namespace AttestorReply { + export type AsObject = { + attestordataList: Array, + signer?: Signer.AsObject, + } +} + +export class AttestorReplies extends jspb.Message { + clearAttestationsList(): void; + getAttestationsList(): Array; + setAttestationsList(value: Array): void; + addAttestations(value?: AttestorReply, index?: number): AttestorReply; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): AttestorReplies.AsObject; + static toObject(includeInstance: boolean, msg: AttestorReplies): AttestorReplies.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: AttestorReplies, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): AttestorReplies; + static deserializeBinaryFromReader(message: AttestorReplies, reader: jspb.BinaryReader): AttestorReplies; +} + +export namespace AttestorReplies { + export type AsObject = { + attestationsList: Array, + } +} + +export class Transaction extends jspb.Message { + getType(): number; + setType(value: number): void; + + getCategory(): string; + setCategory(value: string): void; + + getSender(): string; + setSender(value: string): void; + + clearRecipientsList(): void; + getRecipientsList(): Array; + setRecipientsList(value: Array): void; + addRecipients(value: string, index?: number): string; + + getData(): Uint8Array | string; + getData_asU8(): Uint8Array; + getData_asB64(): string; + setData(value: Uint8Array | string): void; + + getSalt(): Uint8Array | string; + getSalt_asU8(): Uint8Array; + getSalt_asB64(): string; + setSalt(value: Uint8Array | string): void; + + getApitoken(): Uint8Array | string; + getApitoken_asU8(): Uint8Array; + getApitoken_asB64(): string; + setApitoken(value: Uint8Array | string): void; + + getFee(): string; + setFee(value: string): void; + + getSignature(): Uint8Array | string; + getSignature_asU8(): Uint8Array; + getSignature_asB64(): string; + setSignature(value: Uint8Array | string): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Transaction.AsObject; + static toObject(includeInstance: boolean, msg: Transaction): Transaction.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: Transaction, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Transaction; + static deserializeBinaryFromReader(message: Transaction, reader: jspb.BinaryReader): Transaction; +} + +export namespace Transaction { + export type AsObject = { + type: number, + category: string, + sender: string, + recipientsList: Array, + data: Uint8Array | string, + salt: Uint8Array | string, + apitoken: Uint8Array | string, + fee: string, + signature: Uint8Array | string, + } +} + +export class InitDid extends jspb.Message { + getDid(): string; + setDid(value: string): void; + + getMasterpubkey(): string; + setMasterpubkey(value: string): void; + + getDerivedkeyindex(): number; + setDerivedkeyindex(value: number): void; + + getDerivedpubkey(): string; + setDerivedpubkey(value: string): void; + + getEncderivedprivkey(): string; + setEncderivedprivkey(value: string): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): InitDid.AsObject; + static toObject(includeInstance: boolean, msg: InitDid): InitDid.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: InitDid, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): InitDid; + static deserializeBinaryFromReader(message: InitDid, reader: jspb.BinaryReader): InitDid; +} + +export namespace InitDid { + export type AsObject = { + did: string, + masterpubkey: string, + derivedkeyindex: number, + derivedpubkey: string, + encderivedprivkey: string, + } +} + +export class SessionKeyAction extends jspb.Message { + getKeyindex(): number; + setKeyindex(value: number): void; + + getKeyaddress(): string; + setKeyaddress(value: string): void; + + getAction(): KeyActionMap[keyof KeyActionMap]; + setAction(value: KeyActionMap[keyof KeyActionMap]): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): SessionKeyAction.AsObject; + static toObject(includeInstance: boolean, msg: SessionKeyAction): SessionKeyAction.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: SessionKeyAction, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): SessionKeyAction; + static deserializeBinaryFromReader(message: SessionKeyAction, reader: jspb.BinaryReader): SessionKeyAction; +} + +export namespace SessionKeyAction { + export type AsObject = { + keyindex: number, + keyaddress: string, + action: KeyActionMap[keyof KeyActionMap], + } +} + +export class Notification extends jspb.Message { + getApp(): string; + setApp(value: string): void; + + getTitle(): string; + setTitle(value: string): void; + + getBody(): string; + setBody(value: string): void; + + getChannelurl(): string; + setChannelurl(value: string): void; + + getActionurl(): string; + setActionurl(value: string): void; + + getImg(): string; + setImg(value: string): void; + + getIcon(): string; + setIcon(value: string): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Notification.AsObject; + static toObject(includeInstance: boolean, msg: Notification): Notification.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: Notification, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Notification; + static deserializeBinaryFromReader(message: Notification, reader: jspb.BinaryReader): Notification; +} + +export namespace Notification { + export type AsObject = { + app: string, + title: string, + body: string, + channelurl: string, + actionurl: string, + img: string, + icon: string, + } +} + +export class EncryptionDetails extends jspb.Message { + getRecipientdid(): string; + setRecipientdid(value: string): void; + + getType(): EncryptionTypeMap[keyof EncryptionTypeMap]; + setType(value: EncryptionTypeMap[keyof EncryptionTypeMap]): void; + + getKeyindex(): number; + setKeyindex(value: number): void; + + getEncryptedsecret(): Uint8Array | string; + getEncryptedsecret_asU8(): Uint8Array; + getEncryptedsecret_asB64(): string; + setEncryptedsecret(value: Uint8Array | string): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): EncryptionDetails.AsObject; + static toObject(includeInstance: boolean, msg: EncryptionDetails): EncryptionDetails.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: EncryptionDetails, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): EncryptionDetails; + static deserializeBinaryFromReader(message: EncryptionDetails, reader: jspb.BinaryReader): EncryptionDetails; +} + +export namespace EncryptionDetails { + export type AsObject = { + recipientdid: string, + type: EncryptionTypeMap[keyof EncryptionTypeMap], + keyindex: number, + encryptedsecret: Uint8Array | string, + } +} + +export class EncryptedNotif extends jspb.Message { + getEncryptednotif(): Uint8Array | string; + getEncryptednotif_asU8(): Uint8Array; + getEncryptednotif_asB64(): string; + setEncryptednotif(value: Uint8Array | string): void; + + hasSourceenc(): boolean; + clearSourceenc(): void; + getSourceenc(): EncryptionDetails | undefined; + setSourceenc(value?: EncryptionDetails): void; + + clearTargetencList(): void; + getTargetencList(): Array; + setTargetencList(value: Array): void; + addTargetenc(value?: EncryptionDetails, index?: number): EncryptionDetails; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): EncryptedNotif.AsObject; + static toObject(includeInstance: boolean, msg: EncryptedNotif): EncryptedNotif.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: EncryptedNotif, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): EncryptedNotif; + static deserializeBinaryFromReader(message: EncryptedNotif, reader: jspb.BinaryReader): EncryptedNotif; +} + +export namespace EncryptedNotif { + export type AsObject = { + encryptednotif: Uint8Array | string, + sourceenc?: EncryptionDetails.AsObject, + targetencList: Array, + } +} + +export class Attachment extends jspb.Message { + getFilename(): string; + setFilename(value: string): void; + + getType(): string; + setType(value: string): void; + + getContent(): string; + setContent(value: string): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Attachment.AsObject; + static toObject(includeInstance: boolean, msg: Attachment): Attachment.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: Attachment, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Attachment; + static deserializeBinaryFromReader(message: Attachment, reader: jspb.BinaryReader): Attachment; +} + +export namespace Attachment { + export type AsObject = { + filename: string, + type: string, + content: string, + } +} + +export class Email extends jspb.Message { + getSubject(): string; + setSubject(value: string): void; + + getBody(): string; + setBody(value: string): void; + + clearAttachmentsList(): void; + getAttachmentsList(): Array; + setAttachmentsList(value: Array): void; + addAttachments(value?: Attachment, index?: number): Attachment; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Email.AsObject; + static toObject(includeInstance: boolean, msg: Email): Email.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: Email, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Email; + static deserializeBinaryFromReader(message: Email, reader: jspb.BinaryReader): Email; +} + +export namespace Email { + export type AsObject = { + subject: string, + body: string, + attachmentsList: Array, + } +} + +export interface RoleMap { + ROLE_UNSPECIFIED: 0; + VALIDATOR: 1; + ATTESTER: 2; +} + +export const Role: RoleMap; + +export interface VoteMap { + VOTE_UNSPECIFIED: 0; + ACCEPTED: 1; + REJECTED: 2; +} + +export const Vote: VoteMap; + +export interface KeyActionMap { + UNSPECIFIED: 0; + PUBLISH_KEY: 1; + REVOKE_KEY: 2; +} + +export const KeyAction: KeyActionMap; + +export interface EncryptionTypeMap { + ENCRYPTION_UNSPECIFIED: 0; + ECC: 1; +} + +export const EncryptionType: EncryptionTypeMap; + diff --git a/src/generated/push/block_pb.js b/src/generated/push/block_pb.js new file mode 100644 index 0000000..05d5104 --- /dev/null +++ b/src/generated/push/block_pb.js @@ -0,0 +1,4098 @@ +// source: push/block.proto +/** + * @fileoverview + * @enhanceable + * @suppress {missingRequire} reports error on implicit type usages. + * @suppress {messageConventions} JS Compiler reports an error if a variable or + * field starts with 'MSG_' and isn't a translatable message. + * @public + */ +// GENERATED CODE -- DO NOT EDIT! +/* eslint-disable */ +// @ts-nocheck + +var jspb = require('google-protobuf'); +var goog = jspb; +var global = (function() { return this || window || global || self || Function('return this')(); }).call(null); + +goog.exportSymbol('proto.push.Attachment', null, global); +goog.exportSymbol('proto.push.AttestorReplies', null, global); +goog.exportSymbol('proto.push.AttestorReply', null, global); +goog.exportSymbol('proto.push.Block', null, global); +goog.exportSymbol('proto.push.DidMapping', null, global); +goog.exportSymbol('proto.push.Email', null, global); +goog.exportSymbol('proto.push.EncryptedNotif', null, global); +goog.exportSymbol('proto.push.EncryptionDetails', null, global); +goog.exportSymbol('proto.push.EncryptionType', null, global); +goog.exportSymbol('proto.push.InitDid', null, global); +goog.exportSymbol('proto.push.KeyAction', null, global); +goog.exportSymbol('proto.push.Notification', null, global); +goog.exportSymbol('proto.push.Role', null, global); +goog.exportSymbol('proto.push.SessionKeyAction', null, global); +goog.exportSymbol('proto.push.Signer', null, global); +goog.exportSymbol('proto.push.Transaction', null, global); +goog.exportSymbol('proto.push.TransactionObj', null, global); +goog.exportSymbol('proto.push.TxAttestorData', null, global); +goog.exportSymbol('proto.push.TxValidatorData', null, global); +goog.exportSymbol('proto.push.Vote', null, global); +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.push.DidMapping = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.push.DidMapping, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.push.DidMapping.displayName = 'proto.push.DidMapping'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.push.TxValidatorData = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.push.TxValidatorData, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.push.TxValidatorData.displayName = 'proto.push.TxValidatorData'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.push.TxAttestorData = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.push.TxAttestorData, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.push.TxAttestorData.displayName = 'proto.push.TxAttestorData'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.push.TransactionObj = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.push.TransactionObj.repeatedFields_, null); +}; +goog.inherits(proto.push.TransactionObj, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.push.TransactionObj.displayName = 'proto.push.TransactionObj'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.push.Signer = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.push.Signer, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.push.Signer.displayName = 'proto.push.Signer'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.push.Block = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.push.Block.repeatedFields_, null); +}; +goog.inherits(proto.push.Block, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.push.Block.displayName = 'proto.push.Block'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.push.AttestorReply = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.push.AttestorReply.repeatedFields_, null); +}; +goog.inherits(proto.push.AttestorReply, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.push.AttestorReply.displayName = 'proto.push.AttestorReply'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.push.AttestorReplies = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.push.AttestorReplies.repeatedFields_, null); +}; +goog.inherits(proto.push.AttestorReplies, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.push.AttestorReplies.displayName = 'proto.push.AttestorReplies'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.push.Transaction = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.push.Transaction.repeatedFields_, null); +}; +goog.inherits(proto.push.Transaction, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.push.Transaction.displayName = 'proto.push.Transaction'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.push.InitDid = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.push.InitDid, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.push.InitDid.displayName = 'proto.push.InitDid'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.push.SessionKeyAction = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.push.SessionKeyAction, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.push.SessionKeyAction.displayName = 'proto.push.SessionKeyAction'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.push.Notification = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.push.Notification, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.push.Notification.displayName = 'proto.push.Notification'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.push.EncryptionDetails = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.push.EncryptionDetails, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.push.EncryptionDetails.displayName = 'proto.push.EncryptionDetails'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.push.EncryptedNotif = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.push.EncryptedNotif.repeatedFields_, null); +}; +goog.inherits(proto.push.EncryptedNotif, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.push.EncryptedNotif.displayName = 'proto.push.EncryptedNotif'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.push.Attachment = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.push.Attachment, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.push.Attachment.displayName = 'proto.push.Attachment'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.push.Email = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.push.Email.repeatedFields_, null); +}; +goog.inherits(proto.push.Email, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.push.Email.displayName = 'proto.push.Email'; +} + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.push.DidMapping.prototype.toObject = function(opt_includeInstance) { + return proto.push.DidMapping.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.push.DidMapping} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.push.DidMapping.toObject = function(includeInstance, msg) { + var f, obj = { + didmappingMap: (f = msg.getDidmappingMap()) ? f.toObject(includeInstance, undefined) : [] + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.push.DidMapping} + */ +proto.push.DidMapping.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.push.DidMapping; + return proto.push.DidMapping.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.push.DidMapping} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.push.DidMapping} + */ +proto.push.DidMapping.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = msg.getDidmappingMap(); + reader.readMessage(value, function(message, reader) { + jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readString, null, "", ""); + }); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.push.DidMapping.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.push.DidMapping.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.push.DidMapping} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.push.DidMapping.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getDidmappingMap(true); + if (f && f.getLength() > 0) { + f.serializeBinary(1, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeString); + } +}; + + +/** + * map didMapping = 1; + * @param {boolean=} opt_noLazyCreate Do not create the map if + * empty, instead returning `undefined` + * @return {!jspb.Map} + */ +proto.push.DidMapping.prototype.getDidmappingMap = function(opt_noLazyCreate) { + return /** @type {!jspb.Map} */ ( + jspb.Message.getMapField(this, 1, opt_noLazyCreate, + null)); +}; + + +/** + * Clears values from the map. The map will be non-null. + * @return {!proto.push.DidMapping} returns this + */ +proto.push.DidMapping.prototype.clearDidmappingMap = function() { + this.getDidmappingMap().clear(); + return this;}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.push.TxValidatorData.prototype.toObject = function(opt_includeInstance) { + return proto.push.TxValidatorData.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.push.TxValidatorData} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.push.TxValidatorData.toObject = function(includeInstance, msg) { + var f, obj = { + vote: jspb.Message.getFieldWithDefault(msg, 1, 0), + didmapping: (f = msg.getDidmapping()) && proto.push.DidMapping.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.push.TxValidatorData} + */ +proto.push.TxValidatorData.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.push.TxValidatorData; + return proto.push.TxValidatorData.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.push.TxValidatorData} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.push.TxValidatorData} + */ +proto.push.TxValidatorData.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!proto.push.Vote} */ (reader.readEnum()); + msg.setVote(value); + break; + case 2: + var value = new proto.push.DidMapping; + reader.readMessage(value,proto.push.DidMapping.deserializeBinaryFromReader); + msg.setDidmapping(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.push.TxValidatorData.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.push.TxValidatorData.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.push.TxValidatorData} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.push.TxValidatorData.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getVote(); + if (f !== 0.0) { + writer.writeEnum( + 1, + f + ); + } + f = message.getDidmapping(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.push.DidMapping.serializeBinaryToWriter + ); + } +}; + + +/** + * optional Vote vote = 1; + * @return {!proto.push.Vote} + */ +proto.push.TxValidatorData.prototype.getVote = function() { + return /** @type {!proto.push.Vote} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {!proto.push.Vote} value + * @return {!proto.push.TxValidatorData} returns this + */ +proto.push.TxValidatorData.prototype.setVote = function(value) { + return jspb.Message.setProto3EnumField(this, 1, value); +}; + + +/** + * optional DidMapping didMapping = 2; + * @return {?proto.push.DidMapping} + */ +proto.push.TxValidatorData.prototype.getDidmapping = function() { + return /** @type{?proto.push.DidMapping} */ ( + jspb.Message.getWrapperField(this, proto.push.DidMapping, 2)); +}; + + +/** + * @param {?proto.push.DidMapping|undefined} value + * @return {!proto.push.TxValidatorData} returns this +*/ +proto.push.TxValidatorData.prototype.setDidmapping = function(value) { + return jspb.Message.setWrapperField(this, 2, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.push.TxValidatorData} returns this + */ +proto.push.TxValidatorData.prototype.clearDidmapping = function() { + return this.setDidmapping(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.push.TxValidatorData.prototype.hasDidmapping = function() { + return jspb.Message.getField(this, 2) != null; +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.push.TxAttestorData.prototype.toObject = function(opt_includeInstance) { + return proto.push.TxAttestorData.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.push.TxAttestorData} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.push.TxAttestorData.toObject = function(includeInstance, msg) { + var f, obj = { + vote: jspb.Message.getFieldWithDefault(msg, 1, 0) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.push.TxAttestorData} + */ +proto.push.TxAttestorData.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.push.TxAttestorData; + return proto.push.TxAttestorData.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.push.TxAttestorData} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.push.TxAttestorData} + */ +proto.push.TxAttestorData.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!proto.push.Vote} */ (reader.readEnum()); + msg.setVote(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.push.TxAttestorData.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.push.TxAttestorData.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.push.TxAttestorData} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.push.TxAttestorData.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getVote(); + if (f !== 0.0) { + writer.writeEnum( + 1, + f + ); + } +}; + + +/** + * optional Vote vote = 1; + * @return {!proto.push.Vote} + */ +proto.push.TxAttestorData.prototype.getVote = function() { + return /** @type {!proto.push.Vote} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {!proto.push.Vote} value + * @return {!proto.push.TxAttestorData} returns this + */ +proto.push.TxAttestorData.prototype.setVote = function(value) { + return jspb.Message.setProto3EnumField(this, 1, value); +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.push.TransactionObj.repeatedFields_ = [3]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.push.TransactionObj.prototype.toObject = function(opt_includeInstance) { + return proto.push.TransactionObj.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.push.TransactionObj} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.push.TransactionObj.toObject = function(includeInstance, msg) { + var f, obj = { + tx: (f = msg.getTx()) && proto.push.Transaction.toObject(includeInstance, f), + validatordata: (f = msg.getValidatordata()) && proto.push.TxValidatorData.toObject(includeInstance, f), + attestordataList: jspb.Message.toObjectList(msg.getAttestordataList(), + proto.push.TxAttestorData.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.push.TransactionObj} + */ +proto.push.TransactionObj.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.push.TransactionObj; + return proto.push.TransactionObj.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.push.TransactionObj} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.push.TransactionObj} + */ +proto.push.TransactionObj.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.push.Transaction; + reader.readMessage(value,proto.push.Transaction.deserializeBinaryFromReader); + msg.setTx(value); + break; + case 2: + var value = new proto.push.TxValidatorData; + reader.readMessage(value,proto.push.TxValidatorData.deserializeBinaryFromReader); + msg.setValidatordata(value); + break; + case 3: + var value = new proto.push.TxAttestorData; + reader.readMessage(value,proto.push.TxAttestorData.deserializeBinaryFromReader); + msg.addAttestordata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.push.TransactionObj.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.push.TransactionObj.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.push.TransactionObj} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.push.TransactionObj.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getTx(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.push.Transaction.serializeBinaryToWriter + ); + } + f = message.getValidatordata(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.push.TxValidatorData.serializeBinaryToWriter + ); + } + f = message.getAttestordataList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 3, + f, + proto.push.TxAttestorData.serializeBinaryToWriter + ); + } +}; + + +/** + * optional Transaction tx = 1; + * @return {?proto.push.Transaction} + */ +proto.push.TransactionObj.prototype.getTx = function() { + return /** @type{?proto.push.Transaction} */ ( + jspb.Message.getWrapperField(this, proto.push.Transaction, 1)); +}; + + +/** + * @param {?proto.push.Transaction|undefined} value + * @return {!proto.push.TransactionObj} returns this +*/ +proto.push.TransactionObj.prototype.setTx = function(value) { + return jspb.Message.setWrapperField(this, 1, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.push.TransactionObj} returns this + */ +proto.push.TransactionObj.prototype.clearTx = function() { + return this.setTx(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.push.TransactionObj.prototype.hasTx = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional TxValidatorData validatorData = 2; + * @return {?proto.push.TxValidatorData} + */ +proto.push.TransactionObj.prototype.getValidatordata = function() { + return /** @type{?proto.push.TxValidatorData} */ ( + jspb.Message.getWrapperField(this, proto.push.TxValidatorData, 2)); +}; + + +/** + * @param {?proto.push.TxValidatorData|undefined} value + * @return {!proto.push.TransactionObj} returns this +*/ +proto.push.TransactionObj.prototype.setValidatordata = function(value) { + return jspb.Message.setWrapperField(this, 2, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.push.TransactionObj} returns this + */ +proto.push.TransactionObj.prototype.clearValidatordata = function() { + return this.setValidatordata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.push.TransactionObj.prototype.hasValidatordata = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * repeated TxAttestorData attestorData = 3; + * @return {!Array} + */ +proto.push.TransactionObj.prototype.getAttestordataList = function() { + return /** @type{!Array} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.push.TxAttestorData, 3)); +}; + + +/** + * @param {!Array} value + * @return {!proto.push.TransactionObj} returns this +*/ +proto.push.TransactionObj.prototype.setAttestordataList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 3, value); +}; + + +/** + * @param {!proto.push.TxAttestorData=} opt_value + * @param {number=} opt_index + * @return {!proto.push.TxAttestorData} + */ +proto.push.TransactionObj.prototype.addAttestordata = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 3, opt_value, proto.push.TxAttestorData, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.push.TransactionObj} returns this + */ +proto.push.TransactionObj.prototype.clearAttestordataList = function() { + return this.setAttestordataList([]); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.push.Signer.prototype.toObject = function(opt_includeInstance) { + return proto.push.Signer.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.push.Signer} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.push.Signer.toObject = function(includeInstance, msg) { + var f, obj = { + sig: msg.getSig_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.push.Signer} + */ +proto.push.Signer.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.push.Signer; + return proto.push.Signer.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.push.Signer} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.push.Signer} + */ +proto.push.Signer.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setSig(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.push.Signer.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.push.Signer.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.push.Signer} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.push.Signer.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getSig_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } +}; + + +/** + * optional bytes sig = 1; + * @return {!(string|Uint8Array)} + */ +proto.push.Signer.prototype.getSig = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes sig = 1; + * This is a type-conversion wrapper around `getSig()` + * @return {string} + */ +proto.push.Signer.prototype.getSig_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getSig())); +}; + + +/** + * optional bytes sig = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getSig()` + * @return {!Uint8Array} + */ +proto.push.Signer.prototype.getSig_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getSig())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.push.Signer} returns this + */ +proto.push.Signer.prototype.setSig = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.push.Block.repeatedFields_ = [2,3]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.push.Block.prototype.toObject = function(opt_includeInstance) { + return proto.push.Block.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.push.Block} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.push.Block.toObject = function(includeInstance, msg) { + var f, obj = { + ts: jspb.Message.getFieldWithDefault(msg, 1, 0), + attesttoken: msg.getAttesttoken_asB64(), + txobjList: jspb.Message.toObjectList(msg.getTxobjList(), + proto.push.TransactionObj.toObject, includeInstance), + signersList: jspb.Message.toObjectList(msg.getSignersList(), + proto.push.Signer.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.push.Block} + */ +proto.push.Block.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.push.Block; + return proto.push.Block.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.push.Block} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.push.Block} + */ +proto.push.Block.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readUint64()); + msg.setTs(value); + break; + case 4: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setAttesttoken(value); + break; + case 2: + var value = new proto.push.TransactionObj; + reader.readMessage(value,proto.push.TransactionObj.deserializeBinaryFromReader); + msg.addTxobj(value); + break; + case 3: + var value = new proto.push.Signer; + reader.readMessage(value,proto.push.Signer.deserializeBinaryFromReader); + msg.addSigners(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.push.Block.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.push.Block.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.push.Block} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.push.Block.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getTs(); + if (f !== 0) { + writer.writeUint64( + 1, + f + ); + } + f = message.getAttesttoken_asU8(); + if (f.length > 0) { + writer.writeBytes( + 4, + f + ); + } + f = message.getTxobjList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 2, + f, + proto.push.TransactionObj.serializeBinaryToWriter + ); + } + f = message.getSignersList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 3, + f, + proto.push.Signer.serializeBinaryToWriter + ); + } +}; + + +/** + * optional uint64 ts = 1; + * @return {number} + */ +proto.push.Block.prototype.getTs = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.push.Block} returns this + */ +proto.push.Block.prototype.setTs = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); +}; + + +/** + * optional bytes attestToken = 4; + * @return {!(string|Uint8Array)} + */ +proto.push.Block.prototype.getAttesttoken = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +}; + + +/** + * optional bytes attestToken = 4; + * This is a type-conversion wrapper around `getAttesttoken()` + * @return {string} + */ +proto.push.Block.prototype.getAttesttoken_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getAttesttoken())); +}; + + +/** + * optional bytes attestToken = 4; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getAttesttoken()` + * @return {!Uint8Array} + */ +proto.push.Block.prototype.getAttesttoken_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getAttesttoken())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.push.Block} returns this + */ +proto.push.Block.prototype.setAttesttoken = function(value) { + return jspb.Message.setProto3BytesField(this, 4, value); +}; + + +/** + * repeated TransactionObj txObj = 2; + * @return {!Array} + */ +proto.push.Block.prototype.getTxobjList = function() { + return /** @type{!Array} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.push.TransactionObj, 2)); +}; + + +/** + * @param {!Array} value + * @return {!proto.push.Block} returns this +*/ +proto.push.Block.prototype.setTxobjList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 2, value); +}; + + +/** + * @param {!proto.push.TransactionObj=} opt_value + * @param {number=} opt_index + * @return {!proto.push.TransactionObj} + */ +proto.push.Block.prototype.addTxobj = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 2, opt_value, proto.push.TransactionObj, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.push.Block} returns this + */ +proto.push.Block.prototype.clearTxobjList = function() { + return this.setTxobjList([]); +}; + + +/** + * repeated Signer signers = 3; + * @return {!Array} + */ +proto.push.Block.prototype.getSignersList = function() { + return /** @type{!Array} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.push.Signer, 3)); +}; + + +/** + * @param {!Array} value + * @return {!proto.push.Block} returns this +*/ +proto.push.Block.prototype.setSignersList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 3, value); +}; + + +/** + * @param {!proto.push.Signer=} opt_value + * @param {number=} opt_index + * @return {!proto.push.Signer} + */ +proto.push.Block.prototype.addSigners = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 3, opt_value, proto.push.Signer, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.push.Block} returns this + */ +proto.push.Block.prototype.clearSignersList = function() { + return this.setSignersList([]); +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.push.AttestorReply.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.push.AttestorReply.prototype.toObject = function(opt_includeInstance) { + return proto.push.AttestorReply.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.push.AttestorReply} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.push.AttestorReply.toObject = function(includeInstance, msg) { + var f, obj = { + attestordataList: jspb.Message.toObjectList(msg.getAttestordataList(), + proto.push.TxAttestorData.toObject, includeInstance), + signer: (f = msg.getSigner()) && proto.push.Signer.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.push.AttestorReply} + */ +proto.push.AttestorReply.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.push.AttestorReply; + return proto.push.AttestorReply.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.push.AttestorReply} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.push.AttestorReply} + */ +proto.push.AttestorReply.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.push.TxAttestorData; + reader.readMessage(value,proto.push.TxAttestorData.deserializeBinaryFromReader); + msg.addAttestordata(value); + break; + case 2: + var value = new proto.push.Signer; + reader.readMessage(value,proto.push.Signer.deserializeBinaryFromReader); + msg.setSigner(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.push.AttestorReply.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.push.AttestorReply.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.push.AttestorReply} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.push.AttestorReply.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getAttestordataList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 1, + f, + proto.push.TxAttestorData.serializeBinaryToWriter + ); + } + f = message.getSigner(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.push.Signer.serializeBinaryToWriter + ); + } +}; + + +/** + * repeated TxAttestorData attestorData = 1; + * @return {!Array} + */ +proto.push.AttestorReply.prototype.getAttestordataList = function() { + return /** @type{!Array} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.push.TxAttestorData, 1)); +}; + + +/** + * @param {!Array} value + * @return {!proto.push.AttestorReply} returns this +*/ +proto.push.AttestorReply.prototype.setAttestordataList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.push.TxAttestorData=} opt_value + * @param {number=} opt_index + * @return {!proto.push.TxAttestorData} + */ +proto.push.AttestorReply.prototype.addAttestordata = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.push.TxAttestorData, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.push.AttestorReply} returns this + */ +proto.push.AttestorReply.prototype.clearAttestordataList = function() { + return this.setAttestordataList([]); +}; + + +/** + * optional Signer signer = 2; + * @return {?proto.push.Signer} + */ +proto.push.AttestorReply.prototype.getSigner = function() { + return /** @type{?proto.push.Signer} */ ( + jspb.Message.getWrapperField(this, proto.push.Signer, 2)); +}; + + +/** + * @param {?proto.push.Signer|undefined} value + * @return {!proto.push.AttestorReply} returns this +*/ +proto.push.AttestorReply.prototype.setSigner = function(value) { + return jspb.Message.setWrapperField(this, 2, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.push.AttestorReply} returns this + */ +proto.push.AttestorReply.prototype.clearSigner = function() { + return this.setSigner(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.push.AttestorReply.prototype.hasSigner = function() { + return jspb.Message.getField(this, 2) != null; +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.push.AttestorReplies.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.push.AttestorReplies.prototype.toObject = function(opt_includeInstance) { + return proto.push.AttestorReplies.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.push.AttestorReplies} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.push.AttestorReplies.toObject = function(includeInstance, msg) { + var f, obj = { + attestationsList: jspb.Message.toObjectList(msg.getAttestationsList(), + proto.push.AttestorReply.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.push.AttestorReplies} + */ +proto.push.AttestorReplies.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.push.AttestorReplies; + return proto.push.AttestorReplies.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.push.AttestorReplies} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.push.AttestorReplies} + */ +proto.push.AttestorReplies.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.push.AttestorReply; + reader.readMessage(value,proto.push.AttestorReply.deserializeBinaryFromReader); + msg.addAttestations(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.push.AttestorReplies.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.push.AttestorReplies.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.push.AttestorReplies} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.push.AttestorReplies.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getAttestationsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 1, + f, + proto.push.AttestorReply.serializeBinaryToWriter + ); + } +}; + + +/** + * repeated AttestorReply attestations = 1; + * @return {!Array} + */ +proto.push.AttestorReplies.prototype.getAttestationsList = function() { + return /** @type{!Array} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.push.AttestorReply, 1)); +}; + + +/** + * @param {!Array} value + * @return {!proto.push.AttestorReplies} returns this +*/ +proto.push.AttestorReplies.prototype.setAttestationsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.push.AttestorReply=} opt_value + * @param {number=} opt_index + * @return {!proto.push.AttestorReply} + */ +proto.push.AttestorReplies.prototype.addAttestations = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.push.AttestorReply, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.push.AttestorReplies} returns this + */ +proto.push.AttestorReplies.prototype.clearAttestationsList = function() { + return this.setAttestationsList([]); +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.push.Transaction.repeatedFields_ = [4]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.push.Transaction.prototype.toObject = function(opt_includeInstance) { + return proto.push.Transaction.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.push.Transaction} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.push.Transaction.toObject = function(includeInstance, msg) { + var f, obj = { + type: jspb.Message.getFieldWithDefault(msg, 1, 0), + category: jspb.Message.getFieldWithDefault(msg, 2, ""), + sender: jspb.Message.getFieldWithDefault(msg, 3, ""), + recipientsList: (f = jspb.Message.getRepeatedField(msg, 4)) == null ? undefined : f, + data: msg.getData_asB64(), + salt: msg.getSalt_asB64(), + apitoken: msg.getApitoken_asB64(), + fee: jspb.Message.getFieldWithDefault(msg, 9, ""), + signature: msg.getSignature_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.push.Transaction} + */ +proto.push.Transaction.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.push.Transaction; + return proto.push.Transaction.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.push.Transaction} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.push.Transaction} + */ +proto.push.Transaction.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readUint32()); + msg.setType(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setCategory(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setSender(value); + break; + case 4: + var value = /** @type {string} */ (reader.readString()); + msg.addRecipients(value); + break; + case 5: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setData(value); + break; + case 6: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setSalt(value); + break; + case 7: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setApitoken(value); + break; + case 9: + var value = /** @type {string} */ (reader.readString()); + msg.setFee(value); + break; + case 8: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setSignature(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.push.Transaction.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.push.Transaction.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.push.Transaction} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.push.Transaction.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getType(); + if (f !== 0) { + writer.writeUint32( + 1, + f + ); + } + f = message.getCategory(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getSender(); + if (f.length > 0) { + writer.writeString( + 3, + f + ); + } + f = message.getRecipientsList(); + if (f.length > 0) { + writer.writeRepeatedString( + 4, + f + ); + } + f = message.getData_asU8(); + if (f.length > 0) { + writer.writeBytes( + 5, + f + ); + } + f = message.getSalt_asU8(); + if (f.length > 0) { + writer.writeBytes( + 6, + f + ); + } + f = message.getApitoken_asU8(); + if (f.length > 0) { + writer.writeBytes( + 7, + f + ); + } + f = message.getFee(); + if (f.length > 0) { + writer.writeString( + 9, + f + ); + } + f = message.getSignature_asU8(); + if (f.length > 0) { + writer.writeBytes( + 8, + f + ); + } +}; + + +/** + * optional uint32 type = 1; + * @return {number} + */ +proto.push.Transaction.prototype.getType = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.push.Transaction} returns this + */ +proto.push.Transaction.prototype.setType = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); +}; + + +/** + * optional string category = 2; + * @return {string} + */ +proto.push.Transaction.prototype.getCategory = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.push.Transaction} returns this + */ +proto.push.Transaction.prototype.setCategory = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional string sender = 3; + * @return {string} + */ +proto.push.Transaction.prototype.getSender = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.push.Transaction} returns this + */ +proto.push.Transaction.prototype.setSender = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); +}; + + +/** + * repeated string recipients = 4; + * @return {!Array} + */ +proto.push.Transaction.prototype.getRecipientsList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 4)); +}; + + +/** + * @param {!Array} value + * @return {!proto.push.Transaction} returns this + */ +proto.push.Transaction.prototype.setRecipientsList = function(value) { + return jspb.Message.setField(this, 4, value || []); +}; + + +/** + * @param {string} value + * @param {number=} opt_index + * @return {!proto.push.Transaction} returns this + */ +proto.push.Transaction.prototype.addRecipients = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 4, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.push.Transaction} returns this + */ +proto.push.Transaction.prototype.clearRecipientsList = function() { + return this.setRecipientsList([]); +}; + + +/** + * optional bytes data = 5; + * @return {!(string|Uint8Array)} + */ +proto.push.Transaction.prototype.getData = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 5, "")); +}; + + +/** + * optional bytes data = 5; + * This is a type-conversion wrapper around `getData()` + * @return {string} + */ +proto.push.Transaction.prototype.getData_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getData())); +}; + + +/** + * optional bytes data = 5; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getData()` + * @return {!Uint8Array} + */ +proto.push.Transaction.prototype.getData_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getData())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.push.Transaction} returns this + */ +proto.push.Transaction.prototype.setData = function(value) { + return jspb.Message.setProto3BytesField(this, 5, value); +}; + + +/** + * optional bytes salt = 6; + * @return {!(string|Uint8Array)} + */ +proto.push.Transaction.prototype.getSalt = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 6, "")); +}; + + +/** + * optional bytes salt = 6; + * This is a type-conversion wrapper around `getSalt()` + * @return {string} + */ +proto.push.Transaction.prototype.getSalt_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getSalt())); +}; + + +/** + * optional bytes salt = 6; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getSalt()` + * @return {!Uint8Array} + */ +proto.push.Transaction.prototype.getSalt_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getSalt())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.push.Transaction} returns this + */ +proto.push.Transaction.prototype.setSalt = function(value) { + return jspb.Message.setProto3BytesField(this, 6, value); +}; + + +/** + * optional bytes apiToken = 7; + * @return {!(string|Uint8Array)} + */ +proto.push.Transaction.prototype.getApitoken = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 7, "")); +}; + + +/** + * optional bytes apiToken = 7; + * This is a type-conversion wrapper around `getApitoken()` + * @return {string} + */ +proto.push.Transaction.prototype.getApitoken_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getApitoken())); +}; + + +/** + * optional bytes apiToken = 7; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getApitoken()` + * @return {!Uint8Array} + */ +proto.push.Transaction.prototype.getApitoken_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getApitoken())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.push.Transaction} returns this + */ +proto.push.Transaction.prototype.setApitoken = function(value) { + return jspb.Message.setProto3BytesField(this, 7, value); +}; + + +/** + * optional string fee = 9; + * @return {string} + */ +proto.push.Transaction.prototype.getFee = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 9, "")); +}; + + +/** + * @param {string} value + * @return {!proto.push.Transaction} returns this + */ +proto.push.Transaction.prototype.setFee = function(value) { + return jspb.Message.setProto3StringField(this, 9, value); +}; + + +/** + * optional bytes signature = 8; + * @return {!(string|Uint8Array)} + */ +proto.push.Transaction.prototype.getSignature = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 8, "")); +}; + + +/** + * optional bytes signature = 8; + * This is a type-conversion wrapper around `getSignature()` + * @return {string} + */ +proto.push.Transaction.prototype.getSignature_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getSignature())); +}; + + +/** + * optional bytes signature = 8; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getSignature()` + * @return {!Uint8Array} + */ +proto.push.Transaction.prototype.getSignature_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getSignature())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.push.Transaction} returns this + */ +proto.push.Transaction.prototype.setSignature = function(value) { + return jspb.Message.setProto3BytesField(this, 8, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.push.InitDid.prototype.toObject = function(opt_includeInstance) { + return proto.push.InitDid.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.push.InitDid} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.push.InitDid.toObject = function(includeInstance, msg) { + var f, obj = { + did: jspb.Message.getFieldWithDefault(msg, 1, ""), + masterpubkey: jspb.Message.getFieldWithDefault(msg, 2, ""), + derivedkeyindex: jspb.Message.getFieldWithDefault(msg, 3, 0), + derivedpubkey: jspb.Message.getFieldWithDefault(msg, 4, ""), + encderivedprivkey: jspb.Message.getFieldWithDefault(msg, 5, "") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.push.InitDid} + */ +proto.push.InitDid.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.push.InitDid; + return proto.push.InitDid.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.push.InitDid} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.push.InitDid} + */ +proto.push.InitDid.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setDid(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setMasterpubkey(value); + break; + case 3: + var value = /** @type {number} */ (reader.readUint32()); + msg.setDerivedkeyindex(value); + break; + case 4: + var value = /** @type {string} */ (reader.readString()); + msg.setDerivedpubkey(value); + break; + case 5: + var value = /** @type {string} */ (reader.readString()); + msg.setEncderivedprivkey(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.push.InitDid.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.push.InitDid.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.push.InitDid} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.push.InitDid.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getDid(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getMasterpubkey(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getDerivedkeyindex(); + if (f !== 0) { + writer.writeUint32( + 3, + f + ); + } + f = message.getDerivedpubkey(); + if (f.length > 0) { + writer.writeString( + 4, + f + ); + } + f = message.getEncderivedprivkey(); + if (f.length > 0) { + writer.writeString( + 5, + f + ); + } +}; + + +/** + * optional string did = 1; + * @return {string} + */ +proto.push.InitDid.prototype.getDid = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.push.InitDid} returns this + */ +proto.push.InitDid.prototype.setDid = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string masterPubKey = 2; + * @return {string} + */ +proto.push.InitDid.prototype.getMasterpubkey = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.push.InitDid} returns this + */ +proto.push.InitDid.prototype.setMasterpubkey = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional uint32 derivedKeyIndex = 3; + * @return {number} + */ +proto.push.InitDid.prototype.getDerivedkeyindex = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.push.InitDid} returns this + */ +proto.push.InitDid.prototype.setDerivedkeyindex = function(value) { + return jspb.Message.setProto3IntField(this, 3, value); +}; + + +/** + * optional string derivedPubKey = 4; + * @return {string} + */ +proto.push.InitDid.prototype.getDerivedpubkey = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +}; + + +/** + * @param {string} value + * @return {!proto.push.InitDid} returns this + */ +proto.push.InitDid.prototype.setDerivedpubkey = function(value) { + return jspb.Message.setProto3StringField(this, 4, value); +}; + + +/** + * optional string encDerivedPrivKey = 5; + * @return {string} + */ +proto.push.InitDid.prototype.getEncderivedprivkey = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "")); +}; + + +/** + * @param {string} value + * @return {!proto.push.InitDid} returns this + */ +proto.push.InitDid.prototype.setEncderivedprivkey = function(value) { + return jspb.Message.setProto3StringField(this, 5, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.push.SessionKeyAction.prototype.toObject = function(opt_includeInstance) { + return proto.push.SessionKeyAction.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.push.SessionKeyAction} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.push.SessionKeyAction.toObject = function(includeInstance, msg) { + var f, obj = { + keyindex: jspb.Message.getFieldWithDefault(msg, 1, 0), + keyaddress: jspb.Message.getFieldWithDefault(msg, 2, ""), + action: jspb.Message.getFieldWithDefault(msg, 3, 0) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.push.SessionKeyAction} + */ +proto.push.SessionKeyAction.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.push.SessionKeyAction; + return proto.push.SessionKeyAction.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.push.SessionKeyAction} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.push.SessionKeyAction} + */ +proto.push.SessionKeyAction.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readInt32()); + msg.setKeyindex(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setKeyaddress(value); + break; + case 3: + var value = /** @type {!proto.push.KeyAction} */ (reader.readEnum()); + msg.setAction(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.push.SessionKeyAction.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.push.SessionKeyAction.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.push.SessionKeyAction} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.push.SessionKeyAction.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getKeyindex(); + if (f !== 0) { + writer.writeInt32( + 1, + f + ); + } + f = message.getKeyaddress(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getAction(); + if (f !== 0.0) { + writer.writeEnum( + 3, + f + ); + } +}; + + +/** + * optional int32 keyIndex = 1; + * @return {number} + */ +proto.push.SessionKeyAction.prototype.getKeyindex = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.push.SessionKeyAction} returns this + */ +proto.push.SessionKeyAction.prototype.setKeyindex = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); +}; + + +/** + * optional string keyAddress = 2; + * @return {string} + */ +proto.push.SessionKeyAction.prototype.getKeyaddress = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.push.SessionKeyAction} returns this + */ +proto.push.SessionKeyAction.prototype.setKeyaddress = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional KeyAction action = 3; + * @return {!proto.push.KeyAction} + */ +proto.push.SessionKeyAction.prototype.getAction = function() { + return /** @type {!proto.push.KeyAction} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +}; + + +/** + * @param {!proto.push.KeyAction} value + * @return {!proto.push.SessionKeyAction} returns this + */ +proto.push.SessionKeyAction.prototype.setAction = function(value) { + return jspb.Message.setProto3EnumField(this, 3, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.push.Notification.prototype.toObject = function(opt_includeInstance) { + return proto.push.Notification.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.push.Notification} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.push.Notification.toObject = function(includeInstance, msg) { + var f, obj = { + app: jspb.Message.getFieldWithDefault(msg, 1, ""), + title: jspb.Message.getFieldWithDefault(msg, 2, ""), + body: jspb.Message.getFieldWithDefault(msg, 3, ""), + channelurl: jspb.Message.getFieldWithDefault(msg, 4, ""), + actionurl: jspb.Message.getFieldWithDefault(msg, 5, ""), + img: jspb.Message.getFieldWithDefault(msg, 6, ""), + icon: jspb.Message.getFieldWithDefault(msg, 7, "") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.push.Notification} + */ +proto.push.Notification.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.push.Notification; + return proto.push.Notification.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.push.Notification} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.push.Notification} + */ +proto.push.Notification.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setApp(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setTitle(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setBody(value); + break; + case 4: + var value = /** @type {string} */ (reader.readString()); + msg.setChannelurl(value); + break; + case 5: + var value = /** @type {string} */ (reader.readString()); + msg.setActionurl(value); + break; + case 6: + var value = /** @type {string} */ (reader.readString()); + msg.setImg(value); + break; + case 7: + var value = /** @type {string} */ (reader.readString()); + msg.setIcon(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.push.Notification.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.push.Notification.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.push.Notification} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.push.Notification.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getApp(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getTitle(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getBody(); + if (f.length > 0) { + writer.writeString( + 3, + f + ); + } + f = message.getChannelurl(); + if (f.length > 0) { + writer.writeString( + 4, + f + ); + } + f = message.getActionurl(); + if (f.length > 0) { + writer.writeString( + 5, + f + ); + } + f = message.getImg(); + if (f.length > 0) { + writer.writeString( + 6, + f + ); + } + f = message.getIcon(); + if (f.length > 0) { + writer.writeString( + 7, + f + ); + } +}; + + +/** + * optional string app = 1; + * @return {string} + */ +proto.push.Notification.prototype.getApp = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.push.Notification} returns this + */ +proto.push.Notification.prototype.setApp = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string title = 2; + * @return {string} + */ +proto.push.Notification.prototype.getTitle = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.push.Notification} returns this + */ +proto.push.Notification.prototype.setTitle = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional string body = 3; + * @return {string} + */ +proto.push.Notification.prototype.getBody = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.push.Notification} returns this + */ +proto.push.Notification.prototype.setBody = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); +}; + + +/** + * optional string channelUrl = 4; + * @return {string} + */ +proto.push.Notification.prototype.getChannelurl = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +}; + + +/** + * @param {string} value + * @return {!proto.push.Notification} returns this + */ +proto.push.Notification.prototype.setChannelurl = function(value) { + return jspb.Message.setProto3StringField(this, 4, value); +}; + + +/** + * optional string actionUrl = 5; + * @return {string} + */ +proto.push.Notification.prototype.getActionurl = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "")); +}; + + +/** + * @param {string} value + * @return {!proto.push.Notification} returns this + */ +proto.push.Notification.prototype.setActionurl = function(value) { + return jspb.Message.setProto3StringField(this, 5, value); +}; + + +/** + * optional string img = 6; + * @return {string} + */ +proto.push.Notification.prototype.getImg = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 6, "")); +}; + + +/** + * @param {string} value + * @return {!proto.push.Notification} returns this + */ +proto.push.Notification.prototype.setImg = function(value) { + return jspb.Message.setProto3StringField(this, 6, value); +}; + + +/** + * optional string icon = 7; + * @return {string} + */ +proto.push.Notification.prototype.getIcon = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 7, "")); +}; + + +/** + * @param {string} value + * @return {!proto.push.Notification} returns this + */ +proto.push.Notification.prototype.setIcon = function(value) { + return jspb.Message.setProto3StringField(this, 7, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.push.EncryptionDetails.prototype.toObject = function(opt_includeInstance) { + return proto.push.EncryptionDetails.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.push.EncryptionDetails} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.push.EncryptionDetails.toObject = function(includeInstance, msg) { + var f, obj = { + recipientdid: jspb.Message.getFieldWithDefault(msg, 1, ""), + type: jspb.Message.getFieldWithDefault(msg, 2, 0), + keyindex: jspb.Message.getFieldWithDefault(msg, 3, 0), + encryptedsecret: msg.getEncryptedsecret_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.push.EncryptionDetails} + */ +proto.push.EncryptionDetails.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.push.EncryptionDetails; + return proto.push.EncryptionDetails.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.push.EncryptionDetails} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.push.EncryptionDetails} + */ +proto.push.EncryptionDetails.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setRecipientdid(value); + break; + case 2: + var value = /** @type {!proto.push.EncryptionType} */ (reader.readEnum()); + msg.setType(value); + break; + case 3: + var value = /** @type {number} */ (reader.readInt32()); + msg.setKeyindex(value); + break; + case 4: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setEncryptedsecret(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.push.EncryptionDetails.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.push.EncryptionDetails.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.push.EncryptionDetails} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.push.EncryptionDetails.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getRecipientdid(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getType(); + if (f !== 0.0) { + writer.writeEnum( + 2, + f + ); + } + f = message.getKeyindex(); + if (f !== 0) { + writer.writeInt32( + 3, + f + ); + } + f = message.getEncryptedsecret_asU8(); + if (f.length > 0) { + writer.writeBytes( + 4, + f + ); + } +}; + + +/** + * optional string recipientDID = 1; + * @return {string} + */ +proto.push.EncryptionDetails.prototype.getRecipientdid = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.push.EncryptionDetails} returns this + */ +proto.push.EncryptionDetails.prototype.setRecipientdid = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional EncryptionType type = 2; + * @return {!proto.push.EncryptionType} + */ +proto.push.EncryptionDetails.prototype.getType = function() { + return /** @type {!proto.push.EncryptionType} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {!proto.push.EncryptionType} value + * @return {!proto.push.EncryptionDetails} returns this + */ +proto.push.EncryptionDetails.prototype.setType = function(value) { + return jspb.Message.setProto3EnumField(this, 2, value); +}; + + +/** + * optional int32 keyIndex = 3; + * @return {number} + */ +proto.push.EncryptionDetails.prototype.getKeyindex = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.push.EncryptionDetails} returns this + */ +proto.push.EncryptionDetails.prototype.setKeyindex = function(value) { + return jspb.Message.setProto3IntField(this, 3, value); +}; + + +/** + * optional bytes encryptedSecret = 4; + * @return {!(string|Uint8Array)} + */ +proto.push.EncryptionDetails.prototype.getEncryptedsecret = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +}; + + +/** + * optional bytes encryptedSecret = 4; + * This is a type-conversion wrapper around `getEncryptedsecret()` + * @return {string} + */ +proto.push.EncryptionDetails.prototype.getEncryptedsecret_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getEncryptedsecret())); +}; + + +/** + * optional bytes encryptedSecret = 4; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getEncryptedsecret()` + * @return {!Uint8Array} + */ +proto.push.EncryptionDetails.prototype.getEncryptedsecret_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getEncryptedsecret())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.push.EncryptionDetails} returns this + */ +proto.push.EncryptionDetails.prototype.setEncryptedsecret = function(value) { + return jspb.Message.setProto3BytesField(this, 4, value); +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.push.EncryptedNotif.repeatedFields_ = [3]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.push.EncryptedNotif.prototype.toObject = function(opt_includeInstance) { + return proto.push.EncryptedNotif.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.push.EncryptedNotif} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.push.EncryptedNotif.toObject = function(includeInstance, msg) { + var f, obj = { + encryptednotif: msg.getEncryptednotif_asB64(), + sourceenc: (f = msg.getSourceenc()) && proto.push.EncryptionDetails.toObject(includeInstance, f), + targetencList: jspb.Message.toObjectList(msg.getTargetencList(), + proto.push.EncryptionDetails.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.push.EncryptedNotif} + */ +proto.push.EncryptedNotif.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.push.EncryptedNotif; + return proto.push.EncryptedNotif.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.push.EncryptedNotif} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.push.EncryptedNotif} + */ +proto.push.EncryptedNotif.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setEncryptednotif(value); + break; + case 2: + var value = new proto.push.EncryptionDetails; + reader.readMessage(value,proto.push.EncryptionDetails.deserializeBinaryFromReader); + msg.setSourceenc(value); + break; + case 3: + var value = new proto.push.EncryptionDetails; + reader.readMessage(value,proto.push.EncryptionDetails.deserializeBinaryFromReader); + msg.addTargetenc(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.push.EncryptedNotif.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.push.EncryptedNotif.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.push.EncryptedNotif} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.push.EncryptedNotif.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getEncryptednotif_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getSourceenc(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.push.EncryptionDetails.serializeBinaryToWriter + ); + } + f = message.getTargetencList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 3, + f, + proto.push.EncryptionDetails.serializeBinaryToWriter + ); + } +}; + + +/** + * optional bytes encryptedNotif = 1; + * @return {!(string|Uint8Array)} + */ +proto.push.EncryptedNotif.prototype.getEncryptednotif = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes encryptedNotif = 1; + * This is a type-conversion wrapper around `getEncryptednotif()` + * @return {string} + */ +proto.push.EncryptedNotif.prototype.getEncryptednotif_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getEncryptednotif())); +}; + + +/** + * optional bytes encryptedNotif = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getEncryptednotif()` + * @return {!Uint8Array} + */ +proto.push.EncryptedNotif.prototype.getEncryptednotif_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getEncryptednotif())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.push.EncryptedNotif} returns this + */ +proto.push.EncryptedNotif.prototype.setEncryptednotif = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional EncryptionDetails sourceEnc = 2; + * @return {?proto.push.EncryptionDetails} + */ +proto.push.EncryptedNotif.prototype.getSourceenc = function() { + return /** @type{?proto.push.EncryptionDetails} */ ( + jspb.Message.getWrapperField(this, proto.push.EncryptionDetails, 2)); +}; + + +/** + * @param {?proto.push.EncryptionDetails|undefined} value + * @return {!proto.push.EncryptedNotif} returns this +*/ +proto.push.EncryptedNotif.prototype.setSourceenc = function(value) { + return jspb.Message.setWrapperField(this, 2, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.push.EncryptedNotif} returns this + */ +proto.push.EncryptedNotif.prototype.clearSourceenc = function() { + return this.setSourceenc(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.push.EncryptedNotif.prototype.hasSourceenc = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * repeated EncryptionDetails targetEnc = 3; + * @return {!Array} + */ +proto.push.EncryptedNotif.prototype.getTargetencList = function() { + return /** @type{!Array} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.push.EncryptionDetails, 3)); +}; + + +/** + * @param {!Array} value + * @return {!proto.push.EncryptedNotif} returns this +*/ +proto.push.EncryptedNotif.prototype.setTargetencList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 3, value); +}; + + +/** + * @param {!proto.push.EncryptionDetails=} opt_value + * @param {number=} opt_index + * @return {!proto.push.EncryptionDetails} + */ +proto.push.EncryptedNotif.prototype.addTargetenc = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 3, opt_value, proto.push.EncryptionDetails, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.push.EncryptedNotif} returns this + */ +proto.push.EncryptedNotif.prototype.clearTargetencList = function() { + return this.setTargetencList([]); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.push.Attachment.prototype.toObject = function(opt_includeInstance) { + return proto.push.Attachment.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.push.Attachment} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.push.Attachment.toObject = function(includeInstance, msg) { + var f, obj = { + filename: jspb.Message.getFieldWithDefault(msg, 1, ""), + type: jspb.Message.getFieldWithDefault(msg, 2, ""), + content: jspb.Message.getFieldWithDefault(msg, 3, "") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.push.Attachment} + */ +proto.push.Attachment.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.push.Attachment; + return proto.push.Attachment.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.push.Attachment} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.push.Attachment} + */ +proto.push.Attachment.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setFilename(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setType(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setContent(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.push.Attachment.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.push.Attachment.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.push.Attachment} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.push.Attachment.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getFilename(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getType(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getContent(); + if (f.length > 0) { + writer.writeString( + 3, + f + ); + } +}; + + +/** + * optional string filename = 1; + * @return {string} + */ +proto.push.Attachment.prototype.getFilename = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.push.Attachment} returns this + */ +proto.push.Attachment.prototype.setFilename = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string type = 2; + * @return {string} + */ +proto.push.Attachment.prototype.getType = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.push.Attachment} returns this + */ +proto.push.Attachment.prototype.setType = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional string content = 3; + * @return {string} + */ +proto.push.Attachment.prototype.getContent = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.push.Attachment} returns this + */ +proto.push.Attachment.prototype.setContent = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.push.Email.repeatedFields_ = [3]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.push.Email.prototype.toObject = function(opt_includeInstance) { + return proto.push.Email.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.push.Email} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.push.Email.toObject = function(includeInstance, msg) { + var f, obj = { + subject: jspb.Message.getFieldWithDefault(msg, 1, ""), + body: jspb.Message.getFieldWithDefault(msg, 2, ""), + attachmentsList: jspb.Message.toObjectList(msg.getAttachmentsList(), + proto.push.Attachment.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.push.Email} + */ +proto.push.Email.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.push.Email; + return proto.push.Email.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.push.Email} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.push.Email} + */ +proto.push.Email.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setSubject(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setBody(value); + break; + case 3: + var value = new proto.push.Attachment; + reader.readMessage(value,proto.push.Attachment.deserializeBinaryFromReader); + msg.addAttachments(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.push.Email.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.push.Email.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.push.Email} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.push.Email.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getSubject(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getBody(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getAttachmentsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 3, + f, + proto.push.Attachment.serializeBinaryToWriter + ); + } +}; + + +/** + * optional string subject = 1; + * @return {string} + */ +proto.push.Email.prototype.getSubject = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.push.Email} returns this + */ +proto.push.Email.prototype.setSubject = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string body = 2; + * @return {string} + */ +proto.push.Email.prototype.getBody = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.push.Email} returns this + */ +proto.push.Email.prototype.setBody = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * repeated Attachment attachments = 3; + * @return {!Array} + */ +proto.push.Email.prototype.getAttachmentsList = function() { + return /** @type{!Array} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.push.Attachment, 3)); +}; + + +/** + * @param {!Array} value + * @return {!proto.push.Email} returns this +*/ +proto.push.Email.prototype.setAttachmentsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 3, value); +}; + + +/** + * @param {!proto.push.Attachment=} opt_value + * @param {number=} opt_index + * @return {!proto.push.Attachment} + */ +proto.push.Email.prototype.addAttachments = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 3, opt_value, proto.push.Attachment, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.push.Email} returns this + */ +proto.push.Email.prototype.clearAttachmentsList = function() { + return this.setAttachmentsList([]); +}; + + +/** + * @enum {number} + */ +proto.push.Role = { + ROLE_UNSPECIFIED: 0, + VALIDATOR: 1, + ATTESTER: 2 +}; + +/** + * @enum {number} + */ +proto.push.Vote = { + VOTE_UNSPECIFIED: 0, + ACCEPTED: 1, + REJECTED: 2 +}; + +/** + * @enum {number} + */ +proto.push.KeyAction = { + UNSPECIFIED: 0, + PUBLISH_KEY: 1, + REVOKE_KEY: 2 +}; + +/** + * @enum {number} + */ +proto.push.EncryptionType = { + ENCRYPTION_UNSPECIFIED: 0, + ECC: 1 +}; + +goog.object.extend(exports, proto.push); diff --git a/src/proto/push/block.proto b/src/proto/push/block.proto index 07c6df3..7c9ee6f 100644 --- a/src/proto/push/block.proto +++ b/src/proto/push/block.proto @@ -50,9 +50,12 @@ message TransactionObj { } message Signer { - string node = 1; - Role role = 2; - string sig = 3; + // deprecated + // string node = 1; + // deprecated + // Role role = 2; + + bytes sig = 1; } message Block { @@ -63,6 +66,18 @@ message Block { repeated Signer signers = 3; } +message AttestorReply { + // reply per transaction (same order as in block) + repeated TxAttestorData attestorData = 1; + // signature for the whole block + // assuming that on this node TxAttestorData is filled per every tx + Signer signer = 2; +} + +message AttestorReplies { + repeated AttestorReply attestations = 1; +} + // TRANSACTION --------------------------------------------------------------------------------------------------------- @@ -75,8 +90,8 @@ message Transaction { bytes data = 5; // data is also a protobuf message, depending on tx_type bytes salt = 6; bytes apiToken = 7; // f(apiToken) = v1 - bytes signature = 8; string fee = 9; // we don't use this as of now, no native 256bits int support in protobuf + bytes signature = 8; } diff --git a/src/utilz/ethSig.ts b/src/utilz/ethSig.ts index ad4fe42..176ed5a 100644 --- a/src/utilz/ethSig.ts +++ b/src/utilz/ethSig.ts @@ -1,6 +1,9 @@ import { BytesLike, ethers, Wallet } from 'ethers' import { verifyMessage } from 'ethers/lib/utils' import { ObjectHasher } from './objectHasher' +import {recoverAddress} from "@ethersproject/transactions"; +import {hashMessage} from "@ethersproject/hash"; +import {BitUtil} from "./bitUtil"; /** * Utitily class that allows @@ -79,6 +82,15 @@ export class EthSig { } return true } + // 0xAAAA == eip155:1:0xAAAAA + public static recoverAddress(message:Uint8Array, signature:Uint8Array):string { + return recoverAddress(hashMessage(message), signature) + } + + public static async signBytes(wallet: Wallet, bytes: Uint8Array): Promise { + const sig = await wallet.signMessage(bytes); + return BitUtil.base16ToBytes(sig); + } } export function Signed(target: Function) {} diff --git a/src/utilz/hashUtil.ts b/src/utilz/hashUtil.ts index 2bbe71a..9409a85 100644 --- a/src/utilz/hashUtil.ts +++ b/src/utilz/hashUtil.ts @@ -2,6 +2,7 @@ import * as CryptoJS from 'crypto-js' export class HashUtil { + // todo use a better lib public static sha256AsBytes(data: Uint8Array): Uint8Array { const wa = CryptoJS.lib.WordArray.create(data); const shaAsWordArray = CryptoJS.SHA256(wa); diff --git a/tests/block/block.test.ts b/tests/block/block.test.ts index d27dd33..985ed7a 100644 --- a/tests/block/block.test.ts +++ b/tests/block/block.test.ts @@ -69,13 +69,9 @@ describe('block tests', function () { // signers const s1 = new Signer(); - s1.setNode('0x1111'); - s1.setRole(1); - s1.setSig('CC'); + s1.setSig(BitUtil.base16ToBytes('CC')); const s2 = new Signer(); - s2.setNode('0x2222'); - s2.setRole(1); - s2.setSig('EE'); + s2.setSig(BitUtil.base16ToBytes('EE')); const b = new Block(); b.setTs(DateUtil.currentTimeSeconds()); From fcac8804c70d13af92ebc3cd3e5b056698a90a7d Mon Sep 17 00:00:00 2001 From: Igx22 Date: Thu, 5 Sep 2024 23:28:21 +0700 Subject: [PATCH 04/25] fix: map vnodeX.local:400X to localhost:400X --- docker-compose.yml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 31b5173..663c275 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,7 +3,7 @@ services: redis: image: 'redis:latest' - container_name: redis-main + container_name: redis restart: always networks: push-shared-network: @@ -16,7 +16,7 @@ services: mysql: image: mysql:8.0 - container_name: mysql-main + container_name: mysql command: --default-authentication-plugin=mysql_native_password restart: always environment: @@ -36,7 +36,7 @@ services: phpmyadmin: image: phpmyadmin/phpmyadmin - container_name: phpmyadmin-main + container_name: phpmyadmin depends_on: - mysql environment: @@ -64,7 +64,11 @@ services: restart: always environment: SEPOLIA_RPC_URL: 11 - SEPOLIA_PRIVATE_KEY: AA + SEPOLIA_PRIVATE_KEY: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + depends_on: + - mysql + - phpmyadmin + - redis networks: push-shared-network: From 8905e9f8e9273facfc92b74346af5c3b633ada8f Mon Sep 17 00:00:00 2001 From: Igx22 Date: Mon, 9 Sep 2024 13:38:38 +0700 Subject: [PATCH 05/25] fix: /etc/hosts and dns --- docker/dns-main/Dockerfile | 6 +++ docker/dns-main/update-dnsmasq.sh | 11 +++++ docker/dns-main/update-hosts.py | 67 +++++++++++++++++++++++++++++++ docker/dns-main/update-hosts.sh | 37 +++++++++++++++++ 4 files changed, 121 insertions(+) create mode 100644 docker/dns-main/Dockerfile create mode 100644 docker/dns-main/update-dnsmasq.sh create mode 100644 docker/dns-main/update-hosts.py create mode 100755 docker/dns-main/update-hosts.sh diff --git a/docker/dns-main/Dockerfile b/docker/dns-main/Dockerfile new file mode 100644 index 0000000..c731f12 --- /dev/null +++ b/docker/dns-main/Dockerfile @@ -0,0 +1,6 @@ +FROM debian:latest +RUN apt-get update && apt-get install -y dnsmasq docker.io +COPY update-dnsmasq.sh /usr/local/bin/update-dnsmasq.sh +RUN chmod +x /usr/local/bin/update-dnsmasq.sh +EXPOSE 53/udp +CMD ["/bin/bash", "-c", "/usr/local/bin/update-dnsmasq.sh && dnsmasq -k"] \ No newline at end of file diff --git a/docker/dns-main/update-dnsmasq.sh b/docker/dns-main/update-dnsmasq.sh new file mode 100644 index 0000000..48ebe75 --- /dev/null +++ b/docker/dns-main/update-dnsmasq.sh @@ -0,0 +1,11 @@ +#!/bin/bash +DNSMASQ_CONF="/etc/dnsmasq.conf" +echo "" > $DNSMASQ_CONF +docker ps --format '{{.Names}} {{.Networks}}' | while read line; do + CONTAINER_NAME=$(echo $line | awk '{print $1}') + NETWORK_NAME=$(echo $line | awk '{print $2}') + IP_ADDRESS=$(docker inspect -f "{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" $CONTAINER_NAME) + if [ ! -z "$IP_ADDRESS" ]; then + echo "address=/${CONTAINER_NAME}.${NETWORK_NAME}/$IP_ADDRESS" >> $DNSMASQ_CONF + fi +done \ No newline at end of file diff --git a/docker/dns-main/update-hosts.py b/docker/dns-main/update-hosts.py new file mode 100644 index 0000000..075cbe9 --- /dev/null +++ b/docker/dns-main/update-hosts.py @@ -0,0 +1,67 @@ +# RUN: sudo python3 update-hosts.py + +# for every docker container from "push-shared-network" +# adds a row +# 127.0.0.1 container.local +# to /etc/hosts + + +import subprocess +import os +import re + + +# Function to check if the script is running as root +def check_root(): + if os.geteuid() != 0: + print("This script must be run as root. Try again with sudo.") + exit(1) + +# Function to read docker ps output +def get_docker_containers(): + result = subprocess.run(["docker", "ps", "--format", "{{.Names}} {{.Networks}}"], stdout=subprocess.PIPE) + return result.stdout.decode('utf-8').strip().split('\n') + +# Function to backup /etc/hosts file +def backup_hosts_file(): + subprocess.run(["cp", "/etc/hosts", "/etc/hosts.bak"]) + +# Function to check if the host entry already exists +def host_entry_exists(hostname): + with open("/etc/hosts", "r") as file: + content = file.read() + return re.search(rf"127\.0\.0\.1\s+{re.escape(hostname)}\.local", content) + +# Function to append a new host entry to /etc/hosts +def append_to_hosts(hostname): + with open("/etc/hosts", "a") as file: + file.write(f"127.0.0.1 {hostname}.local\n") + +# Main function +def update_hosts(): + # Check if script is run as root + check_root() + + # Backup the existing /etc/hosts file + backup_hosts_file() + + # Get docker container names and networks + docker_output = get_docker_containers() + + for line in docker_output: + if line: + name, network = line.split() + + # Only process containers in push-shared-network + if network == "push-shared-network": + # Check if the host entry already exists + if not host_entry_exists(name): + print(f"Adding 127.0.0.1 {name}.local to /etc/hosts") + append_to_hosts(name) + else: + print(f"{name}.local already exists in /etc/hosts, skipping.") + + print("Script completed.") + +if __name__ == "__main__": + update_hosts() diff --git a/docker/dns-main/update-hosts.sh b/docker/dns-main/update-hosts.sh new file mode 100755 index 0000000..af5db0d --- /dev/null +++ b/docker/dns-main/update-hosts.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +# for every docker container from "push-shared-network" +# adds a row +# 127.0.0.1 container.local +# to /etc/hosts + +# Check if running as root +if [ "$(id -u)" != "0" ]; then + echo "This script must be run as root. Try again with sudo." + exit 1 +fi + +# Run docker command to get the list of names and networks +docker_output=$(docker ps --format '{{.Names}} {{.Networks}}') + +# Backup the existing /etc/hosts file +cp /etc/hosts /etc/hosts.bak + +# Process each line from docker output +while read -r line; do + name=$(echo "$line" | awk '{print $1}') # Extract the container name + network=$(echo "$line" | awk '{print $2}') # Extract the network name + + # Only add lines for containers in push-shared-network + if [[ "$network" == "push-shared-network" ]]; then + # Check if /etc/hosts already contains the 127.0.0.1 mapping for this name + if ! grep -q "127.0.0.1 $name.local" /etc/hosts; then + echo "Adding 127.0.0.1 $name.local to /etc/hosts" + echo "127.0.0.1 $name.local" >> /etc/hosts + else + echo "$name.local already exists in /etc/hosts, skipping." + fi + fi +done <<< "$docker_output" + +echo "Script completed." \ No newline at end of file From eb6691ae7abb255ee5835e519973d0d86f7417db Mon Sep 17 00:00:00 2001 From: Igx22 Date: Mon, 9 Sep 2024 13:39:33 +0700 Subject: [PATCH 06/25] fix: /etc/hosts and dns (2) --- docker/dns-main/update-hosts.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/docker/dns-main/update-hosts.py b/docker/dns-main/update-hosts.py index 075cbe9..d73ccec 100644 --- a/docker/dns-main/update-hosts.py +++ b/docker/dns-main/update-hosts.py @@ -1,10 +1,13 @@ -# RUN: sudo python3 update-hosts.py - # for every docker container from "push-shared-network" # adds a row # 127.0.0.1 container.local # to /etc/hosts +# precondition: start all docker containers +# RUN: sudo python3 update-hosts.py + + + import subprocess import os From 5d12308743bd8fc1ba5ac2f6db4e4273df50e773 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Tue, 10 Sep 2024 01:31:42 +0700 Subject: [PATCH 07/25] add: docker which includes snodes (v1) --- docker/db.yml | 97 ++ .../mysql-init}/create_databases.sql | 0 docker/pg-init/create_databases.sql | 1 + docker/s.yml | 62 + docker/{v01 => s1}/StorageV1.json | 0 docker/{v01 => s1}/ValidatorV1.json | 0 docker/s1/validator_eth_key.json | 21 + docker/{v02 => s2}/StorageV1.json | 0 docker/{v02 => s2}/ValidatorV1.json | 0 docker/s2/validator_eth_key.json | 21 + docker/v.yml | 74 ++ docker/{v03 => v1}/StorageV1.json | 0 docker/{v03 => v1}/ValidatorV1.json | 0 docker/{v01 => v1}/validator_eth_key.json | 0 docker/v2/StorageV1.json | 633 +++++++++ docker/v2/ValidatorV1.json | 1161 +++++++++++++++++ docker/{v02 => v2}/validator_eth_key.json | 0 docker/v3/StorageV1.json | 633 +++++++++ docker/v3/ValidatorV1.json | 1161 +++++++++++++++++ docker/{v03 => v3}/validator_eth_key.json | 0 20 files changed, 3864 insertions(+) create mode 100644 docker/db.yml rename {mysql-init => docker/mysql-init}/create_databases.sql (100%) create mode 100755 docker/pg-init/create_databases.sql create mode 100644 docker/s.yml rename docker/{v01 => s1}/StorageV1.json (100%) rename docker/{v01 => s1}/ValidatorV1.json (100%) create mode 100644 docker/s1/validator_eth_key.json rename docker/{v02 => s2}/StorageV1.json (100%) rename docker/{v02 => s2}/ValidatorV1.json (100%) create mode 100644 docker/s2/validator_eth_key.json create mode 100644 docker/v.yml rename docker/{v03 => v1}/StorageV1.json (100%) rename docker/{v03 => v1}/ValidatorV1.json (100%) rename docker/{v01 => v1}/validator_eth_key.json (100%) create mode 100644 docker/v2/StorageV1.json create mode 100644 docker/v2/ValidatorV1.json rename docker/{v02 => v2}/validator_eth_key.json (100%) create mode 100644 docker/v3/StorageV1.json create mode 100644 docker/v3/ValidatorV1.json rename docker/{v03 => v3}/validator_eth_key.json (100%) diff --git a/docker/db.yml b/docker/db.yml new file mode 100644 index 0000000..89a35c9 --- /dev/null +++ b/docker/db.yml @@ -0,0 +1,97 @@ +version: '3' +services: + + redis: + image: 'redis:latest' + container_name: redis + restart: always + networks: + push-shared-network: + aliases: + - redis.local + ports: + - 6379:6379 + volumes: + - ./external/redis:/data + + phpmyadmin: + image: phpmyadmin/phpmyadmin + container_name: phpmyadmin + depends_on: + - mysql + environment: + PMA_HOST: mysql + PMA_PORT: 3306 + PMA_ARBITRARY: 1 + UPLOAD_LIMIT: 3000M + restart: always + ports: + - 8183:80 + networks: + push-shared-network: + aliases: + - phpmyadmin.local + + hardhat: + image: hardhat-main + container_name: hardhat + networks: + push-shared-network: + aliases: + - hardhat.local + ports: + - "8545:8545" + restart: always + environment: + SEPOLIA_RPC_URL: 11 + SEPOLIA_PRIVATE_KEY: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + depends_on: + - mysql + - phpmyadmin + - redis + + + # for V nodes we use mysql + mysql: + image: mysql:8.0 + container_name: mysql + command: --default-authentication-plugin=mysql_native_password + restart: always + environment: + MYSQL_ROOT_PASSWORD: 'pass' + MYSQL_DATABASE: ${DB_NAME} + MYSQL_USER: ${DB_USER} + MYSQL_PASSWORD: ${DB_PASS} + ports: + - 3306:3306 + volumes: + - ./external/mysql:/var/lib/mysql/ + - ./mysql-init:/docker-entrypoint-initdb.d/ + networks: + push-shared-network: + aliases: + - mysql.local + + # for snodes and a nodes we use postgres + postgres: + image: postgres:15.1 + container_name: postgres + restart: always + environment: + - POSTGRES_DB=snode1 + - POSTGRES_USER=${POSTGRES_USER} + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + ports: + - '5432:5432' + volumes: + - ./external/postgresql:/var/lib/postgresql/data + - ./pg-init:/docker-entrypoint-initdb.d/ +# - ./pg-init/create_databases.sh:/docker-entrypoint-initdb.d/create_databases.sh + networks: + push-shared-network: + aliases: + - postgres.local + +networks: + push-shared-network: + external: true \ No newline at end of file diff --git a/mysql-init/create_databases.sql b/docker/mysql-init/create_databases.sql similarity index 100% rename from mysql-init/create_databases.sql rename to docker/mysql-init/create_databases.sql diff --git a/docker/pg-init/create_databases.sql b/docker/pg-init/create_databases.sql new file mode 100755 index 0000000..a01cc13 --- /dev/null +++ b/docker/pg-init/create_databases.sql @@ -0,0 +1 @@ +CREATE DATABASE snode2; CREATE DATABASE snode3; CREATE DATABASE snode4; CREATE DATABASE snode5; CREATE DATABASE snode6; CREATE DATABASE snode7; CREATE DATABASE snode8; CREATE DATABASE snode9; CREATE DATABASE snode10; \ No newline at end of file diff --git a/docker/s.yml b/docker/s.yml new file mode 100644 index 0000000..9abe95c --- /dev/null +++ b/docker/s.yml @@ -0,0 +1,62 @@ +version: '3' +services: + + snode1: + image: snode-main + container_name: snode1 + networks: + push-shared-network: + aliases: + - snode1.local + environment: + PG_NAME: snode1 + PG_USER: ${POSTGRES_USER} + PG_PASS: ${POSTGRES_PASSWORD} + PG_HOST: postgres.local + DB_NAME: snode1 + DB_HOST: mysql.local + DB_USER: ${DB_USER} + DB_PASS: ${DB_PASS} + PORT: 3001 + CONFIG_DIR: /config + LOG_DIR: /log + REDIS_URL: redis://redis.local:6379 + VALIDATOR_RPC_ENDPOINT: http://hardhat.local:8545 + VALIDATOR_RPC_NETWORK: 1337 + ports: + - "3001:3001" + volumes: + - ./s1:/config + - ./s1/log:/log + + snode2: + image: snode-main + container_name: snode2 + networks: + push-shared-network: + aliases: + - snode2.local + environment: + PG_NAME: snode2 + PG_USER: ${POSTGRES_USER} + PG_PASS: ${POSTGRES_PASSWORD} + PG_HOST: postgres.local + DB_NAME: snode2 + DB_HOST: mysql.local + DB_USER: ${DB_USER} + DB_PASS: ${DB_PASS} + PORT: 3002 + CONFIG_DIR: /config + LOG_DIR: /log + REDIS_URL: redis://redis.local:6379 + VALIDATOR_RPC_ENDPOINT: http://hardhat.local:8545 + VALIDATOR_RPC_NETWORK: 1337 + ports: + - "3002:3001" + volumes: + - ./s2:/config + - ./s2/log:/log + +networks: + push-shared-network: + external: true \ No newline at end of file diff --git a/docker/v01/StorageV1.json b/docker/s1/StorageV1.json similarity index 100% rename from docker/v01/StorageV1.json rename to docker/s1/StorageV1.json diff --git a/docker/v01/ValidatorV1.json b/docker/s1/ValidatorV1.json similarity index 100% rename from docker/v01/ValidatorV1.json rename to docker/s1/ValidatorV1.json diff --git a/docker/s1/validator_eth_key.json b/docker/s1/validator_eth_key.json new file mode 100644 index 0000000..ff139bd --- /dev/null +++ b/docker/s1/validator_eth_key.json @@ -0,0 +1,21 @@ +{ + "address": "3563c89b05e4dcd0edeee0f3e93e396c128c06e2", + "id": "711eabe0-4b33-4e45-bb8a-780994f525d7", + "version": 3, + "crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "9dac5b874d0b3de05e3431942799ddb3" + }, + "ciphertext": "ad9ab64be0de592be0c5b6ca794d32ae190423079e37850b32ee67403feef5a4", + "kdf": "scrypt", + "kdfparams": { + "salt": "fc8ae77e3cac1a620d97cfaace88c248a412feb7eefd52a83e1d44c3c8100cda", + "n": 131072, + "dklen": 32, + "p": 1, + "r": 8 + }, + "mac": "59029132918a6f3de7e8244173c9485030f3311bb15e1ce3ab7c8078ff8fcd87" + } +} \ No newline at end of file diff --git a/docker/v02/StorageV1.json b/docker/s2/StorageV1.json similarity index 100% rename from docker/v02/StorageV1.json rename to docker/s2/StorageV1.json diff --git a/docker/v02/ValidatorV1.json b/docker/s2/ValidatorV1.json similarity index 100% rename from docker/v02/ValidatorV1.json rename to docker/s2/ValidatorV1.json diff --git a/docker/s2/validator_eth_key.json b/docker/s2/validator_eth_key.json new file mode 100644 index 0000000..9311779 --- /dev/null +++ b/docker/s2/validator_eth_key.json @@ -0,0 +1,21 @@ +{ + "address": "b4d6fd1c0df9e3f427a1a8f8a8ec122396206ff7", + "id": "f90be12f-379c-4974-bd23-52b8a1faef4a", + "version": 3, + "Crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "dbbb90e30dc2a5cbf8228b8fd62615c3" + }, + "ciphertext": "7d6a5cff3ac05d4b0fc8d6df1e13de969d5a049c174aca600ebee76936a6012f", + "kdf": "scrypt", + "kdfparams": { + "salt": "19e54abb49aa3b665fbb82bc4d9fa65ed6339e696d865a0d61bb7866dc1a8412", + "n": 131072, + "dklen": 32, + "p": 1, + "r": 8 + }, + "mac": "4482f0b48e7a36a97df8464a46554de564f56c06c811a8ae0327e55655039159" + } +} diff --git a/docker/v.yml b/docker/v.yml new file mode 100644 index 0000000..5521c36 --- /dev/null +++ b/docker/v.yml @@ -0,0 +1,74 @@ +version: '3' +services: + + vnode1: + image: vnode-main + container_name: vnode1 + networks: + push-shared-network: + aliases: + - vnode1.local + environment: + DB_NAME: vnode1 + PORT: 4001 + CONFIG_DIR: /config + LOG_DIR: /log + DB_HOST: mysql.local + REDIS_URL: redis://redis.local:6379 + VALIDATOR_RPC_ENDPOINT: http://hardhat.local:8545 + VALIDATOR_RPC_NETWORK: 1337 + ports: + - "4001:4001" + volumes: + - ./v1:/config + - ./v1/log:/log + + + vnode2: + image: vnode-main + container_name: vnode2 + networks: + push-shared-network: + aliases: + - vnode2.local + environment: + DB_NAME: vnode2 + PORT: 4001 + CONFIG_DIR: /config + LOG_DIR: /log + DB_HOST: mysql.local + REDIS_URL: redis://redis.local:6379 + VALIDATOR_RPC_ENDPOINT: http://hardhat.local:8545 + VALIDATOR_RPC_NETWORK: 1337 + ports: + - "4002:4001" + volumes: + - ./v2:/config + - ./v2/log:/log + + + vnode3: + image: vnode-main + container_name: vnode3 + networks: + push-shared-network: + aliases: + - vnode3.local + environment: + DB_NAME: vnode3 + PORT: 4001 + CONFIG_DIR: /config + LOG_DIR: /log + DB_HOST: mysql.local + REDIS_URL: redis://redis.local:6379 + VALIDATOR_RPC_ENDPOINT: http://hardhat.local:8545 + VALIDATOR_RPC_NETWORK: 1337 + ports: + - "4003:4001" + volumes: + - ./v3:/config + - ./v3/log:/log + +networks: + push-shared-network: + external: true \ No newline at end of file diff --git a/docker/v03/StorageV1.json b/docker/v1/StorageV1.json similarity index 100% rename from docker/v03/StorageV1.json rename to docker/v1/StorageV1.json diff --git a/docker/v03/ValidatorV1.json b/docker/v1/ValidatorV1.json similarity index 100% rename from docker/v03/ValidatorV1.json rename to docker/v1/ValidatorV1.json diff --git a/docker/v01/validator_eth_key.json b/docker/v1/validator_eth_key.json similarity index 100% rename from docker/v01/validator_eth_key.json rename to docker/v1/validator_eth_key.json diff --git a/docker/v2/StorageV1.json b/docker/v2/StorageV1.json new file mode 100644 index 0000000..fa118f3 --- /dev/null +++ b/docker/v2/StorageV1.json @@ -0,0 +1,633 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "StorageV1", + "sourceName": "contracts/Storage.sol", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address[]", + "name": "nodeList", + "type": "address[]" + } + ], + "name": "SNodeMappingChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "inputs": [], + "name": "MAX_NODE_ID", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "NULL_NODE", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "NULL_SHARD", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SHARD_COUNT", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress_", + "type": "address" + } + ], + "name": "addNode", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8[]", + "name": "nodeList_", + "type": "uint8[]" + }, + { + "internalType": "uint8[]", + "name": "countersMap_", + "type": "uint8[]" + } + ], + "name": "calculateAvgPerNode", + "outputs": [ + { + "internalType": "uint256", + "name": "avgPerNode_", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "demand_", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "nodeAddr_", + "type": "address[]" + } + ], + "name": "getAllNodeShards", + "outputs": [ + { + "internalType": "uint32[]", + "name": "", + "type": "uint32[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getNodeAddresses", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress_", + "type": "address" + } + ], + "name": "getNodeShardsByAddr", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint16", + "name": "protocolVersion_", + "type": "uint16" + }, + { + "internalType": "address", + "name": "validatorContract_", + "type": "address" + }, + { + "internalType": "uint8", + "name": "rfTarget_", + "type": "uint8" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "mapAddrToNodeId", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "name": "mapNodeIdToAddr", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "name": "mapNodeToShards", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nodeCount", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "nodeIdList", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "rf_", + "type": "uint8" + } + ], + "name": "overrideRf", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "protocolVersion", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress_", + "type": "address" + } + ], + "name": "removeNode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "rf", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rfChangedByAdmin", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rfTarget", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress_", + "type": "address" + }, + { + "internalType": "uint32", + "name": "bitmap_", + "type": "uint32" + } + ], + "name": "setNodeShardsByAddr", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "rfTarget_", + "type": "uint8" + } + ], + "name": "setRfTarget", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "addr_", + "type": "address" + } + ], + "name": "setValidatorContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "shuffle", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "validatorContract", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60a06040523060805234801561001457600080fd5b50608051613bac61004c600039600081816108c30152818161094801528181610b6201528181610be70152610cd10152613bac6000f3fe6080604052600436106102195760003560e01c8063893f5da91161011d578063bac506e0116100b0578063d85707d51161007f578063f143896811610064578063f143896814610667578063f2fde38b1461067c578063fe92fe861461069c57600080fd5b8063d85707d514610629578063e30c39781461064957600080fd5b8063bac506e0146105a2578063cc59a6f4146105bc578063cdf64a76146105dc578063d12be06b146105fc57600080fd5b80639fc8ded3116100ec5780639fc8ded31461051e578063a25d526f14610533578063a5129cd014610562578063b2b99ec91461058257600080fd5b8063893f5da91461048e5780638da5cb5b146104bf57806399439089146104dd5780639d95f1cc146104fe57600080fd5b806345954486116101b0578063633207ae1161017f578063715018a611610164578063715018a61461044f578063720a0fa41461046457806379ba50971461047957600080fd5b8063633207ae146104255780636da49b831461043a57600080fd5b8063459544861461039657806348570569146103c85780634f1ef286146103fd57806352d1902d1461041057600080fd5b80632e949824116101ec5780632e949824146102e657806330cdb2751461030857806333083fe6146103565780633659cfe61461037657600080fd5b806301b9e4381461021e5780631a27e21c1461026b5780632520bf041461028d5780632ae9c600146102b0575b600080fd5b34801561022a57600080fd5b506102516102393660046134d4565b60fe6020526000908152604090205463ffffffff1681565b60405163ffffffff90911681526020015b60405180910390f35b34801561027757600080fd5b5061028b6102863660046134d4565b6106bc565b005b34801561029957600080fd5b506102a261070a565b604051908152602001610262565b3480156102bc57600080fd5b50610102546102d390600160a01b900461ffff1681565b60405161ffff9091168152602001610262565b3480156102f257600080fd5b506102fb610741565b60405161026291906134ef565b34801561031457600080fd5b5061033e6103233660046134d4565b60fd602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610262565b34801561036257600080fd5b50610251610371366004613553565b61082d565b34801561038257600080fd5b5061028b610391366004613553565b6108b9565b3480156103a257600080fd5b506103b66103b136600461356e565b610a34565b60405160ff9091168152602001610262565b3480156103d457600080fd5b506103e86103e3366004613664565b610a68565b60408051928352602083019190915201610262565b61028b61040b3660046136c8565b610b58565b34801561041c57600080fd5b506102a2610cc4565b34801561043157600080fd5b506103b660fe81565b34801561044657600080fd5b5060fc546103b6565b34801561045b57600080fd5b5061028b610d89565b34801561047057600080fd5b506103b6600081565b34801561048557600080fd5b5061028b610d9d565b34801561049a57600080fd5b506103b66104a9366004613553565b60ff602081905260009182526040909120541681565b3480156104cb57600080fd5b506033546001600160a01b031661033e565b3480156104e957600080fd5b506101025461033e906001600160a01b031681565b34801561050a57600080fd5b506103b6610519366004613553565b610e28565b34801561052a57600080fd5b506103b660ff81565b34801561053f57600080fd5b5060fb5461055290610100900460ff1681565b6040519015158152602001610262565b34801561056e57600080fd5b5061028b61057d3660046134d4565b6110fc565b34801561058e57600080fd5b5061028b61059d366004613553565b61117c565b3480156105ae57600080fd5b5060fb546103b69060ff1681565b3480156105c857600080fd5b5061028b6105d736600461376e565b611537565b3480156105e857600080fd5b5061028b6105f7366004613553565b6115d5565b34801561060857600080fd5b5061061c6106173660046137ae565b611600565b604051610262919061383b565b34801561063557600080fd5b5060fb546103b69062010000900460ff1681565b34801561065557600080fd5b506065546001600160a01b031661033e565b34801561067357600080fd5b506103b6602081565b34801561068857600080fd5b5061028b610697366004613553565b6116f3565b3480156106a857600080fd5b5061028b6106b7366004613879565b611764565b6106c4611902565b60fb805462ff000019166201000060ff84169081029190911790915560fc548111156106ef575060fc545b60fb805461ffff191660ff9092169190911761010017905550565b6000610714611902565b60fb5460009061072d90610100900460ff16828061195c565b60fb805461ff001916905560ff1691505090565b60fc5460609060008167ffffffffffffffff81111561076257610762613587565b60405190808252806020026020018201604052801561078b578160200160208202803683370190505b50905060005b8281101561082657600060fc82815481106107ae576107ae6138c5565b600091825260208083208183040154601f9092166101000a90910460ff1680835260fd90915260409091205484519192506001600160a01b0316908490849081106107fb576107fb6138c5565b6001600160a01b0390921660209283029190910190910152508061081e816138f1565b915050610791565b5092915050565b6001600160a01b038116600090815260ff60208190526040822054168061089b5760405162461bcd60e51b815260206004820152600c60248201527f6e6f2073756368206e6f6465000000000000000000000000000000000000000060448201526064015b60405180910390fd5b60ff16600090815260fe602052604090205463ffffffff1692915050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036109465760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610892565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166109a17f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610a0c5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610892565b610a1581611ec3565b60408051600080825260208201909252610a3191839190611ecb565b50565b60fc8181548110610a4457600080fd5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b815160fb54600091829160ff918216918391610a869116602061390a565b905060008215610a9f57610a9a8383613937565b610aa2565b60005b90506000610ab0848461394b565b1115610ac457610ac181600161395f565b90505b6000805b8851811015610b4a576000898281518110610ae557610ae56138c5565b602002602001015190506000898260ff1681518110610b0657610b066138c5565b60200260200101519050848160ff161015610b3557610b2860ff821686613972565b610b32908561395f565b93505b50508080610b42906138f1565b915050610ac8565b509097909650945050505050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610be55760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610892565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610c407f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610cab5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610892565b610cb482611ec3565b610cc082826001611ecb565b5050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610d645760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610892565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610d91611902565b610d9b6000612070565b565b60655433906001600160a01b03168114610e1f5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610892565b610a3181612070565b610102546000906001600160a01b0316331480610e4f57506033546001600160a01b031633145b610e9b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610892565b6001600160a01b038216600090815260ff60208190526040909120541615610f055760405162461bcd60e51b815260206004820152601d60248201527f6164647265737320697320616c726561647920726567697374657265640000006044820152606401610892565b6101005460ff1615801590610f2257506101005460fe60ff909116105b610f6e5760405162461bcd60e51b815260206004820152601a60248201527f6e6f64654964203e2030202626206e6f64654964203c206d61780000000000006044820152606401610892565b610101546000908015610ffc57610101610f89600183613972565b81548110610f9957610f996138c5565b90600052602060002090602091828204019190069054906101000a900460ff169150610101805480610fcd57610fcd613985565b60019003818190600052602060002090602091828204019190066101000a81549060ff0219169055905561102b565b610100805460ff169060006110108361399b565b91906101000a81548160ff021916908360ff16021790555091505b60fc8054600181810190925560208082047f371f36870d18f32a11fea0f144b021c8b407bb50f8e0267c711123f454b963c001805460ff808816601f9095166101000a8581029082021990921691909117909155600083815260fd8352604080822080546001600160a01b038c166001600160a01b031990911681179091558252918352818120805460ff19168517905592835260fe9091528120805463ffffffff19169055906110db90612089565b90506110e98160008061195c565b50506101005460ff16925050505b919050565b611104611902565b60fc5460ff821611156111595760405162461bcd60e51b815260206004820152601b60248201527f7266206973206c696d69746564206279206e6f646520636f756e7400000000006044820152606401610892565b60fb805461010060ff9390931661ffff19909116179190911762ff000019169055565b610102546001600160a01b03163314806111a057506033546001600160a01b031633145b6111ec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610892565b6001600160a01b038116600090815260ff60208181526040832054610101805460018101825594529083047f109ea3cebb188b9c1b9fc5bb3920be60dfdc8699098dff92f3d80daaca747689018054601f9094166101000a918316828102929093021990931617909155806112a35760405162461bcd60e51b815260206004820152601060248201527f6e6f206164647265737320666f756e64000000000000000000000000000000006044820152606401610892565b60fc54600003611317576001600160a01b038216600090815260ff602052604090819020805460ff191690555162461bcd60e51b81526108929060040160208082526010908201527f6e6f206e6f646520696420666f756e6400000000000000000000000000000000604082015260600190565b60ff8116600090815260fe60205260408120805463ffffffff19811690915560fc5463ffffffff909116915b81811015611465578360ff1660fc8281548110611362576113626138c5565b60009182526020918290209181049091015460ff601f9092166101000a9004160361145357611392600183613972565b81146114135760fc6113a5600184613972565b815481106113b5576113b56138c5565b90600052602060002090602091828204019190069054906101000a900460ff1660fc82815481106113e8576113e86138c5565b90600052602060002090602091828204019190066101000a81548160ff021916908360ff1602179055505b60fc80548061142457611424613985565b60019003818190600052602060002090602091828204019190066101000a81549060ff02191690559055611465565b8061145d816138f1565b915050611343565b5060ff8316600090815260fd6020526040812080546001600160a01b0319169055611491600019612089565b604080516001808252818301909252919250600091906020808301908036833701905050905085816000815181106114cb576114cb6138c5565b60200260200101906001600160a01b031690816001600160a01b0316815250507fb338e44b9e4e2d94df983fde422fd91ba2bd6f8182b607b50c968f8161bcf8858160405161151a91906134ef565b60405180910390a161152e8260018661195c565b50505050505050565b61153f611902565b6001600160a01b038216600090815260ff602081905260409091205416806115a95760405162461bcd60e51b815260206004820152601e60248201527f6e6f64652061646472657373206973206e6f74207265676973746572656400006044820152606401610892565b60ff16600090815260fe60205260409020805463ffffffff191663ffffffff9290921691909117905550565b6115dd611902565b61010280546001600160a01b0319166001600160a01b0392909216919091179055565b60606000825167ffffffffffffffff81111561161e5761161e613587565b604051908082528060200260200182016040528015611647578160200160208202803683370190505b50905060005b835181101561082657600060ff600086848151811061166e5761166e6138c5565b6020908102919091018101516001600160a01b0316825281810192909252604090810160009081205460ff1680825260fe9093522054845191925063ffffffff169081908590859081106116c4576116c46138c5565b602002602001019063ffffffff16908163ffffffff1681525050505080806116eb906138f1565b91505061164d565b6116fb611902565b606580546001600160a01b0383166001600160a01b0319909116811790915561172c6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600054610100900460ff16158080156117845750600054600160ff909116105b8061179e5750303b15801561179e575060005460ff166001145b6118105760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610892565b6000805460ff191660011790558015611833576000805461ff0019166101001790555b61183b612120565b61184361218b565b6101008054600160ff1990911617905560fb8054610102805462ff00ff199092166201000060ff871602179092557fffffffffffffffffffff0000000000000000000000000000000000000000000016600160a01b61ffff8716026001600160a01b031916176001600160a01b03851617905580156118fc576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6033546001600160a01b03163314610d9b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610892565b60008060fc8054806020026020016040519081016040528092919081815260200182805480156119c957602002820191906000526020600020906000905b825461010083900a900460ff1681526020600192830181810494850194909303909202910180841161199a5790505b505060fb549394505060ff90921691505060fe811115611a2b5760405162461bcd60e51b815260206004820152600660248201527f62616420726600000000000000000000000000000000000000000000000000006044820152606401610892565b815160ff11611a7c5760405162461bcd60e51b815260206004820152600e60248201527f626164206e6f646520636f756e740000000000000000000000000000000000006044820152606401610892565b6000805b8351811015611acc576000848281518110611a9d57611a9d6138c5565b602002602001015190508260ff168160ff161115611ab9578092505b5080611ac4816138f1565b915050611a80565b5060fe60ff821610611add57600080fd5b6000611aea8260016139ba565b60ff1667ffffffffffffffff811115611b0557611b05613587565b604051908082528060200260200182016040528015611b2e578160200160208202803683370190505b5090506000611b3e8360016139ba565b60ff1667ffffffffffffffff811115611b5957611b59613587565b604051908082528060200260200182016040528015611b82578160200160208202803683370190505b50905060005b8551811015611c59576000868281518110611ba557611ba56138c5565b6020026020010151905060018160ff161015611c035760405162461bcd60e51b815260206004820152601160248201527f6e6f6465732061726520312062617365640000000000000000000000000000006044820152606401610892565b60ff8116600081815260fe6020526040902054845163ffffffff9091169185918110611c3157611c316138c5565b63ffffffff909216602092830291909101909101525080611c51816138f1565b915050611b88565b506000611c6b868385888e8e8e6121ff565b60fc5490915015611ce5576000611c8387868561264b565b9050611c948288838688600061277a565b50600080611ca28984610a68565b90925090505b8015611ce1576000611cbc8a85888a6129a0565b90508015611cd557611cce8183613972565b9150611cdb565b50611ce1565b50611ca8565b5050505b600060015b84518160ff161015611d8a576000858260ff1681518110611d0d57611d0d6138c5565b602002602001015160ff161115611d78576000848260ff1681518110611d3557611d356138c5565b60209081029190910181015160ff8416600090815260fe9092526040909120805463ffffffff191663ffffffff8316179055905082611d738161399b565b935050505b80611d828161399b565b915050611cea565b5060008160ff1667ffffffffffffffff811115611da957611da9613587565b604051908082528060200260200182016040528015611dd2578160200160208202803683370190505b509050600060015b86518160ff161015611e7a576000878260ff1681518110611dfd57611dfd6138c5565b602002602001015160ff161115611e685760ff8116600090815260fd60205260409020546001600160a01b03168383611e35816138f1565b945081518110611e4757611e476138c5565b60200260200101906001600160a01b031690816001600160a01b0316815250505b80611e728161399b565b915050611dda565b507fb338e44b9e4e2d94df983fde422fd91ba2bd6f8182b607b50c968f8161bcf88582604051611eaa91906134ef565b60405180910390a150909b9a5050505050505050505050565b610a31611902565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611f0357611efe83612c7a565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611f5d575060408051601f3d908101601f19168201909252611f5a918101906139d3565b60015b611fcf5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610892565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146120645760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610892565b50611efe838383612d38565b606580546001600160a01b0319169055610a3181612d5d565b60fb54600090610100900460ff1680156120a95760fb805461ff00191690555b60fb5460ff1660006120bb85836139ec565b60fb5490915062010000900460ff16158015906120d9575060008112155b80156120f0575060fb5462010000900460ff168113155b80156120fe575060fc548113155b156121175760fb805460ff191660ff8316179055600192505b50909392505050565b600054610100900460ff16610d9b5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610892565b600054610100900460ff166121f65760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610892565b610d9b33612070565b6060808415801561220e575083155b15612229575050604080516000815260208101909152612640565b83156122be576040805160208082526104208201909252908082016104008036833701905050905060005b602060ff821610156122b65761226a8482612daf565b60ff1660011461227b5760ff61227d565b805b828260ff1681518110612292576122926138c5565b60ff90921660209283029190910190910152806122ae8161399b565b915050612254565b509050612640565b6122c960208761390a565b67ffffffffffffffff8111156122e1576122e1613587565b60405190808252806020026020018201604052801561230a578160200160208202803683370190505b5090506000805b8781101561237d5760005b602060ff8216101561236a57808484612334816138f1565b955081518110612346576123466138c5565b60ff90921660209283029190910190910152806123628161399b565b91505061231c565b5080612375816138f1565b915050612311565b5060005b8a518110156124fe5760008b828151811061239e5761239e6138c5565b602002602001015160ff16905060008b82815181106123bf576123bf6138c5565b6020026020010151905060005b602060ff821610156124bb576123e28282612daf565b60ff16156124a95760001960005b8751811015612439578260ff1688828151811061240f5761240f6138c5565b602002602001015160ff160361242757809150612439565b80612431816138f1565b9150506123f0565b50801961247e57600160ff83161b19831692508c848151811061245e5761245e6138c5565b6020026020010180518091906124739061399b565b60ff169052506124a7565b60ff878281518110612492576124926138c5565b602002602001019060ff16908160ff16815250505b505b806124b38161399b565b9150506123cc565b50808c83815181106124cf576124cf6138c5565b602002602001019063ffffffff16908163ffffffff1681525050505080806124f6906138f1565b915050612381565b506000805b83518110156125525760ff8016848281518110612522576125226138c5565b602002602001015160ff1603612540578161253c816138f1565b9250505b8061254a816138f1565b915050612503565b5060008184516125629190613972565b67ffffffffffffffff81111561257a5761257a613587565b6040519080825280602002602001820160405280156125a3578160200160208202803683370190505b5090506000805b85518110156126375760ff80168682815181106125c9576125c96138c5565b602002602001015160ff1614612625578581815181106125eb576125eb6138c5565b6020026020010151838381518110612605576126056138c5565b60ff9092166020928302919091019091015281612621816138f1565b9250505b8061262f816138f1565b9150506125aa565b50909450505050505b979650505050505050565b6060600061265a8460016139ba565b60ff1667ffffffffffffffff81111561267557612675613587565b60405190808252806020026020018201604052801561269e578160200160208202803683370190505b50905060005b85518110156127715760008682815181106126c1576126c16138c5565b602002602001015190506000858260ff16815181106126e2576126e26138c5565b602002602001015190506000805b602060ff82161015612730576127068382612daf565b60ff1660010361271e578161271a8161399b565b9250505b806127288161399b565b9150506126f0565b5080858460ff1681518110612747576127476138c5565b602002602001019060ff16908160ff16815250505050508080612769906138f1565b9150506126a4565b50949350505050565b6000865160000361278d57506000612996565b6127978686612dc5565b6000805b88518110156129925760008982815181106127b8576127b86138c5565b6020026020010151905060ff80168160ff16036127d55750612980565b60005b89518160ff16101561297d5760008a8260ff16815181106127fb576127fb6138c5565b6020026020010151905060008760ff1611801561283a57508660ff168a8260ff168151811061282c5761282c6138c5565b602002602001015160ff1610155b15612845575061296b565b6000898260ff168151811061285c5761285c6138c5565b6020026020010151905060006128728286612daf565b90508060ff166000036129675760ff8e8781518110612893576128936138c5565b60ff928316602091820292909201015260019086161b82178b8460ff16815181106128c0576128c06138c5565b602002602001019063ffffffff16908163ffffffff16815250508b8360ff16815181106128ef576128ef6138c5565b6020026020010180518091906129049061399b565b60ff1660ff1681525050898360ff1681518110612923576129236138c5565b6020026020010180518091906129389061399b565b60ff1660ff16815250506129528d8d8660ff166001612dec565b8661295c816138f1565b97505050505061297d565b5050505b806129758161399b565b9150506127d8565b50505b8061298a816138f1565b91505061279b565b5090505b9695505050505050565b600084516000036129b357506000612c72565b6129bd8585612dc5565b600080600187516129ce9190613972565b90506129d86134a4565b81831015612c6a5760008884815181106129f4576129f46138c5565b602002602001015190506000898481518110612a1257612a126138c5565b602002602001015190506000888360ff1681518110612a3357612a336138c5565b602002602001015119898360ff1681518110612a5157612a516138c5565b60200260200101518a8560ff1681518110612a6e57612a6e6138c5565b6020026020010151181690508063ffffffff16600014612c47576000612a94828661302a565b9050612ac58a8460ff1681518110612aae57612aae6138c5565b602002602001015182600160ff919091161b191690565b8a8460ff1681518110612ada57612ada6138c5565b602002602001019063ffffffff16908163ffffffff16815250508a8360ff1681518110612b0957612b096138c5565b602002602001018051809190612b1e90613a14565b60ff1660ff1681525050888360ff1681518110612b3d57612b3d6138c5565b602002602001018051809190612b529061399b565b60ff1660ff1681525050612b8a8a8560ff1681518110612b7457612b746138c5565b602002602001015182600160ff919091161b1790565b8a8560ff1681518110612b9f57612b9f6138c5565b602002602001019063ffffffff16908163ffffffff16815250508a8460ff1681518110612bce57612bce6138c5565b602002602001018051809190612be39061399b565b60ff1660ff1681525050888460ff1681518110612c0257612c026138c5565b602002602001018051809190612c179061399b565b60ff16905250612c2a8c8c896001612dec565b612c378c8c886000612dec565b6001975050505050505050612c72565b85612c51816138f1565b9650508480612c5f90613a31565b9550505050506129d8565b600093505050505b949350505050565b6001600160a01b0381163b612cf75760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610892565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b612d4183613152565b600082511180612d4e5750805b15611efe576118fc8383613192565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600163ffffffff831660ff83161c165b92915050565b8151600003612dd2575050565b610cc08282600060018651612de79190613972565b6131be565b818115612ec7575b6000612e018260016139ec565b12158015612e26575060018551612e189190613972565b612e238260016139ec565b13155b8015612eab57508385612e3a8360016139ec565b81518110612e4a57612e4a6138c5565b602002602001015160ff1681518110612e6557612e656138c5565b602002602001015160ff1684868581518110612e8357612e836138c5565b602002602001015160ff1681518110612e9e57612e9e6138c5565b602002602001015160ff16115b15612ec25780612eba81613a48565b915050612df4565b612f95565b6000612ed4600183613a79565b12158015612ef9575060018551612eeb9190613972565b612ef6600183613a79565b13155b8015612f7e57508385612f0d600184613a79565b81518110612f1d57612f1d6138c5565b602002602001015160ff1681518110612f3857612f386138c5565b602002602001015160ff1684868581518110612f5657612f566138c5565b602002602001015160ff1681518110612f7157612f716138c5565b602002602001015160ff16105b15612f955780612f8d81613a99565b915050612ec7565b828114613023576000858281518110612fb057612fb06138c5565b60200260200101519050858481518110612fcc57612fcc6138c5565b6020026020010151868381518110612fe657612fe66138c5565b602002602001019060ff16908160ff16815250508086858151811061300d5761300d6138c5565b602002602001019060ff16908160ff1681525050505b5050505050565b600080805b63ffffffff8516156130955760018086169003613075578084836130528161399b565b945060ff1660208110613067576130676138c5565b60ff90921660209290920201525b60018563ffffffff16901c9450808061308d9061399b565b91505061302f565b60408051426020808301919091527fff0000000000000000000000000000000000000000000000000000000000000060f885811b8216848601527fffffffff0000000000000000000000000000000000000000000000000000000060e08b901b16604185015286901b166045830152825180830360260181526046909201909252805191012060009061312c9060ff85169061394b565b9050848160ff1660208110613143576131436138c5565b60200201519695505050505050565b61315b81612c7a565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606131b78383604051806060016040528060278152602001613b506027913961339d565b9392505050565b81818082036131ce5750506118fc565b6000858760026131de8888613a79565b6131e89190613aae565b6131f290886139ec565b81518110613202576132026138c5565b602002602001015160ff168151811061321d5761321d6138c5565b602002602001015190505b818313613375575b8060ff1686888581518110613247576132476138c5565b602002602001015160ff1681518110613262576132626138c5565b602002602001015160ff161015613285578261327d81613a48565b935050613230565b85878381518110613298576132986138c5565b602002602001015160ff16815181106132b3576132b36138c5565b602002602001015160ff168160ff1610156132da57816132d281613a99565b925050613285565b818313613370578682815181106132f3576132f36138c5565b602002602001015187848151811061330d5761330d6138c5565b6020026020010151888581518110613327576133276138c5565b60200260200101898581518110613340576133406138c5565b60ff9384166020918202929092010152911690528261335e81613a48565b935050818061336c90613a99565b9250505b613228565b8185121561338957613389878787856131be565b8383121561152e5761152e878785876131be565b6060600080856001600160a01b0316856040516133ba9190613b00565b600060405180830381855af49150503d80600081146133f5576040519150601f19603f3d011682016040523d82523d6000602084013e6133fa565b606091505b5091509150612996868383876060831561347557825160000361346e576001600160a01b0385163b61346e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610892565b5081612c72565b612c72838381511561348a5781518083602001fd5b8060405162461bcd60e51b81526004016108929190613b1c565b6040518061040001604052806020906020820280368337509192915050565b803560ff811681146110f757600080fd5b6000602082840312156134e657600080fd5b6131b7826134c3565b6020808252825182820181905260009190848201906040850190845b818110156135305783516001600160a01b03168352928401929184019160010161350b565b50909695505050505050565b80356001600160a01b03811681146110f757600080fd5b60006020828403121561356557600080fd5b6131b78261353c565b60006020828403121561358057600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156135c6576135c6613587565b604052919050565b600067ffffffffffffffff8211156135e8576135e8613587565b5060051b60200190565b600082601f83011261360357600080fd5b81356020613618613613836135ce565b61359d565b82815260059290921b8401810191818101908684111561363757600080fd5b8286015b848110156136595761364c816134c3565b835291830191830161363b565b509695505050505050565b6000806040838503121561367757600080fd5b823567ffffffffffffffff8082111561368f57600080fd5b61369b868387016135f2565b935060208501359150808211156136b157600080fd5b506136be858286016135f2565b9150509250929050565b600080604083850312156136db57600080fd5b6136e48361353c565b915060208084013567ffffffffffffffff8082111561370257600080fd5b818601915086601f83011261371657600080fd5b81358181111561372857613728613587565b61373a601f8201601f1916850161359d565b9150808252878482850101111561375057600080fd5b80848401858401376000848284010152508093505050509250929050565b6000806040838503121561378157600080fd5b61378a8361353c565b9150602083013563ffffffff811681146137a357600080fd5b809150509250929050565b600060208083850312156137c157600080fd5b823567ffffffffffffffff8111156137d857600080fd5b8301601f810185136137e957600080fd5b80356137f7613613826135ce565b81815260059190911b8201830190838101908783111561381657600080fd5b928401925b828410156126405761382c8461353c565b8252928401929084019061381b565b6020808252825182820181905260009190848201906040850190845b8181101561353057835163ffffffff1683529284019291840191600101613857565b60008060006060848603121561388e57600080fd5b833561ffff811681146138a057600080fd5b92506138ae6020850161353c565b91506138bc604085016134c3565b90509250925092565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201613903576139036138db565b5060010190565b8082028115828204841417612dbf57612dbf6138db565b634e487b7160e01b600052601260045260246000fd5b60008261394657613946613921565b500490565b60008261395a5761395a613921565b500690565b80820180821115612dbf57612dbf6138db565b81810381811115612dbf57612dbf6138db565b634e487b7160e01b600052603160045260246000fd5b600060ff821660ff81036139b1576139b16138db565b60010192915050565b60ff8181168382160190811115612dbf57612dbf6138db565b6000602082840312156139e557600080fd5b5051919050565b8082018281126000831280158216821582161715613a0c57613a0c6138db565b505092915050565b600060ff821680613a2757613a276138db565b6000190192915050565b600081613a4057613a406138db565b506000190190565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613903576139036138db565b8181036000831280158383131683831282161715610826576108266138db565b6000600160ff1b8203613a4057613a406138db565b600082613abd57613abd613921565b600160ff1b821460001984141615613ad757613ad76138db565b500590565b60005b83811015613af7578181015183820152602001613adf565b50506000910152565b60008251613b12818460208701613adc565b9190910192915050565b6020815260008251806020840152613b3b816040850160208701613adc565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212208b49979b2f722eba21fe73a725f59b75c53ae7952a13f2732dd8e0c979721d1c64736f6c63430008110033", + "deployedBytecode": "0x6080604052600436106102195760003560e01c8063893f5da91161011d578063bac506e0116100b0578063d85707d51161007f578063f143896811610064578063f143896814610667578063f2fde38b1461067c578063fe92fe861461069c57600080fd5b8063d85707d514610629578063e30c39781461064957600080fd5b8063bac506e0146105a2578063cc59a6f4146105bc578063cdf64a76146105dc578063d12be06b146105fc57600080fd5b80639fc8ded3116100ec5780639fc8ded31461051e578063a25d526f14610533578063a5129cd014610562578063b2b99ec91461058257600080fd5b8063893f5da91461048e5780638da5cb5b146104bf57806399439089146104dd5780639d95f1cc146104fe57600080fd5b806345954486116101b0578063633207ae1161017f578063715018a611610164578063715018a61461044f578063720a0fa41461046457806379ba50971461047957600080fd5b8063633207ae146104255780636da49b831461043a57600080fd5b8063459544861461039657806348570569146103c85780634f1ef286146103fd57806352d1902d1461041057600080fd5b80632e949824116101ec5780632e949824146102e657806330cdb2751461030857806333083fe6146103565780633659cfe61461037657600080fd5b806301b9e4381461021e5780631a27e21c1461026b5780632520bf041461028d5780632ae9c600146102b0575b600080fd5b34801561022a57600080fd5b506102516102393660046134d4565b60fe6020526000908152604090205463ffffffff1681565b60405163ffffffff90911681526020015b60405180910390f35b34801561027757600080fd5b5061028b6102863660046134d4565b6106bc565b005b34801561029957600080fd5b506102a261070a565b604051908152602001610262565b3480156102bc57600080fd5b50610102546102d390600160a01b900461ffff1681565b60405161ffff9091168152602001610262565b3480156102f257600080fd5b506102fb610741565b60405161026291906134ef565b34801561031457600080fd5b5061033e6103233660046134d4565b60fd602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610262565b34801561036257600080fd5b50610251610371366004613553565b61082d565b34801561038257600080fd5b5061028b610391366004613553565b6108b9565b3480156103a257600080fd5b506103b66103b136600461356e565b610a34565b60405160ff9091168152602001610262565b3480156103d457600080fd5b506103e86103e3366004613664565b610a68565b60408051928352602083019190915201610262565b61028b61040b3660046136c8565b610b58565b34801561041c57600080fd5b506102a2610cc4565b34801561043157600080fd5b506103b660fe81565b34801561044657600080fd5b5060fc546103b6565b34801561045b57600080fd5b5061028b610d89565b34801561047057600080fd5b506103b6600081565b34801561048557600080fd5b5061028b610d9d565b34801561049a57600080fd5b506103b66104a9366004613553565b60ff602081905260009182526040909120541681565b3480156104cb57600080fd5b506033546001600160a01b031661033e565b3480156104e957600080fd5b506101025461033e906001600160a01b031681565b34801561050a57600080fd5b506103b6610519366004613553565b610e28565b34801561052a57600080fd5b506103b660ff81565b34801561053f57600080fd5b5060fb5461055290610100900460ff1681565b6040519015158152602001610262565b34801561056e57600080fd5b5061028b61057d3660046134d4565b6110fc565b34801561058e57600080fd5b5061028b61059d366004613553565b61117c565b3480156105ae57600080fd5b5060fb546103b69060ff1681565b3480156105c857600080fd5b5061028b6105d736600461376e565b611537565b3480156105e857600080fd5b5061028b6105f7366004613553565b6115d5565b34801561060857600080fd5b5061061c6106173660046137ae565b611600565b604051610262919061383b565b34801561063557600080fd5b5060fb546103b69062010000900460ff1681565b34801561065557600080fd5b506065546001600160a01b031661033e565b34801561067357600080fd5b506103b6602081565b34801561068857600080fd5b5061028b610697366004613553565b6116f3565b3480156106a857600080fd5b5061028b6106b7366004613879565b611764565b6106c4611902565b60fb805462ff000019166201000060ff84169081029190911790915560fc548111156106ef575060fc545b60fb805461ffff191660ff9092169190911761010017905550565b6000610714611902565b60fb5460009061072d90610100900460ff16828061195c565b60fb805461ff001916905560ff1691505090565b60fc5460609060008167ffffffffffffffff81111561076257610762613587565b60405190808252806020026020018201604052801561078b578160200160208202803683370190505b50905060005b8281101561082657600060fc82815481106107ae576107ae6138c5565b600091825260208083208183040154601f9092166101000a90910460ff1680835260fd90915260409091205484519192506001600160a01b0316908490849081106107fb576107fb6138c5565b6001600160a01b0390921660209283029190910190910152508061081e816138f1565b915050610791565b5092915050565b6001600160a01b038116600090815260ff60208190526040822054168061089b5760405162461bcd60e51b815260206004820152600c60248201527f6e6f2073756368206e6f6465000000000000000000000000000000000000000060448201526064015b60405180910390fd5b60ff16600090815260fe602052604090205463ffffffff1692915050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036109465760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610892565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166109a17f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610a0c5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610892565b610a1581611ec3565b60408051600080825260208201909252610a3191839190611ecb565b50565b60fc8181548110610a4457600080fd5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b815160fb54600091829160ff918216918391610a869116602061390a565b905060008215610a9f57610a9a8383613937565b610aa2565b60005b90506000610ab0848461394b565b1115610ac457610ac181600161395f565b90505b6000805b8851811015610b4a576000898281518110610ae557610ae56138c5565b602002602001015190506000898260ff1681518110610b0657610b066138c5565b60200260200101519050848160ff161015610b3557610b2860ff821686613972565b610b32908561395f565b93505b50508080610b42906138f1565b915050610ac8565b509097909650945050505050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610be55760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610892565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610c407f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610cab5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610892565b610cb482611ec3565b610cc082826001611ecb565b5050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610d645760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610892565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610d91611902565b610d9b6000612070565b565b60655433906001600160a01b03168114610e1f5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610892565b610a3181612070565b610102546000906001600160a01b0316331480610e4f57506033546001600160a01b031633145b610e9b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610892565b6001600160a01b038216600090815260ff60208190526040909120541615610f055760405162461bcd60e51b815260206004820152601d60248201527f6164647265737320697320616c726561647920726567697374657265640000006044820152606401610892565b6101005460ff1615801590610f2257506101005460fe60ff909116105b610f6e5760405162461bcd60e51b815260206004820152601a60248201527f6e6f64654964203e2030202626206e6f64654964203c206d61780000000000006044820152606401610892565b610101546000908015610ffc57610101610f89600183613972565b81548110610f9957610f996138c5565b90600052602060002090602091828204019190069054906101000a900460ff169150610101805480610fcd57610fcd613985565b60019003818190600052602060002090602091828204019190066101000a81549060ff0219169055905561102b565b610100805460ff169060006110108361399b565b91906101000a81548160ff021916908360ff16021790555091505b60fc8054600181810190925560208082047f371f36870d18f32a11fea0f144b021c8b407bb50f8e0267c711123f454b963c001805460ff808816601f9095166101000a8581029082021990921691909117909155600083815260fd8352604080822080546001600160a01b038c166001600160a01b031990911681179091558252918352818120805460ff19168517905592835260fe9091528120805463ffffffff19169055906110db90612089565b90506110e98160008061195c565b50506101005460ff16925050505b919050565b611104611902565b60fc5460ff821611156111595760405162461bcd60e51b815260206004820152601b60248201527f7266206973206c696d69746564206279206e6f646520636f756e7400000000006044820152606401610892565b60fb805461010060ff9390931661ffff19909116179190911762ff000019169055565b610102546001600160a01b03163314806111a057506033546001600160a01b031633145b6111ec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610892565b6001600160a01b038116600090815260ff60208181526040832054610101805460018101825594529083047f109ea3cebb188b9c1b9fc5bb3920be60dfdc8699098dff92f3d80daaca747689018054601f9094166101000a918316828102929093021990931617909155806112a35760405162461bcd60e51b815260206004820152601060248201527f6e6f206164647265737320666f756e64000000000000000000000000000000006044820152606401610892565b60fc54600003611317576001600160a01b038216600090815260ff602052604090819020805460ff191690555162461bcd60e51b81526108929060040160208082526010908201527f6e6f206e6f646520696420666f756e6400000000000000000000000000000000604082015260600190565b60ff8116600090815260fe60205260408120805463ffffffff19811690915560fc5463ffffffff909116915b81811015611465578360ff1660fc8281548110611362576113626138c5565b60009182526020918290209181049091015460ff601f9092166101000a9004160361145357611392600183613972565b81146114135760fc6113a5600184613972565b815481106113b5576113b56138c5565b90600052602060002090602091828204019190069054906101000a900460ff1660fc82815481106113e8576113e86138c5565b90600052602060002090602091828204019190066101000a81548160ff021916908360ff1602179055505b60fc80548061142457611424613985565b60019003818190600052602060002090602091828204019190066101000a81549060ff02191690559055611465565b8061145d816138f1565b915050611343565b5060ff8316600090815260fd6020526040812080546001600160a01b0319169055611491600019612089565b604080516001808252818301909252919250600091906020808301908036833701905050905085816000815181106114cb576114cb6138c5565b60200260200101906001600160a01b031690816001600160a01b0316815250507fb338e44b9e4e2d94df983fde422fd91ba2bd6f8182b607b50c968f8161bcf8858160405161151a91906134ef565b60405180910390a161152e8260018661195c565b50505050505050565b61153f611902565b6001600160a01b038216600090815260ff602081905260409091205416806115a95760405162461bcd60e51b815260206004820152601e60248201527f6e6f64652061646472657373206973206e6f74207265676973746572656400006044820152606401610892565b60ff16600090815260fe60205260409020805463ffffffff191663ffffffff9290921691909117905550565b6115dd611902565b61010280546001600160a01b0319166001600160a01b0392909216919091179055565b60606000825167ffffffffffffffff81111561161e5761161e613587565b604051908082528060200260200182016040528015611647578160200160208202803683370190505b50905060005b835181101561082657600060ff600086848151811061166e5761166e6138c5565b6020908102919091018101516001600160a01b0316825281810192909252604090810160009081205460ff1680825260fe9093522054845191925063ffffffff169081908590859081106116c4576116c46138c5565b602002602001019063ffffffff16908163ffffffff1681525050505080806116eb906138f1565b91505061164d565b6116fb611902565b606580546001600160a01b0383166001600160a01b0319909116811790915561172c6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600054610100900460ff16158080156117845750600054600160ff909116105b8061179e5750303b15801561179e575060005460ff166001145b6118105760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610892565b6000805460ff191660011790558015611833576000805461ff0019166101001790555b61183b612120565b61184361218b565b6101008054600160ff1990911617905560fb8054610102805462ff00ff199092166201000060ff871602179092557fffffffffffffffffffff0000000000000000000000000000000000000000000016600160a01b61ffff8716026001600160a01b031916176001600160a01b03851617905580156118fc576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6033546001600160a01b03163314610d9b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610892565b60008060fc8054806020026020016040519081016040528092919081815260200182805480156119c957602002820191906000526020600020906000905b825461010083900a900460ff1681526020600192830181810494850194909303909202910180841161199a5790505b505060fb549394505060ff90921691505060fe811115611a2b5760405162461bcd60e51b815260206004820152600660248201527f62616420726600000000000000000000000000000000000000000000000000006044820152606401610892565b815160ff11611a7c5760405162461bcd60e51b815260206004820152600e60248201527f626164206e6f646520636f756e740000000000000000000000000000000000006044820152606401610892565b6000805b8351811015611acc576000848281518110611a9d57611a9d6138c5565b602002602001015190508260ff168160ff161115611ab9578092505b5080611ac4816138f1565b915050611a80565b5060fe60ff821610611add57600080fd5b6000611aea8260016139ba565b60ff1667ffffffffffffffff811115611b0557611b05613587565b604051908082528060200260200182016040528015611b2e578160200160208202803683370190505b5090506000611b3e8360016139ba565b60ff1667ffffffffffffffff811115611b5957611b59613587565b604051908082528060200260200182016040528015611b82578160200160208202803683370190505b50905060005b8551811015611c59576000868281518110611ba557611ba56138c5565b6020026020010151905060018160ff161015611c035760405162461bcd60e51b815260206004820152601160248201527f6e6f6465732061726520312062617365640000000000000000000000000000006044820152606401610892565b60ff8116600081815260fe6020526040902054845163ffffffff9091169185918110611c3157611c316138c5565b63ffffffff909216602092830291909101909101525080611c51816138f1565b915050611b88565b506000611c6b868385888e8e8e6121ff565b60fc5490915015611ce5576000611c8387868561264b565b9050611c948288838688600061277a565b50600080611ca28984610a68565b90925090505b8015611ce1576000611cbc8a85888a6129a0565b90508015611cd557611cce8183613972565b9150611cdb565b50611ce1565b50611ca8565b5050505b600060015b84518160ff161015611d8a576000858260ff1681518110611d0d57611d0d6138c5565b602002602001015160ff161115611d78576000848260ff1681518110611d3557611d356138c5565b60209081029190910181015160ff8416600090815260fe9092526040909120805463ffffffff191663ffffffff8316179055905082611d738161399b565b935050505b80611d828161399b565b915050611cea565b5060008160ff1667ffffffffffffffff811115611da957611da9613587565b604051908082528060200260200182016040528015611dd2578160200160208202803683370190505b509050600060015b86518160ff161015611e7a576000878260ff1681518110611dfd57611dfd6138c5565b602002602001015160ff161115611e685760ff8116600090815260fd60205260409020546001600160a01b03168383611e35816138f1565b945081518110611e4757611e476138c5565b60200260200101906001600160a01b031690816001600160a01b0316815250505b80611e728161399b565b915050611dda565b507fb338e44b9e4e2d94df983fde422fd91ba2bd6f8182b607b50c968f8161bcf88582604051611eaa91906134ef565b60405180910390a150909b9a5050505050505050505050565b610a31611902565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611f0357611efe83612c7a565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611f5d575060408051601f3d908101601f19168201909252611f5a918101906139d3565b60015b611fcf5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610892565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146120645760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610892565b50611efe838383612d38565b606580546001600160a01b0319169055610a3181612d5d565b60fb54600090610100900460ff1680156120a95760fb805461ff00191690555b60fb5460ff1660006120bb85836139ec565b60fb5490915062010000900460ff16158015906120d9575060008112155b80156120f0575060fb5462010000900460ff168113155b80156120fe575060fc548113155b156121175760fb805460ff191660ff8316179055600192505b50909392505050565b600054610100900460ff16610d9b5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610892565b600054610100900460ff166121f65760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610892565b610d9b33612070565b6060808415801561220e575083155b15612229575050604080516000815260208101909152612640565b83156122be576040805160208082526104208201909252908082016104008036833701905050905060005b602060ff821610156122b65761226a8482612daf565b60ff1660011461227b5760ff61227d565b805b828260ff1681518110612292576122926138c5565b60ff90921660209283029190910190910152806122ae8161399b565b915050612254565b509050612640565b6122c960208761390a565b67ffffffffffffffff8111156122e1576122e1613587565b60405190808252806020026020018201604052801561230a578160200160208202803683370190505b5090506000805b8781101561237d5760005b602060ff8216101561236a57808484612334816138f1565b955081518110612346576123466138c5565b60ff90921660209283029190910190910152806123628161399b565b91505061231c565b5080612375816138f1565b915050612311565b5060005b8a518110156124fe5760008b828151811061239e5761239e6138c5565b602002602001015160ff16905060008b82815181106123bf576123bf6138c5565b6020026020010151905060005b602060ff821610156124bb576123e28282612daf565b60ff16156124a95760001960005b8751811015612439578260ff1688828151811061240f5761240f6138c5565b602002602001015160ff160361242757809150612439565b80612431816138f1565b9150506123f0565b50801961247e57600160ff83161b19831692508c848151811061245e5761245e6138c5565b6020026020010180518091906124739061399b565b60ff169052506124a7565b60ff878281518110612492576124926138c5565b602002602001019060ff16908160ff16815250505b505b806124b38161399b565b9150506123cc565b50808c83815181106124cf576124cf6138c5565b602002602001019063ffffffff16908163ffffffff1681525050505080806124f6906138f1565b915050612381565b506000805b83518110156125525760ff8016848281518110612522576125226138c5565b602002602001015160ff1603612540578161253c816138f1565b9250505b8061254a816138f1565b915050612503565b5060008184516125629190613972565b67ffffffffffffffff81111561257a5761257a613587565b6040519080825280602002602001820160405280156125a3578160200160208202803683370190505b5090506000805b85518110156126375760ff80168682815181106125c9576125c96138c5565b602002602001015160ff1614612625578581815181106125eb576125eb6138c5565b6020026020010151838381518110612605576126056138c5565b60ff9092166020928302919091019091015281612621816138f1565b9250505b8061262f816138f1565b9150506125aa565b50909450505050505b979650505050505050565b6060600061265a8460016139ba565b60ff1667ffffffffffffffff81111561267557612675613587565b60405190808252806020026020018201604052801561269e578160200160208202803683370190505b50905060005b85518110156127715760008682815181106126c1576126c16138c5565b602002602001015190506000858260ff16815181106126e2576126e26138c5565b602002602001015190506000805b602060ff82161015612730576127068382612daf565b60ff1660010361271e578161271a8161399b565b9250505b806127288161399b565b9150506126f0565b5080858460ff1681518110612747576127476138c5565b602002602001019060ff16908160ff16815250505050508080612769906138f1565b9150506126a4565b50949350505050565b6000865160000361278d57506000612996565b6127978686612dc5565b6000805b88518110156129925760008982815181106127b8576127b86138c5565b6020026020010151905060ff80168160ff16036127d55750612980565b60005b89518160ff16101561297d5760008a8260ff16815181106127fb576127fb6138c5565b6020026020010151905060008760ff1611801561283a57508660ff168a8260ff168151811061282c5761282c6138c5565b602002602001015160ff1610155b15612845575061296b565b6000898260ff168151811061285c5761285c6138c5565b6020026020010151905060006128728286612daf565b90508060ff166000036129675760ff8e8781518110612893576128936138c5565b60ff928316602091820292909201015260019086161b82178b8460ff16815181106128c0576128c06138c5565b602002602001019063ffffffff16908163ffffffff16815250508b8360ff16815181106128ef576128ef6138c5565b6020026020010180518091906129049061399b565b60ff1660ff1681525050898360ff1681518110612923576129236138c5565b6020026020010180518091906129389061399b565b60ff1660ff16815250506129528d8d8660ff166001612dec565b8661295c816138f1565b97505050505061297d565b5050505b806129758161399b565b9150506127d8565b50505b8061298a816138f1565b91505061279b565b5090505b9695505050505050565b600084516000036129b357506000612c72565b6129bd8585612dc5565b600080600187516129ce9190613972565b90506129d86134a4565b81831015612c6a5760008884815181106129f4576129f46138c5565b602002602001015190506000898481518110612a1257612a126138c5565b602002602001015190506000888360ff1681518110612a3357612a336138c5565b602002602001015119898360ff1681518110612a5157612a516138c5565b60200260200101518a8560ff1681518110612a6e57612a6e6138c5565b6020026020010151181690508063ffffffff16600014612c47576000612a94828661302a565b9050612ac58a8460ff1681518110612aae57612aae6138c5565b602002602001015182600160ff919091161b191690565b8a8460ff1681518110612ada57612ada6138c5565b602002602001019063ffffffff16908163ffffffff16815250508a8360ff1681518110612b0957612b096138c5565b602002602001018051809190612b1e90613a14565b60ff1660ff1681525050888360ff1681518110612b3d57612b3d6138c5565b602002602001018051809190612b529061399b565b60ff1660ff1681525050612b8a8a8560ff1681518110612b7457612b746138c5565b602002602001015182600160ff919091161b1790565b8a8560ff1681518110612b9f57612b9f6138c5565b602002602001019063ffffffff16908163ffffffff16815250508a8460ff1681518110612bce57612bce6138c5565b602002602001018051809190612be39061399b565b60ff1660ff1681525050888460ff1681518110612c0257612c026138c5565b602002602001018051809190612c179061399b565b60ff16905250612c2a8c8c896001612dec565b612c378c8c886000612dec565b6001975050505050505050612c72565b85612c51816138f1565b9650508480612c5f90613a31565b9550505050506129d8565b600093505050505b949350505050565b6001600160a01b0381163b612cf75760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610892565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b612d4183613152565b600082511180612d4e5750805b15611efe576118fc8383613192565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600163ffffffff831660ff83161c165b92915050565b8151600003612dd2575050565b610cc08282600060018651612de79190613972565b6131be565b818115612ec7575b6000612e018260016139ec565b12158015612e26575060018551612e189190613972565b612e238260016139ec565b13155b8015612eab57508385612e3a8360016139ec565b81518110612e4a57612e4a6138c5565b602002602001015160ff1681518110612e6557612e656138c5565b602002602001015160ff1684868581518110612e8357612e836138c5565b602002602001015160ff1681518110612e9e57612e9e6138c5565b602002602001015160ff16115b15612ec25780612eba81613a48565b915050612df4565b612f95565b6000612ed4600183613a79565b12158015612ef9575060018551612eeb9190613972565b612ef6600183613a79565b13155b8015612f7e57508385612f0d600184613a79565b81518110612f1d57612f1d6138c5565b602002602001015160ff1681518110612f3857612f386138c5565b602002602001015160ff1684868581518110612f5657612f566138c5565b602002602001015160ff1681518110612f7157612f716138c5565b602002602001015160ff16105b15612f955780612f8d81613a99565b915050612ec7565b828114613023576000858281518110612fb057612fb06138c5565b60200260200101519050858481518110612fcc57612fcc6138c5565b6020026020010151868381518110612fe657612fe66138c5565b602002602001019060ff16908160ff16815250508086858151811061300d5761300d6138c5565b602002602001019060ff16908160ff1681525050505b5050505050565b600080805b63ffffffff8516156130955760018086169003613075578084836130528161399b565b945060ff1660208110613067576130676138c5565b60ff90921660209290920201525b60018563ffffffff16901c9450808061308d9061399b565b91505061302f565b60408051426020808301919091527fff0000000000000000000000000000000000000000000000000000000000000060f885811b8216848601527fffffffff0000000000000000000000000000000000000000000000000000000060e08b901b16604185015286901b166045830152825180830360260181526046909201909252805191012060009061312c9060ff85169061394b565b9050848160ff1660208110613143576131436138c5565b60200201519695505050505050565b61315b81612c7a565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606131b78383604051806060016040528060278152602001613b506027913961339d565b9392505050565b81818082036131ce5750506118fc565b6000858760026131de8888613a79565b6131e89190613aae565b6131f290886139ec565b81518110613202576132026138c5565b602002602001015160ff168151811061321d5761321d6138c5565b602002602001015190505b818313613375575b8060ff1686888581518110613247576132476138c5565b602002602001015160ff1681518110613262576132626138c5565b602002602001015160ff161015613285578261327d81613a48565b935050613230565b85878381518110613298576132986138c5565b602002602001015160ff16815181106132b3576132b36138c5565b602002602001015160ff168160ff1610156132da57816132d281613a99565b925050613285565b818313613370578682815181106132f3576132f36138c5565b602002602001015187848151811061330d5761330d6138c5565b6020026020010151888581518110613327576133276138c5565b60200260200101898581518110613340576133406138c5565b60ff9384166020918202929092010152911690528261335e81613a48565b935050818061336c90613a99565b9250505b613228565b8185121561338957613389878787856131be565b8383121561152e5761152e878785876131be565b6060600080856001600160a01b0316856040516133ba9190613b00565b600060405180830381855af49150503d80600081146133f5576040519150601f19603f3d011682016040523d82523d6000602084013e6133fa565b606091505b5091509150612996868383876060831561347557825160000361346e576001600160a01b0385163b61346e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610892565b5081612c72565b612c72838381511561348a5781518083602001fd5b8060405162461bcd60e51b81526004016108929190613b1c565b6040518061040001604052806020906020820280368337509192915050565b803560ff811681146110f757600080fd5b6000602082840312156134e657600080fd5b6131b7826134c3565b6020808252825182820181905260009190848201906040850190845b818110156135305783516001600160a01b03168352928401929184019160010161350b565b50909695505050505050565b80356001600160a01b03811681146110f757600080fd5b60006020828403121561356557600080fd5b6131b78261353c565b60006020828403121561358057600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156135c6576135c6613587565b604052919050565b600067ffffffffffffffff8211156135e8576135e8613587565b5060051b60200190565b600082601f83011261360357600080fd5b81356020613618613613836135ce565b61359d565b82815260059290921b8401810191818101908684111561363757600080fd5b8286015b848110156136595761364c816134c3565b835291830191830161363b565b509695505050505050565b6000806040838503121561367757600080fd5b823567ffffffffffffffff8082111561368f57600080fd5b61369b868387016135f2565b935060208501359150808211156136b157600080fd5b506136be858286016135f2565b9150509250929050565b600080604083850312156136db57600080fd5b6136e48361353c565b915060208084013567ffffffffffffffff8082111561370257600080fd5b818601915086601f83011261371657600080fd5b81358181111561372857613728613587565b61373a601f8201601f1916850161359d565b9150808252878482850101111561375057600080fd5b80848401858401376000848284010152508093505050509250929050565b6000806040838503121561378157600080fd5b61378a8361353c565b9150602083013563ffffffff811681146137a357600080fd5b809150509250929050565b600060208083850312156137c157600080fd5b823567ffffffffffffffff8111156137d857600080fd5b8301601f810185136137e957600080fd5b80356137f7613613826135ce565b81815260059190911b8201830190838101908783111561381657600080fd5b928401925b828410156126405761382c8461353c565b8252928401929084019061381b565b6020808252825182820181905260009190848201906040850190845b8181101561353057835163ffffffff1683529284019291840191600101613857565b60008060006060848603121561388e57600080fd5b833561ffff811681146138a057600080fd5b92506138ae6020850161353c565b91506138bc604085016134c3565b90509250925092565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201613903576139036138db565b5060010190565b8082028115828204841417612dbf57612dbf6138db565b634e487b7160e01b600052601260045260246000fd5b60008261394657613946613921565b500490565b60008261395a5761395a613921565b500690565b80820180821115612dbf57612dbf6138db565b81810381811115612dbf57612dbf6138db565b634e487b7160e01b600052603160045260246000fd5b600060ff821660ff81036139b1576139b16138db565b60010192915050565b60ff8181168382160190811115612dbf57612dbf6138db565b6000602082840312156139e557600080fd5b5051919050565b8082018281126000831280158216821582161715613a0c57613a0c6138db565b505092915050565b600060ff821680613a2757613a276138db565b6000190192915050565b600081613a4057613a406138db565b506000190190565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613903576139036138db565b8181036000831280158383131683831282161715610826576108266138db565b6000600160ff1b8203613a4057613a406138db565b600082613abd57613abd613921565b600160ff1b821460001984141615613ad757613ad76138db565b500590565b60005b83811015613af7578181015183820152602001613adf565b50506000910152565b60008251613b12818460208701613adc565b9190910192915050565b6020815260008251806020840152613b3b816040850160208701613adc565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212208b49979b2f722eba21fe73a725f59b75c53ae7952a13f2732dd8e0c979721d1c64736f6c63430008110033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/docker/v2/ValidatorV1.json b/docker/v2/ValidatorV1.json new file mode 100644 index 0000000..dbecf31 --- /dev/null +++ b/docker/v2/ValidatorV1.json @@ -0,0 +1,1161 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ValidatorV1", + "sourceName": "contracts/Validator.sol", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint16", + "name": "valPerBlock", + "type": "uint16" + }, + { + "indexed": false, + "internalType": "uint16", + "name": "valPerBlockTarget", + "type": "uint16" + } + ], + "name": "BlockParamsUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "ownerWallet", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "nodeWallet", + "type": "address" + }, + { + "indexed": false, + "internalType": "enum ValidatorV1.NodeType", + "name": "nodeType", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "nodeTokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "nodeApiBaseUrl", + "type": "string" + } + ], + "name": "NodeAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "nodeWallet", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "reporterWallet", + "type": "address" + }, + { + "indexed": false, + "internalType": "address[]", + "name": "voters", + "type": "address[]" + }, + { + "indexed": false, + "internalType": "enum ValidatorV1.VoteAction", + "name": "voteAction", + "type": "uint8" + } + ], + "name": "NodeReported", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "nodeWallet", + "type": "address" + }, + { + "indexed": false, + "internalType": "enum ValidatorV1.NodeStatus", + "name": "nodeStatus", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "nodeTokens", + "type": "uint256" + } + ], + "name": "NodeStatusChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint16", + "name": "nodeRandomMinCount", + "type": "uint16" + }, + { + "indexed": false, + "internalType": "uint16", + "name": "nodeRandomPingCount", + "type": "uint16" + } + ], + "name": "RandomParamsUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "inputs": [], + "name": "BAN_PERCENT", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "REPORTS_BEFORE_SLASH_S", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "REPORTS_BEFORE_SLASH_V", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "REPORT_THRESHOLD_PER_BLOCK", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SLASHES_BEFORE_BAN_S", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SLASHES_BEFORE_BAN_V", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SLASH_PERCENT", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "VERSION", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "dnodes", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getActiveVNodes", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "nodeWallet", + "type": "address" + }, + { + "internalType": "string", + "name": "nodeApiBaseUrl", + "type": "string" + } + ], + "internalType": "struct ValidatorV1.ActiveValidator[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDNodes", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDNodesLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_nodeWallet", + "type": "address" + } + ], + "name": "getNodeInfo", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "ownerWallet", + "type": "address" + }, + { + "internalType": "address", + "name": "nodeWallet", + "type": "address" + }, + { + "internalType": "enum ValidatorV1.NodeType", + "name": "nodeType", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "nodeTokens", + "type": "uint256" + }, + { + "internalType": "string", + "name": "nodeApiBaseUrl", + "type": "string" + }, + { + "components": [ + { + "internalType": "uint16", + "name": "reportCounter", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "slashCounter", + "type": "uint16" + }, + { + "internalType": "uint128[]", + "name": "reportedInBlocks", + "type": "uint128[]" + }, + { + "internalType": "address[]", + "name": "reportedBy", + "type": "address[]" + }, + { + "internalType": "uint128[]", + "name": "reportedKeys", + "type": "uint128[]" + } + ], + "internalType": "struct ValidatorV1.NodeCounters", + "name": "counters", + "type": "tuple" + }, + { + "internalType": "enum ValidatorV1.NodeStatus", + "name": "status", + "type": "uint8" + } + ], + "internalType": "struct ValidatorV1.NodeInfo", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getSNodes", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getSNodesLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVNodes", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVNodesLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint16", + "name": "protocolVersion_", + "type": "uint16" + }, + { + "internalType": "address", + "name": "pushToken_", + "type": "address" + }, + { + "internalType": "uint16", + "name": "valPerBlockTarget_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "nodeRandomMinCount_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "nodeRandomPingCount_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "REPORTS_BEFORE_SLASH_V_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "REPORTS_BEFORE_SLASH_S_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "SLASHES_BEFORE_BAN_V_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "SLASHES_BEFORE_BAN_S_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "SLASH_PERCENT_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "BAN_PERCENT_", + "type": "uint16" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "minStakeD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minStakeS", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minStakeV", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "nodeMap", + "outputs": [ + { + "internalType": "address", + "name": "ownerWallet", + "type": "address" + }, + { + "internalType": "address", + "name": "nodeWallet", + "type": "address" + }, + { + "internalType": "enum ValidatorV1.NodeType", + "name": "nodeType", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "nodeTokens", + "type": "uint256" + }, + { + "internalType": "string", + "name": "nodeApiBaseUrl", + "type": "string" + }, + { + "components": [ + { + "internalType": "uint16", + "name": "reportCounter", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "slashCounter", + "type": "uint16" + }, + { + "internalType": "uint128[]", + "name": "reportedInBlocks", + "type": "uint128[]" + }, + { + "internalType": "address[]", + "name": "reportedBy", + "type": "address[]" + }, + { + "internalType": "uint128[]", + "name": "reportedKeys", + "type": "uint128[]" + } + ], + "internalType": "struct ValidatorV1.NodeCounters", + "name": "counters", + "type": "tuple" + }, + { + "internalType": "enum ValidatorV1.NodeStatus", + "name": "status", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nodeRandomMinCount", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nodeRandomPingCount", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "protocolVersion", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from_", + "type": "address" + }, + { + "internalType": "address", + "name": "to_", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount_", + "type": "uint256" + } + ], + "name": "redistributeStaked", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeTokens_", + "type": "uint256" + }, + { + "internalType": "enum ValidatorV1.NodeType", + "name": "nodeType_", + "type": "uint8" + }, + { + "internalType": "string", + "name": "nodeApiBaseUrl_", + "type": "string" + }, + { + "internalType": "address", + "name": "nodeWallet_", + "type": "address" + } + ], + "name": "registerNodeAndStake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum ValidatorV1.NodeType", + "name": "targetNodeType_", + "type": "uint8" + }, + { + "internalType": "bytes", + "name": "voteBlob_", + "type": "bytes" + }, + { + "internalType": "bytes[]", + "name": "signatures_", + "type": "bytes[]" + } + ], + "name": "reportNode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "addr_", + "type": "address" + } + ], + "name": "setStorageContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "snodes", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "storageContract", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalFees", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalStaked", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to_", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount_", + "type": "uint256" + } + ], + "name": "unstakeFees", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeWallet_", + "type": "address" + } + ], + "name": "unstakeNode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint16", + "name": "valPerBlockTarget_", + "type": "uint16" + } + ], + "name": "updateBlockParams", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint16", + "name": "nodeRandomMinCount_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "nodeRandomPingCount_", + "type": "uint16" + } + ], + "name": "updateRandomParams", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "valPerBlock", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "valPerBlockTarget", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "vnodes", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "vnodesActive", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60a06040523060805234801561001457600080fd5b50608051615c436200004d60003960008181610db901528181610e3e015281816111a80152818161122d01526113170152615c436000f3fe60806040526004361061031e5760003560e01c80637f6e29de116101a5578063bdb860ea116100ec578063e67a5d7811610095578063f6e8913d1161006f578063f6e8913d146108b2578063f7714eb9146108d7578063fdd9344c146108fe578063ffa1ad741461092057600080fd5b8063e67a5d781461085c578063f108f5b61461087c578063f2fde38b1461089257600080fd5b8063dc38b0a2116100c6578063dc38b0a214610808578063dd6f8f9014610828578063e30c39781461083e57600080fd5b8063bdb860ea146107b2578063c993d861146107c8578063ce3e7e91146107e857600080fd5b8063931127a01161014e578063adf1daa611610128578063adf1daa614610750578063b10064eb14610772578063b27b154d1461079257600080fd5b8063931127a0146106fa578063974c5b411461071b5780639c30db5c1461073057600080fd5b806384f21a441161017f57806384f21a441461069a5780638b8f631f146106bc5780638da5cb5b146106dc57600080fd5b80637f6e29de14610658578063817b1cd21461066e57806381ebc5061461068557600080fd5b80633659cfe61161026957806365cdbaea11610212578063715018a6116101ec578063715018a61461061357806379ba5097146106285780637c4981c81461063d57600080fd5b806365cdbaea146105ae5780636dcd3af2146105d75780636ddf344a146105f757600080fd5b806352d1902d1161024357806352d1902d1461054c578063569c876214610561578063582115fb1461058157600080fd5b80633659cfe6146104e65780633a688a2f146105065780634f1ef2861461053957600080fd5b80631acf7629116102cb57806324212b86116102a557806324212b86146104855780632ae9c6001461049b578063339f334b146104b657600080fd5b80631acf76291461041657806323b8ac5d1461043857806323deecfe1461046357600080fd5b8063125c6c98116102fc578063125c6c98146103b957806313114a9d146103dd57806315aa7b06146103f457600080fd5b8063011f59a014610323578063024f38cb1461035d57806311ce026714610380575b600080fd5b34801561032f57600080fd5b5060ff5461034590600160701b900461ffff1681565b60405161ffff90911681526020015b60405180910390f35b34801561036957600080fd5b5060ff5461034590640100000000900461ffff1681565b34801561038c57600080fd5b50610101546103a1906001600160a01b031681565b6040516001600160a01b039091168152602001610354565b3480156103c557600080fd5b506103cf60fc5481565b604051908152602001610354565b3480156103e957600080fd5b506103cf6101085481565b34801561040057600080fd5b50610409610976565b6040516103549190614fd2565b34801561042257600080fd5b50610436610431366004614ffa565b6109d9565b005b34801561044457600080fd5b5060ff54610345906c01000000000000000000000000900461ffff1681565b34801561046f57600080fd5b5060ff5461034590600160801b900461ffff1681565b34801561049157600080fd5b506103cf60fe5481565b3480156104a757600080fd5b5060fb546103459061ffff1681565b3480156104c257600080fd5b506104d66104d1366004615017565b610b34565b6040519015158152602001610354565b3480156104f257600080fd5b50610436610501366004614ffa565b610daf565b34801561051257600080fd5b50610526610521366004614ffa565b610f2a565b60405161035497969594939291906151a7565b6104366105473660046152d3565b61119e565b34801561055857600080fd5b506103cf61130a565b34801561056d57600080fd5b506103a161057c366004615323565b6113cf565b34801561058d57600080fd5b506105a161059c366004614ffa565b6113fa565b604051610354919061533c565b3480156105ba57600080fd5b5060ff54610345906a0100000000000000000000900461ffff1681565b3480156105e357600080fd5b506104366105f23660046153ea565b6116eb565b34801561060357600080fd5b50610103546103459061ffff1681565b34801561061f57600080fd5b50610436611b1f565b34801561063457600080fd5b50610436611b33565b34801561064957600080fd5b5060ff546103459061ffff1681565b34801561066457600080fd5b50610105546103cf565b34801561067a57600080fd5b506103cf6101075481565b34801561069157600080fd5b50610409611bbe565b3480156106a657600080fd5b506106af611c1f565b60405161035491906154b8565b3480156106c857600080fd5b506103a16106d7366004615323565b611e6e565b3480156106e857600080fd5b506033546001600160a01b03166103a1565b34801561070657600080fd5b5060ff546103459062010000900461ffff1681565b34801561072757600080fd5b50610409611e7f565b34801561073c57600080fd5b5061043661074b366004615544565b611ee0565b34801561075c57600080fd5b5060ff5461034590600160901b900461ffff1681565b34801561077e57600080fd5b5061043661078d3660046155c2565b612775565b34801561079e57600080fd5b506104366107ad3660046156bc565b612daa565b3480156107be57600080fd5b50610104546103cf565b3480156107d457600080fd5b506103a16107e3366004615323565b612e7c565b3480156107f457600080fd5b506104d66108033660046156d7565b612e8d565b34801561081457600080fd5b50610436610823366004614ffa565b61336a565b34801561083457600080fd5b506103cf60fd5481565b34801561084a57600080fd5b506065546001600160a01b03166103a1565b34801561086857600080fd5b50610436610877366004615718565b613395565b34801561088857600080fd5b50610102546103cf565b34801561089e57600080fd5b506104366108ad366004614ffa565b61346a565b3480156108be57600080fd5b5060ff54610345906601000000000000900461ffff1681565b3480156108e357600080fd5b5060ff546103459068010000000000000000900461ffff1681565b34801561090a57600080fd5b5060ff5461034590600160a01b900461ffff1681565b34801561092c57600080fd5b506109696040518060400160405280600581526020017f302e302e3200000000000000000000000000000000000000000000000000000081525081565b604051610354919061574b565b60606101058054806020026020016040519081016040528092919081815260200182805480156109cf57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109b1575b5050505050905090565b6001600160a01b038082166000908152610106602052604090206001810154909116610a4c5760405162461bcd60e51b815260206004820152601460248201527f6e6f646520646f6573206e6f742065786973747300000000000000000000000060448201526064015b60405180910390fd5b80546001600160a01b0316331480610a7d575033610a726033546001600160a01b031690565b6001600160a01b0316145b610ac95760405162461bcd60e51b815260206004820152601d60248201527f6f6e6c79206f776e65722063616e20756e7374616b652061206e6f64650000006044820152606401610a43565b610ad2816134db565b5060088101805460ff1916600490811790915560018201546040516001600160a01b03909116917ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e91610b28919060009061575e565b60405180910390a25050565b6000610b3e6137c6565b6001600160a01b038316610b945760405162461bcd60e51b815260206004820152601260248201527f696e76616c696420746f206164647265737300000000000000000000000000006044820152606401610a43565b60008211610be45760405162461bcd60e51b815260206004820152600e60248201527f696e76616c696420616d6f756e740000000000000000000000000000000000006044820152606401610a43565b610108548211158015610c7c5750610100546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610c54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c789190615779565b8211155b610cc85760405162461bcd60e51b815260206004820152601460248201527f696e73756666696369656e742062616c616e63650000000000000000000000006044820152606401610a43565b6101005460405163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529091169063a9059cbb906044016020604051808303816000875af1158015610d1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d409190615792565b610d8c5760405162461bcd60e51b815260206004820152601260248201527f6661696c656420746f207472616e7366657200000000000000000000000000006044820152606401610a43565b816101086000828254610d9f91906157ca565b9091555060019150505b92915050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610e3c5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610a43565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610e977f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610f025760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610a43565b610f0b81613820565b60408051600080825260208201909252610f2791839190613828565b50565b6101066020526000908152604090208054600182015460028301546003840180546001600160a01b039485169594841694600160a01b90940460ff16939190610f72906157dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9e906157dd565b8015610feb5780601f10610fc057610100808354040283529160200191610feb565b820191906000526020600020905b815481529060010190602001808311610fce57829003601f168201915b50506040805160a08101825260048701805461ffff808216845262010000909104166020808401919091526005890180548551818402810184018752818152999a99949850929650938701945091929183018282801561109c57602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116110595790505b50505050508152602001600282018054806020026020016040519081016040528092919081815260200182805480156110fe57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116110e0575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561118857602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116111455790505b5050509190925250505060089091015460ff1687565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361122b5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610a43565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166112867f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b0316146112f15760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610a43565b6112fa82613820565b61130682826001613828565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113aa5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610a43565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b61010581815481106113e057600080fd5b6000918252602090912001546001600160a01b0316905081565b611402614db9565b6001600160a01b0382811660009081526101066020908152604091829020825160e08101845281548516815260018201549485169281019290925290929091830190600160a01b900460ff16600281111561145f5761145f615043565b600281111561147057611470615043565b81526020016002820154815260200160038201805461148e906157dd565b80601f01602080910402602001604051908101604052809291908181526020018280546114ba906157dd565b80156115075780601f106114dc57610100808354040283529160200191611507565b820191906000526020600020905b8154815290600101906020018083116114ea57829003601f168201915b50505091835250506040805160a08101825260048401805461ffff808216845262010000909104166020838101919091526005860180548551818402810184018752818152968301969495939493860193928301828280156115ba57602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116115775790505b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561161c57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116115fe575b50505050508152602001600382018054806020026020016040519081016040528092919081815260200182805480156116a657602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116116635790505b505050919092525050508152600882015460209091019060ff1660048111156116d1576116d1615043565b60048111156116e2576116e2615043565b90525092915050565b600054610100900460ff161580801561170b5750600054600160ff909116105b806117255750303b158015611725575060005460ff166001145b6117975760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a43565b6000805460ff1916600117905580156117ba576000805461ff0019166101001790555b6117c26139cd565b6117ca613a38565b60fb805461ffff191661ffff8e161790556001600160a01b038b166117ee57600080fd5b61010080546001600160a01b0319166001600160a01b038d1617905561ffff8a1661185b5760405162461bcd60e51b815260206004820152601860248201527f696e76616c69642061747465737465727320616d6f756e7400000000000000006044820152606401610a43565b60ff805461ffff808d16600160801b0271ffff00000000000000000000000000000000199092169190911790915589166118fd5760405162461bcd60e51b815260206004820152602160248201527f696e76616c6964206e6f646552616e646f6d4d696e436f756e7420616d6f756e60448201527f74000000000000000000000000000000000000000000000000000000000000006064820152608401610a43565b60ff805461ffff808c16600160901b027fffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffff9092169190911790915588166119ac5760405162461bcd60e51b815260206004820152602c60248201527f696e76616c6964206e6f646552616e646f6d46696c74657250696e677352657160448201527f756972656420616d6f756e7400000000000000000000000000000000000000006064820152608401610a43565b8760ff60146101000a81548161ffff021916908361ffff160217905550606460fc81905550606460fd81905550606460fe819055508660ff60026101000a81548161ffff021916908361ffff1602179055508560ff60046101000a81548161ffff021916908361ffff1602179055508260ff60066101000a81548161ffff021916908361ffff1602179055508460ff60086101000a81548161ffff021916908361ffff1602179055508360ff600a6101000a81548161ffff021916908361ffff1602179055508160ff600c6101000a81548161ffff021916908361ffff160217905550604260ff60006101000a81548161ffff021916908361ffff160217905550600060ff600e6101000a81548161ffff021916908361ffff1602179055508015611b11576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050505050565b611b276137c6565b611b316000613aa8565b565b60655433906001600160a01b03168114611bb55760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610a43565b610f2781613aa8565b60606101048054806020026020016040519081016040528092919081815260200182805480156109cf576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109b1575050505050905090565b60606000805b61010254811015611ca85760006101028281548110611c4657611c46615817565b60009182526020808320909101546001600160a01b03168083526101069091526040909120600881015491925090611c809060ff16613ac1565b15611c935783611c8f8161582d565b9450505b50508080611ca09061582d565b915050611c25565b5060008167ffffffffffffffff811115611cc457611cc4615214565b604051908082528060200260200182016040528015611d0a57816020015b604080518082019091526000815260606020820152815260200190600190039081611ce25790505b5090506000805b61010254811015611e655760006101028281548110611d3257611d32615817565b60009182526020808320909101546001600160a01b03168083526101069091526040909120600881015491925090611d6c9060ff16613ac1565b611d77575050611e53565b6040805180820190915260018201546001600160a01b03168152600382018054602083019190611da6906157dd565b80601f0160208091040260200160405190810160405280929190818152602001828054611dd2906157dd565b8015611e1f5780601f10611df457610100808354040283529160200191611e1f565b820191906000526020600020905b815481529060010190602001808311611e0257829003601f168201915b5050505050815250858580611e339061582d565b965081518110611e4557611e45615817565b602002602001018190525050505b80611e5d8161582d565b915050611d11565b50909392505050565b61010481815481106113e057600080fd5b60606101028054806020026020016040519081016040528092919081815260200182805480156109cf576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109b1575050505050905090565b6000836002811115611ef457611ef4615043565b03611fa65760fc54841015611f555760405162461bcd60e51b815260206004820152602160248201527f496e73756666696369656e7420636f6c6c61746572616c20666f7220564e4f446044820152604560f81b6064820152608401610a43565b61010280546001810182556000919091527f93bdaa6a4190909b7c3fbe8d42169ffe1cab19f51dfc8db24c71abf849eced4a0180546001600160a01b0319166001600160a01b03831617905561217a565b6001836002811115611fba57611fba615043565b0361206c5760fd5484101561201b5760405162461bcd60e51b815260206004820152602160248201527f496e73756666696369656e7420636f6c6c61746572616c20666f7220534e4f446044820152604560f81b6064820152608401610a43565b61010480546001810182556000919091527f4c0be60200faa20559308cb7b5a1bb3255c16cb1cab91f525b5ae7a03d02fabe0180546001600160a01b0319166001600160a01b03831617905561217a565b600283600281111561208057612080615043565b036121325760fe548410156120e15760405162461bcd60e51b815260206004820152602160248201527f496e73756666696369656e7420636f6c6c61746572616c20666f7220444e4f446044820152604560f81b6064820152608401610a43565b61010580546001810182556000919091527ffc62abc8c0fc47c2d92f5aec99bf8b60f375828e14394d89345cae11a98673710180546001600160a01b0319166001600160a01b03831617905561217a565b60405162461bcd60e51b815260206004820152601560248201527f756e737570706f72746564206e6f6465547970652000000000000000000000006044820152606401610a43565b6001600160a01b0380821660009081526101066020526040902080549091161561220c5760405162461bcd60e51b815260206004820152602560248201527f61206e6f64652077697468207075624b657920697320616c726561647920646560448201527f66696e65640000000000000000000000000000000000000000000000000000006064820152608401610a43565b841561231957610100546040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523360048201523060248201526000916001600160a01b03169063dd62ed3e90604401602060405180830381865afa15801561227b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061229f9190615779565b9050858110156123175760405162461bcd60e51b815260206004820152603260248201527f5f6e6f6465546f6b656e732063616e6e6f74206265207472616e73666572726560448201527f642c20636865636b20616c6c6f77616e636500000000000000000000000000006064820152608401610a43565b505b612321614db9565b3381526001600160a01b03831660208201526040810185600281111561234957612349615043565b9081600281111561235c5761235c615043565b90525060608101869052608081018490526001600160a01b0380841660009081526101066020908152604091829020845181549085166001600160a01b0319918216178255918501516001820180549190951692811683178555928501518594919390927fffffffffffffffffffffff00000000000000000000000000000000000000000090911617600160a01b8360028111156123fc576123fc615043565b0217905550606082015160028201556080820151600382019061241f908261588c565b5060a0820151805160048301805460208085015161ffff908116620100000263ffffffff1990931694169390931717815560408301518051919261246b92600587019290910190614e2d565b5060608201518051612487916002840191602090910190614ee5565b50608082015180516124a3916003840191602090910190614e2d565b50505060c082015160088201805460ff191660018360048111156124c9576124c9615043565b021790555050861590506125de57610100546040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018890526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015612548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256c9190615792565b6125de5760405162461bcd60e51b815260206004820152602560248201527f6661696c656420746f207472616e7366657220746f6b656e7320746f20636f6e60448201527f74726163740000000000000000000000000000000000000000000000000000006064820152608401610a43565b8561010760008282546125f1919061594c565b909155506000905085600281111561260b5761260b615043565b0361261d57612618613afb565b61271e565b600185600281111561263157612631615043565b0361271e57610101546001600160a01b031661268f5760405162461bcd60e51b815260206004820152601b60248201527f6e6f2073746f7261676520636f6e747261637420646566696e656400000000006044820152606401610a43565b610101546040517f9d95f1cc0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152909116908190639d95f1cc906024016020604051808303816000875af11580156126f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271b9190615970565b50505b826001600160a01b0316336001600160a01b03167f67bd55f864dcc77d483ff7567de0889142417ef6d0299753cfd80e4c72ddc5548789886040516127659392919061598b565b60405180910390a3505050505050565b3360009081526101066020526040902060018101546001600160a01b03166127df5760405162461bcd60e51b815260206004820152601060248201527f696e76616c6964207265706f72746572000000000000000000000000000000006044820152606401610a43565b600080835167ffffffffffffffff8111156127fc576127fc615214565b604051908082528060200260200182016040528015612825578160200160208202803683370190505b50905060005b84518110156129b457600073__$7aaf162b34d2533b02434bde51cad0c5c5$__6336de68108888858151811061286357612863615817565b60200260200101516040518363ffffffff1660e01b81526004016128889291906159b3565b602060405180830381865af41580156128a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c991906159d8565b6001600160a01b03808216600090815261010660205260409020600181015492935091166128f85750506129a2565b6000805b8681101561295157836001600160a01b031686828151811061292057612920615817565b60200260200101516001600160a01b03160361293f5760019150612951565b806129498161582d565b9150506128fc565b508015612960575050506129a2565b82858761296c8161582d565b98508151811061297e5761297e615817565b60200260200101906001600160a01b031690816001600160a01b0316815250505050505b806129ac8161582d565b91505061282b565b508351821015612a6a5760008267ffffffffffffffff8111156129d9576129d9615214565b604051908082528060200260200182016040528015612a02578160200160208202803683370190505b50905060005b83811015612a6657828181518110612a2257612a22615817565b6020026020010151828281518110612a3c57612a3c615817565b6001600160a01b039092166020928302919091019091015280612a5e8161582d565b915050612a08565b5090505b6000866002811115612a7e57612a7e615043565b03612c0957600080600087806020019051810190612a9c9190615a0c565b9194509250905060ff8316600114612af65760405162461bcd60e51b815260206004820152601c60248201527f7265706f727420616374696f6e206f6e6c7920737570706f72746564000000006044820152606401610a43565b6001600160a01b038082166000908152610106602052604090206001810154909116612b6f5760405162461bcd60e51b815260206004820152602260248201527f746172676574206e6f64652077616c6c657420646f6573206e6f742065786973604482015261747360f01b6064820152608401610a43565b60006001820154600160a01b900460ff166002811115612b9157612b91615043565b14612bde5760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220564e6f646573000000000000000000006044820152606401610a43565b612bff8460ff166002811115612bf657612bf6615043565b88878487613c61565b5050505050612da2565b6001866002811115612c1d57612c1d615043565b03612da25760008060008088806020019051810190612c3c9190615a53565b9296509094509250905060ff8416600214612c995760405162461bcd60e51b815260206004820152601c60248201527f7265706f727420616374696f6e206f6e6c7920737570706f72746564000000006044820152606401610a43565b6001600160a01b038083166000908152610106602052604090206001810154909116612d125760405162461bcd60e51b815260206004820152602260248201527f746172676574206e6f64652077616c6c657420646f6573206e6f742065786973604482015261747360f01b6064820152608401610a43565b600180820154600160a01b900460ff166002811115612d3357612d33615043565b14612d805760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220534e6f646573000000000000000000006044820152606401610a43565b611b118560ff166002811115612d9857612d98615043565b8988848887613e09565b505050505050565b612db26137c6565b6101025461ffff82161115612e095760405162461bcd60e51b815260206004820152601c60248201527f696e636f72726563742076616c506572426c6f636b5461726765745f000000006044820152606401610a43565b60ff805471ffff000000000000000000000000000000001916600160801b61ffff848116918202929092179283905560408051600160701b909404909216835260208301527f81512b84dc2b38f82b4999b5512a14df033b165371fa51776cce559212bf0a44910160405180910390a150565b61010281815481106113e057600080fd5b6000612e976137c6565b60008211612ee75760405162461bcd60e51b815260206004820152601960248201527f616d6f756e742073686f756c6420626520706f736974697665000000000000006044820152606401610a43565b826001600160a01b0316846001600160a01b031603612f6e5760405162461bcd60e51b815260206004820152602660248201527f63616e6e6f74207472616e73666572206265747765656e2073616d652061646460448201527f72657373657300000000000000000000000000000000000000000000000000006064820152608401610a43565b6001600160a01b03831615801590612f8d57506001600160a01b038416155b156130b45781610108541015612ff55760405162461bcd60e51b815260206004820152602760248201527f66726f6d206e6f64652073686f756c64206861766520656e6f75676820636f6c6044820152661b185d195c985b60ca1b6064820152608401610a43565b6001600160a01b0380841660009081526101066020526040902080549091166130605760405162461bcd60e51b815260206004820152600f60248201527f6d697373696e6720746f206e6f646500000000000000000000000000000000006044820152606401610a43565b82610108600082825461307391906157ca565b9250508190555082610107600082825461308d919061594c565b92505081905550828160020160008282546130a8919061594c565b90915550613360915050565b6001600160a01b038416158015906130d357506001600160a01b038316155b156131ef576001600160a01b0380851660009081526101066020526040902080549091166131435760405162461bcd60e51b815260206004820152601160248201527f6d697373696e672066726f6d206e6f64650000000000000000000000000000006044820152606401610a43565b82816002015410156131a75760405162461bcd60e51b815260206004820152602760248201527f66726f6d206e6f64652073686f756c64206861766520656e6f75676820636f6c6044820152661b185d195c985b60ca1b6064820152608401610a43565b828160020160008282546131bb91906157ca565b925050819055508261010760008282546131d591906157ca565b925050819055508261010860008282546130a8919061594c565b6001600160a01b03808516600090815261010660205260409020805490911661325a5760405162461bcd60e51b815260206004820152601160248201527f6d697373696e672066726f6d206e6f64650000000000000000000000000000006044820152606401610a43565b82816002015410156132be5760405162461bcd60e51b815260206004820152602760248201527f66726f6d206e6f64652073686f756c64206861766520656e6f75676820636f6c6044820152661b185d195c985b60ca1b6064820152608401610a43565b6001600160a01b0380851660009081526101066020526040902082549091166133295760405162461bcd60e51b815260206004820152600f60248201527f6d697373696e6720746f206e6f646500000000000000000000000000000000006044820152606401610a43565b8382600201600082825461333d91906157ca565b9250508190555083816002016000828254613358919061594c565b909155505050505b5060019392505050565b6133726137c6565b61010180546001600160a01b0319166001600160a01b0392909216919091179055565b61339d6137c6565b6101025461ffff8316106133b057600080fd5b6101025461ffff8216106133c357600080fd5b60ff80547fffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffff16600160901b61ffff8581169182027fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1692909217600160a01b928516928302179092556040805192835260208301919091527fcd481667fa77e513c517493174075f0471ec1fe24d57af644377cd1a2572d13d910160405180910390a15050565b6134726137c6565b606580546001600160a01b0383166001600160a01b031990911681179091556134a36033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600281015461010054825460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810184905260009392919091169063a9059cbb906044016020604051808303816000875af115801561353b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061355f9190615792565b6135d15760405162461bcd60e51b815260206004820152602560248201527f6661696c656420746f20747261736665722066756e6473206261636b20746f2060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610a43565b600083600201819055508061010760008282546135ee91906157ca565b92505081905550806101086000828254613608919061594c565b90915550600090506001840154600160a01b900460ff16600281111561363057613630615043565b0361367a57613643600584016000614f3a565b613651600684016000614f5f565b600183015461366c90610102906001600160a01b0316613fb5565b50613675613afb565b610da9565b600180840154600160a01b900460ff16600281111561369b5761369b615043565b03610da957610101546001600160a01b03166136f95760405162461bcd60e51b815260206004820152601b60248201527f6e6f2073746f7261676520636f6e747261637420646566696e656400000000006044820152606401610a43565b6101015460018401546040517fb2b99ec90000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690819063b2b99ec990602401600060405180830381600087803b15801561376057600080fd5b505af1158015613774573d6000803e3d6000fd5b5061378792505050600585016000614f3a565b613795600685016000614f5f565b6137a3600785016000614f3a565b60018401546137be90610104906001600160a01b0316613fb5565b505092915050565b6033546001600160a01b03163314611b315760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a43565b610f276137c6565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156138605761385b836140e1565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156138ba575060408051601f3d908101601f191682019092526138b791810190615779565b60015b61392c5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610a43565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146139c15760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610a43565b5061385b83838361419f565b600054610100900460ff16611b315760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610a43565b600054610100900460ff16613aa35760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610a43565b611b31335b606580546001600160a01b0319169055610f27816141ca565b60006004826004811115613ad757613ad7615043565b1480613af457506003826004811115613af257613af2615043565b145b1592915050565b6000805b61010254811015613b825760006101028281548110613b2057613b20615817565b60009182526020808320909101546001600160a01b03168083526101069091526040909120600881015491925090613b5a9060ff16613ac1565b15613b6d5783613b6981615aa9565b9450505b50508080613b7a9061582d565b915050613aff565b50610103805461ffff191661ffff83811691821790925560ff548392600160801b9091041690811015613bb3578091505b60ff5461ffff808316600160701b909204161115613bd057600080fd5b60ff5461ffff838116600160701b909204161461385b5760ff80547fffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffff16600160701b61ffff858116918202929092179092556040805192835290831660208301527f81512b84dc2b38f82b4999b5512a14df033b165371fa51776cce559212bf0a44910160405180910390a1505050565b6000806001840154600160a01b900460ff166002811115613c8457613c84615043565b14613cd15760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220564e6f646573000000000000000000006044820152606401610a43565b60ff54606490613cef9061ffff80821691600160701b900416615aca565b613cf99190615afe565b61ffff1684511015613d4d5760405162461bcd60e51b815260206004820152601460248201527f73696720636f756e7420697320746f6f206c6f770000000000000000000000006044820152606401610a43565b600883015460ff166004816004811115613d6957613d69615043565b1480613d8657506003816004811115613d8457613d84615043565b145b15613d95576000915050613e00565b613da48787868887600061421c565b60ff54600485015461ffff620100009092048216911610613dc957613dc98685614892565b60ff5460048501546801000000000000000090910461ffff908116620100009092041610613dfa57613dfa84614af0565b60009150505b95945050505050565b6000600180850154600160a01b900460ff166002811115613e2c57613e2c615043565b14613e795760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220534e6f646573000000000000000000006044820152606401610a43565b60ff54606490613e979061ffff80821691600160701b900416615aca565b613ea19190615afe565b61ffff1685511015613ef55760405162461bcd60e51b815260206004820152601460248201527f73696720636f756e7420697320746f6f206c6f770000000000000000000000006044820152606401610a43565b600884015460ff166004816004811115613f1157613f11615043565b1480613f2e57506003816004811115613f2c57613f2c615043565b145b15613f3d576000915050613fab565b613f4b88888789888861421c565b60ff54600486015461ffff6401000000009092048216911610613f7257613f728786614892565b60ff5460048601546a010000000000000000000090910461ffff908116620100009092041610613fa557613fa585614af0565b60009150505b9695505050505050565b8154600090815b818110156140d657836001600160a01b0316858281548110613fe057613fe0615817565b6000918252602090912001546001600160a01b0316036140c4576140056001836157ca565b811461408657846140176001846157ca565b8154811061402757614027615817565b9060005260206000200160009054906101000a90046001600160a01b031685828154811061405757614057615817565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b8480548061409657614096615b1f565b600082815260209020810160001990810180546001600160a01b03191690550190555060019150610da99050565b806140ce8161582d565b915050613fbc565b506000949350505050565b6001600160a01b0381163b61415e5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610a43565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6141a883614b97565b6000825111806141b55750805b1561385b576141c48383614bd7565b50505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000846004016001018054806020026020016040519081016040528092919081815260200182805480156142a157602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f0104928301926001038202915080841161425e5790505b505083519394506000925050505b81811015614343578281815181106142c9576142c9615817565b60200260200101516001600160801b0316856001600160801b0316036143315760405162461bcd60e51b815260206004820152601060248201527f626c6f636b206973206e6f74206e6577000000000000000000000000000000006044820152606401610a43565b8061433b8161582d565b9150506142af565b50600180870154600160a01b900460ff16600281111561436557614365615043565b0361453057826001600160801b03166000036143c35760405162461bcd60e51b815260206004820152601760248201527f73746f72616765206b65792069732072657175697265640000000000000000006044820152606401610a43565b60008660040160030180548060200260200160405190810160405280929190818152602001828054801561444857602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116144055790505b505083519394506000925050505b818110156144ea5782818151811061447057614470615817565b60200260200101516001600160801b0316866001600160801b0316036144d85760405162461bcd60e51b815260206004820152601660248201527f73746f72616765206b6579206973206e6f74206e6577000000000000000000006044820152606401610a43565b806144e28161582d565b915050614456565b505050600786018054600180820183556000928352602090922060028204018054929091166010026101000a6001600160801b0381810219909316928616029190911790555b60048601805461ffff1690600061454683615aa9565b825461010092830a61ffff818102199092169290911602179091556005880180546001818101835560009283526020808420600284040180549390921660100290940a6001600160801b0381810219909316928a1602919091179055600689018054604080518286028101860190915281815292945091929091908301828280156145fa57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116145dc575b505083519394506000925050505b87518110156146fe5760005b828110156146eb5783818151811061462e5761462e615817565b60200260200101516001600160a01b031689838151811061465157614651615817565b60200260200101516001600160a01b031614801561469b575060006001600160a01b031689838151811061468757614687615817565b60200260200101516001600160a01b031614155b156146d95760008983815181106146b4576146b4615817565b60200260200101906001600160a01b031690816001600160a01b0316815250506146eb565b806146e38161582d565b915050614614565b50806146f68161582d565b915050614608565b5060005b87518110156147ab57600088828151811061471f5761471f615817565b6020026020010151905060006001600160a01b0316816001600160a01b031614614798578960040160020189838151811061475c5761475c615817565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790555b50806147a38161582d565b915050614702565b506000600889015460ff1660048111156147c7576147c7615043565b036147dc5760088801805460ff191660011790555b600180890154908a01546040517f19d5f3972073c7002111a82b2a44db11e739567a002445f2e3db8ab96fe6645f92614827926001600160a01b03918216929116908b908f90615b35565b60405180910390a16001880154600889015460028a01546040516001600160a01b03909316927ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e9261487e9260ff9091169161575e565b60405180910390a250505050505050505050565b60ff5460009081906148b39084906601000000000000900461ffff16614c03565b600685018054604080516020808402820181019092528281529496509294506000939283018282801561490f57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116148f1575b5050505050905060008083118015614928575060008251115b156149d25781516149399084615b7b565b905060005b82518110156149d0576000610106600085848151811061496057614960615817565b6020908102919091018101516001600160a01b0390811683529082019290925260400160002080549092501661499657506149be565b828160020160008282546149aa919061594c565b909155506149ba905083866157ca565b9450505b806149c88161582d565b91505061493e565b505b828660020160008282546149e6919061594c565b909155506149fa9050600686016000614f5f565b6000600886015460ff166004811115614a1557614a15615043565b1480614a3957506001600886015460ff166004811115614a3757614a37615043565b145b15614a4e5760088501805460ff191660021790555b60048501805461ffff191680825562010000900461ffff16906002614a7283615aa9565b91906101000a81548161ffff021916908361ffff160217905550508460010160009054906101000a90046001600160a01b03166001600160a01b03167ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e600286604051614ae092919061575e565b60405180910390a2505050505050565b60ff546000908190614b179084906c01000000000000000000000000900461ffff16614c03565b9092509050614b25836134db565b5060048301805463ffff00001916905560088301805460ff1916600390811790915560018401546040516001600160a01b03909116917ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e91614b8a919060009061575e565b60405180910390a2505050565b614ba0816140e1565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060614bfc8383604051806060016040528060278152602001615be760279139614ca5565b9392505050565b60008060648363ffffffff161115614c5d5760405162461bcd60e51b815260206004820181905260248201527f70657263656e746167652073686f756c6420626520696e205b302c203130305d6044820152606401610a43565b60028401546064614c6e8582615b8f565b614c7e9063ffffffff1683615bb3565b614c889190615b7b565b9250614c9483826157ca565b600286018490559150509250929050565b6060600080856001600160a01b031685604051614cc29190615bca565b600060405180830381855af49150503d8060008114614cfd576040519150601f19603f3d011682016040523d82523d6000602084013e614d02565b606091505b5091509150613fab8683838760608315614d7d578251600003614d76576001600160a01b0385163b614d765760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a43565b5081614d87565b614d878383614d8f565b949350505050565b815115614d9f5781518083602001fd5b8060405162461bcd60e51b8152600401610a43919061574b565b6040805160e081018252600080825260208201819052909182019081526020016000815260200160608152602001614e216040518060a00160405280600061ffff168152602001600061ffff1681526020016060815260200160608152602001606081525090565b81526020016000905290565b82805482825590600052602060002090600101600290048101928215614ed55791602002820160005b83821115614ea057835183826101000a8154816001600160801b0302191690836001600160801b031602179055509260200192601001602081600f01049283019260010302614e56565b8015614ed35782816101000a8154906001600160801b030219169055601001602081600f01049283019260010302614ea0565b505b50614ee1929150614f79565b5090565b828054828255906000526020600020908101928215614ed5579160200282015b82811115614ed557825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614f05565b508054600082556001016002900490600052602060002090810190610f279190614f79565b5080546000825590600052602060002090810190610f2791905b5b80821115614ee15760008155600101614f7a565b600081518084526020808501945080840160005b83811015614fc75781516001600160a01b031687529582019590820190600101614fa2565b509495945050505050565b602081526000614bfc6020830184614f8e565b6001600160a01b0381168114610f2757600080fd5b60006020828403121561500c57600080fd5b8135614bfc81614fe5565b6000806040838503121561502a57600080fd5b823561503581614fe5565b946020939093013593505050565b634e487b7160e01b600052602160045260246000fd5b60038110610f2757610f27615043565b60005b8381101561508457818101518382015260200161506c565b50506000910152565b600081518084526150a5816020860160208601615069565b601f01601f19169290920160200192915050565b600081518084526020808501945080840160005b83811015614fc75781516001600160801b0316875295820195908201906001016150cd565b600061ffff8083511684526020818185015116818601526040840151915060a0604086015261512460a08601836150b9565b60608581015187830391880191909152805180835290830193506000918301905b8083101561516e5784516001600160a01b03168252938301936001929092019190830190615145565b5060808601519350868103608088015261518881856150b9565b979650505050505050565b600581106151a3576151a3615043565b9052565b6001600160a01b0388811682528716602082015260006151c687615059565b86604083015285606083015260e060808301526151e660e083018661508d565b82810360a08401526151f881866150f2565b91505061520860c0830184615193565b98975050505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561525357615253615214565b604052919050565b600067ffffffffffffffff83111561527557615275615214565b615288601f8401601f191660200161522a565b905082815283838301111561529c57600080fd5b828260208301376000602084830101529392505050565b600082601f8301126152c457600080fd5b614bfc8383356020850161525b565b600080604083850312156152e657600080fd5b82356152f181614fe5565b9150602083013567ffffffffffffffff81111561530d57600080fd5b615319858286016152b3565b9150509250929050565b60006020828403121561533557600080fd5b5035919050565b6020815260006001600160a01b0380845116602084015280602085015116604084015250604083015161536e81615059565b8060608401525060608301516080830152608083015160e060a084015261539961010084018261508d565b905060a0840151601f198483030160c08501526153b682826150f2565b91505060c08401516153cb60e0850182615193565b509392505050565b803561ffff811681146153e557600080fd5b919050565b60008060008060008060008060008060006101608c8e03121561540c57600080fd5b6154158c6153d3565b9a5060208c013561542581614fe5565b995061543360408d016153d3565b985061544160608d016153d3565b975061544f60808d016153d3565b965061545d60a08d016153d3565b955061546b60c08d016153d3565b945061547960e08d016153d3565b93506154886101008d016153d3565b92506154976101208d016153d3565b91506154a66101408d016153d3565b90509295989b509295989b9093969950565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101561552757888303603f19018552815180516001600160a01b031684528701518784018790526155148785018261508d565b95880195935050908601906001016154df565b509098975050505050505050565b8035600381106153e557600080fd5b6000806000806080858703121561555a57600080fd5b8435935061556a60208601615535565b9250604085013567ffffffffffffffff81111561558657600080fd5b8501601f8101871361559757600080fd5b6155a68782356020840161525b565b92505060608501356155b781614fe5565b939692955090935050565b6000806000606084860312156155d757600080fd5b6155e084615535565b925060208085013567ffffffffffffffff808211156155fe57600080fd5b61560a888389016152b3565b9450604087013591508082111561562057600080fd5b818701915087601f83011261563457600080fd5b81358181111561564657615646615214565b8060051b61565585820161522a565b918252838101850191858101908b84111561566f57600080fd5b86860192505b838310156156ab5782358581111561568d5760008081fd5b61569b8d89838a01016152b3565b8352509186019190860190615675565b809750505050505050509250925092565b6000602082840312156156ce57600080fd5b614bfc826153d3565b6000806000606084860312156156ec57600080fd5b83356156f781614fe5565b9250602084013561570781614fe5565b929592945050506040919091013590565b6000806040838503121561572b57600080fd5b615734836153d3565b9150615742602084016153d3565b90509250929050565b602081526000614bfc602083018461508d565b6040810161576c8285615193565b8260208301529392505050565b60006020828403121561578b57600080fd5b5051919050565b6000602082840312156157a457600080fd5b81518015158114614bfc57600080fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610da957610da96157b4565b600181811c908216806157f157607f821691505b60208210810361581157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b60006001820161583f5761583f6157b4565b5060010190565b601f82111561385b57600081815260208120601f850160051c8101602086101561586d5750805b601f850160051c820191505b81811015612da257828155600101615879565b815167ffffffffffffffff8111156158a6576158a6615214565b6158ba816158b484546157dd565b84615846565b602080601f8311600181146158ef57600084156158d75750858301515b600019600386901b1c1916600185901b178555612da2565b600085815260208120601f198616915b8281101561591e578886015182559484019460019091019084016158ff565b508582101561593c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610da957610da96157b4565b805160ff811681146153e557600080fd5b60006020828403121561598257600080fd5b614bfc8261595f565b61599484615059565b838152826020820152606060408201526000613e00606083018461508d565b6040815260006159c6604083018561508d565b8281036020840152613e00818561508d565b6000602082840312156159ea57600080fd5b8151614bfc81614fe5565b80516001600160801b03811681146153e557600080fd5b600080600060608486031215615a2157600080fd5b615a2a8461595f565b9250615a38602085016159f5565b91506040840151615a4881614fe5565b809150509250925092565b60008060008060808587031215615a6957600080fd5b615a728561595f565b9350615a80602086016159f5565b92506040850151615a9081614fe5565b9150615a9e606086016159f5565b905092959194509250565b600061ffff808316818103615ac057615ac06157b4565b6001019392505050565b61ffff8181168382160280821691908281146137be576137be6157b4565b634e487b7160e01b600052601260045260246000fd5b600061ffff80841680615b1357615b13615ae8565b92169190910492915050565b634e487b7160e01b600052603160045260246000fd5b60006001600160a01b03808716835280861660208401525060806040830152615b616080830185614f8e565b9050615b6c83615059565b82606083015295945050505050565b600082615b8a57615b8a615ae8565b500490565b63ffffffff828116828216039080821115615bac57615bac6157b4565b5092915050565b8082028115828204841417610da957610da96157b4565b60008251615bdc818460208701615069565b919091019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122019aa0081e69056404e40023f916698c2b116cb83388048dea2cf1b230e45ab7b64736f6c63430008110033", + "deployedBytecode": "0x60806040526004361061031e5760003560e01c80637f6e29de116101a5578063bdb860ea116100ec578063e67a5d7811610095578063f6e8913d1161006f578063f6e8913d146108b2578063f7714eb9146108d7578063fdd9344c146108fe578063ffa1ad741461092057600080fd5b8063e67a5d781461085c578063f108f5b61461087c578063f2fde38b1461089257600080fd5b8063dc38b0a2116100c6578063dc38b0a214610808578063dd6f8f9014610828578063e30c39781461083e57600080fd5b8063bdb860ea146107b2578063c993d861146107c8578063ce3e7e91146107e857600080fd5b8063931127a01161014e578063adf1daa611610128578063adf1daa614610750578063b10064eb14610772578063b27b154d1461079257600080fd5b8063931127a0146106fa578063974c5b411461071b5780639c30db5c1461073057600080fd5b806384f21a441161017f57806384f21a441461069a5780638b8f631f146106bc5780638da5cb5b146106dc57600080fd5b80637f6e29de14610658578063817b1cd21461066e57806381ebc5061461068557600080fd5b80633659cfe61161026957806365cdbaea11610212578063715018a6116101ec578063715018a61461061357806379ba5097146106285780637c4981c81461063d57600080fd5b806365cdbaea146105ae5780636dcd3af2146105d75780636ddf344a146105f757600080fd5b806352d1902d1161024357806352d1902d1461054c578063569c876214610561578063582115fb1461058157600080fd5b80633659cfe6146104e65780633a688a2f146105065780634f1ef2861461053957600080fd5b80631acf7629116102cb57806324212b86116102a557806324212b86146104855780632ae9c6001461049b578063339f334b146104b657600080fd5b80631acf76291461041657806323b8ac5d1461043857806323deecfe1461046357600080fd5b8063125c6c98116102fc578063125c6c98146103b957806313114a9d146103dd57806315aa7b06146103f457600080fd5b8063011f59a014610323578063024f38cb1461035d57806311ce026714610380575b600080fd5b34801561032f57600080fd5b5060ff5461034590600160701b900461ffff1681565b60405161ffff90911681526020015b60405180910390f35b34801561036957600080fd5b5060ff5461034590640100000000900461ffff1681565b34801561038c57600080fd5b50610101546103a1906001600160a01b031681565b6040516001600160a01b039091168152602001610354565b3480156103c557600080fd5b506103cf60fc5481565b604051908152602001610354565b3480156103e957600080fd5b506103cf6101085481565b34801561040057600080fd5b50610409610976565b6040516103549190614fd2565b34801561042257600080fd5b50610436610431366004614ffa565b6109d9565b005b34801561044457600080fd5b5060ff54610345906c01000000000000000000000000900461ffff1681565b34801561046f57600080fd5b5060ff5461034590600160801b900461ffff1681565b34801561049157600080fd5b506103cf60fe5481565b3480156104a757600080fd5b5060fb546103459061ffff1681565b3480156104c257600080fd5b506104d66104d1366004615017565b610b34565b6040519015158152602001610354565b3480156104f257600080fd5b50610436610501366004614ffa565b610daf565b34801561051257600080fd5b50610526610521366004614ffa565b610f2a565b60405161035497969594939291906151a7565b6104366105473660046152d3565b61119e565b34801561055857600080fd5b506103cf61130a565b34801561056d57600080fd5b506103a161057c366004615323565b6113cf565b34801561058d57600080fd5b506105a161059c366004614ffa565b6113fa565b604051610354919061533c565b3480156105ba57600080fd5b5060ff54610345906a0100000000000000000000900461ffff1681565b3480156105e357600080fd5b506104366105f23660046153ea565b6116eb565b34801561060357600080fd5b50610103546103459061ffff1681565b34801561061f57600080fd5b50610436611b1f565b34801561063457600080fd5b50610436611b33565b34801561064957600080fd5b5060ff546103459061ffff1681565b34801561066457600080fd5b50610105546103cf565b34801561067a57600080fd5b506103cf6101075481565b34801561069157600080fd5b50610409611bbe565b3480156106a657600080fd5b506106af611c1f565b60405161035491906154b8565b3480156106c857600080fd5b506103a16106d7366004615323565b611e6e565b3480156106e857600080fd5b506033546001600160a01b03166103a1565b34801561070657600080fd5b5060ff546103459062010000900461ffff1681565b34801561072757600080fd5b50610409611e7f565b34801561073c57600080fd5b5061043661074b366004615544565b611ee0565b34801561075c57600080fd5b5060ff5461034590600160901b900461ffff1681565b34801561077e57600080fd5b5061043661078d3660046155c2565b612775565b34801561079e57600080fd5b506104366107ad3660046156bc565b612daa565b3480156107be57600080fd5b50610104546103cf565b3480156107d457600080fd5b506103a16107e3366004615323565b612e7c565b3480156107f457600080fd5b506104d66108033660046156d7565b612e8d565b34801561081457600080fd5b50610436610823366004614ffa565b61336a565b34801561083457600080fd5b506103cf60fd5481565b34801561084a57600080fd5b506065546001600160a01b03166103a1565b34801561086857600080fd5b50610436610877366004615718565b613395565b34801561088857600080fd5b50610102546103cf565b34801561089e57600080fd5b506104366108ad366004614ffa565b61346a565b3480156108be57600080fd5b5060ff54610345906601000000000000900461ffff1681565b3480156108e357600080fd5b5060ff546103459068010000000000000000900461ffff1681565b34801561090a57600080fd5b5060ff5461034590600160a01b900461ffff1681565b34801561092c57600080fd5b506109696040518060400160405280600581526020017f302e302e3200000000000000000000000000000000000000000000000000000081525081565b604051610354919061574b565b60606101058054806020026020016040519081016040528092919081815260200182805480156109cf57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109b1575b5050505050905090565b6001600160a01b038082166000908152610106602052604090206001810154909116610a4c5760405162461bcd60e51b815260206004820152601460248201527f6e6f646520646f6573206e6f742065786973747300000000000000000000000060448201526064015b60405180910390fd5b80546001600160a01b0316331480610a7d575033610a726033546001600160a01b031690565b6001600160a01b0316145b610ac95760405162461bcd60e51b815260206004820152601d60248201527f6f6e6c79206f776e65722063616e20756e7374616b652061206e6f64650000006044820152606401610a43565b610ad2816134db565b5060088101805460ff1916600490811790915560018201546040516001600160a01b03909116917ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e91610b28919060009061575e565b60405180910390a25050565b6000610b3e6137c6565b6001600160a01b038316610b945760405162461bcd60e51b815260206004820152601260248201527f696e76616c696420746f206164647265737300000000000000000000000000006044820152606401610a43565b60008211610be45760405162461bcd60e51b815260206004820152600e60248201527f696e76616c696420616d6f756e740000000000000000000000000000000000006044820152606401610a43565b610108548211158015610c7c5750610100546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610c54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c789190615779565b8211155b610cc85760405162461bcd60e51b815260206004820152601460248201527f696e73756666696369656e742062616c616e63650000000000000000000000006044820152606401610a43565b6101005460405163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529091169063a9059cbb906044016020604051808303816000875af1158015610d1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d409190615792565b610d8c5760405162461bcd60e51b815260206004820152601260248201527f6661696c656420746f207472616e7366657200000000000000000000000000006044820152606401610a43565b816101086000828254610d9f91906157ca565b9091555060019150505b92915050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610e3c5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610a43565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610e977f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610f025760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610a43565b610f0b81613820565b60408051600080825260208201909252610f2791839190613828565b50565b6101066020526000908152604090208054600182015460028301546003840180546001600160a01b039485169594841694600160a01b90940460ff16939190610f72906157dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9e906157dd565b8015610feb5780601f10610fc057610100808354040283529160200191610feb565b820191906000526020600020905b815481529060010190602001808311610fce57829003601f168201915b50506040805160a08101825260048701805461ffff808216845262010000909104166020808401919091526005890180548551818402810184018752818152999a99949850929650938701945091929183018282801561109c57602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116110595790505b50505050508152602001600282018054806020026020016040519081016040528092919081815260200182805480156110fe57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116110e0575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561118857602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116111455790505b5050509190925250505060089091015460ff1687565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361122b5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610a43565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166112867f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b0316146112f15760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610a43565b6112fa82613820565b61130682826001613828565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113aa5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610a43565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b61010581815481106113e057600080fd5b6000918252602090912001546001600160a01b0316905081565b611402614db9565b6001600160a01b0382811660009081526101066020908152604091829020825160e08101845281548516815260018201549485169281019290925290929091830190600160a01b900460ff16600281111561145f5761145f615043565b600281111561147057611470615043565b81526020016002820154815260200160038201805461148e906157dd565b80601f01602080910402602001604051908101604052809291908181526020018280546114ba906157dd565b80156115075780601f106114dc57610100808354040283529160200191611507565b820191906000526020600020905b8154815290600101906020018083116114ea57829003601f168201915b50505091835250506040805160a08101825260048401805461ffff808216845262010000909104166020838101919091526005860180548551818402810184018752818152968301969495939493860193928301828280156115ba57602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116115775790505b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561161c57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116115fe575b50505050508152602001600382018054806020026020016040519081016040528092919081815260200182805480156116a657602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116116635790505b505050919092525050508152600882015460209091019060ff1660048111156116d1576116d1615043565b60048111156116e2576116e2615043565b90525092915050565b600054610100900460ff161580801561170b5750600054600160ff909116105b806117255750303b158015611725575060005460ff166001145b6117975760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a43565b6000805460ff1916600117905580156117ba576000805461ff0019166101001790555b6117c26139cd565b6117ca613a38565b60fb805461ffff191661ffff8e161790556001600160a01b038b166117ee57600080fd5b61010080546001600160a01b0319166001600160a01b038d1617905561ffff8a1661185b5760405162461bcd60e51b815260206004820152601860248201527f696e76616c69642061747465737465727320616d6f756e7400000000000000006044820152606401610a43565b60ff805461ffff808d16600160801b0271ffff00000000000000000000000000000000199092169190911790915589166118fd5760405162461bcd60e51b815260206004820152602160248201527f696e76616c6964206e6f646552616e646f6d4d696e436f756e7420616d6f756e60448201527f74000000000000000000000000000000000000000000000000000000000000006064820152608401610a43565b60ff805461ffff808c16600160901b027fffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffff9092169190911790915588166119ac5760405162461bcd60e51b815260206004820152602c60248201527f696e76616c6964206e6f646552616e646f6d46696c74657250696e677352657160448201527f756972656420616d6f756e7400000000000000000000000000000000000000006064820152608401610a43565b8760ff60146101000a81548161ffff021916908361ffff160217905550606460fc81905550606460fd81905550606460fe819055508660ff60026101000a81548161ffff021916908361ffff1602179055508560ff60046101000a81548161ffff021916908361ffff1602179055508260ff60066101000a81548161ffff021916908361ffff1602179055508460ff60086101000a81548161ffff021916908361ffff1602179055508360ff600a6101000a81548161ffff021916908361ffff1602179055508160ff600c6101000a81548161ffff021916908361ffff160217905550604260ff60006101000a81548161ffff021916908361ffff160217905550600060ff600e6101000a81548161ffff021916908361ffff1602179055508015611b11576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050505050565b611b276137c6565b611b316000613aa8565b565b60655433906001600160a01b03168114611bb55760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610a43565b610f2781613aa8565b60606101048054806020026020016040519081016040528092919081815260200182805480156109cf576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109b1575050505050905090565b60606000805b61010254811015611ca85760006101028281548110611c4657611c46615817565b60009182526020808320909101546001600160a01b03168083526101069091526040909120600881015491925090611c809060ff16613ac1565b15611c935783611c8f8161582d565b9450505b50508080611ca09061582d565b915050611c25565b5060008167ffffffffffffffff811115611cc457611cc4615214565b604051908082528060200260200182016040528015611d0a57816020015b604080518082019091526000815260606020820152815260200190600190039081611ce25790505b5090506000805b61010254811015611e655760006101028281548110611d3257611d32615817565b60009182526020808320909101546001600160a01b03168083526101069091526040909120600881015491925090611d6c9060ff16613ac1565b611d77575050611e53565b6040805180820190915260018201546001600160a01b03168152600382018054602083019190611da6906157dd565b80601f0160208091040260200160405190810160405280929190818152602001828054611dd2906157dd565b8015611e1f5780601f10611df457610100808354040283529160200191611e1f565b820191906000526020600020905b815481529060010190602001808311611e0257829003601f168201915b5050505050815250858580611e339061582d565b965081518110611e4557611e45615817565b602002602001018190525050505b80611e5d8161582d565b915050611d11565b50909392505050565b61010481815481106113e057600080fd5b60606101028054806020026020016040519081016040528092919081815260200182805480156109cf576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109b1575050505050905090565b6000836002811115611ef457611ef4615043565b03611fa65760fc54841015611f555760405162461bcd60e51b815260206004820152602160248201527f496e73756666696369656e7420636f6c6c61746572616c20666f7220564e4f446044820152604560f81b6064820152608401610a43565b61010280546001810182556000919091527f93bdaa6a4190909b7c3fbe8d42169ffe1cab19f51dfc8db24c71abf849eced4a0180546001600160a01b0319166001600160a01b03831617905561217a565b6001836002811115611fba57611fba615043565b0361206c5760fd5484101561201b5760405162461bcd60e51b815260206004820152602160248201527f496e73756666696369656e7420636f6c6c61746572616c20666f7220534e4f446044820152604560f81b6064820152608401610a43565b61010480546001810182556000919091527f4c0be60200faa20559308cb7b5a1bb3255c16cb1cab91f525b5ae7a03d02fabe0180546001600160a01b0319166001600160a01b03831617905561217a565b600283600281111561208057612080615043565b036121325760fe548410156120e15760405162461bcd60e51b815260206004820152602160248201527f496e73756666696369656e7420636f6c6c61746572616c20666f7220444e4f446044820152604560f81b6064820152608401610a43565b61010580546001810182556000919091527ffc62abc8c0fc47c2d92f5aec99bf8b60f375828e14394d89345cae11a98673710180546001600160a01b0319166001600160a01b03831617905561217a565b60405162461bcd60e51b815260206004820152601560248201527f756e737570706f72746564206e6f6465547970652000000000000000000000006044820152606401610a43565b6001600160a01b0380821660009081526101066020526040902080549091161561220c5760405162461bcd60e51b815260206004820152602560248201527f61206e6f64652077697468207075624b657920697320616c726561647920646560448201527f66696e65640000000000000000000000000000000000000000000000000000006064820152608401610a43565b841561231957610100546040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523360048201523060248201526000916001600160a01b03169063dd62ed3e90604401602060405180830381865afa15801561227b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061229f9190615779565b9050858110156123175760405162461bcd60e51b815260206004820152603260248201527f5f6e6f6465546f6b656e732063616e6e6f74206265207472616e73666572726560448201527f642c20636865636b20616c6c6f77616e636500000000000000000000000000006064820152608401610a43565b505b612321614db9565b3381526001600160a01b03831660208201526040810185600281111561234957612349615043565b9081600281111561235c5761235c615043565b90525060608101869052608081018490526001600160a01b0380841660009081526101066020908152604091829020845181549085166001600160a01b0319918216178255918501516001820180549190951692811683178555928501518594919390927fffffffffffffffffffffff00000000000000000000000000000000000000000090911617600160a01b8360028111156123fc576123fc615043565b0217905550606082015160028201556080820151600382019061241f908261588c565b5060a0820151805160048301805460208085015161ffff908116620100000263ffffffff1990931694169390931717815560408301518051919261246b92600587019290910190614e2d565b5060608201518051612487916002840191602090910190614ee5565b50608082015180516124a3916003840191602090910190614e2d565b50505060c082015160088201805460ff191660018360048111156124c9576124c9615043565b021790555050861590506125de57610100546040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018890526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015612548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256c9190615792565b6125de5760405162461bcd60e51b815260206004820152602560248201527f6661696c656420746f207472616e7366657220746f6b656e7320746f20636f6e60448201527f74726163740000000000000000000000000000000000000000000000000000006064820152608401610a43565b8561010760008282546125f1919061594c565b909155506000905085600281111561260b5761260b615043565b0361261d57612618613afb565b61271e565b600185600281111561263157612631615043565b0361271e57610101546001600160a01b031661268f5760405162461bcd60e51b815260206004820152601b60248201527f6e6f2073746f7261676520636f6e747261637420646566696e656400000000006044820152606401610a43565b610101546040517f9d95f1cc0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152909116908190639d95f1cc906024016020604051808303816000875af11580156126f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271b9190615970565b50505b826001600160a01b0316336001600160a01b03167f67bd55f864dcc77d483ff7567de0889142417ef6d0299753cfd80e4c72ddc5548789886040516127659392919061598b565b60405180910390a3505050505050565b3360009081526101066020526040902060018101546001600160a01b03166127df5760405162461bcd60e51b815260206004820152601060248201527f696e76616c6964207265706f72746572000000000000000000000000000000006044820152606401610a43565b600080835167ffffffffffffffff8111156127fc576127fc615214565b604051908082528060200260200182016040528015612825578160200160208202803683370190505b50905060005b84518110156129b457600073__$7aaf162b34d2533b02434bde51cad0c5c5$__6336de68108888858151811061286357612863615817565b60200260200101516040518363ffffffff1660e01b81526004016128889291906159b3565b602060405180830381865af41580156128a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c991906159d8565b6001600160a01b03808216600090815261010660205260409020600181015492935091166128f85750506129a2565b6000805b8681101561295157836001600160a01b031686828151811061292057612920615817565b60200260200101516001600160a01b03160361293f5760019150612951565b806129498161582d565b9150506128fc565b508015612960575050506129a2565b82858761296c8161582d565b98508151811061297e5761297e615817565b60200260200101906001600160a01b031690816001600160a01b0316815250505050505b806129ac8161582d565b91505061282b565b508351821015612a6a5760008267ffffffffffffffff8111156129d9576129d9615214565b604051908082528060200260200182016040528015612a02578160200160208202803683370190505b50905060005b83811015612a6657828181518110612a2257612a22615817565b6020026020010151828281518110612a3c57612a3c615817565b6001600160a01b039092166020928302919091019091015280612a5e8161582d565b915050612a08565b5090505b6000866002811115612a7e57612a7e615043565b03612c0957600080600087806020019051810190612a9c9190615a0c565b9194509250905060ff8316600114612af65760405162461bcd60e51b815260206004820152601c60248201527f7265706f727420616374696f6e206f6e6c7920737570706f72746564000000006044820152606401610a43565b6001600160a01b038082166000908152610106602052604090206001810154909116612b6f5760405162461bcd60e51b815260206004820152602260248201527f746172676574206e6f64652077616c6c657420646f6573206e6f742065786973604482015261747360f01b6064820152608401610a43565b60006001820154600160a01b900460ff166002811115612b9157612b91615043565b14612bde5760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220564e6f646573000000000000000000006044820152606401610a43565b612bff8460ff166002811115612bf657612bf6615043565b88878487613c61565b5050505050612da2565b6001866002811115612c1d57612c1d615043565b03612da25760008060008088806020019051810190612c3c9190615a53565b9296509094509250905060ff8416600214612c995760405162461bcd60e51b815260206004820152601c60248201527f7265706f727420616374696f6e206f6e6c7920737570706f72746564000000006044820152606401610a43565b6001600160a01b038083166000908152610106602052604090206001810154909116612d125760405162461bcd60e51b815260206004820152602260248201527f746172676574206e6f64652077616c6c657420646f6573206e6f742065786973604482015261747360f01b6064820152608401610a43565b600180820154600160a01b900460ff166002811115612d3357612d33615043565b14612d805760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220534e6f646573000000000000000000006044820152606401610a43565b611b118560ff166002811115612d9857612d98615043565b8988848887613e09565b505050505050565b612db26137c6565b6101025461ffff82161115612e095760405162461bcd60e51b815260206004820152601c60248201527f696e636f72726563742076616c506572426c6f636b5461726765745f000000006044820152606401610a43565b60ff805471ffff000000000000000000000000000000001916600160801b61ffff848116918202929092179283905560408051600160701b909404909216835260208301527f81512b84dc2b38f82b4999b5512a14df033b165371fa51776cce559212bf0a44910160405180910390a150565b61010281815481106113e057600080fd5b6000612e976137c6565b60008211612ee75760405162461bcd60e51b815260206004820152601960248201527f616d6f756e742073686f756c6420626520706f736974697665000000000000006044820152606401610a43565b826001600160a01b0316846001600160a01b031603612f6e5760405162461bcd60e51b815260206004820152602660248201527f63616e6e6f74207472616e73666572206265747765656e2073616d652061646460448201527f72657373657300000000000000000000000000000000000000000000000000006064820152608401610a43565b6001600160a01b03831615801590612f8d57506001600160a01b038416155b156130b45781610108541015612ff55760405162461bcd60e51b815260206004820152602760248201527f66726f6d206e6f64652073686f756c64206861766520656e6f75676820636f6c6044820152661b185d195c985b60ca1b6064820152608401610a43565b6001600160a01b0380841660009081526101066020526040902080549091166130605760405162461bcd60e51b815260206004820152600f60248201527f6d697373696e6720746f206e6f646500000000000000000000000000000000006044820152606401610a43565b82610108600082825461307391906157ca565b9250508190555082610107600082825461308d919061594c565b92505081905550828160020160008282546130a8919061594c565b90915550613360915050565b6001600160a01b038416158015906130d357506001600160a01b038316155b156131ef576001600160a01b0380851660009081526101066020526040902080549091166131435760405162461bcd60e51b815260206004820152601160248201527f6d697373696e672066726f6d206e6f64650000000000000000000000000000006044820152606401610a43565b82816002015410156131a75760405162461bcd60e51b815260206004820152602760248201527f66726f6d206e6f64652073686f756c64206861766520656e6f75676820636f6c6044820152661b185d195c985b60ca1b6064820152608401610a43565b828160020160008282546131bb91906157ca565b925050819055508261010760008282546131d591906157ca565b925050819055508261010860008282546130a8919061594c565b6001600160a01b03808516600090815261010660205260409020805490911661325a5760405162461bcd60e51b815260206004820152601160248201527f6d697373696e672066726f6d206e6f64650000000000000000000000000000006044820152606401610a43565b82816002015410156132be5760405162461bcd60e51b815260206004820152602760248201527f66726f6d206e6f64652073686f756c64206861766520656e6f75676820636f6c6044820152661b185d195c985b60ca1b6064820152608401610a43565b6001600160a01b0380851660009081526101066020526040902082549091166133295760405162461bcd60e51b815260206004820152600f60248201527f6d697373696e6720746f206e6f646500000000000000000000000000000000006044820152606401610a43565b8382600201600082825461333d91906157ca565b9250508190555083816002016000828254613358919061594c565b909155505050505b5060019392505050565b6133726137c6565b61010180546001600160a01b0319166001600160a01b0392909216919091179055565b61339d6137c6565b6101025461ffff8316106133b057600080fd5b6101025461ffff8216106133c357600080fd5b60ff80547fffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffff16600160901b61ffff8581169182027fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1692909217600160a01b928516928302179092556040805192835260208301919091527fcd481667fa77e513c517493174075f0471ec1fe24d57af644377cd1a2572d13d910160405180910390a15050565b6134726137c6565b606580546001600160a01b0383166001600160a01b031990911681179091556134a36033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600281015461010054825460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810184905260009392919091169063a9059cbb906044016020604051808303816000875af115801561353b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061355f9190615792565b6135d15760405162461bcd60e51b815260206004820152602560248201527f6661696c656420746f20747261736665722066756e6473206261636b20746f2060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610a43565b600083600201819055508061010760008282546135ee91906157ca565b92505081905550806101086000828254613608919061594c565b90915550600090506001840154600160a01b900460ff16600281111561363057613630615043565b0361367a57613643600584016000614f3a565b613651600684016000614f5f565b600183015461366c90610102906001600160a01b0316613fb5565b50613675613afb565b610da9565b600180840154600160a01b900460ff16600281111561369b5761369b615043565b03610da957610101546001600160a01b03166136f95760405162461bcd60e51b815260206004820152601b60248201527f6e6f2073746f7261676520636f6e747261637420646566696e656400000000006044820152606401610a43565b6101015460018401546040517fb2b99ec90000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690819063b2b99ec990602401600060405180830381600087803b15801561376057600080fd5b505af1158015613774573d6000803e3d6000fd5b5061378792505050600585016000614f3a565b613795600685016000614f5f565b6137a3600785016000614f3a565b60018401546137be90610104906001600160a01b0316613fb5565b505092915050565b6033546001600160a01b03163314611b315760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a43565b610f276137c6565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156138605761385b836140e1565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156138ba575060408051601f3d908101601f191682019092526138b791810190615779565b60015b61392c5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610a43565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146139c15760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610a43565b5061385b83838361419f565b600054610100900460ff16611b315760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610a43565b600054610100900460ff16613aa35760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610a43565b611b31335b606580546001600160a01b0319169055610f27816141ca565b60006004826004811115613ad757613ad7615043565b1480613af457506003826004811115613af257613af2615043565b145b1592915050565b6000805b61010254811015613b825760006101028281548110613b2057613b20615817565b60009182526020808320909101546001600160a01b03168083526101069091526040909120600881015491925090613b5a9060ff16613ac1565b15613b6d5783613b6981615aa9565b9450505b50508080613b7a9061582d565b915050613aff565b50610103805461ffff191661ffff83811691821790925560ff548392600160801b9091041690811015613bb3578091505b60ff5461ffff808316600160701b909204161115613bd057600080fd5b60ff5461ffff838116600160701b909204161461385b5760ff80547fffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffff16600160701b61ffff858116918202929092179092556040805192835290831660208301527f81512b84dc2b38f82b4999b5512a14df033b165371fa51776cce559212bf0a44910160405180910390a1505050565b6000806001840154600160a01b900460ff166002811115613c8457613c84615043565b14613cd15760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220564e6f646573000000000000000000006044820152606401610a43565b60ff54606490613cef9061ffff80821691600160701b900416615aca565b613cf99190615afe565b61ffff1684511015613d4d5760405162461bcd60e51b815260206004820152601460248201527f73696720636f756e7420697320746f6f206c6f770000000000000000000000006044820152606401610a43565b600883015460ff166004816004811115613d6957613d69615043565b1480613d8657506003816004811115613d8457613d84615043565b145b15613d95576000915050613e00565b613da48787868887600061421c565b60ff54600485015461ffff620100009092048216911610613dc957613dc98685614892565b60ff5460048501546801000000000000000090910461ffff908116620100009092041610613dfa57613dfa84614af0565b60009150505b95945050505050565b6000600180850154600160a01b900460ff166002811115613e2c57613e2c615043565b14613e795760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220534e6f646573000000000000000000006044820152606401610a43565b60ff54606490613e979061ffff80821691600160701b900416615aca565b613ea19190615afe565b61ffff1685511015613ef55760405162461bcd60e51b815260206004820152601460248201527f73696720636f756e7420697320746f6f206c6f770000000000000000000000006044820152606401610a43565b600884015460ff166004816004811115613f1157613f11615043565b1480613f2e57506003816004811115613f2c57613f2c615043565b145b15613f3d576000915050613fab565b613f4b88888789888861421c565b60ff54600486015461ffff6401000000009092048216911610613f7257613f728786614892565b60ff5460048601546a010000000000000000000090910461ffff908116620100009092041610613fa557613fa585614af0565b60009150505b9695505050505050565b8154600090815b818110156140d657836001600160a01b0316858281548110613fe057613fe0615817565b6000918252602090912001546001600160a01b0316036140c4576140056001836157ca565b811461408657846140176001846157ca565b8154811061402757614027615817565b9060005260206000200160009054906101000a90046001600160a01b031685828154811061405757614057615817565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b8480548061409657614096615b1f565b600082815260209020810160001990810180546001600160a01b03191690550190555060019150610da99050565b806140ce8161582d565b915050613fbc565b506000949350505050565b6001600160a01b0381163b61415e5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610a43565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6141a883614b97565b6000825111806141b55750805b1561385b576141c48383614bd7565b50505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000846004016001018054806020026020016040519081016040528092919081815260200182805480156142a157602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f0104928301926001038202915080841161425e5790505b505083519394506000925050505b81811015614343578281815181106142c9576142c9615817565b60200260200101516001600160801b0316856001600160801b0316036143315760405162461bcd60e51b815260206004820152601060248201527f626c6f636b206973206e6f74206e6577000000000000000000000000000000006044820152606401610a43565b8061433b8161582d565b9150506142af565b50600180870154600160a01b900460ff16600281111561436557614365615043565b0361453057826001600160801b03166000036143c35760405162461bcd60e51b815260206004820152601760248201527f73746f72616765206b65792069732072657175697265640000000000000000006044820152606401610a43565b60008660040160030180548060200260200160405190810160405280929190818152602001828054801561444857602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116144055790505b505083519394506000925050505b818110156144ea5782818151811061447057614470615817565b60200260200101516001600160801b0316866001600160801b0316036144d85760405162461bcd60e51b815260206004820152601660248201527f73746f72616765206b6579206973206e6f74206e6577000000000000000000006044820152606401610a43565b806144e28161582d565b915050614456565b505050600786018054600180820183556000928352602090922060028204018054929091166010026101000a6001600160801b0381810219909316928616029190911790555b60048601805461ffff1690600061454683615aa9565b825461010092830a61ffff818102199092169290911602179091556005880180546001818101835560009283526020808420600284040180549390921660100290940a6001600160801b0381810219909316928a1602919091179055600689018054604080518286028101860190915281815292945091929091908301828280156145fa57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116145dc575b505083519394506000925050505b87518110156146fe5760005b828110156146eb5783818151811061462e5761462e615817565b60200260200101516001600160a01b031689838151811061465157614651615817565b60200260200101516001600160a01b031614801561469b575060006001600160a01b031689838151811061468757614687615817565b60200260200101516001600160a01b031614155b156146d95760008983815181106146b4576146b4615817565b60200260200101906001600160a01b031690816001600160a01b0316815250506146eb565b806146e38161582d565b915050614614565b50806146f68161582d565b915050614608565b5060005b87518110156147ab57600088828151811061471f5761471f615817565b6020026020010151905060006001600160a01b0316816001600160a01b031614614798578960040160020189838151811061475c5761475c615817565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790555b50806147a38161582d565b915050614702565b506000600889015460ff1660048111156147c7576147c7615043565b036147dc5760088801805460ff191660011790555b600180890154908a01546040517f19d5f3972073c7002111a82b2a44db11e739567a002445f2e3db8ab96fe6645f92614827926001600160a01b03918216929116908b908f90615b35565b60405180910390a16001880154600889015460028a01546040516001600160a01b03909316927ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e9261487e9260ff9091169161575e565b60405180910390a250505050505050505050565b60ff5460009081906148b39084906601000000000000900461ffff16614c03565b600685018054604080516020808402820181019092528281529496509294506000939283018282801561490f57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116148f1575b5050505050905060008083118015614928575060008251115b156149d25781516149399084615b7b565b905060005b82518110156149d0576000610106600085848151811061496057614960615817565b6020908102919091018101516001600160a01b0390811683529082019290925260400160002080549092501661499657506149be565b828160020160008282546149aa919061594c565b909155506149ba905083866157ca565b9450505b806149c88161582d565b91505061493e565b505b828660020160008282546149e6919061594c565b909155506149fa9050600686016000614f5f565b6000600886015460ff166004811115614a1557614a15615043565b1480614a3957506001600886015460ff166004811115614a3757614a37615043565b145b15614a4e5760088501805460ff191660021790555b60048501805461ffff191680825562010000900461ffff16906002614a7283615aa9565b91906101000a81548161ffff021916908361ffff160217905550508460010160009054906101000a90046001600160a01b03166001600160a01b03167ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e600286604051614ae092919061575e565b60405180910390a2505050505050565b60ff546000908190614b179084906c01000000000000000000000000900461ffff16614c03565b9092509050614b25836134db565b5060048301805463ffff00001916905560088301805460ff1916600390811790915560018401546040516001600160a01b03909116917ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e91614b8a919060009061575e565b60405180910390a2505050565b614ba0816140e1565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060614bfc8383604051806060016040528060278152602001615be760279139614ca5565b9392505050565b60008060648363ffffffff161115614c5d5760405162461bcd60e51b815260206004820181905260248201527f70657263656e746167652073686f756c6420626520696e205b302c203130305d6044820152606401610a43565b60028401546064614c6e8582615b8f565b614c7e9063ffffffff1683615bb3565b614c889190615b7b565b9250614c9483826157ca565b600286018490559150509250929050565b6060600080856001600160a01b031685604051614cc29190615bca565b600060405180830381855af49150503d8060008114614cfd576040519150601f19603f3d011682016040523d82523d6000602084013e614d02565b606091505b5091509150613fab8683838760608315614d7d578251600003614d76576001600160a01b0385163b614d765760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a43565b5081614d87565b614d878383614d8f565b949350505050565b815115614d9f5781518083602001fd5b8060405162461bcd60e51b8152600401610a43919061574b565b6040805160e081018252600080825260208201819052909182019081526020016000815260200160608152602001614e216040518060a00160405280600061ffff168152602001600061ffff1681526020016060815260200160608152602001606081525090565b81526020016000905290565b82805482825590600052602060002090600101600290048101928215614ed55791602002820160005b83821115614ea057835183826101000a8154816001600160801b0302191690836001600160801b031602179055509260200192601001602081600f01049283019260010302614e56565b8015614ed35782816101000a8154906001600160801b030219169055601001602081600f01049283019260010302614ea0565b505b50614ee1929150614f79565b5090565b828054828255906000526020600020908101928215614ed5579160200282015b82811115614ed557825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614f05565b508054600082556001016002900490600052602060002090810190610f279190614f79565b5080546000825590600052602060002090810190610f2791905b5b80821115614ee15760008155600101614f7a565b600081518084526020808501945080840160005b83811015614fc75781516001600160a01b031687529582019590820190600101614fa2565b509495945050505050565b602081526000614bfc6020830184614f8e565b6001600160a01b0381168114610f2757600080fd5b60006020828403121561500c57600080fd5b8135614bfc81614fe5565b6000806040838503121561502a57600080fd5b823561503581614fe5565b946020939093013593505050565b634e487b7160e01b600052602160045260246000fd5b60038110610f2757610f27615043565b60005b8381101561508457818101518382015260200161506c565b50506000910152565b600081518084526150a5816020860160208601615069565b601f01601f19169290920160200192915050565b600081518084526020808501945080840160005b83811015614fc75781516001600160801b0316875295820195908201906001016150cd565b600061ffff8083511684526020818185015116818601526040840151915060a0604086015261512460a08601836150b9565b60608581015187830391880191909152805180835290830193506000918301905b8083101561516e5784516001600160a01b03168252938301936001929092019190830190615145565b5060808601519350868103608088015261518881856150b9565b979650505050505050565b600581106151a3576151a3615043565b9052565b6001600160a01b0388811682528716602082015260006151c687615059565b86604083015285606083015260e060808301526151e660e083018661508d565b82810360a08401526151f881866150f2565b91505061520860c0830184615193565b98975050505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561525357615253615214565b604052919050565b600067ffffffffffffffff83111561527557615275615214565b615288601f8401601f191660200161522a565b905082815283838301111561529c57600080fd5b828260208301376000602084830101529392505050565b600082601f8301126152c457600080fd5b614bfc8383356020850161525b565b600080604083850312156152e657600080fd5b82356152f181614fe5565b9150602083013567ffffffffffffffff81111561530d57600080fd5b615319858286016152b3565b9150509250929050565b60006020828403121561533557600080fd5b5035919050565b6020815260006001600160a01b0380845116602084015280602085015116604084015250604083015161536e81615059565b8060608401525060608301516080830152608083015160e060a084015261539961010084018261508d565b905060a0840151601f198483030160c08501526153b682826150f2565b91505060c08401516153cb60e0850182615193565b509392505050565b803561ffff811681146153e557600080fd5b919050565b60008060008060008060008060008060006101608c8e03121561540c57600080fd5b6154158c6153d3565b9a5060208c013561542581614fe5565b995061543360408d016153d3565b985061544160608d016153d3565b975061544f60808d016153d3565b965061545d60a08d016153d3565b955061546b60c08d016153d3565b945061547960e08d016153d3565b93506154886101008d016153d3565b92506154976101208d016153d3565b91506154a66101408d016153d3565b90509295989b509295989b9093969950565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101561552757888303603f19018552815180516001600160a01b031684528701518784018790526155148785018261508d565b95880195935050908601906001016154df565b509098975050505050505050565b8035600381106153e557600080fd5b6000806000806080858703121561555a57600080fd5b8435935061556a60208601615535565b9250604085013567ffffffffffffffff81111561558657600080fd5b8501601f8101871361559757600080fd5b6155a68782356020840161525b565b92505060608501356155b781614fe5565b939692955090935050565b6000806000606084860312156155d757600080fd5b6155e084615535565b925060208085013567ffffffffffffffff808211156155fe57600080fd5b61560a888389016152b3565b9450604087013591508082111561562057600080fd5b818701915087601f83011261563457600080fd5b81358181111561564657615646615214565b8060051b61565585820161522a565b918252838101850191858101908b84111561566f57600080fd5b86860192505b838310156156ab5782358581111561568d5760008081fd5b61569b8d89838a01016152b3565b8352509186019190860190615675565b809750505050505050509250925092565b6000602082840312156156ce57600080fd5b614bfc826153d3565b6000806000606084860312156156ec57600080fd5b83356156f781614fe5565b9250602084013561570781614fe5565b929592945050506040919091013590565b6000806040838503121561572b57600080fd5b615734836153d3565b9150615742602084016153d3565b90509250929050565b602081526000614bfc602083018461508d565b6040810161576c8285615193565b8260208301529392505050565b60006020828403121561578b57600080fd5b5051919050565b6000602082840312156157a457600080fd5b81518015158114614bfc57600080fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610da957610da96157b4565b600181811c908216806157f157607f821691505b60208210810361581157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b60006001820161583f5761583f6157b4565b5060010190565b601f82111561385b57600081815260208120601f850160051c8101602086101561586d5750805b601f850160051c820191505b81811015612da257828155600101615879565b815167ffffffffffffffff8111156158a6576158a6615214565b6158ba816158b484546157dd565b84615846565b602080601f8311600181146158ef57600084156158d75750858301515b600019600386901b1c1916600185901b178555612da2565b600085815260208120601f198616915b8281101561591e578886015182559484019460019091019084016158ff565b508582101561593c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610da957610da96157b4565b805160ff811681146153e557600080fd5b60006020828403121561598257600080fd5b614bfc8261595f565b61599484615059565b838152826020820152606060408201526000613e00606083018461508d565b6040815260006159c6604083018561508d565b8281036020840152613e00818561508d565b6000602082840312156159ea57600080fd5b8151614bfc81614fe5565b80516001600160801b03811681146153e557600080fd5b600080600060608486031215615a2157600080fd5b615a2a8461595f565b9250615a38602085016159f5565b91506040840151615a4881614fe5565b809150509250925092565b60008060008060808587031215615a6957600080fd5b615a728561595f565b9350615a80602086016159f5565b92506040850151615a9081614fe5565b9150615a9e606086016159f5565b905092959194509250565b600061ffff808316818103615ac057615ac06157b4565b6001019392505050565b61ffff8181168382160280821691908281146137be576137be6157b4565b634e487b7160e01b600052601260045260246000fd5b600061ffff80841680615b1357615b13615ae8565b92169190910492915050565b634e487b7160e01b600052603160045260246000fd5b60006001600160a01b03808716835280861660208401525060806040830152615b616080830185614f8e565b9050615b6c83615059565b82606083015295945050505050565b600082615b8a57615b8a615ae8565b500490565b63ffffffff828116828216039080821115615bac57615bac6157b4565b5092915050565b8082028115828204841417610da957610da96157b4565b60008251615bdc818460208701615069565b919091019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122019aa0081e69056404e40023f916698c2b116cb83388048dea2cf1b230e45ab7b64736f6c63430008110033", + "linkReferences": { + "contracts/SigUtil.sol": { + "SigUtil": [ + { + "length": 20, + "start": 10373 + } + ] + } + }, + "deployedLinkReferences": { + "contracts/SigUtil.sol": { + "SigUtil": [ + { + "length": 20, + "start": 10296 + } + ] + } + } +} diff --git a/docker/v02/validator_eth_key.json b/docker/v2/validator_eth_key.json similarity index 100% rename from docker/v02/validator_eth_key.json rename to docker/v2/validator_eth_key.json diff --git a/docker/v3/StorageV1.json b/docker/v3/StorageV1.json new file mode 100644 index 0000000..fa118f3 --- /dev/null +++ b/docker/v3/StorageV1.json @@ -0,0 +1,633 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "StorageV1", + "sourceName": "contracts/Storage.sol", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address[]", + "name": "nodeList", + "type": "address[]" + } + ], + "name": "SNodeMappingChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "inputs": [], + "name": "MAX_NODE_ID", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "NULL_NODE", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "NULL_SHARD", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SHARD_COUNT", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress_", + "type": "address" + } + ], + "name": "addNode", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8[]", + "name": "nodeList_", + "type": "uint8[]" + }, + { + "internalType": "uint8[]", + "name": "countersMap_", + "type": "uint8[]" + } + ], + "name": "calculateAvgPerNode", + "outputs": [ + { + "internalType": "uint256", + "name": "avgPerNode_", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "demand_", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "nodeAddr_", + "type": "address[]" + } + ], + "name": "getAllNodeShards", + "outputs": [ + { + "internalType": "uint32[]", + "name": "", + "type": "uint32[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getNodeAddresses", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress_", + "type": "address" + } + ], + "name": "getNodeShardsByAddr", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint16", + "name": "protocolVersion_", + "type": "uint16" + }, + { + "internalType": "address", + "name": "validatorContract_", + "type": "address" + }, + { + "internalType": "uint8", + "name": "rfTarget_", + "type": "uint8" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "mapAddrToNodeId", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "name": "mapNodeIdToAddr", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "name": "mapNodeToShards", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nodeCount", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "nodeIdList", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "rf_", + "type": "uint8" + } + ], + "name": "overrideRf", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "protocolVersion", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress_", + "type": "address" + } + ], + "name": "removeNode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "rf", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rfChangedByAdmin", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rfTarget", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress_", + "type": "address" + }, + { + "internalType": "uint32", + "name": "bitmap_", + "type": "uint32" + } + ], + "name": "setNodeShardsByAddr", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "rfTarget_", + "type": "uint8" + } + ], + "name": "setRfTarget", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "addr_", + "type": "address" + } + ], + "name": "setValidatorContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "shuffle", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "validatorContract", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60a06040523060805234801561001457600080fd5b50608051613bac61004c600039600081816108c30152818161094801528181610b6201528181610be70152610cd10152613bac6000f3fe6080604052600436106102195760003560e01c8063893f5da91161011d578063bac506e0116100b0578063d85707d51161007f578063f143896811610064578063f143896814610667578063f2fde38b1461067c578063fe92fe861461069c57600080fd5b8063d85707d514610629578063e30c39781461064957600080fd5b8063bac506e0146105a2578063cc59a6f4146105bc578063cdf64a76146105dc578063d12be06b146105fc57600080fd5b80639fc8ded3116100ec5780639fc8ded31461051e578063a25d526f14610533578063a5129cd014610562578063b2b99ec91461058257600080fd5b8063893f5da91461048e5780638da5cb5b146104bf57806399439089146104dd5780639d95f1cc146104fe57600080fd5b806345954486116101b0578063633207ae1161017f578063715018a611610164578063715018a61461044f578063720a0fa41461046457806379ba50971461047957600080fd5b8063633207ae146104255780636da49b831461043a57600080fd5b8063459544861461039657806348570569146103c85780634f1ef286146103fd57806352d1902d1461041057600080fd5b80632e949824116101ec5780632e949824146102e657806330cdb2751461030857806333083fe6146103565780633659cfe61461037657600080fd5b806301b9e4381461021e5780631a27e21c1461026b5780632520bf041461028d5780632ae9c600146102b0575b600080fd5b34801561022a57600080fd5b506102516102393660046134d4565b60fe6020526000908152604090205463ffffffff1681565b60405163ffffffff90911681526020015b60405180910390f35b34801561027757600080fd5b5061028b6102863660046134d4565b6106bc565b005b34801561029957600080fd5b506102a261070a565b604051908152602001610262565b3480156102bc57600080fd5b50610102546102d390600160a01b900461ffff1681565b60405161ffff9091168152602001610262565b3480156102f257600080fd5b506102fb610741565b60405161026291906134ef565b34801561031457600080fd5b5061033e6103233660046134d4565b60fd602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610262565b34801561036257600080fd5b50610251610371366004613553565b61082d565b34801561038257600080fd5b5061028b610391366004613553565b6108b9565b3480156103a257600080fd5b506103b66103b136600461356e565b610a34565b60405160ff9091168152602001610262565b3480156103d457600080fd5b506103e86103e3366004613664565b610a68565b60408051928352602083019190915201610262565b61028b61040b3660046136c8565b610b58565b34801561041c57600080fd5b506102a2610cc4565b34801561043157600080fd5b506103b660fe81565b34801561044657600080fd5b5060fc546103b6565b34801561045b57600080fd5b5061028b610d89565b34801561047057600080fd5b506103b6600081565b34801561048557600080fd5b5061028b610d9d565b34801561049a57600080fd5b506103b66104a9366004613553565b60ff602081905260009182526040909120541681565b3480156104cb57600080fd5b506033546001600160a01b031661033e565b3480156104e957600080fd5b506101025461033e906001600160a01b031681565b34801561050a57600080fd5b506103b6610519366004613553565b610e28565b34801561052a57600080fd5b506103b660ff81565b34801561053f57600080fd5b5060fb5461055290610100900460ff1681565b6040519015158152602001610262565b34801561056e57600080fd5b5061028b61057d3660046134d4565b6110fc565b34801561058e57600080fd5b5061028b61059d366004613553565b61117c565b3480156105ae57600080fd5b5060fb546103b69060ff1681565b3480156105c857600080fd5b5061028b6105d736600461376e565b611537565b3480156105e857600080fd5b5061028b6105f7366004613553565b6115d5565b34801561060857600080fd5b5061061c6106173660046137ae565b611600565b604051610262919061383b565b34801561063557600080fd5b5060fb546103b69062010000900460ff1681565b34801561065557600080fd5b506065546001600160a01b031661033e565b34801561067357600080fd5b506103b6602081565b34801561068857600080fd5b5061028b610697366004613553565b6116f3565b3480156106a857600080fd5b5061028b6106b7366004613879565b611764565b6106c4611902565b60fb805462ff000019166201000060ff84169081029190911790915560fc548111156106ef575060fc545b60fb805461ffff191660ff9092169190911761010017905550565b6000610714611902565b60fb5460009061072d90610100900460ff16828061195c565b60fb805461ff001916905560ff1691505090565b60fc5460609060008167ffffffffffffffff81111561076257610762613587565b60405190808252806020026020018201604052801561078b578160200160208202803683370190505b50905060005b8281101561082657600060fc82815481106107ae576107ae6138c5565b600091825260208083208183040154601f9092166101000a90910460ff1680835260fd90915260409091205484519192506001600160a01b0316908490849081106107fb576107fb6138c5565b6001600160a01b0390921660209283029190910190910152508061081e816138f1565b915050610791565b5092915050565b6001600160a01b038116600090815260ff60208190526040822054168061089b5760405162461bcd60e51b815260206004820152600c60248201527f6e6f2073756368206e6f6465000000000000000000000000000000000000000060448201526064015b60405180910390fd5b60ff16600090815260fe602052604090205463ffffffff1692915050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036109465760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610892565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166109a17f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610a0c5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610892565b610a1581611ec3565b60408051600080825260208201909252610a3191839190611ecb565b50565b60fc8181548110610a4457600080fd5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b815160fb54600091829160ff918216918391610a869116602061390a565b905060008215610a9f57610a9a8383613937565b610aa2565b60005b90506000610ab0848461394b565b1115610ac457610ac181600161395f565b90505b6000805b8851811015610b4a576000898281518110610ae557610ae56138c5565b602002602001015190506000898260ff1681518110610b0657610b066138c5565b60200260200101519050848160ff161015610b3557610b2860ff821686613972565b610b32908561395f565b93505b50508080610b42906138f1565b915050610ac8565b509097909650945050505050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610be55760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610892565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610c407f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610cab5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610892565b610cb482611ec3565b610cc082826001611ecb565b5050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610d645760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610892565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610d91611902565b610d9b6000612070565b565b60655433906001600160a01b03168114610e1f5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610892565b610a3181612070565b610102546000906001600160a01b0316331480610e4f57506033546001600160a01b031633145b610e9b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610892565b6001600160a01b038216600090815260ff60208190526040909120541615610f055760405162461bcd60e51b815260206004820152601d60248201527f6164647265737320697320616c726561647920726567697374657265640000006044820152606401610892565b6101005460ff1615801590610f2257506101005460fe60ff909116105b610f6e5760405162461bcd60e51b815260206004820152601a60248201527f6e6f64654964203e2030202626206e6f64654964203c206d61780000000000006044820152606401610892565b610101546000908015610ffc57610101610f89600183613972565b81548110610f9957610f996138c5565b90600052602060002090602091828204019190069054906101000a900460ff169150610101805480610fcd57610fcd613985565b60019003818190600052602060002090602091828204019190066101000a81549060ff0219169055905561102b565b610100805460ff169060006110108361399b565b91906101000a81548160ff021916908360ff16021790555091505b60fc8054600181810190925560208082047f371f36870d18f32a11fea0f144b021c8b407bb50f8e0267c711123f454b963c001805460ff808816601f9095166101000a8581029082021990921691909117909155600083815260fd8352604080822080546001600160a01b038c166001600160a01b031990911681179091558252918352818120805460ff19168517905592835260fe9091528120805463ffffffff19169055906110db90612089565b90506110e98160008061195c565b50506101005460ff16925050505b919050565b611104611902565b60fc5460ff821611156111595760405162461bcd60e51b815260206004820152601b60248201527f7266206973206c696d69746564206279206e6f646520636f756e7400000000006044820152606401610892565b60fb805461010060ff9390931661ffff19909116179190911762ff000019169055565b610102546001600160a01b03163314806111a057506033546001600160a01b031633145b6111ec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610892565b6001600160a01b038116600090815260ff60208181526040832054610101805460018101825594529083047f109ea3cebb188b9c1b9fc5bb3920be60dfdc8699098dff92f3d80daaca747689018054601f9094166101000a918316828102929093021990931617909155806112a35760405162461bcd60e51b815260206004820152601060248201527f6e6f206164647265737320666f756e64000000000000000000000000000000006044820152606401610892565b60fc54600003611317576001600160a01b038216600090815260ff602052604090819020805460ff191690555162461bcd60e51b81526108929060040160208082526010908201527f6e6f206e6f646520696420666f756e6400000000000000000000000000000000604082015260600190565b60ff8116600090815260fe60205260408120805463ffffffff19811690915560fc5463ffffffff909116915b81811015611465578360ff1660fc8281548110611362576113626138c5565b60009182526020918290209181049091015460ff601f9092166101000a9004160361145357611392600183613972565b81146114135760fc6113a5600184613972565b815481106113b5576113b56138c5565b90600052602060002090602091828204019190069054906101000a900460ff1660fc82815481106113e8576113e86138c5565b90600052602060002090602091828204019190066101000a81548160ff021916908360ff1602179055505b60fc80548061142457611424613985565b60019003818190600052602060002090602091828204019190066101000a81549060ff02191690559055611465565b8061145d816138f1565b915050611343565b5060ff8316600090815260fd6020526040812080546001600160a01b0319169055611491600019612089565b604080516001808252818301909252919250600091906020808301908036833701905050905085816000815181106114cb576114cb6138c5565b60200260200101906001600160a01b031690816001600160a01b0316815250507fb338e44b9e4e2d94df983fde422fd91ba2bd6f8182b607b50c968f8161bcf8858160405161151a91906134ef565b60405180910390a161152e8260018661195c565b50505050505050565b61153f611902565b6001600160a01b038216600090815260ff602081905260409091205416806115a95760405162461bcd60e51b815260206004820152601e60248201527f6e6f64652061646472657373206973206e6f74207265676973746572656400006044820152606401610892565b60ff16600090815260fe60205260409020805463ffffffff191663ffffffff9290921691909117905550565b6115dd611902565b61010280546001600160a01b0319166001600160a01b0392909216919091179055565b60606000825167ffffffffffffffff81111561161e5761161e613587565b604051908082528060200260200182016040528015611647578160200160208202803683370190505b50905060005b835181101561082657600060ff600086848151811061166e5761166e6138c5565b6020908102919091018101516001600160a01b0316825281810192909252604090810160009081205460ff1680825260fe9093522054845191925063ffffffff169081908590859081106116c4576116c46138c5565b602002602001019063ffffffff16908163ffffffff1681525050505080806116eb906138f1565b91505061164d565b6116fb611902565b606580546001600160a01b0383166001600160a01b0319909116811790915561172c6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600054610100900460ff16158080156117845750600054600160ff909116105b8061179e5750303b15801561179e575060005460ff166001145b6118105760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610892565b6000805460ff191660011790558015611833576000805461ff0019166101001790555b61183b612120565b61184361218b565b6101008054600160ff1990911617905560fb8054610102805462ff00ff199092166201000060ff871602179092557fffffffffffffffffffff0000000000000000000000000000000000000000000016600160a01b61ffff8716026001600160a01b031916176001600160a01b03851617905580156118fc576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6033546001600160a01b03163314610d9b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610892565b60008060fc8054806020026020016040519081016040528092919081815260200182805480156119c957602002820191906000526020600020906000905b825461010083900a900460ff1681526020600192830181810494850194909303909202910180841161199a5790505b505060fb549394505060ff90921691505060fe811115611a2b5760405162461bcd60e51b815260206004820152600660248201527f62616420726600000000000000000000000000000000000000000000000000006044820152606401610892565b815160ff11611a7c5760405162461bcd60e51b815260206004820152600e60248201527f626164206e6f646520636f756e740000000000000000000000000000000000006044820152606401610892565b6000805b8351811015611acc576000848281518110611a9d57611a9d6138c5565b602002602001015190508260ff168160ff161115611ab9578092505b5080611ac4816138f1565b915050611a80565b5060fe60ff821610611add57600080fd5b6000611aea8260016139ba565b60ff1667ffffffffffffffff811115611b0557611b05613587565b604051908082528060200260200182016040528015611b2e578160200160208202803683370190505b5090506000611b3e8360016139ba565b60ff1667ffffffffffffffff811115611b5957611b59613587565b604051908082528060200260200182016040528015611b82578160200160208202803683370190505b50905060005b8551811015611c59576000868281518110611ba557611ba56138c5565b6020026020010151905060018160ff161015611c035760405162461bcd60e51b815260206004820152601160248201527f6e6f6465732061726520312062617365640000000000000000000000000000006044820152606401610892565b60ff8116600081815260fe6020526040902054845163ffffffff9091169185918110611c3157611c316138c5565b63ffffffff909216602092830291909101909101525080611c51816138f1565b915050611b88565b506000611c6b868385888e8e8e6121ff565b60fc5490915015611ce5576000611c8387868561264b565b9050611c948288838688600061277a565b50600080611ca28984610a68565b90925090505b8015611ce1576000611cbc8a85888a6129a0565b90508015611cd557611cce8183613972565b9150611cdb565b50611ce1565b50611ca8565b5050505b600060015b84518160ff161015611d8a576000858260ff1681518110611d0d57611d0d6138c5565b602002602001015160ff161115611d78576000848260ff1681518110611d3557611d356138c5565b60209081029190910181015160ff8416600090815260fe9092526040909120805463ffffffff191663ffffffff8316179055905082611d738161399b565b935050505b80611d828161399b565b915050611cea565b5060008160ff1667ffffffffffffffff811115611da957611da9613587565b604051908082528060200260200182016040528015611dd2578160200160208202803683370190505b509050600060015b86518160ff161015611e7a576000878260ff1681518110611dfd57611dfd6138c5565b602002602001015160ff161115611e685760ff8116600090815260fd60205260409020546001600160a01b03168383611e35816138f1565b945081518110611e4757611e476138c5565b60200260200101906001600160a01b031690816001600160a01b0316815250505b80611e728161399b565b915050611dda565b507fb338e44b9e4e2d94df983fde422fd91ba2bd6f8182b607b50c968f8161bcf88582604051611eaa91906134ef565b60405180910390a150909b9a5050505050505050505050565b610a31611902565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611f0357611efe83612c7a565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611f5d575060408051601f3d908101601f19168201909252611f5a918101906139d3565b60015b611fcf5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610892565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146120645760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610892565b50611efe838383612d38565b606580546001600160a01b0319169055610a3181612d5d565b60fb54600090610100900460ff1680156120a95760fb805461ff00191690555b60fb5460ff1660006120bb85836139ec565b60fb5490915062010000900460ff16158015906120d9575060008112155b80156120f0575060fb5462010000900460ff168113155b80156120fe575060fc548113155b156121175760fb805460ff191660ff8316179055600192505b50909392505050565b600054610100900460ff16610d9b5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610892565b600054610100900460ff166121f65760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610892565b610d9b33612070565b6060808415801561220e575083155b15612229575050604080516000815260208101909152612640565b83156122be576040805160208082526104208201909252908082016104008036833701905050905060005b602060ff821610156122b65761226a8482612daf565b60ff1660011461227b5760ff61227d565b805b828260ff1681518110612292576122926138c5565b60ff90921660209283029190910190910152806122ae8161399b565b915050612254565b509050612640565b6122c960208761390a565b67ffffffffffffffff8111156122e1576122e1613587565b60405190808252806020026020018201604052801561230a578160200160208202803683370190505b5090506000805b8781101561237d5760005b602060ff8216101561236a57808484612334816138f1565b955081518110612346576123466138c5565b60ff90921660209283029190910190910152806123628161399b565b91505061231c565b5080612375816138f1565b915050612311565b5060005b8a518110156124fe5760008b828151811061239e5761239e6138c5565b602002602001015160ff16905060008b82815181106123bf576123bf6138c5565b6020026020010151905060005b602060ff821610156124bb576123e28282612daf565b60ff16156124a95760001960005b8751811015612439578260ff1688828151811061240f5761240f6138c5565b602002602001015160ff160361242757809150612439565b80612431816138f1565b9150506123f0565b50801961247e57600160ff83161b19831692508c848151811061245e5761245e6138c5565b6020026020010180518091906124739061399b565b60ff169052506124a7565b60ff878281518110612492576124926138c5565b602002602001019060ff16908160ff16815250505b505b806124b38161399b565b9150506123cc565b50808c83815181106124cf576124cf6138c5565b602002602001019063ffffffff16908163ffffffff1681525050505080806124f6906138f1565b915050612381565b506000805b83518110156125525760ff8016848281518110612522576125226138c5565b602002602001015160ff1603612540578161253c816138f1565b9250505b8061254a816138f1565b915050612503565b5060008184516125629190613972565b67ffffffffffffffff81111561257a5761257a613587565b6040519080825280602002602001820160405280156125a3578160200160208202803683370190505b5090506000805b85518110156126375760ff80168682815181106125c9576125c96138c5565b602002602001015160ff1614612625578581815181106125eb576125eb6138c5565b6020026020010151838381518110612605576126056138c5565b60ff9092166020928302919091019091015281612621816138f1565b9250505b8061262f816138f1565b9150506125aa565b50909450505050505b979650505050505050565b6060600061265a8460016139ba565b60ff1667ffffffffffffffff81111561267557612675613587565b60405190808252806020026020018201604052801561269e578160200160208202803683370190505b50905060005b85518110156127715760008682815181106126c1576126c16138c5565b602002602001015190506000858260ff16815181106126e2576126e26138c5565b602002602001015190506000805b602060ff82161015612730576127068382612daf565b60ff1660010361271e578161271a8161399b565b9250505b806127288161399b565b9150506126f0565b5080858460ff1681518110612747576127476138c5565b602002602001019060ff16908160ff16815250505050508080612769906138f1565b9150506126a4565b50949350505050565b6000865160000361278d57506000612996565b6127978686612dc5565b6000805b88518110156129925760008982815181106127b8576127b86138c5565b6020026020010151905060ff80168160ff16036127d55750612980565b60005b89518160ff16101561297d5760008a8260ff16815181106127fb576127fb6138c5565b6020026020010151905060008760ff1611801561283a57508660ff168a8260ff168151811061282c5761282c6138c5565b602002602001015160ff1610155b15612845575061296b565b6000898260ff168151811061285c5761285c6138c5565b6020026020010151905060006128728286612daf565b90508060ff166000036129675760ff8e8781518110612893576128936138c5565b60ff928316602091820292909201015260019086161b82178b8460ff16815181106128c0576128c06138c5565b602002602001019063ffffffff16908163ffffffff16815250508b8360ff16815181106128ef576128ef6138c5565b6020026020010180518091906129049061399b565b60ff1660ff1681525050898360ff1681518110612923576129236138c5565b6020026020010180518091906129389061399b565b60ff1660ff16815250506129528d8d8660ff166001612dec565b8661295c816138f1565b97505050505061297d565b5050505b806129758161399b565b9150506127d8565b50505b8061298a816138f1565b91505061279b565b5090505b9695505050505050565b600084516000036129b357506000612c72565b6129bd8585612dc5565b600080600187516129ce9190613972565b90506129d86134a4565b81831015612c6a5760008884815181106129f4576129f46138c5565b602002602001015190506000898481518110612a1257612a126138c5565b602002602001015190506000888360ff1681518110612a3357612a336138c5565b602002602001015119898360ff1681518110612a5157612a516138c5565b60200260200101518a8560ff1681518110612a6e57612a6e6138c5565b6020026020010151181690508063ffffffff16600014612c47576000612a94828661302a565b9050612ac58a8460ff1681518110612aae57612aae6138c5565b602002602001015182600160ff919091161b191690565b8a8460ff1681518110612ada57612ada6138c5565b602002602001019063ffffffff16908163ffffffff16815250508a8360ff1681518110612b0957612b096138c5565b602002602001018051809190612b1e90613a14565b60ff1660ff1681525050888360ff1681518110612b3d57612b3d6138c5565b602002602001018051809190612b529061399b565b60ff1660ff1681525050612b8a8a8560ff1681518110612b7457612b746138c5565b602002602001015182600160ff919091161b1790565b8a8560ff1681518110612b9f57612b9f6138c5565b602002602001019063ffffffff16908163ffffffff16815250508a8460ff1681518110612bce57612bce6138c5565b602002602001018051809190612be39061399b565b60ff1660ff1681525050888460ff1681518110612c0257612c026138c5565b602002602001018051809190612c179061399b565b60ff16905250612c2a8c8c896001612dec565b612c378c8c886000612dec565b6001975050505050505050612c72565b85612c51816138f1565b9650508480612c5f90613a31565b9550505050506129d8565b600093505050505b949350505050565b6001600160a01b0381163b612cf75760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610892565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b612d4183613152565b600082511180612d4e5750805b15611efe576118fc8383613192565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600163ffffffff831660ff83161c165b92915050565b8151600003612dd2575050565b610cc08282600060018651612de79190613972565b6131be565b818115612ec7575b6000612e018260016139ec565b12158015612e26575060018551612e189190613972565b612e238260016139ec565b13155b8015612eab57508385612e3a8360016139ec565b81518110612e4a57612e4a6138c5565b602002602001015160ff1681518110612e6557612e656138c5565b602002602001015160ff1684868581518110612e8357612e836138c5565b602002602001015160ff1681518110612e9e57612e9e6138c5565b602002602001015160ff16115b15612ec25780612eba81613a48565b915050612df4565b612f95565b6000612ed4600183613a79565b12158015612ef9575060018551612eeb9190613972565b612ef6600183613a79565b13155b8015612f7e57508385612f0d600184613a79565b81518110612f1d57612f1d6138c5565b602002602001015160ff1681518110612f3857612f386138c5565b602002602001015160ff1684868581518110612f5657612f566138c5565b602002602001015160ff1681518110612f7157612f716138c5565b602002602001015160ff16105b15612f955780612f8d81613a99565b915050612ec7565b828114613023576000858281518110612fb057612fb06138c5565b60200260200101519050858481518110612fcc57612fcc6138c5565b6020026020010151868381518110612fe657612fe66138c5565b602002602001019060ff16908160ff16815250508086858151811061300d5761300d6138c5565b602002602001019060ff16908160ff1681525050505b5050505050565b600080805b63ffffffff8516156130955760018086169003613075578084836130528161399b565b945060ff1660208110613067576130676138c5565b60ff90921660209290920201525b60018563ffffffff16901c9450808061308d9061399b565b91505061302f565b60408051426020808301919091527fff0000000000000000000000000000000000000000000000000000000000000060f885811b8216848601527fffffffff0000000000000000000000000000000000000000000000000000000060e08b901b16604185015286901b166045830152825180830360260181526046909201909252805191012060009061312c9060ff85169061394b565b9050848160ff1660208110613143576131436138c5565b60200201519695505050505050565b61315b81612c7a565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606131b78383604051806060016040528060278152602001613b506027913961339d565b9392505050565b81818082036131ce5750506118fc565b6000858760026131de8888613a79565b6131e89190613aae565b6131f290886139ec565b81518110613202576132026138c5565b602002602001015160ff168151811061321d5761321d6138c5565b602002602001015190505b818313613375575b8060ff1686888581518110613247576132476138c5565b602002602001015160ff1681518110613262576132626138c5565b602002602001015160ff161015613285578261327d81613a48565b935050613230565b85878381518110613298576132986138c5565b602002602001015160ff16815181106132b3576132b36138c5565b602002602001015160ff168160ff1610156132da57816132d281613a99565b925050613285565b818313613370578682815181106132f3576132f36138c5565b602002602001015187848151811061330d5761330d6138c5565b6020026020010151888581518110613327576133276138c5565b60200260200101898581518110613340576133406138c5565b60ff9384166020918202929092010152911690528261335e81613a48565b935050818061336c90613a99565b9250505b613228565b8185121561338957613389878787856131be565b8383121561152e5761152e878785876131be565b6060600080856001600160a01b0316856040516133ba9190613b00565b600060405180830381855af49150503d80600081146133f5576040519150601f19603f3d011682016040523d82523d6000602084013e6133fa565b606091505b5091509150612996868383876060831561347557825160000361346e576001600160a01b0385163b61346e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610892565b5081612c72565b612c72838381511561348a5781518083602001fd5b8060405162461bcd60e51b81526004016108929190613b1c565b6040518061040001604052806020906020820280368337509192915050565b803560ff811681146110f757600080fd5b6000602082840312156134e657600080fd5b6131b7826134c3565b6020808252825182820181905260009190848201906040850190845b818110156135305783516001600160a01b03168352928401929184019160010161350b565b50909695505050505050565b80356001600160a01b03811681146110f757600080fd5b60006020828403121561356557600080fd5b6131b78261353c565b60006020828403121561358057600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156135c6576135c6613587565b604052919050565b600067ffffffffffffffff8211156135e8576135e8613587565b5060051b60200190565b600082601f83011261360357600080fd5b81356020613618613613836135ce565b61359d565b82815260059290921b8401810191818101908684111561363757600080fd5b8286015b848110156136595761364c816134c3565b835291830191830161363b565b509695505050505050565b6000806040838503121561367757600080fd5b823567ffffffffffffffff8082111561368f57600080fd5b61369b868387016135f2565b935060208501359150808211156136b157600080fd5b506136be858286016135f2565b9150509250929050565b600080604083850312156136db57600080fd5b6136e48361353c565b915060208084013567ffffffffffffffff8082111561370257600080fd5b818601915086601f83011261371657600080fd5b81358181111561372857613728613587565b61373a601f8201601f1916850161359d565b9150808252878482850101111561375057600080fd5b80848401858401376000848284010152508093505050509250929050565b6000806040838503121561378157600080fd5b61378a8361353c565b9150602083013563ffffffff811681146137a357600080fd5b809150509250929050565b600060208083850312156137c157600080fd5b823567ffffffffffffffff8111156137d857600080fd5b8301601f810185136137e957600080fd5b80356137f7613613826135ce565b81815260059190911b8201830190838101908783111561381657600080fd5b928401925b828410156126405761382c8461353c565b8252928401929084019061381b565b6020808252825182820181905260009190848201906040850190845b8181101561353057835163ffffffff1683529284019291840191600101613857565b60008060006060848603121561388e57600080fd5b833561ffff811681146138a057600080fd5b92506138ae6020850161353c565b91506138bc604085016134c3565b90509250925092565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201613903576139036138db565b5060010190565b8082028115828204841417612dbf57612dbf6138db565b634e487b7160e01b600052601260045260246000fd5b60008261394657613946613921565b500490565b60008261395a5761395a613921565b500690565b80820180821115612dbf57612dbf6138db565b81810381811115612dbf57612dbf6138db565b634e487b7160e01b600052603160045260246000fd5b600060ff821660ff81036139b1576139b16138db565b60010192915050565b60ff8181168382160190811115612dbf57612dbf6138db565b6000602082840312156139e557600080fd5b5051919050565b8082018281126000831280158216821582161715613a0c57613a0c6138db565b505092915050565b600060ff821680613a2757613a276138db565b6000190192915050565b600081613a4057613a406138db565b506000190190565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613903576139036138db565b8181036000831280158383131683831282161715610826576108266138db565b6000600160ff1b8203613a4057613a406138db565b600082613abd57613abd613921565b600160ff1b821460001984141615613ad757613ad76138db565b500590565b60005b83811015613af7578181015183820152602001613adf565b50506000910152565b60008251613b12818460208701613adc565b9190910192915050565b6020815260008251806020840152613b3b816040850160208701613adc565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212208b49979b2f722eba21fe73a725f59b75c53ae7952a13f2732dd8e0c979721d1c64736f6c63430008110033", + "deployedBytecode": "0x6080604052600436106102195760003560e01c8063893f5da91161011d578063bac506e0116100b0578063d85707d51161007f578063f143896811610064578063f143896814610667578063f2fde38b1461067c578063fe92fe861461069c57600080fd5b8063d85707d514610629578063e30c39781461064957600080fd5b8063bac506e0146105a2578063cc59a6f4146105bc578063cdf64a76146105dc578063d12be06b146105fc57600080fd5b80639fc8ded3116100ec5780639fc8ded31461051e578063a25d526f14610533578063a5129cd014610562578063b2b99ec91461058257600080fd5b8063893f5da91461048e5780638da5cb5b146104bf57806399439089146104dd5780639d95f1cc146104fe57600080fd5b806345954486116101b0578063633207ae1161017f578063715018a611610164578063715018a61461044f578063720a0fa41461046457806379ba50971461047957600080fd5b8063633207ae146104255780636da49b831461043a57600080fd5b8063459544861461039657806348570569146103c85780634f1ef286146103fd57806352d1902d1461041057600080fd5b80632e949824116101ec5780632e949824146102e657806330cdb2751461030857806333083fe6146103565780633659cfe61461037657600080fd5b806301b9e4381461021e5780631a27e21c1461026b5780632520bf041461028d5780632ae9c600146102b0575b600080fd5b34801561022a57600080fd5b506102516102393660046134d4565b60fe6020526000908152604090205463ffffffff1681565b60405163ffffffff90911681526020015b60405180910390f35b34801561027757600080fd5b5061028b6102863660046134d4565b6106bc565b005b34801561029957600080fd5b506102a261070a565b604051908152602001610262565b3480156102bc57600080fd5b50610102546102d390600160a01b900461ffff1681565b60405161ffff9091168152602001610262565b3480156102f257600080fd5b506102fb610741565b60405161026291906134ef565b34801561031457600080fd5b5061033e6103233660046134d4565b60fd602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610262565b34801561036257600080fd5b50610251610371366004613553565b61082d565b34801561038257600080fd5b5061028b610391366004613553565b6108b9565b3480156103a257600080fd5b506103b66103b136600461356e565b610a34565b60405160ff9091168152602001610262565b3480156103d457600080fd5b506103e86103e3366004613664565b610a68565b60408051928352602083019190915201610262565b61028b61040b3660046136c8565b610b58565b34801561041c57600080fd5b506102a2610cc4565b34801561043157600080fd5b506103b660fe81565b34801561044657600080fd5b5060fc546103b6565b34801561045b57600080fd5b5061028b610d89565b34801561047057600080fd5b506103b6600081565b34801561048557600080fd5b5061028b610d9d565b34801561049a57600080fd5b506103b66104a9366004613553565b60ff602081905260009182526040909120541681565b3480156104cb57600080fd5b506033546001600160a01b031661033e565b3480156104e957600080fd5b506101025461033e906001600160a01b031681565b34801561050a57600080fd5b506103b6610519366004613553565b610e28565b34801561052a57600080fd5b506103b660ff81565b34801561053f57600080fd5b5060fb5461055290610100900460ff1681565b6040519015158152602001610262565b34801561056e57600080fd5b5061028b61057d3660046134d4565b6110fc565b34801561058e57600080fd5b5061028b61059d366004613553565b61117c565b3480156105ae57600080fd5b5060fb546103b69060ff1681565b3480156105c857600080fd5b5061028b6105d736600461376e565b611537565b3480156105e857600080fd5b5061028b6105f7366004613553565b6115d5565b34801561060857600080fd5b5061061c6106173660046137ae565b611600565b604051610262919061383b565b34801561063557600080fd5b5060fb546103b69062010000900460ff1681565b34801561065557600080fd5b506065546001600160a01b031661033e565b34801561067357600080fd5b506103b6602081565b34801561068857600080fd5b5061028b610697366004613553565b6116f3565b3480156106a857600080fd5b5061028b6106b7366004613879565b611764565b6106c4611902565b60fb805462ff000019166201000060ff84169081029190911790915560fc548111156106ef575060fc545b60fb805461ffff191660ff9092169190911761010017905550565b6000610714611902565b60fb5460009061072d90610100900460ff16828061195c565b60fb805461ff001916905560ff1691505090565b60fc5460609060008167ffffffffffffffff81111561076257610762613587565b60405190808252806020026020018201604052801561078b578160200160208202803683370190505b50905060005b8281101561082657600060fc82815481106107ae576107ae6138c5565b600091825260208083208183040154601f9092166101000a90910460ff1680835260fd90915260409091205484519192506001600160a01b0316908490849081106107fb576107fb6138c5565b6001600160a01b0390921660209283029190910190910152508061081e816138f1565b915050610791565b5092915050565b6001600160a01b038116600090815260ff60208190526040822054168061089b5760405162461bcd60e51b815260206004820152600c60248201527f6e6f2073756368206e6f6465000000000000000000000000000000000000000060448201526064015b60405180910390fd5b60ff16600090815260fe602052604090205463ffffffff1692915050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036109465760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610892565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166109a17f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610a0c5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610892565b610a1581611ec3565b60408051600080825260208201909252610a3191839190611ecb565b50565b60fc8181548110610a4457600080fd5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b815160fb54600091829160ff918216918391610a869116602061390a565b905060008215610a9f57610a9a8383613937565b610aa2565b60005b90506000610ab0848461394b565b1115610ac457610ac181600161395f565b90505b6000805b8851811015610b4a576000898281518110610ae557610ae56138c5565b602002602001015190506000898260ff1681518110610b0657610b066138c5565b60200260200101519050848160ff161015610b3557610b2860ff821686613972565b610b32908561395f565b93505b50508080610b42906138f1565b915050610ac8565b509097909650945050505050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610be55760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610892565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610c407f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610cab5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610892565b610cb482611ec3565b610cc082826001611ecb565b5050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610d645760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610892565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610d91611902565b610d9b6000612070565b565b60655433906001600160a01b03168114610e1f5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610892565b610a3181612070565b610102546000906001600160a01b0316331480610e4f57506033546001600160a01b031633145b610e9b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610892565b6001600160a01b038216600090815260ff60208190526040909120541615610f055760405162461bcd60e51b815260206004820152601d60248201527f6164647265737320697320616c726561647920726567697374657265640000006044820152606401610892565b6101005460ff1615801590610f2257506101005460fe60ff909116105b610f6e5760405162461bcd60e51b815260206004820152601a60248201527f6e6f64654964203e2030202626206e6f64654964203c206d61780000000000006044820152606401610892565b610101546000908015610ffc57610101610f89600183613972565b81548110610f9957610f996138c5565b90600052602060002090602091828204019190069054906101000a900460ff169150610101805480610fcd57610fcd613985565b60019003818190600052602060002090602091828204019190066101000a81549060ff0219169055905561102b565b610100805460ff169060006110108361399b565b91906101000a81548160ff021916908360ff16021790555091505b60fc8054600181810190925560208082047f371f36870d18f32a11fea0f144b021c8b407bb50f8e0267c711123f454b963c001805460ff808816601f9095166101000a8581029082021990921691909117909155600083815260fd8352604080822080546001600160a01b038c166001600160a01b031990911681179091558252918352818120805460ff19168517905592835260fe9091528120805463ffffffff19169055906110db90612089565b90506110e98160008061195c565b50506101005460ff16925050505b919050565b611104611902565b60fc5460ff821611156111595760405162461bcd60e51b815260206004820152601b60248201527f7266206973206c696d69746564206279206e6f646520636f756e7400000000006044820152606401610892565b60fb805461010060ff9390931661ffff19909116179190911762ff000019169055565b610102546001600160a01b03163314806111a057506033546001600160a01b031633145b6111ec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610892565b6001600160a01b038116600090815260ff60208181526040832054610101805460018101825594529083047f109ea3cebb188b9c1b9fc5bb3920be60dfdc8699098dff92f3d80daaca747689018054601f9094166101000a918316828102929093021990931617909155806112a35760405162461bcd60e51b815260206004820152601060248201527f6e6f206164647265737320666f756e64000000000000000000000000000000006044820152606401610892565b60fc54600003611317576001600160a01b038216600090815260ff602052604090819020805460ff191690555162461bcd60e51b81526108929060040160208082526010908201527f6e6f206e6f646520696420666f756e6400000000000000000000000000000000604082015260600190565b60ff8116600090815260fe60205260408120805463ffffffff19811690915560fc5463ffffffff909116915b81811015611465578360ff1660fc8281548110611362576113626138c5565b60009182526020918290209181049091015460ff601f9092166101000a9004160361145357611392600183613972565b81146114135760fc6113a5600184613972565b815481106113b5576113b56138c5565b90600052602060002090602091828204019190069054906101000a900460ff1660fc82815481106113e8576113e86138c5565b90600052602060002090602091828204019190066101000a81548160ff021916908360ff1602179055505b60fc80548061142457611424613985565b60019003818190600052602060002090602091828204019190066101000a81549060ff02191690559055611465565b8061145d816138f1565b915050611343565b5060ff8316600090815260fd6020526040812080546001600160a01b0319169055611491600019612089565b604080516001808252818301909252919250600091906020808301908036833701905050905085816000815181106114cb576114cb6138c5565b60200260200101906001600160a01b031690816001600160a01b0316815250507fb338e44b9e4e2d94df983fde422fd91ba2bd6f8182b607b50c968f8161bcf8858160405161151a91906134ef565b60405180910390a161152e8260018661195c565b50505050505050565b61153f611902565b6001600160a01b038216600090815260ff602081905260409091205416806115a95760405162461bcd60e51b815260206004820152601e60248201527f6e6f64652061646472657373206973206e6f74207265676973746572656400006044820152606401610892565b60ff16600090815260fe60205260409020805463ffffffff191663ffffffff9290921691909117905550565b6115dd611902565b61010280546001600160a01b0319166001600160a01b0392909216919091179055565b60606000825167ffffffffffffffff81111561161e5761161e613587565b604051908082528060200260200182016040528015611647578160200160208202803683370190505b50905060005b835181101561082657600060ff600086848151811061166e5761166e6138c5565b6020908102919091018101516001600160a01b0316825281810192909252604090810160009081205460ff1680825260fe9093522054845191925063ffffffff169081908590859081106116c4576116c46138c5565b602002602001019063ffffffff16908163ffffffff1681525050505080806116eb906138f1565b91505061164d565b6116fb611902565b606580546001600160a01b0383166001600160a01b0319909116811790915561172c6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600054610100900460ff16158080156117845750600054600160ff909116105b8061179e5750303b15801561179e575060005460ff166001145b6118105760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610892565b6000805460ff191660011790558015611833576000805461ff0019166101001790555b61183b612120565b61184361218b565b6101008054600160ff1990911617905560fb8054610102805462ff00ff199092166201000060ff871602179092557fffffffffffffffffffff0000000000000000000000000000000000000000000016600160a01b61ffff8716026001600160a01b031916176001600160a01b03851617905580156118fc576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6033546001600160a01b03163314610d9b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610892565b60008060fc8054806020026020016040519081016040528092919081815260200182805480156119c957602002820191906000526020600020906000905b825461010083900a900460ff1681526020600192830181810494850194909303909202910180841161199a5790505b505060fb549394505060ff90921691505060fe811115611a2b5760405162461bcd60e51b815260206004820152600660248201527f62616420726600000000000000000000000000000000000000000000000000006044820152606401610892565b815160ff11611a7c5760405162461bcd60e51b815260206004820152600e60248201527f626164206e6f646520636f756e740000000000000000000000000000000000006044820152606401610892565b6000805b8351811015611acc576000848281518110611a9d57611a9d6138c5565b602002602001015190508260ff168160ff161115611ab9578092505b5080611ac4816138f1565b915050611a80565b5060fe60ff821610611add57600080fd5b6000611aea8260016139ba565b60ff1667ffffffffffffffff811115611b0557611b05613587565b604051908082528060200260200182016040528015611b2e578160200160208202803683370190505b5090506000611b3e8360016139ba565b60ff1667ffffffffffffffff811115611b5957611b59613587565b604051908082528060200260200182016040528015611b82578160200160208202803683370190505b50905060005b8551811015611c59576000868281518110611ba557611ba56138c5565b6020026020010151905060018160ff161015611c035760405162461bcd60e51b815260206004820152601160248201527f6e6f6465732061726520312062617365640000000000000000000000000000006044820152606401610892565b60ff8116600081815260fe6020526040902054845163ffffffff9091169185918110611c3157611c316138c5565b63ffffffff909216602092830291909101909101525080611c51816138f1565b915050611b88565b506000611c6b868385888e8e8e6121ff565b60fc5490915015611ce5576000611c8387868561264b565b9050611c948288838688600061277a565b50600080611ca28984610a68565b90925090505b8015611ce1576000611cbc8a85888a6129a0565b90508015611cd557611cce8183613972565b9150611cdb565b50611ce1565b50611ca8565b5050505b600060015b84518160ff161015611d8a576000858260ff1681518110611d0d57611d0d6138c5565b602002602001015160ff161115611d78576000848260ff1681518110611d3557611d356138c5565b60209081029190910181015160ff8416600090815260fe9092526040909120805463ffffffff191663ffffffff8316179055905082611d738161399b565b935050505b80611d828161399b565b915050611cea565b5060008160ff1667ffffffffffffffff811115611da957611da9613587565b604051908082528060200260200182016040528015611dd2578160200160208202803683370190505b509050600060015b86518160ff161015611e7a576000878260ff1681518110611dfd57611dfd6138c5565b602002602001015160ff161115611e685760ff8116600090815260fd60205260409020546001600160a01b03168383611e35816138f1565b945081518110611e4757611e476138c5565b60200260200101906001600160a01b031690816001600160a01b0316815250505b80611e728161399b565b915050611dda565b507fb338e44b9e4e2d94df983fde422fd91ba2bd6f8182b607b50c968f8161bcf88582604051611eaa91906134ef565b60405180910390a150909b9a5050505050505050505050565b610a31611902565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611f0357611efe83612c7a565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611f5d575060408051601f3d908101601f19168201909252611f5a918101906139d3565b60015b611fcf5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610892565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146120645760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610892565b50611efe838383612d38565b606580546001600160a01b0319169055610a3181612d5d565b60fb54600090610100900460ff1680156120a95760fb805461ff00191690555b60fb5460ff1660006120bb85836139ec565b60fb5490915062010000900460ff16158015906120d9575060008112155b80156120f0575060fb5462010000900460ff168113155b80156120fe575060fc548113155b156121175760fb805460ff191660ff8316179055600192505b50909392505050565b600054610100900460ff16610d9b5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610892565b600054610100900460ff166121f65760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610892565b610d9b33612070565b6060808415801561220e575083155b15612229575050604080516000815260208101909152612640565b83156122be576040805160208082526104208201909252908082016104008036833701905050905060005b602060ff821610156122b65761226a8482612daf565b60ff1660011461227b5760ff61227d565b805b828260ff1681518110612292576122926138c5565b60ff90921660209283029190910190910152806122ae8161399b565b915050612254565b509050612640565b6122c960208761390a565b67ffffffffffffffff8111156122e1576122e1613587565b60405190808252806020026020018201604052801561230a578160200160208202803683370190505b5090506000805b8781101561237d5760005b602060ff8216101561236a57808484612334816138f1565b955081518110612346576123466138c5565b60ff90921660209283029190910190910152806123628161399b565b91505061231c565b5080612375816138f1565b915050612311565b5060005b8a518110156124fe5760008b828151811061239e5761239e6138c5565b602002602001015160ff16905060008b82815181106123bf576123bf6138c5565b6020026020010151905060005b602060ff821610156124bb576123e28282612daf565b60ff16156124a95760001960005b8751811015612439578260ff1688828151811061240f5761240f6138c5565b602002602001015160ff160361242757809150612439565b80612431816138f1565b9150506123f0565b50801961247e57600160ff83161b19831692508c848151811061245e5761245e6138c5565b6020026020010180518091906124739061399b565b60ff169052506124a7565b60ff878281518110612492576124926138c5565b602002602001019060ff16908160ff16815250505b505b806124b38161399b565b9150506123cc565b50808c83815181106124cf576124cf6138c5565b602002602001019063ffffffff16908163ffffffff1681525050505080806124f6906138f1565b915050612381565b506000805b83518110156125525760ff8016848281518110612522576125226138c5565b602002602001015160ff1603612540578161253c816138f1565b9250505b8061254a816138f1565b915050612503565b5060008184516125629190613972565b67ffffffffffffffff81111561257a5761257a613587565b6040519080825280602002602001820160405280156125a3578160200160208202803683370190505b5090506000805b85518110156126375760ff80168682815181106125c9576125c96138c5565b602002602001015160ff1614612625578581815181106125eb576125eb6138c5565b6020026020010151838381518110612605576126056138c5565b60ff9092166020928302919091019091015281612621816138f1565b9250505b8061262f816138f1565b9150506125aa565b50909450505050505b979650505050505050565b6060600061265a8460016139ba565b60ff1667ffffffffffffffff81111561267557612675613587565b60405190808252806020026020018201604052801561269e578160200160208202803683370190505b50905060005b85518110156127715760008682815181106126c1576126c16138c5565b602002602001015190506000858260ff16815181106126e2576126e26138c5565b602002602001015190506000805b602060ff82161015612730576127068382612daf565b60ff1660010361271e578161271a8161399b565b9250505b806127288161399b565b9150506126f0565b5080858460ff1681518110612747576127476138c5565b602002602001019060ff16908160ff16815250505050508080612769906138f1565b9150506126a4565b50949350505050565b6000865160000361278d57506000612996565b6127978686612dc5565b6000805b88518110156129925760008982815181106127b8576127b86138c5565b6020026020010151905060ff80168160ff16036127d55750612980565b60005b89518160ff16101561297d5760008a8260ff16815181106127fb576127fb6138c5565b6020026020010151905060008760ff1611801561283a57508660ff168a8260ff168151811061282c5761282c6138c5565b602002602001015160ff1610155b15612845575061296b565b6000898260ff168151811061285c5761285c6138c5565b6020026020010151905060006128728286612daf565b90508060ff166000036129675760ff8e8781518110612893576128936138c5565b60ff928316602091820292909201015260019086161b82178b8460ff16815181106128c0576128c06138c5565b602002602001019063ffffffff16908163ffffffff16815250508b8360ff16815181106128ef576128ef6138c5565b6020026020010180518091906129049061399b565b60ff1660ff1681525050898360ff1681518110612923576129236138c5565b6020026020010180518091906129389061399b565b60ff1660ff16815250506129528d8d8660ff166001612dec565b8661295c816138f1565b97505050505061297d565b5050505b806129758161399b565b9150506127d8565b50505b8061298a816138f1565b91505061279b565b5090505b9695505050505050565b600084516000036129b357506000612c72565b6129bd8585612dc5565b600080600187516129ce9190613972565b90506129d86134a4565b81831015612c6a5760008884815181106129f4576129f46138c5565b602002602001015190506000898481518110612a1257612a126138c5565b602002602001015190506000888360ff1681518110612a3357612a336138c5565b602002602001015119898360ff1681518110612a5157612a516138c5565b60200260200101518a8560ff1681518110612a6e57612a6e6138c5565b6020026020010151181690508063ffffffff16600014612c47576000612a94828661302a565b9050612ac58a8460ff1681518110612aae57612aae6138c5565b602002602001015182600160ff919091161b191690565b8a8460ff1681518110612ada57612ada6138c5565b602002602001019063ffffffff16908163ffffffff16815250508a8360ff1681518110612b0957612b096138c5565b602002602001018051809190612b1e90613a14565b60ff1660ff1681525050888360ff1681518110612b3d57612b3d6138c5565b602002602001018051809190612b529061399b565b60ff1660ff1681525050612b8a8a8560ff1681518110612b7457612b746138c5565b602002602001015182600160ff919091161b1790565b8a8560ff1681518110612b9f57612b9f6138c5565b602002602001019063ffffffff16908163ffffffff16815250508a8460ff1681518110612bce57612bce6138c5565b602002602001018051809190612be39061399b565b60ff1660ff1681525050888460ff1681518110612c0257612c026138c5565b602002602001018051809190612c179061399b565b60ff16905250612c2a8c8c896001612dec565b612c378c8c886000612dec565b6001975050505050505050612c72565b85612c51816138f1565b9650508480612c5f90613a31565b9550505050506129d8565b600093505050505b949350505050565b6001600160a01b0381163b612cf75760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610892565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b612d4183613152565b600082511180612d4e5750805b15611efe576118fc8383613192565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600163ffffffff831660ff83161c165b92915050565b8151600003612dd2575050565b610cc08282600060018651612de79190613972565b6131be565b818115612ec7575b6000612e018260016139ec565b12158015612e26575060018551612e189190613972565b612e238260016139ec565b13155b8015612eab57508385612e3a8360016139ec565b81518110612e4a57612e4a6138c5565b602002602001015160ff1681518110612e6557612e656138c5565b602002602001015160ff1684868581518110612e8357612e836138c5565b602002602001015160ff1681518110612e9e57612e9e6138c5565b602002602001015160ff16115b15612ec25780612eba81613a48565b915050612df4565b612f95565b6000612ed4600183613a79565b12158015612ef9575060018551612eeb9190613972565b612ef6600183613a79565b13155b8015612f7e57508385612f0d600184613a79565b81518110612f1d57612f1d6138c5565b602002602001015160ff1681518110612f3857612f386138c5565b602002602001015160ff1684868581518110612f5657612f566138c5565b602002602001015160ff1681518110612f7157612f716138c5565b602002602001015160ff16105b15612f955780612f8d81613a99565b915050612ec7565b828114613023576000858281518110612fb057612fb06138c5565b60200260200101519050858481518110612fcc57612fcc6138c5565b6020026020010151868381518110612fe657612fe66138c5565b602002602001019060ff16908160ff16815250508086858151811061300d5761300d6138c5565b602002602001019060ff16908160ff1681525050505b5050505050565b600080805b63ffffffff8516156130955760018086169003613075578084836130528161399b565b945060ff1660208110613067576130676138c5565b60ff90921660209290920201525b60018563ffffffff16901c9450808061308d9061399b565b91505061302f565b60408051426020808301919091527fff0000000000000000000000000000000000000000000000000000000000000060f885811b8216848601527fffffffff0000000000000000000000000000000000000000000000000000000060e08b901b16604185015286901b166045830152825180830360260181526046909201909252805191012060009061312c9060ff85169061394b565b9050848160ff1660208110613143576131436138c5565b60200201519695505050505050565b61315b81612c7a565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606131b78383604051806060016040528060278152602001613b506027913961339d565b9392505050565b81818082036131ce5750506118fc565b6000858760026131de8888613a79565b6131e89190613aae565b6131f290886139ec565b81518110613202576132026138c5565b602002602001015160ff168151811061321d5761321d6138c5565b602002602001015190505b818313613375575b8060ff1686888581518110613247576132476138c5565b602002602001015160ff1681518110613262576132626138c5565b602002602001015160ff161015613285578261327d81613a48565b935050613230565b85878381518110613298576132986138c5565b602002602001015160ff16815181106132b3576132b36138c5565b602002602001015160ff168160ff1610156132da57816132d281613a99565b925050613285565b818313613370578682815181106132f3576132f36138c5565b602002602001015187848151811061330d5761330d6138c5565b6020026020010151888581518110613327576133276138c5565b60200260200101898581518110613340576133406138c5565b60ff9384166020918202929092010152911690528261335e81613a48565b935050818061336c90613a99565b9250505b613228565b8185121561338957613389878787856131be565b8383121561152e5761152e878785876131be565b6060600080856001600160a01b0316856040516133ba9190613b00565b600060405180830381855af49150503d80600081146133f5576040519150601f19603f3d011682016040523d82523d6000602084013e6133fa565b606091505b5091509150612996868383876060831561347557825160000361346e576001600160a01b0385163b61346e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610892565b5081612c72565b612c72838381511561348a5781518083602001fd5b8060405162461bcd60e51b81526004016108929190613b1c565b6040518061040001604052806020906020820280368337509192915050565b803560ff811681146110f757600080fd5b6000602082840312156134e657600080fd5b6131b7826134c3565b6020808252825182820181905260009190848201906040850190845b818110156135305783516001600160a01b03168352928401929184019160010161350b565b50909695505050505050565b80356001600160a01b03811681146110f757600080fd5b60006020828403121561356557600080fd5b6131b78261353c565b60006020828403121561358057600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156135c6576135c6613587565b604052919050565b600067ffffffffffffffff8211156135e8576135e8613587565b5060051b60200190565b600082601f83011261360357600080fd5b81356020613618613613836135ce565b61359d565b82815260059290921b8401810191818101908684111561363757600080fd5b8286015b848110156136595761364c816134c3565b835291830191830161363b565b509695505050505050565b6000806040838503121561367757600080fd5b823567ffffffffffffffff8082111561368f57600080fd5b61369b868387016135f2565b935060208501359150808211156136b157600080fd5b506136be858286016135f2565b9150509250929050565b600080604083850312156136db57600080fd5b6136e48361353c565b915060208084013567ffffffffffffffff8082111561370257600080fd5b818601915086601f83011261371657600080fd5b81358181111561372857613728613587565b61373a601f8201601f1916850161359d565b9150808252878482850101111561375057600080fd5b80848401858401376000848284010152508093505050509250929050565b6000806040838503121561378157600080fd5b61378a8361353c565b9150602083013563ffffffff811681146137a357600080fd5b809150509250929050565b600060208083850312156137c157600080fd5b823567ffffffffffffffff8111156137d857600080fd5b8301601f810185136137e957600080fd5b80356137f7613613826135ce565b81815260059190911b8201830190838101908783111561381657600080fd5b928401925b828410156126405761382c8461353c565b8252928401929084019061381b565b6020808252825182820181905260009190848201906040850190845b8181101561353057835163ffffffff1683529284019291840191600101613857565b60008060006060848603121561388e57600080fd5b833561ffff811681146138a057600080fd5b92506138ae6020850161353c565b91506138bc604085016134c3565b90509250925092565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201613903576139036138db565b5060010190565b8082028115828204841417612dbf57612dbf6138db565b634e487b7160e01b600052601260045260246000fd5b60008261394657613946613921565b500490565b60008261395a5761395a613921565b500690565b80820180821115612dbf57612dbf6138db565b81810381811115612dbf57612dbf6138db565b634e487b7160e01b600052603160045260246000fd5b600060ff821660ff81036139b1576139b16138db565b60010192915050565b60ff8181168382160190811115612dbf57612dbf6138db565b6000602082840312156139e557600080fd5b5051919050565b8082018281126000831280158216821582161715613a0c57613a0c6138db565b505092915050565b600060ff821680613a2757613a276138db565b6000190192915050565b600081613a4057613a406138db565b506000190190565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613903576139036138db565b8181036000831280158383131683831282161715610826576108266138db565b6000600160ff1b8203613a4057613a406138db565b600082613abd57613abd613921565b600160ff1b821460001984141615613ad757613ad76138db565b500590565b60005b83811015613af7578181015183820152602001613adf565b50506000910152565b60008251613b12818460208701613adc565b9190910192915050565b6020815260008251806020840152613b3b816040850160208701613adc565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212208b49979b2f722eba21fe73a725f59b75c53ae7952a13f2732dd8e0c979721d1c64736f6c63430008110033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/docker/v3/ValidatorV1.json b/docker/v3/ValidatorV1.json new file mode 100644 index 0000000..dbecf31 --- /dev/null +++ b/docker/v3/ValidatorV1.json @@ -0,0 +1,1161 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ValidatorV1", + "sourceName": "contracts/Validator.sol", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint16", + "name": "valPerBlock", + "type": "uint16" + }, + { + "indexed": false, + "internalType": "uint16", + "name": "valPerBlockTarget", + "type": "uint16" + } + ], + "name": "BlockParamsUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "ownerWallet", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "nodeWallet", + "type": "address" + }, + { + "indexed": false, + "internalType": "enum ValidatorV1.NodeType", + "name": "nodeType", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "nodeTokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "nodeApiBaseUrl", + "type": "string" + } + ], + "name": "NodeAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "nodeWallet", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "reporterWallet", + "type": "address" + }, + { + "indexed": false, + "internalType": "address[]", + "name": "voters", + "type": "address[]" + }, + { + "indexed": false, + "internalType": "enum ValidatorV1.VoteAction", + "name": "voteAction", + "type": "uint8" + } + ], + "name": "NodeReported", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "nodeWallet", + "type": "address" + }, + { + "indexed": false, + "internalType": "enum ValidatorV1.NodeStatus", + "name": "nodeStatus", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "nodeTokens", + "type": "uint256" + } + ], + "name": "NodeStatusChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint16", + "name": "nodeRandomMinCount", + "type": "uint16" + }, + { + "indexed": false, + "internalType": "uint16", + "name": "nodeRandomPingCount", + "type": "uint16" + } + ], + "name": "RandomParamsUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "inputs": [], + "name": "BAN_PERCENT", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "REPORTS_BEFORE_SLASH_S", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "REPORTS_BEFORE_SLASH_V", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "REPORT_THRESHOLD_PER_BLOCK", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SLASHES_BEFORE_BAN_S", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SLASHES_BEFORE_BAN_V", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SLASH_PERCENT", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "VERSION", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "dnodes", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getActiveVNodes", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "nodeWallet", + "type": "address" + }, + { + "internalType": "string", + "name": "nodeApiBaseUrl", + "type": "string" + } + ], + "internalType": "struct ValidatorV1.ActiveValidator[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDNodes", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDNodesLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_nodeWallet", + "type": "address" + } + ], + "name": "getNodeInfo", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "ownerWallet", + "type": "address" + }, + { + "internalType": "address", + "name": "nodeWallet", + "type": "address" + }, + { + "internalType": "enum ValidatorV1.NodeType", + "name": "nodeType", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "nodeTokens", + "type": "uint256" + }, + { + "internalType": "string", + "name": "nodeApiBaseUrl", + "type": "string" + }, + { + "components": [ + { + "internalType": "uint16", + "name": "reportCounter", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "slashCounter", + "type": "uint16" + }, + { + "internalType": "uint128[]", + "name": "reportedInBlocks", + "type": "uint128[]" + }, + { + "internalType": "address[]", + "name": "reportedBy", + "type": "address[]" + }, + { + "internalType": "uint128[]", + "name": "reportedKeys", + "type": "uint128[]" + } + ], + "internalType": "struct ValidatorV1.NodeCounters", + "name": "counters", + "type": "tuple" + }, + { + "internalType": "enum ValidatorV1.NodeStatus", + "name": "status", + "type": "uint8" + } + ], + "internalType": "struct ValidatorV1.NodeInfo", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getSNodes", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getSNodesLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVNodes", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVNodesLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint16", + "name": "protocolVersion_", + "type": "uint16" + }, + { + "internalType": "address", + "name": "pushToken_", + "type": "address" + }, + { + "internalType": "uint16", + "name": "valPerBlockTarget_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "nodeRandomMinCount_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "nodeRandomPingCount_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "REPORTS_BEFORE_SLASH_V_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "REPORTS_BEFORE_SLASH_S_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "SLASHES_BEFORE_BAN_V_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "SLASHES_BEFORE_BAN_S_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "SLASH_PERCENT_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "BAN_PERCENT_", + "type": "uint16" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "minStakeD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minStakeS", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minStakeV", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "nodeMap", + "outputs": [ + { + "internalType": "address", + "name": "ownerWallet", + "type": "address" + }, + { + "internalType": "address", + "name": "nodeWallet", + "type": "address" + }, + { + "internalType": "enum ValidatorV1.NodeType", + "name": "nodeType", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "nodeTokens", + "type": "uint256" + }, + { + "internalType": "string", + "name": "nodeApiBaseUrl", + "type": "string" + }, + { + "components": [ + { + "internalType": "uint16", + "name": "reportCounter", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "slashCounter", + "type": "uint16" + }, + { + "internalType": "uint128[]", + "name": "reportedInBlocks", + "type": "uint128[]" + }, + { + "internalType": "address[]", + "name": "reportedBy", + "type": "address[]" + }, + { + "internalType": "uint128[]", + "name": "reportedKeys", + "type": "uint128[]" + } + ], + "internalType": "struct ValidatorV1.NodeCounters", + "name": "counters", + "type": "tuple" + }, + { + "internalType": "enum ValidatorV1.NodeStatus", + "name": "status", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nodeRandomMinCount", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nodeRandomPingCount", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "protocolVersion", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from_", + "type": "address" + }, + { + "internalType": "address", + "name": "to_", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount_", + "type": "uint256" + } + ], + "name": "redistributeStaked", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nodeTokens_", + "type": "uint256" + }, + { + "internalType": "enum ValidatorV1.NodeType", + "name": "nodeType_", + "type": "uint8" + }, + { + "internalType": "string", + "name": "nodeApiBaseUrl_", + "type": "string" + }, + { + "internalType": "address", + "name": "nodeWallet_", + "type": "address" + } + ], + "name": "registerNodeAndStake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum ValidatorV1.NodeType", + "name": "targetNodeType_", + "type": "uint8" + }, + { + "internalType": "bytes", + "name": "voteBlob_", + "type": "bytes" + }, + { + "internalType": "bytes[]", + "name": "signatures_", + "type": "bytes[]" + } + ], + "name": "reportNode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "addr_", + "type": "address" + } + ], + "name": "setStorageContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "snodes", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "storageContract", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalFees", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalStaked", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to_", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount_", + "type": "uint256" + } + ], + "name": "unstakeFees", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeWallet_", + "type": "address" + } + ], + "name": "unstakeNode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint16", + "name": "valPerBlockTarget_", + "type": "uint16" + } + ], + "name": "updateBlockParams", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint16", + "name": "nodeRandomMinCount_", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "nodeRandomPingCount_", + "type": "uint16" + } + ], + "name": "updateRandomParams", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "valPerBlock", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "valPerBlockTarget", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "vnodes", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "vnodesActive", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60a06040523060805234801561001457600080fd5b50608051615c436200004d60003960008181610db901528181610e3e015281816111a80152818161122d01526113170152615c436000f3fe60806040526004361061031e5760003560e01c80637f6e29de116101a5578063bdb860ea116100ec578063e67a5d7811610095578063f6e8913d1161006f578063f6e8913d146108b2578063f7714eb9146108d7578063fdd9344c146108fe578063ffa1ad741461092057600080fd5b8063e67a5d781461085c578063f108f5b61461087c578063f2fde38b1461089257600080fd5b8063dc38b0a2116100c6578063dc38b0a214610808578063dd6f8f9014610828578063e30c39781461083e57600080fd5b8063bdb860ea146107b2578063c993d861146107c8578063ce3e7e91146107e857600080fd5b8063931127a01161014e578063adf1daa611610128578063adf1daa614610750578063b10064eb14610772578063b27b154d1461079257600080fd5b8063931127a0146106fa578063974c5b411461071b5780639c30db5c1461073057600080fd5b806384f21a441161017f57806384f21a441461069a5780638b8f631f146106bc5780638da5cb5b146106dc57600080fd5b80637f6e29de14610658578063817b1cd21461066e57806381ebc5061461068557600080fd5b80633659cfe61161026957806365cdbaea11610212578063715018a6116101ec578063715018a61461061357806379ba5097146106285780637c4981c81461063d57600080fd5b806365cdbaea146105ae5780636dcd3af2146105d75780636ddf344a146105f757600080fd5b806352d1902d1161024357806352d1902d1461054c578063569c876214610561578063582115fb1461058157600080fd5b80633659cfe6146104e65780633a688a2f146105065780634f1ef2861461053957600080fd5b80631acf7629116102cb57806324212b86116102a557806324212b86146104855780632ae9c6001461049b578063339f334b146104b657600080fd5b80631acf76291461041657806323b8ac5d1461043857806323deecfe1461046357600080fd5b8063125c6c98116102fc578063125c6c98146103b957806313114a9d146103dd57806315aa7b06146103f457600080fd5b8063011f59a014610323578063024f38cb1461035d57806311ce026714610380575b600080fd5b34801561032f57600080fd5b5060ff5461034590600160701b900461ffff1681565b60405161ffff90911681526020015b60405180910390f35b34801561036957600080fd5b5060ff5461034590640100000000900461ffff1681565b34801561038c57600080fd5b50610101546103a1906001600160a01b031681565b6040516001600160a01b039091168152602001610354565b3480156103c557600080fd5b506103cf60fc5481565b604051908152602001610354565b3480156103e957600080fd5b506103cf6101085481565b34801561040057600080fd5b50610409610976565b6040516103549190614fd2565b34801561042257600080fd5b50610436610431366004614ffa565b6109d9565b005b34801561044457600080fd5b5060ff54610345906c01000000000000000000000000900461ffff1681565b34801561046f57600080fd5b5060ff5461034590600160801b900461ffff1681565b34801561049157600080fd5b506103cf60fe5481565b3480156104a757600080fd5b5060fb546103459061ffff1681565b3480156104c257600080fd5b506104d66104d1366004615017565b610b34565b6040519015158152602001610354565b3480156104f257600080fd5b50610436610501366004614ffa565b610daf565b34801561051257600080fd5b50610526610521366004614ffa565b610f2a565b60405161035497969594939291906151a7565b6104366105473660046152d3565b61119e565b34801561055857600080fd5b506103cf61130a565b34801561056d57600080fd5b506103a161057c366004615323565b6113cf565b34801561058d57600080fd5b506105a161059c366004614ffa565b6113fa565b604051610354919061533c565b3480156105ba57600080fd5b5060ff54610345906a0100000000000000000000900461ffff1681565b3480156105e357600080fd5b506104366105f23660046153ea565b6116eb565b34801561060357600080fd5b50610103546103459061ffff1681565b34801561061f57600080fd5b50610436611b1f565b34801561063457600080fd5b50610436611b33565b34801561064957600080fd5b5060ff546103459061ffff1681565b34801561066457600080fd5b50610105546103cf565b34801561067a57600080fd5b506103cf6101075481565b34801561069157600080fd5b50610409611bbe565b3480156106a657600080fd5b506106af611c1f565b60405161035491906154b8565b3480156106c857600080fd5b506103a16106d7366004615323565b611e6e565b3480156106e857600080fd5b506033546001600160a01b03166103a1565b34801561070657600080fd5b5060ff546103459062010000900461ffff1681565b34801561072757600080fd5b50610409611e7f565b34801561073c57600080fd5b5061043661074b366004615544565b611ee0565b34801561075c57600080fd5b5060ff5461034590600160901b900461ffff1681565b34801561077e57600080fd5b5061043661078d3660046155c2565b612775565b34801561079e57600080fd5b506104366107ad3660046156bc565b612daa565b3480156107be57600080fd5b50610104546103cf565b3480156107d457600080fd5b506103a16107e3366004615323565b612e7c565b3480156107f457600080fd5b506104d66108033660046156d7565b612e8d565b34801561081457600080fd5b50610436610823366004614ffa565b61336a565b34801561083457600080fd5b506103cf60fd5481565b34801561084a57600080fd5b506065546001600160a01b03166103a1565b34801561086857600080fd5b50610436610877366004615718565b613395565b34801561088857600080fd5b50610102546103cf565b34801561089e57600080fd5b506104366108ad366004614ffa565b61346a565b3480156108be57600080fd5b5060ff54610345906601000000000000900461ffff1681565b3480156108e357600080fd5b5060ff546103459068010000000000000000900461ffff1681565b34801561090a57600080fd5b5060ff5461034590600160a01b900461ffff1681565b34801561092c57600080fd5b506109696040518060400160405280600581526020017f302e302e3200000000000000000000000000000000000000000000000000000081525081565b604051610354919061574b565b60606101058054806020026020016040519081016040528092919081815260200182805480156109cf57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109b1575b5050505050905090565b6001600160a01b038082166000908152610106602052604090206001810154909116610a4c5760405162461bcd60e51b815260206004820152601460248201527f6e6f646520646f6573206e6f742065786973747300000000000000000000000060448201526064015b60405180910390fd5b80546001600160a01b0316331480610a7d575033610a726033546001600160a01b031690565b6001600160a01b0316145b610ac95760405162461bcd60e51b815260206004820152601d60248201527f6f6e6c79206f776e65722063616e20756e7374616b652061206e6f64650000006044820152606401610a43565b610ad2816134db565b5060088101805460ff1916600490811790915560018201546040516001600160a01b03909116917ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e91610b28919060009061575e565b60405180910390a25050565b6000610b3e6137c6565b6001600160a01b038316610b945760405162461bcd60e51b815260206004820152601260248201527f696e76616c696420746f206164647265737300000000000000000000000000006044820152606401610a43565b60008211610be45760405162461bcd60e51b815260206004820152600e60248201527f696e76616c696420616d6f756e740000000000000000000000000000000000006044820152606401610a43565b610108548211158015610c7c5750610100546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610c54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c789190615779565b8211155b610cc85760405162461bcd60e51b815260206004820152601460248201527f696e73756666696369656e742062616c616e63650000000000000000000000006044820152606401610a43565b6101005460405163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529091169063a9059cbb906044016020604051808303816000875af1158015610d1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d409190615792565b610d8c5760405162461bcd60e51b815260206004820152601260248201527f6661696c656420746f207472616e7366657200000000000000000000000000006044820152606401610a43565b816101086000828254610d9f91906157ca565b9091555060019150505b92915050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610e3c5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610a43565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610e977f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610f025760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610a43565b610f0b81613820565b60408051600080825260208201909252610f2791839190613828565b50565b6101066020526000908152604090208054600182015460028301546003840180546001600160a01b039485169594841694600160a01b90940460ff16939190610f72906157dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9e906157dd565b8015610feb5780601f10610fc057610100808354040283529160200191610feb565b820191906000526020600020905b815481529060010190602001808311610fce57829003601f168201915b50506040805160a08101825260048701805461ffff808216845262010000909104166020808401919091526005890180548551818402810184018752818152999a99949850929650938701945091929183018282801561109c57602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116110595790505b50505050508152602001600282018054806020026020016040519081016040528092919081815260200182805480156110fe57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116110e0575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561118857602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116111455790505b5050509190925250505060089091015460ff1687565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361122b5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610a43565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166112867f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b0316146112f15760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610a43565b6112fa82613820565b61130682826001613828565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113aa5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610a43565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b61010581815481106113e057600080fd5b6000918252602090912001546001600160a01b0316905081565b611402614db9565b6001600160a01b0382811660009081526101066020908152604091829020825160e08101845281548516815260018201549485169281019290925290929091830190600160a01b900460ff16600281111561145f5761145f615043565b600281111561147057611470615043565b81526020016002820154815260200160038201805461148e906157dd565b80601f01602080910402602001604051908101604052809291908181526020018280546114ba906157dd565b80156115075780601f106114dc57610100808354040283529160200191611507565b820191906000526020600020905b8154815290600101906020018083116114ea57829003601f168201915b50505091835250506040805160a08101825260048401805461ffff808216845262010000909104166020838101919091526005860180548551818402810184018752818152968301969495939493860193928301828280156115ba57602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116115775790505b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561161c57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116115fe575b50505050508152602001600382018054806020026020016040519081016040528092919081815260200182805480156116a657602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116116635790505b505050919092525050508152600882015460209091019060ff1660048111156116d1576116d1615043565b60048111156116e2576116e2615043565b90525092915050565b600054610100900460ff161580801561170b5750600054600160ff909116105b806117255750303b158015611725575060005460ff166001145b6117975760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a43565b6000805460ff1916600117905580156117ba576000805461ff0019166101001790555b6117c26139cd565b6117ca613a38565b60fb805461ffff191661ffff8e161790556001600160a01b038b166117ee57600080fd5b61010080546001600160a01b0319166001600160a01b038d1617905561ffff8a1661185b5760405162461bcd60e51b815260206004820152601860248201527f696e76616c69642061747465737465727320616d6f756e7400000000000000006044820152606401610a43565b60ff805461ffff808d16600160801b0271ffff00000000000000000000000000000000199092169190911790915589166118fd5760405162461bcd60e51b815260206004820152602160248201527f696e76616c6964206e6f646552616e646f6d4d696e436f756e7420616d6f756e60448201527f74000000000000000000000000000000000000000000000000000000000000006064820152608401610a43565b60ff805461ffff808c16600160901b027fffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffff9092169190911790915588166119ac5760405162461bcd60e51b815260206004820152602c60248201527f696e76616c6964206e6f646552616e646f6d46696c74657250696e677352657160448201527f756972656420616d6f756e7400000000000000000000000000000000000000006064820152608401610a43565b8760ff60146101000a81548161ffff021916908361ffff160217905550606460fc81905550606460fd81905550606460fe819055508660ff60026101000a81548161ffff021916908361ffff1602179055508560ff60046101000a81548161ffff021916908361ffff1602179055508260ff60066101000a81548161ffff021916908361ffff1602179055508460ff60086101000a81548161ffff021916908361ffff1602179055508360ff600a6101000a81548161ffff021916908361ffff1602179055508160ff600c6101000a81548161ffff021916908361ffff160217905550604260ff60006101000a81548161ffff021916908361ffff160217905550600060ff600e6101000a81548161ffff021916908361ffff1602179055508015611b11576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050505050565b611b276137c6565b611b316000613aa8565b565b60655433906001600160a01b03168114611bb55760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610a43565b610f2781613aa8565b60606101048054806020026020016040519081016040528092919081815260200182805480156109cf576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109b1575050505050905090565b60606000805b61010254811015611ca85760006101028281548110611c4657611c46615817565b60009182526020808320909101546001600160a01b03168083526101069091526040909120600881015491925090611c809060ff16613ac1565b15611c935783611c8f8161582d565b9450505b50508080611ca09061582d565b915050611c25565b5060008167ffffffffffffffff811115611cc457611cc4615214565b604051908082528060200260200182016040528015611d0a57816020015b604080518082019091526000815260606020820152815260200190600190039081611ce25790505b5090506000805b61010254811015611e655760006101028281548110611d3257611d32615817565b60009182526020808320909101546001600160a01b03168083526101069091526040909120600881015491925090611d6c9060ff16613ac1565b611d77575050611e53565b6040805180820190915260018201546001600160a01b03168152600382018054602083019190611da6906157dd565b80601f0160208091040260200160405190810160405280929190818152602001828054611dd2906157dd565b8015611e1f5780601f10611df457610100808354040283529160200191611e1f565b820191906000526020600020905b815481529060010190602001808311611e0257829003601f168201915b5050505050815250858580611e339061582d565b965081518110611e4557611e45615817565b602002602001018190525050505b80611e5d8161582d565b915050611d11565b50909392505050565b61010481815481106113e057600080fd5b60606101028054806020026020016040519081016040528092919081815260200182805480156109cf576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109b1575050505050905090565b6000836002811115611ef457611ef4615043565b03611fa65760fc54841015611f555760405162461bcd60e51b815260206004820152602160248201527f496e73756666696369656e7420636f6c6c61746572616c20666f7220564e4f446044820152604560f81b6064820152608401610a43565b61010280546001810182556000919091527f93bdaa6a4190909b7c3fbe8d42169ffe1cab19f51dfc8db24c71abf849eced4a0180546001600160a01b0319166001600160a01b03831617905561217a565b6001836002811115611fba57611fba615043565b0361206c5760fd5484101561201b5760405162461bcd60e51b815260206004820152602160248201527f496e73756666696369656e7420636f6c6c61746572616c20666f7220534e4f446044820152604560f81b6064820152608401610a43565b61010480546001810182556000919091527f4c0be60200faa20559308cb7b5a1bb3255c16cb1cab91f525b5ae7a03d02fabe0180546001600160a01b0319166001600160a01b03831617905561217a565b600283600281111561208057612080615043565b036121325760fe548410156120e15760405162461bcd60e51b815260206004820152602160248201527f496e73756666696369656e7420636f6c6c61746572616c20666f7220444e4f446044820152604560f81b6064820152608401610a43565b61010580546001810182556000919091527ffc62abc8c0fc47c2d92f5aec99bf8b60f375828e14394d89345cae11a98673710180546001600160a01b0319166001600160a01b03831617905561217a565b60405162461bcd60e51b815260206004820152601560248201527f756e737570706f72746564206e6f6465547970652000000000000000000000006044820152606401610a43565b6001600160a01b0380821660009081526101066020526040902080549091161561220c5760405162461bcd60e51b815260206004820152602560248201527f61206e6f64652077697468207075624b657920697320616c726561647920646560448201527f66696e65640000000000000000000000000000000000000000000000000000006064820152608401610a43565b841561231957610100546040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523360048201523060248201526000916001600160a01b03169063dd62ed3e90604401602060405180830381865afa15801561227b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061229f9190615779565b9050858110156123175760405162461bcd60e51b815260206004820152603260248201527f5f6e6f6465546f6b656e732063616e6e6f74206265207472616e73666572726560448201527f642c20636865636b20616c6c6f77616e636500000000000000000000000000006064820152608401610a43565b505b612321614db9565b3381526001600160a01b03831660208201526040810185600281111561234957612349615043565b9081600281111561235c5761235c615043565b90525060608101869052608081018490526001600160a01b0380841660009081526101066020908152604091829020845181549085166001600160a01b0319918216178255918501516001820180549190951692811683178555928501518594919390927fffffffffffffffffffffff00000000000000000000000000000000000000000090911617600160a01b8360028111156123fc576123fc615043565b0217905550606082015160028201556080820151600382019061241f908261588c565b5060a0820151805160048301805460208085015161ffff908116620100000263ffffffff1990931694169390931717815560408301518051919261246b92600587019290910190614e2d565b5060608201518051612487916002840191602090910190614ee5565b50608082015180516124a3916003840191602090910190614e2d565b50505060c082015160088201805460ff191660018360048111156124c9576124c9615043565b021790555050861590506125de57610100546040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018890526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015612548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256c9190615792565b6125de5760405162461bcd60e51b815260206004820152602560248201527f6661696c656420746f207472616e7366657220746f6b656e7320746f20636f6e60448201527f74726163740000000000000000000000000000000000000000000000000000006064820152608401610a43565b8561010760008282546125f1919061594c565b909155506000905085600281111561260b5761260b615043565b0361261d57612618613afb565b61271e565b600185600281111561263157612631615043565b0361271e57610101546001600160a01b031661268f5760405162461bcd60e51b815260206004820152601b60248201527f6e6f2073746f7261676520636f6e747261637420646566696e656400000000006044820152606401610a43565b610101546040517f9d95f1cc0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152909116908190639d95f1cc906024016020604051808303816000875af11580156126f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271b9190615970565b50505b826001600160a01b0316336001600160a01b03167f67bd55f864dcc77d483ff7567de0889142417ef6d0299753cfd80e4c72ddc5548789886040516127659392919061598b565b60405180910390a3505050505050565b3360009081526101066020526040902060018101546001600160a01b03166127df5760405162461bcd60e51b815260206004820152601060248201527f696e76616c6964207265706f72746572000000000000000000000000000000006044820152606401610a43565b600080835167ffffffffffffffff8111156127fc576127fc615214565b604051908082528060200260200182016040528015612825578160200160208202803683370190505b50905060005b84518110156129b457600073__$7aaf162b34d2533b02434bde51cad0c5c5$__6336de68108888858151811061286357612863615817565b60200260200101516040518363ffffffff1660e01b81526004016128889291906159b3565b602060405180830381865af41580156128a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c991906159d8565b6001600160a01b03808216600090815261010660205260409020600181015492935091166128f85750506129a2565b6000805b8681101561295157836001600160a01b031686828151811061292057612920615817565b60200260200101516001600160a01b03160361293f5760019150612951565b806129498161582d565b9150506128fc565b508015612960575050506129a2565b82858761296c8161582d565b98508151811061297e5761297e615817565b60200260200101906001600160a01b031690816001600160a01b0316815250505050505b806129ac8161582d565b91505061282b565b508351821015612a6a5760008267ffffffffffffffff8111156129d9576129d9615214565b604051908082528060200260200182016040528015612a02578160200160208202803683370190505b50905060005b83811015612a6657828181518110612a2257612a22615817565b6020026020010151828281518110612a3c57612a3c615817565b6001600160a01b039092166020928302919091019091015280612a5e8161582d565b915050612a08565b5090505b6000866002811115612a7e57612a7e615043565b03612c0957600080600087806020019051810190612a9c9190615a0c565b9194509250905060ff8316600114612af65760405162461bcd60e51b815260206004820152601c60248201527f7265706f727420616374696f6e206f6e6c7920737570706f72746564000000006044820152606401610a43565b6001600160a01b038082166000908152610106602052604090206001810154909116612b6f5760405162461bcd60e51b815260206004820152602260248201527f746172676574206e6f64652077616c6c657420646f6573206e6f742065786973604482015261747360f01b6064820152608401610a43565b60006001820154600160a01b900460ff166002811115612b9157612b91615043565b14612bde5760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220564e6f646573000000000000000000006044820152606401610a43565b612bff8460ff166002811115612bf657612bf6615043565b88878487613c61565b5050505050612da2565b6001866002811115612c1d57612c1d615043565b03612da25760008060008088806020019051810190612c3c9190615a53565b9296509094509250905060ff8416600214612c995760405162461bcd60e51b815260206004820152601c60248201527f7265706f727420616374696f6e206f6e6c7920737570706f72746564000000006044820152606401610a43565b6001600160a01b038083166000908152610106602052604090206001810154909116612d125760405162461bcd60e51b815260206004820152602260248201527f746172676574206e6f64652077616c6c657420646f6573206e6f742065786973604482015261747360f01b6064820152608401610a43565b600180820154600160a01b900460ff166002811115612d3357612d33615043565b14612d805760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220534e6f646573000000000000000000006044820152606401610a43565b611b118560ff166002811115612d9857612d98615043565b8988848887613e09565b505050505050565b612db26137c6565b6101025461ffff82161115612e095760405162461bcd60e51b815260206004820152601c60248201527f696e636f72726563742076616c506572426c6f636b5461726765745f000000006044820152606401610a43565b60ff805471ffff000000000000000000000000000000001916600160801b61ffff848116918202929092179283905560408051600160701b909404909216835260208301527f81512b84dc2b38f82b4999b5512a14df033b165371fa51776cce559212bf0a44910160405180910390a150565b61010281815481106113e057600080fd5b6000612e976137c6565b60008211612ee75760405162461bcd60e51b815260206004820152601960248201527f616d6f756e742073686f756c6420626520706f736974697665000000000000006044820152606401610a43565b826001600160a01b0316846001600160a01b031603612f6e5760405162461bcd60e51b815260206004820152602660248201527f63616e6e6f74207472616e73666572206265747765656e2073616d652061646460448201527f72657373657300000000000000000000000000000000000000000000000000006064820152608401610a43565b6001600160a01b03831615801590612f8d57506001600160a01b038416155b156130b45781610108541015612ff55760405162461bcd60e51b815260206004820152602760248201527f66726f6d206e6f64652073686f756c64206861766520656e6f75676820636f6c6044820152661b185d195c985b60ca1b6064820152608401610a43565b6001600160a01b0380841660009081526101066020526040902080549091166130605760405162461bcd60e51b815260206004820152600f60248201527f6d697373696e6720746f206e6f646500000000000000000000000000000000006044820152606401610a43565b82610108600082825461307391906157ca565b9250508190555082610107600082825461308d919061594c565b92505081905550828160020160008282546130a8919061594c565b90915550613360915050565b6001600160a01b038416158015906130d357506001600160a01b038316155b156131ef576001600160a01b0380851660009081526101066020526040902080549091166131435760405162461bcd60e51b815260206004820152601160248201527f6d697373696e672066726f6d206e6f64650000000000000000000000000000006044820152606401610a43565b82816002015410156131a75760405162461bcd60e51b815260206004820152602760248201527f66726f6d206e6f64652073686f756c64206861766520656e6f75676820636f6c6044820152661b185d195c985b60ca1b6064820152608401610a43565b828160020160008282546131bb91906157ca565b925050819055508261010760008282546131d591906157ca565b925050819055508261010860008282546130a8919061594c565b6001600160a01b03808516600090815261010660205260409020805490911661325a5760405162461bcd60e51b815260206004820152601160248201527f6d697373696e672066726f6d206e6f64650000000000000000000000000000006044820152606401610a43565b82816002015410156132be5760405162461bcd60e51b815260206004820152602760248201527f66726f6d206e6f64652073686f756c64206861766520656e6f75676820636f6c6044820152661b185d195c985b60ca1b6064820152608401610a43565b6001600160a01b0380851660009081526101066020526040902082549091166133295760405162461bcd60e51b815260206004820152600f60248201527f6d697373696e6720746f206e6f646500000000000000000000000000000000006044820152606401610a43565b8382600201600082825461333d91906157ca565b9250508190555083816002016000828254613358919061594c565b909155505050505b5060019392505050565b6133726137c6565b61010180546001600160a01b0319166001600160a01b0392909216919091179055565b61339d6137c6565b6101025461ffff8316106133b057600080fd5b6101025461ffff8216106133c357600080fd5b60ff80547fffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffff16600160901b61ffff8581169182027fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1692909217600160a01b928516928302179092556040805192835260208301919091527fcd481667fa77e513c517493174075f0471ec1fe24d57af644377cd1a2572d13d910160405180910390a15050565b6134726137c6565b606580546001600160a01b0383166001600160a01b031990911681179091556134a36033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600281015461010054825460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810184905260009392919091169063a9059cbb906044016020604051808303816000875af115801561353b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061355f9190615792565b6135d15760405162461bcd60e51b815260206004820152602560248201527f6661696c656420746f20747261736665722066756e6473206261636b20746f2060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610a43565b600083600201819055508061010760008282546135ee91906157ca565b92505081905550806101086000828254613608919061594c565b90915550600090506001840154600160a01b900460ff16600281111561363057613630615043565b0361367a57613643600584016000614f3a565b613651600684016000614f5f565b600183015461366c90610102906001600160a01b0316613fb5565b50613675613afb565b610da9565b600180840154600160a01b900460ff16600281111561369b5761369b615043565b03610da957610101546001600160a01b03166136f95760405162461bcd60e51b815260206004820152601b60248201527f6e6f2073746f7261676520636f6e747261637420646566696e656400000000006044820152606401610a43565b6101015460018401546040517fb2b99ec90000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690819063b2b99ec990602401600060405180830381600087803b15801561376057600080fd5b505af1158015613774573d6000803e3d6000fd5b5061378792505050600585016000614f3a565b613795600685016000614f5f565b6137a3600785016000614f3a565b60018401546137be90610104906001600160a01b0316613fb5565b505092915050565b6033546001600160a01b03163314611b315760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a43565b610f276137c6565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156138605761385b836140e1565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156138ba575060408051601f3d908101601f191682019092526138b791810190615779565b60015b61392c5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610a43565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146139c15760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610a43565b5061385b83838361419f565b600054610100900460ff16611b315760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610a43565b600054610100900460ff16613aa35760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610a43565b611b31335b606580546001600160a01b0319169055610f27816141ca565b60006004826004811115613ad757613ad7615043565b1480613af457506003826004811115613af257613af2615043565b145b1592915050565b6000805b61010254811015613b825760006101028281548110613b2057613b20615817565b60009182526020808320909101546001600160a01b03168083526101069091526040909120600881015491925090613b5a9060ff16613ac1565b15613b6d5783613b6981615aa9565b9450505b50508080613b7a9061582d565b915050613aff565b50610103805461ffff191661ffff83811691821790925560ff548392600160801b9091041690811015613bb3578091505b60ff5461ffff808316600160701b909204161115613bd057600080fd5b60ff5461ffff838116600160701b909204161461385b5760ff80547fffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffff16600160701b61ffff858116918202929092179092556040805192835290831660208301527f81512b84dc2b38f82b4999b5512a14df033b165371fa51776cce559212bf0a44910160405180910390a1505050565b6000806001840154600160a01b900460ff166002811115613c8457613c84615043565b14613cd15760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220564e6f646573000000000000000000006044820152606401610a43565b60ff54606490613cef9061ffff80821691600160701b900416615aca565b613cf99190615afe565b61ffff1684511015613d4d5760405162461bcd60e51b815260206004820152601460248201527f73696720636f756e7420697320746f6f206c6f770000000000000000000000006044820152606401610a43565b600883015460ff166004816004811115613d6957613d69615043565b1480613d8657506003816004811115613d8457613d84615043565b145b15613d95576000915050613e00565b613da48787868887600061421c565b60ff54600485015461ffff620100009092048216911610613dc957613dc98685614892565b60ff5460048501546801000000000000000090910461ffff908116620100009092041610613dfa57613dfa84614af0565b60009150505b95945050505050565b6000600180850154600160a01b900460ff166002811115613e2c57613e2c615043565b14613e795760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220534e6f646573000000000000000000006044820152606401610a43565b60ff54606490613e979061ffff80821691600160701b900416615aca565b613ea19190615afe565b61ffff1685511015613ef55760405162461bcd60e51b815260206004820152601460248201527f73696720636f756e7420697320746f6f206c6f770000000000000000000000006044820152606401610a43565b600884015460ff166004816004811115613f1157613f11615043565b1480613f2e57506003816004811115613f2c57613f2c615043565b145b15613f3d576000915050613fab565b613f4b88888789888861421c565b60ff54600486015461ffff6401000000009092048216911610613f7257613f728786614892565b60ff5460048601546a010000000000000000000090910461ffff908116620100009092041610613fa557613fa585614af0565b60009150505b9695505050505050565b8154600090815b818110156140d657836001600160a01b0316858281548110613fe057613fe0615817565b6000918252602090912001546001600160a01b0316036140c4576140056001836157ca565b811461408657846140176001846157ca565b8154811061402757614027615817565b9060005260206000200160009054906101000a90046001600160a01b031685828154811061405757614057615817565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b8480548061409657614096615b1f565b600082815260209020810160001990810180546001600160a01b03191690550190555060019150610da99050565b806140ce8161582d565b915050613fbc565b506000949350505050565b6001600160a01b0381163b61415e5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610a43565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6141a883614b97565b6000825111806141b55750805b1561385b576141c48383614bd7565b50505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000846004016001018054806020026020016040519081016040528092919081815260200182805480156142a157602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f0104928301926001038202915080841161425e5790505b505083519394506000925050505b81811015614343578281815181106142c9576142c9615817565b60200260200101516001600160801b0316856001600160801b0316036143315760405162461bcd60e51b815260206004820152601060248201527f626c6f636b206973206e6f74206e6577000000000000000000000000000000006044820152606401610a43565b8061433b8161582d565b9150506142af565b50600180870154600160a01b900460ff16600281111561436557614365615043565b0361453057826001600160801b03166000036143c35760405162461bcd60e51b815260206004820152601760248201527f73746f72616765206b65792069732072657175697265640000000000000000006044820152606401610a43565b60008660040160030180548060200260200160405190810160405280929190818152602001828054801561444857602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116144055790505b505083519394506000925050505b818110156144ea5782818151811061447057614470615817565b60200260200101516001600160801b0316866001600160801b0316036144d85760405162461bcd60e51b815260206004820152601660248201527f73746f72616765206b6579206973206e6f74206e6577000000000000000000006044820152606401610a43565b806144e28161582d565b915050614456565b505050600786018054600180820183556000928352602090922060028204018054929091166010026101000a6001600160801b0381810219909316928616029190911790555b60048601805461ffff1690600061454683615aa9565b825461010092830a61ffff818102199092169290911602179091556005880180546001818101835560009283526020808420600284040180549390921660100290940a6001600160801b0381810219909316928a1602919091179055600689018054604080518286028101860190915281815292945091929091908301828280156145fa57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116145dc575b505083519394506000925050505b87518110156146fe5760005b828110156146eb5783818151811061462e5761462e615817565b60200260200101516001600160a01b031689838151811061465157614651615817565b60200260200101516001600160a01b031614801561469b575060006001600160a01b031689838151811061468757614687615817565b60200260200101516001600160a01b031614155b156146d95760008983815181106146b4576146b4615817565b60200260200101906001600160a01b031690816001600160a01b0316815250506146eb565b806146e38161582d565b915050614614565b50806146f68161582d565b915050614608565b5060005b87518110156147ab57600088828151811061471f5761471f615817565b6020026020010151905060006001600160a01b0316816001600160a01b031614614798578960040160020189838151811061475c5761475c615817565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790555b50806147a38161582d565b915050614702565b506000600889015460ff1660048111156147c7576147c7615043565b036147dc5760088801805460ff191660011790555b600180890154908a01546040517f19d5f3972073c7002111a82b2a44db11e739567a002445f2e3db8ab96fe6645f92614827926001600160a01b03918216929116908b908f90615b35565b60405180910390a16001880154600889015460028a01546040516001600160a01b03909316927ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e9261487e9260ff9091169161575e565b60405180910390a250505050505050505050565b60ff5460009081906148b39084906601000000000000900461ffff16614c03565b600685018054604080516020808402820181019092528281529496509294506000939283018282801561490f57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116148f1575b5050505050905060008083118015614928575060008251115b156149d25781516149399084615b7b565b905060005b82518110156149d0576000610106600085848151811061496057614960615817565b6020908102919091018101516001600160a01b0390811683529082019290925260400160002080549092501661499657506149be565b828160020160008282546149aa919061594c565b909155506149ba905083866157ca565b9450505b806149c88161582d565b91505061493e565b505b828660020160008282546149e6919061594c565b909155506149fa9050600686016000614f5f565b6000600886015460ff166004811115614a1557614a15615043565b1480614a3957506001600886015460ff166004811115614a3757614a37615043565b145b15614a4e5760088501805460ff191660021790555b60048501805461ffff191680825562010000900461ffff16906002614a7283615aa9565b91906101000a81548161ffff021916908361ffff160217905550508460010160009054906101000a90046001600160a01b03166001600160a01b03167ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e600286604051614ae092919061575e565b60405180910390a2505050505050565b60ff546000908190614b179084906c01000000000000000000000000900461ffff16614c03565b9092509050614b25836134db565b5060048301805463ffff00001916905560088301805460ff1916600390811790915560018401546040516001600160a01b03909116917ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e91614b8a919060009061575e565b60405180910390a2505050565b614ba0816140e1565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060614bfc8383604051806060016040528060278152602001615be760279139614ca5565b9392505050565b60008060648363ffffffff161115614c5d5760405162461bcd60e51b815260206004820181905260248201527f70657263656e746167652073686f756c6420626520696e205b302c203130305d6044820152606401610a43565b60028401546064614c6e8582615b8f565b614c7e9063ffffffff1683615bb3565b614c889190615b7b565b9250614c9483826157ca565b600286018490559150509250929050565b6060600080856001600160a01b031685604051614cc29190615bca565b600060405180830381855af49150503d8060008114614cfd576040519150601f19603f3d011682016040523d82523d6000602084013e614d02565b606091505b5091509150613fab8683838760608315614d7d578251600003614d76576001600160a01b0385163b614d765760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a43565b5081614d87565b614d878383614d8f565b949350505050565b815115614d9f5781518083602001fd5b8060405162461bcd60e51b8152600401610a43919061574b565b6040805160e081018252600080825260208201819052909182019081526020016000815260200160608152602001614e216040518060a00160405280600061ffff168152602001600061ffff1681526020016060815260200160608152602001606081525090565b81526020016000905290565b82805482825590600052602060002090600101600290048101928215614ed55791602002820160005b83821115614ea057835183826101000a8154816001600160801b0302191690836001600160801b031602179055509260200192601001602081600f01049283019260010302614e56565b8015614ed35782816101000a8154906001600160801b030219169055601001602081600f01049283019260010302614ea0565b505b50614ee1929150614f79565b5090565b828054828255906000526020600020908101928215614ed5579160200282015b82811115614ed557825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614f05565b508054600082556001016002900490600052602060002090810190610f279190614f79565b5080546000825590600052602060002090810190610f2791905b5b80821115614ee15760008155600101614f7a565b600081518084526020808501945080840160005b83811015614fc75781516001600160a01b031687529582019590820190600101614fa2565b509495945050505050565b602081526000614bfc6020830184614f8e565b6001600160a01b0381168114610f2757600080fd5b60006020828403121561500c57600080fd5b8135614bfc81614fe5565b6000806040838503121561502a57600080fd5b823561503581614fe5565b946020939093013593505050565b634e487b7160e01b600052602160045260246000fd5b60038110610f2757610f27615043565b60005b8381101561508457818101518382015260200161506c565b50506000910152565b600081518084526150a5816020860160208601615069565b601f01601f19169290920160200192915050565b600081518084526020808501945080840160005b83811015614fc75781516001600160801b0316875295820195908201906001016150cd565b600061ffff8083511684526020818185015116818601526040840151915060a0604086015261512460a08601836150b9565b60608581015187830391880191909152805180835290830193506000918301905b8083101561516e5784516001600160a01b03168252938301936001929092019190830190615145565b5060808601519350868103608088015261518881856150b9565b979650505050505050565b600581106151a3576151a3615043565b9052565b6001600160a01b0388811682528716602082015260006151c687615059565b86604083015285606083015260e060808301526151e660e083018661508d565b82810360a08401526151f881866150f2565b91505061520860c0830184615193565b98975050505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561525357615253615214565b604052919050565b600067ffffffffffffffff83111561527557615275615214565b615288601f8401601f191660200161522a565b905082815283838301111561529c57600080fd5b828260208301376000602084830101529392505050565b600082601f8301126152c457600080fd5b614bfc8383356020850161525b565b600080604083850312156152e657600080fd5b82356152f181614fe5565b9150602083013567ffffffffffffffff81111561530d57600080fd5b615319858286016152b3565b9150509250929050565b60006020828403121561533557600080fd5b5035919050565b6020815260006001600160a01b0380845116602084015280602085015116604084015250604083015161536e81615059565b8060608401525060608301516080830152608083015160e060a084015261539961010084018261508d565b905060a0840151601f198483030160c08501526153b682826150f2565b91505060c08401516153cb60e0850182615193565b509392505050565b803561ffff811681146153e557600080fd5b919050565b60008060008060008060008060008060006101608c8e03121561540c57600080fd5b6154158c6153d3565b9a5060208c013561542581614fe5565b995061543360408d016153d3565b985061544160608d016153d3565b975061544f60808d016153d3565b965061545d60a08d016153d3565b955061546b60c08d016153d3565b945061547960e08d016153d3565b93506154886101008d016153d3565b92506154976101208d016153d3565b91506154a66101408d016153d3565b90509295989b509295989b9093969950565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101561552757888303603f19018552815180516001600160a01b031684528701518784018790526155148785018261508d565b95880195935050908601906001016154df565b509098975050505050505050565b8035600381106153e557600080fd5b6000806000806080858703121561555a57600080fd5b8435935061556a60208601615535565b9250604085013567ffffffffffffffff81111561558657600080fd5b8501601f8101871361559757600080fd5b6155a68782356020840161525b565b92505060608501356155b781614fe5565b939692955090935050565b6000806000606084860312156155d757600080fd5b6155e084615535565b925060208085013567ffffffffffffffff808211156155fe57600080fd5b61560a888389016152b3565b9450604087013591508082111561562057600080fd5b818701915087601f83011261563457600080fd5b81358181111561564657615646615214565b8060051b61565585820161522a565b918252838101850191858101908b84111561566f57600080fd5b86860192505b838310156156ab5782358581111561568d5760008081fd5b61569b8d89838a01016152b3565b8352509186019190860190615675565b809750505050505050509250925092565b6000602082840312156156ce57600080fd5b614bfc826153d3565b6000806000606084860312156156ec57600080fd5b83356156f781614fe5565b9250602084013561570781614fe5565b929592945050506040919091013590565b6000806040838503121561572b57600080fd5b615734836153d3565b9150615742602084016153d3565b90509250929050565b602081526000614bfc602083018461508d565b6040810161576c8285615193565b8260208301529392505050565b60006020828403121561578b57600080fd5b5051919050565b6000602082840312156157a457600080fd5b81518015158114614bfc57600080fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610da957610da96157b4565b600181811c908216806157f157607f821691505b60208210810361581157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b60006001820161583f5761583f6157b4565b5060010190565b601f82111561385b57600081815260208120601f850160051c8101602086101561586d5750805b601f850160051c820191505b81811015612da257828155600101615879565b815167ffffffffffffffff8111156158a6576158a6615214565b6158ba816158b484546157dd565b84615846565b602080601f8311600181146158ef57600084156158d75750858301515b600019600386901b1c1916600185901b178555612da2565b600085815260208120601f198616915b8281101561591e578886015182559484019460019091019084016158ff565b508582101561593c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610da957610da96157b4565b805160ff811681146153e557600080fd5b60006020828403121561598257600080fd5b614bfc8261595f565b61599484615059565b838152826020820152606060408201526000613e00606083018461508d565b6040815260006159c6604083018561508d565b8281036020840152613e00818561508d565b6000602082840312156159ea57600080fd5b8151614bfc81614fe5565b80516001600160801b03811681146153e557600080fd5b600080600060608486031215615a2157600080fd5b615a2a8461595f565b9250615a38602085016159f5565b91506040840151615a4881614fe5565b809150509250925092565b60008060008060808587031215615a6957600080fd5b615a728561595f565b9350615a80602086016159f5565b92506040850151615a9081614fe5565b9150615a9e606086016159f5565b905092959194509250565b600061ffff808316818103615ac057615ac06157b4565b6001019392505050565b61ffff8181168382160280821691908281146137be576137be6157b4565b634e487b7160e01b600052601260045260246000fd5b600061ffff80841680615b1357615b13615ae8565b92169190910492915050565b634e487b7160e01b600052603160045260246000fd5b60006001600160a01b03808716835280861660208401525060806040830152615b616080830185614f8e565b9050615b6c83615059565b82606083015295945050505050565b600082615b8a57615b8a615ae8565b500490565b63ffffffff828116828216039080821115615bac57615bac6157b4565b5092915050565b8082028115828204841417610da957610da96157b4565b60008251615bdc818460208701615069565b919091019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122019aa0081e69056404e40023f916698c2b116cb83388048dea2cf1b230e45ab7b64736f6c63430008110033", + "deployedBytecode": "0x60806040526004361061031e5760003560e01c80637f6e29de116101a5578063bdb860ea116100ec578063e67a5d7811610095578063f6e8913d1161006f578063f6e8913d146108b2578063f7714eb9146108d7578063fdd9344c146108fe578063ffa1ad741461092057600080fd5b8063e67a5d781461085c578063f108f5b61461087c578063f2fde38b1461089257600080fd5b8063dc38b0a2116100c6578063dc38b0a214610808578063dd6f8f9014610828578063e30c39781461083e57600080fd5b8063bdb860ea146107b2578063c993d861146107c8578063ce3e7e91146107e857600080fd5b8063931127a01161014e578063adf1daa611610128578063adf1daa614610750578063b10064eb14610772578063b27b154d1461079257600080fd5b8063931127a0146106fa578063974c5b411461071b5780639c30db5c1461073057600080fd5b806384f21a441161017f57806384f21a441461069a5780638b8f631f146106bc5780638da5cb5b146106dc57600080fd5b80637f6e29de14610658578063817b1cd21461066e57806381ebc5061461068557600080fd5b80633659cfe61161026957806365cdbaea11610212578063715018a6116101ec578063715018a61461061357806379ba5097146106285780637c4981c81461063d57600080fd5b806365cdbaea146105ae5780636dcd3af2146105d75780636ddf344a146105f757600080fd5b806352d1902d1161024357806352d1902d1461054c578063569c876214610561578063582115fb1461058157600080fd5b80633659cfe6146104e65780633a688a2f146105065780634f1ef2861461053957600080fd5b80631acf7629116102cb57806324212b86116102a557806324212b86146104855780632ae9c6001461049b578063339f334b146104b657600080fd5b80631acf76291461041657806323b8ac5d1461043857806323deecfe1461046357600080fd5b8063125c6c98116102fc578063125c6c98146103b957806313114a9d146103dd57806315aa7b06146103f457600080fd5b8063011f59a014610323578063024f38cb1461035d57806311ce026714610380575b600080fd5b34801561032f57600080fd5b5060ff5461034590600160701b900461ffff1681565b60405161ffff90911681526020015b60405180910390f35b34801561036957600080fd5b5060ff5461034590640100000000900461ffff1681565b34801561038c57600080fd5b50610101546103a1906001600160a01b031681565b6040516001600160a01b039091168152602001610354565b3480156103c557600080fd5b506103cf60fc5481565b604051908152602001610354565b3480156103e957600080fd5b506103cf6101085481565b34801561040057600080fd5b50610409610976565b6040516103549190614fd2565b34801561042257600080fd5b50610436610431366004614ffa565b6109d9565b005b34801561044457600080fd5b5060ff54610345906c01000000000000000000000000900461ffff1681565b34801561046f57600080fd5b5060ff5461034590600160801b900461ffff1681565b34801561049157600080fd5b506103cf60fe5481565b3480156104a757600080fd5b5060fb546103459061ffff1681565b3480156104c257600080fd5b506104d66104d1366004615017565b610b34565b6040519015158152602001610354565b3480156104f257600080fd5b50610436610501366004614ffa565b610daf565b34801561051257600080fd5b50610526610521366004614ffa565b610f2a565b60405161035497969594939291906151a7565b6104366105473660046152d3565b61119e565b34801561055857600080fd5b506103cf61130a565b34801561056d57600080fd5b506103a161057c366004615323565b6113cf565b34801561058d57600080fd5b506105a161059c366004614ffa565b6113fa565b604051610354919061533c565b3480156105ba57600080fd5b5060ff54610345906a0100000000000000000000900461ffff1681565b3480156105e357600080fd5b506104366105f23660046153ea565b6116eb565b34801561060357600080fd5b50610103546103459061ffff1681565b34801561061f57600080fd5b50610436611b1f565b34801561063457600080fd5b50610436611b33565b34801561064957600080fd5b5060ff546103459061ffff1681565b34801561066457600080fd5b50610105546103cf565b34801561067a57600080fd5b506103cf6101075481565b34801561069157600080fd5b50610409611bbe565b3480156106a657600080fd5b506106af611c1f565b60405161035491906154b8565b3480156106c857600080fd5b506103a16106d7366004615323565b611e6e565b3480156106e857600080fd5b506033546001600160a01b03166103a1565b34801561070657600080fd5b5060ff546103459062010000900461ffff1681565b34801561072757600080fd5b50610409611e7f565b34801561073c57600080fd5b5061043661074b366004615544565b611ee0565b34801561075c57600080fd5b5060ff5461034590600160901b900461ffff1681565b34801561077e57600080fd5b5061043661078d3660046155c2565b612775565b34801561079e57600080fd5b506104366107ad3660046156bc565b612daa565b3480156107be57600080fd5b50610104546103cf565b3480156107d457600080fd5b506103a16107e3366004615323565b612e7c565b3480156107f457600080fd5b506104d66108033660046156d7565b612e8d565b34801561081457600080fd5b50610436610823366004614ffa565b61336a565b34801561083457600080fd5b506103cf60fd5481565b34801561084a57600080fd5b506065546001600160a01b03166103a1565b34801561086857600080fd5b50610436610877366004615718565b613395565b34801561088857600080fd5b50610102546103cf565b34801561089e57600080fd5b506104366108ad366004614ffa565b61346a565b3480156108be57600080fd5b5060ff54610345906601000000000000900461ffff1681565b3480156108e357600080fd5b5060ff546103459068010000000000000000900461ffff1681565b34801561090a57600080fd5b5060ff5461034590600160a01b900461ffff1681565b34801561092c57600080fd5b506109696040518060400160405280600581526020017f302e302e3200000000000000000000000000000000000000000000000000000081525081565b604051610354919061574b565b60606101058054806020026020016040519081016040528092919081815260200182805480156109cf57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109b1575b5050505050905090565b6001600160a01b038082166000908152610106602052604090206001810154909116610a4c5760405162461bcd60e51b815260206004820152601460248201527f6e6f646520646f6573206e6f742065786973747300000000000000000000000060448201526064015b60405180910390fd5b80546001600160a01b0316331480610a7d575033610a726033546001600160a01b031690565b6001600160a01b0316145b610ac95760405162461bcd60e51b815260206004820152601d60248201527f6f6e6c79206f776e65722063616e20756e7374616b652061206e6f64650000006044820152606401610a43565b610ad2816134db565b5060088101805460ff1916600490811790915560018201546040516001600160a01b03909116917ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e91610b28919060009061575e565b60405180910390a25050565b6000610b3e6137c6565b6001600160a01b038316610b945760405162461bcd60e51b815260206004820152601260248201527f696e76616c696420746f206164647265737300000000000000000000000000006044820152606401610a43565b60008211610be45760405162461bcd60e51b815260206004820152600e60248201527f696e76616c696420616d6f756e740000000000000000000000000000000000006044820152606401610a43565b610108548211158015610c7c5750610100546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610c54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c789190615779565b8211155b610cc85760405162461bcd60e51b815260206004820152601460248201527f696e73756666696369656e742062616c616e63650000000000000000000000006044820152606401610a43565b6101005460405163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529091169063a9059cbb906044016020604051808303816000875af1158015610d1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d409190615792565b610d8c5760405162461bcd60e51b815260206004820152601260248201527f6661696c656420746f207472616e7366657200000000000000000000000000006044820152606401610a43565b816101086000828254610d9f91906157ca565b9091555060019150505b92915050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610e3c5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610a43565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610e977f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610f025760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610a43565b610f0b81613820565b60408051600080825260208201909252610f2791839190613828565b50565b6101066020526000908152604090208054600182015460028301546003840180546001600160a01b039485169594841694600160a01b90940460ff16939190610f72906157dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9e906157dd565b8015610feb5780601f10610fc057610100808354040283529160200191610feb565b820191906000526020600020905b815481529060010190602001808311610fce57829003601f168201915b50506040805160a08101825260048701805461ffff808216845262010000909104166020808401919091526005890180548551818402810184018752818152999a99949850929650938701945091929183018282801561109c57602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116110595790505b50505050508152602001600282018054806020026020016040519081016040528092919081815260200182805480156110fe57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116110e0575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561118857602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116111455790505b5050509190925250505060089091015460ff1687565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361122b5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610a43565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166112867f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b0316146112f15760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610a43565b6112fa82613820565b61130682826001613828565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113aa5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610a43565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b61010581815481106113e057600080fd5b6000918252602090912001546001600160a01b0316905081565b611402614db9565b6001600160a01b0382811660009081526101066020908152604091829020825160e08101845281548516815260018201549485169281019290925290929091830190600160a01b900460ff16600281111561145f5761145f615043565b600281111561147057611470615043565b81526020016002820154815260200160038201805461148e906157dd565b80601f01602080910402602001604051908101604052809291908181526020018280546114ba906157dd565b80156115075780601f106114dc57610100808354040283529160200191611507565b820191906000526020600020905b8154815290600101906020018083116114ea57829003601f168201915b50505091835250506040805160a08101825260048401805461ffff808216845262010000909104166020838101919091526005860180548551818402810184018752818152968301969495939493860193928301828280156115ba57602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116115775790505b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561161c57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116115fe575b50505050508152602001600382018054806020026020016040519081016040528092919081815260200182805480156116a657602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116116635790505b505050919092525050508152600882015460209091019060ff1660048111156116d1576116d1615043565b60048111156116e2576116e2615043565b90525092915050565b600054610100900460ff161580801561170b5750600054600160ff909116105b806117255750303b158015611725575060005460ff166001145b6117975760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a43565b6000805460ff1916600117905580156117ba576000805461ff0019166101001790555b6117c26139cd565b6117ca613a38565b60fb805461ffff191661ffff8e161790556001600160a01b038b166117ee57600080fd5b61010080546001600160a01b0319166001600160a01b038d1617905561ffff8a1661185b5760405162461bcd60e51b815260206004820152601860248201527f696e76616c69642061747465737465727320616d6f756e7400000000000000006044820152606401610a43565b60ff805461ffff808d16600160801b0271ffff00000000000000000000000000000000199092169190911790915589166118fd5760405162461bcd60e51b815260206004820152602160248201527f696e76616c6964206e6f646552616e646f6d4d696e436f756e7420616d6f756e60448201527f74000000000000000000000000000000000000000000000000000000000000006064820152608401610a43565b60ff805461ffff808c16600160901b027fffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffff9092169190911790915588166119ac5760405162461bcd60e51b815260206004820152602c60248201527f696e76616c6964206e6f646552616e646f6d46696c74657250696e677352657160448201527f756972656420616d6f756e7400000000000000000000000000000000000000006064820152608401610a43565b8760ff60146101000a81548161ffff021916908361ffff160217905550606460fc81905550606460fd81905550606460fe819055508660ff60026101000a81548161ffff021916908361ffff1602179055508560ff60046101000a81548161ffff021916908361ffff1602179055508260ff60066101000a81548161ffff021916908361ffff1602179055508460ff60086101000a81548161ffff021916908361ffff1602179055508360ff600a6101000a81548161ffff021916908361ffff1602179055508160ff600c6101000a81548161ffff021916908361ffff160217905550604260ff60006101000a81548161ffff021916908361ffff160217905550600060ff600e6101000a81548161ffff021916908361ffff1602179055508015611b11576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050505050565b611b276137c6565b611b316000613aa8565b565b60655433906001600160a01b03168114611bb55760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610a43565b610f2781613aa8565b60606101048054806020026020016040519081016040528092919081815260200182805480156109cf576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109b1575050505050905090565b60606000805b61010254811015611ca85760006101028281548110611c4657611c46615817565b60009182526020808320909101546001600160a01b03168083526101069091526040909120600881015491925090611c809060ff16613ac1565b15611c935783611c8f8161582d565b9450505b50508080611ca09061582d565b915050611c25565b5060008167ffffffffffffffff811115611cc457611cc4615214565b604051908082528060200260200182016040528015611d0a57816020015b604080518082019091526000815260606020820152815260200190600190039081611ce25790505b5090506000805b61010254811015611e655760006101028281548110611d3257611d32615817565b60009182526020808320909101546001600160a01b03168083526101069091526040909120600881015491925090611d6c9060ff16613ac1565b611d77575050611e53565b6040805180820190915260018201546001600160a01b03168152600382018054602083019190611da6906157dd565b80601f0160208091040260200160405190810160405280929190818152602001828054611dd2906157dd565b8015611e1f5780601f10611df457610100808354040283529160200191611e1f565b820191906000526020600020905b815481529060010190602001808311611e0257829003601f168201915b5050505050815250858580611e339061582d565b965081518110611e4557611e45615817565b602002602001018190525050505b80611e5d8161582d565b915050611d11565b50909392505050565b61010481815481106113e057600080fd5b60606101028054806020026020016040519081016040528092919081815260200182805480156109cf576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109b1575050505050905090565b6000836002811115611ef457611ef4615043565b03611fa65760fc54841015611f555760405162461bcd60e51b815260206004820152602160248201527f496e73756666696369656e7420636f6c6c61746572616c20666f7220564e4f446044820152604560f81b6064820152608401610a43565b61010280546001810182556000919091527f93bdaa6a4190909b7c3fbe8d42169ffe1cab19f51dfc8db24c71abf849eced4a0180546001600160a01b0319166001600160a01b03831617905561217a565b6001836002811115611fba57611fba615043565b0361206c5760fd5484101561201b5760405162461bcd60e51b815260206004820152602160248201527f496e73756666696369656e7420636f6c6c61746572616c20666f7220534e4f446044820152604560f81b6064820152608401610a43565b61010480546001810182556000919091527f4c0be60200faa20559308cb7b5a1bb3255c16cb1cab91f525b5ae7a03d02fabe0180546001600160a01b0319166001600160a01b03831617905561217a565b600283600281111561208057612080615043565b036121325760fe548410156120e15760405162461bcd60e51b815260206004820152602160248201527f496e73756666696369656e7420636f6c6c61746572616c20666f7220444e4f446044820152604560f81b6064820152608401610a43565b61010580546001810182556000919091527ffc62abc8c0fc47c2d92f5aec99bf8b60f375828e14394d89345cae11a98673710180546001600160a01b0319166001600160a01b03831617905561217a565b60405162461bcd60e51b815260206004820152601560248201527f756e737570706f72746564206e6f6465547970652000000000000000000000006044820152606401610a43565b6001600160a01b0380821660009081526101066020526040902080549091161561220c5760405162461bcd60e51b815260206004820152602560248201527f61206e6f64652077697468207075624b657920697320616c726561647920646560448201527f66696e65640000000000000000000000000000000000000000000000000000006064820152608401610a43565b841561231957610100546040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523360048201523060248201526000916001600160a01b03169063dd62ed3e90604401602060405180830381865afa15801561227b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061229f9190615779565b9050858110156123175760405162461bcd60e51b815260206004820152603260248201527f5f6e6f6465546f6b656e732063616e6e6f74206265207472616e73666572726560448201527f642c20636865636b20616c6c6f77616e636500000000000000000000000000006064820152608401610a43565b505b612321614db9565b3381526001600160a01b03831660208201526040810185600281111561234957612349615043565b9081600281111561235c5761235c615043565b90525060608101869052608081018490526001600160a01b0380841660009081526101066020908152604091829020845181549085166001600160a01b0319918216178255918501516001820180549190951692811683178555928501518594919390927fffffffffffffffffffffff00000000000000000000000000000000000000000090911617600160a01b8360028111156123fc576123fc615043565b0217905550606082015160028201556080820151600382019061241f908261588c565b5060a0820151805160048301805460208085015161ffff908116620100000263ffffffff1990931694169390931717815560408301518051919261246b92600587019290910190614e2d565b5060608201518051612487916002840191602090910190614ee5565b50608082015180516124a3916003840191602090910190614e2d565b50505060c082015160088201805460ff191660018360048111156124c9576124c9615043565b021790555050861590506125de57610100546040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018890526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015612548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256c9190615792565b6125de5760405162461bcd60e51b815260206004820152602560248201527f6661696c656420746f207472616e7366657220746f6b656e7320746f20636f6e60448201527f74726163740000000000000000000000000000000000000000000000000000006064820152608401610a43565b8561010760008282546125f1919061594c565b909155506000905085600281111561260b5761260b615043565b0361261d57612618613afb565b61271e565b600185600281111561263157612631615043565b0361271e57610101546001600160a01b031661268f5760405162461bcd60e51b815260206004820152601b60248201527f6e6f2073746f7261676520636f6e747261637420646566696e656400000000006044820152606401610a43565b610101546040517f9d95f1cc0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152909116908190639d95f1cc906024016020604051808303816000875af11580156126f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271b9190615970565b50505b826001600160a01b0316336001600160a01b03167f67bd55f864dcc77d483ff7567de0889142417ef6d0299753cfd80e4c72ddc5548789886040516127659392919061598b565b60405180910390a3505050505050565b3360009081526101066020526040902060018101546001600160a01b03166127df5760405162461bcd60e51b815260206004820152601060248201527f696e76616c6964207265706f72746572000000000000000000000000000000006044820152606401610a43565b600080835167ffffffffffffffff8111156127fc576127fc615214565b604051908082528060200260200182016040528015612825578160200160208202803683370190505b50905060005b84518110156129b457600073__$7aaf162b34d2533b02434bde51cad0c5c5$__6336de68108888858151811061286357612863615817565b60200260200101516040518363ffffffff1660e01b81526004016128889291906159b3565b602060405180830381865af41580156128a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c991906159d8565b6001600160a01b03808216600090815261010660205260409020600181015492935091166128f85750506129a2565b6000805b8681101561295157836001600160a01b031686828151811061292057612920615817565b60200260200101516001600160a01b03160361293f5760019150612951565b806129498161582d565b9150506128fc565b508015612960575050506129a2565b82858761296c8161582d565b98508151811061297e5761297e615817565b60200260200101906001600160a01b031690816001600160a01b0316815250505050505b806129ac8161582d565b91505061282b565b508351821015612a6a5760008267ffffffffffffffff8111156129d9576129d9615214565b604051908082528060200260200182016040528015612a02578160200160208202803683370190505b50905060005b83811015612a6657828181518110612a2257612a22615817565b6020026020010151828281518110612a3c57612a3c615817565b6001600160a01b039092166020928302919091019091015280612a5e8161582d565b915050612a08565b5090505b6000866002811115612a7e57612a7e615043565b03612c0957600080600087806020019051810190612a9c9190615a0c565b9194509250905060ff8316600114612af65760405162461bcd60e51b815260206004820152601c60248201527f7265706f727420616374696f6e206f6e6c7920737570706f72746564000000006044820152606401610a43565b6001600160a01b038082166000908152610106602052604090206001810154909116612b6f5760405162461bcd60e51b815260206004820152602260248201527f746172676574206e6f64652077616c6c657420646f6573206e6f742065786973604482015261747360f01b6064820152608401610a43565b60006001820154600160a01b900460ff166002811115612b9157612b91615043565b14612bde5760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220564e6f646573000000000000000000006044820152606401610a43565b612bff8460ff166002811115612bf657612bf6615043565b88878487613c61565b5050505050612da2565b6001866002811115612c1d57612c1d615043565b03612da25760008060008088806020019051810190612c3c9190615a53565b9296509094509250905060ff8416600214612c995760405162461bcd60e51b815260206004820152601c60248201527f7265706f727420616374696f6e206f6e6c7920737570706f72746564000000006044820152606401610a43565b6001600160a01b038083166000908152610106602052604090206001810154909116612d125760405162461bcd60e51b815260206004820152602260248201527f746172676574206e6f64652077616c6c657420646f6573206e6f742065786973604482015261747360f01b6064820152608401610a43565b600180820154600160a01b900460ff166002811115612d3357612d33615043565b14612d805760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220534e6f646573000000000000000000006044820152606401610a43565b611b118560ff166002811115612d9857612d98615043565b8988848887613e09565b505050505050565b612db26137c6565b6101025461ffff82161115612e095760405162461bcd60e51b815260206004820152601c60248201527f696e636f72726563742076616c506572426c6f636b5461726765745f000000006044820152606401610a43565b60ff805471ffff000000000000000000000000000000001916600160801b61ffff848116918202929092179283905560408051600160701b909404909216835260208301527f81512b84dc2b38f82b4999b5512a14df033b165371fa51776cce559212bf0a44910160405180910390a150565b61010281815481106113e057600080fd5b6000612e976137c6565b60008211612ee75760405162461bcd60e51b815260206004820152601960248201527f616d6f756e742073686f756c6420626520706f736974697665000000000000006044820152606401610a43565b826001600160a01b0316846001600160a01b031603612f6e5760405162461bcd60e51b815260206004820152602660248201527f63616e6e6f74207472616e73666572206265747765656e2073616d652061646460448201527f72657373657300000000000000000000000000000000000000000000000000006064820152608401610a43565b6001600160a01b03831615801590612f8d57506001600160a01b038416155b156130b45781610108541015612ff55760405162461bcd60e51b815260206004820152602760248201527f66726f6d206e6f64652073686f756c64206861766520656e6f75676820636f6c6044820152661b185d195c985b60ca1b6064820152608401610a43565b6001600160a01b0380841660009081526101066020526040902080549091166130605760405162461bcd60e51b815260206004820152600f60248201527f6d697373696e6720746f206e6f646500000000000000000000000000000000006044820152606401610a43565b82610108600082825461307391906157ca565b9250508190555082610107600082825461308d919061594c565b92505081905550828160020160008282546130a8919061594c565b90915550613360915050565b6001600160a01b038416158015906130d357506001600160a01b038316155b156131ef576001600160a01b0380851660009081526101066020526040902080549091166131435760405162461bcd60e51b815260206004820152601160248201527f6d697373696e672066726f6d206e6f64650000000000000000000000000000006044820152606401610a43565b82816002015410156131a75760405162461bcd60e51b815260206004820152602760248201527f66726f6d206e6f64652073686f756c64206861766520656e6f75676820636f6c6044820152661b185d195c985b60ca1b6064820152608401610a43565b828160020160008282546131bb91906157ca565b925050819055508261010760008282546131d591906157ca565b925050819055508261010860008282546130a8919061594c565b6001600160a01b03808516600090815261010660205260409020805490911661325a5760405162461bcd60e51b815260206004820152601160248201527f6d697373696e672066726f6d206e6f64650000000000000000000000000000006044820152606401610a43565b82816002015410156132be5760405162461bcd60e51b815260206004820152602760248201527f66726f6d206e6f64652073686f756c64206861766520656e6f75676820636f6c6044820152661b185d195c985b60ca1b6064820152608401610a43565b6001600160a01b0380851660009081526101066020526040902082549091166133295760405162461bcd60e51b815260206004820152600f60248201527f6d697373696e6720746f206e6f646500000000000000000000000000000000006044820152606401610a43565b8382600201600082825461333d91906157ca565b9250508190555083816002016000828254613358919061594c565b909155505050505b5060019392505050565b6133726137c6565b61010180546001600160a01b0319166001600160a01b0392909216919091179055565b61339d6137c6565b6101025461ffff8316106133b057600080fd5b6101025461ffff8216106133c357600080fd5b60ff80547fffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffff16600160901b61ffff8581169182027fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1692909217600160a01b928516928302179092556040805192835260208301919091527fcd481667fa77e513c517493174075f0471ec1fe24d57af644377cd1a2572d13d910160405180910390a15050565b6134726137c6565b606580546001600160a01b0383166001600160a01b031990911681179091556134a36033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600281015461010054825460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810184905260009392919091169063a9059cbb906044016020604051808303816000875af115801561353b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061355f9190615792565b6135d15760405162461bcd60e51b815260206004820152602560248201527f6661696c656420746f20747261736665722066756e6473206261636b20746f2060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610a43565b600083600201819055508061010760008282546135ee91906157ca565b92505081905550806101086000828254613608919061594c565b90915550600090506001840154600160a01b900460ff16600281111561363057613630615043565b0361367a57613643600584016000614f3a565b613651600684016000614f5f565b600183015461366c90610102906001600160a01b0316613fb5565b50613675613afb565b610da9565b600180840154600160a01b900460ff16600281111561369b5761369b615043565b03610da957610101546001600160a01b03166136f95760405162461bcd60e51b815260206004820152601b60248201527f6e6f2073746f7261676520636f6e747261637420646566696e656400000000006044820152606401610a43565b6101015460018401546040517fb2b99ec90000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690819063b2b99ec990602401600060405180830381600087803b15801561376057600080fd5b505af1158015613774573d6000803e3d6000fd5b5061378792505050600585016000614f3a565b613795600685016000614f5f565b6137a3600785016000614f3a565b60018401546137be90610104906001600160a01b0316613fb5565b505092915050565b6033546001600160a01b03163314611b315760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a43565b610f276137c6565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156138605761385b836140e1565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156138ba575060408051601f3d908101601f191682019092526138b791810190615779565b60015b61392c5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610a43565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146139c15760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610a43565b5061385b83838361419f565b600054610100900460ff16611b315760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610a43565b600054610100900460ff16613aa35760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610a43565b611b31335b606580546001600160a01b0319169055610f27816141ca565b60006004826004811115613ad757613ad7615043565b1480613af457506003826004811115613af257613af2615043565b145b1592915050565b6000805b61010254811015613b825760006101028281548110613b2057613b20615817565b60009182526020808320909101546001600160a01b03168083526101069091526040909120600881015491925090613b5a9060ff16613ac1565b15613b6d5783613b6981615aa9565b9450505b50508080613b7a9061582d565b915050613aff565b50610103805461ffff191661ffff83811691821790925560ff548392600160801b9091041690811015613bb3578091505b60ff5461ffff808316600160701b909204161115613bd057600080fd5b60ff5461ffff838116600160701b909204161461385b5760ff80547fffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffff16600160701b61ffff858116918202929092179092556040805192835290831660208301527f81512b84dc2b38f82b4999b5512a14df033b165371fa51776cce559212bf0a44910160405180910390a1505050565b6000806001840154600160a01b900460ff166002811115613c8457613c84615043565b14613cd15760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220564e6f646573000000000000000000006044820152606401610a43565b60ff54606490613cef9061ffff80821691600160701b900416615aca565b613cf99190615afe565b61ffff1684511015613d4d5760405162461bcd60e51b815260206004820152601460248201527f73696720636f756e7420697320746f6f206c6f770000000000000000000000006044820152606401610a43565b600883015460ff166004816004811115613d6957613d69615043565b1480613d8657506003816004811115613d8457613d84615043565b145b15613d95576000915050613e00565b613da48787868887600061421c565b60ff54600485015461ffff620100009092048216911610613dc957613dc98685614892565b60ff5460048501546801000000000000000090910461ffff908116620100009092041610613dfa57613dfa84614af0565b60009150505b95945050505050565b6000600180850154600160a01b900460ff166002811115613e2c57613e2c615043565b14613e795760405162461bcd60e51b815260206004820152601660248201527f7265706f7274206f6e6c7920666f7220534e6f646573000000000000000000006044820152606401610a43565b60ff54606490613e979061ffff80821691600160701b900416615aca565b613ea19190615afe565b61ffff1685511015613ef55760405162461bcd60e51b815260206004820152601460248201527f73696720636f756e7420697320746f6f206c6f770000000000000000000000006044820152606401610a43565b600884015460ff166004816004811115613f1157613f11615043565b1480613f2e57506003816004811115613f2c57613f2c615043565b145b15613f3d576000915050613fab565b613f4b88888789888861421c565b60ff54600486015461ffff6401000000009092048216911610613f7257613f728786614892565b60ff5460048601546a010000000000000000000090910461ffff908116620100009092041610613fa557613fa585614af0565b60009150505b9695505050505050565b8154600090815b818110156140d657836001600160a01b0316858281548110613fe057613fe0615817565b6000918252602090912001546001600160a01b0316036140c4576140056001836157ca565b811461408657846140176001846157ca565b8154811061402757614027615817565b9060005260206000200160009054906101000a90046001600160a01b031685828154811061405757614057615817565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b8480548061409657614096615b1f565b600082815260209020810160001990810180546001600160a01b03191690550190555060019150610da99050565b806140ce8161582d565b915050613fbc565b506000949350505050565b6001600160a01b0381163b61415e5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610a43565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6141a883614b97565b6000825111806141b55750805b1561385b576141c48383614bd7565b50505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000846004016001018054806020026020016040519081016040528092919081815260200182805480156142a157602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f0104928301926001038202915080841161425e5790505b505083519394506000925050505b81811015614343578281815181106142c9576142c9615817565b60200260200101516001600160801b0316856001600160801b0316036143315760405162461bcd60e51b815260206004820152601060248201527f626c6f636b206973206e6f74206e6577000000000000000000000000000000006044820152606401610a43565b8061433b8161582d565b9150506142af565b50600180870154600160a01b900460ff16600281111561436557614365615043565b0361453057826001600160801b03166000036143c35760405162461bcd60e51b815260206004820152601760248201527f73746f72616765206b65792069732072657175697265640000000000000000006044820152606401610a43565b60008660040160030180548060200260200160405190810160405280929190818152602001828054801561444857602002820191906000526020600020906000905b82829054906101000a90046001600160801b03166001600160801b031681526020019060100190602082600f010492830192600103820291508084116144055790505b505083519394506000925050505b818110156144ea5782818151811061447057614470615817565b60200260200101516001600160801b0316866001600160801b0316036144d85760405162461bcd60e51b815260206004820152601660248201527f73746f72616765206b6579206973206e6f74206e6577000000000000000000006044820152606401610a43565b806144e28161582d565b915050614456565b505050600786018054600180820183556000928352602090922060028204018054929091166010026101000a6001600160801b0381810219909316928616029190911790555b60048601805461ffff1690600061454683615aa9565b825461010092830a61ffff818102199092169290911602179091556005880180546001818101835560009283526020808420600284040180549390921660100290940a6001600160801b0381810219909316928a1602919091179055600689018054604080518286028101860190915281815292945091929091908301828280156145fa57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116145dc575b505083519394506000925050505b87518110156146fe5760005b828110156146eb5783818151811061462e5761462e615817565b60200260200101516001600160a01b031689838151811061465157614651615817565b60200260200101516001600160a01b031614801561469b575060006001600160a01b031689838151811061468757614687615817565b60200260200101516001600160a01b031614155b156146d95760008983815181106146b4576146b4615817565b60200260200101906001600160a01b031690816001600160a01b0316815250506146eb565b806146e38161582d565b915050614614565b50806146f68161582d565b915050614608565b5060005b87518110156147ab57600088828151811061471f5761471f615817565b6020026020010151905060006001600160a01b0316816001600160a01b031614614798578960040160020189838151811061475c5761475c615817565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790555b50806147a38161582d565b915050614702565b506000600889015460ff1660048111156147c7576147c7615043565b036147dc5760088801805460ff191660011790555b600180890154908a01546040517f19d5f3972073c7002111a82b2a44db11e739567a002445f2e3db8ab96fe6645f92614827926001600160a01b03918216929116908b908f90615b35565b60405180910390a16001880154600889015460028a01546040516001600160a01b03909316927ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e9261487e9260ff9091169161575e565b60405180910390a250505050505050505050565b60ff5460009081906148b39084906601000000000000900461ffff16614c03565b600685018054604080516020808402820181019092528281529496509294506000939283018282801561490f57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116148f1575b5050505050905060008083118015614928575060008251115b156149d25781516149399084615b7b565b905060005b82518110156149d0576000610106600085848151811061496057614960615817565b6020908102919091018101516001600160a01b0390811683529082019290925260400160002080549092501661499657506149be565b828160020160008282546149aa919061594c565b909155506149ba905083866157ca565b9450505b806149c88161582d565b91505061493e565b505b828660020160008282546149e6919061594c565b909155506149fa9050600686016000614f5f565b6000600886015460ff166004811115614a1557614a15615043565b1480614a3957506001600886015460ff166004811115614a3757614a37615043565b145b15614a4e5760088501805460ff191660021790555b60048501805461ffff191680825562010000900461ffff16906002614a7283615aa9565b91906101000a81548161ffff021916908361ffff160217905550508460010160009054906101000a90046001600160a01b03166001600160a01b03167ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e600286604051614ae092919061575e565b60405180910390a2505050505050565b60ff546000908190614b179084906c01000000000000000000000000900461ffff16614c03565b9092509050614b25836134db565b5060048301805463ffff00001916905560088301805460ff1916600390811790915560018401546040516001600160a01b03909116917ffadfb6f5325606e6d04ae4ed3649c7c96949cd874f7cb927bef9ed701ba15a3e91614b8a919060009061575e565b60405180910390a2505050565b614ba0816140e1565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060614bfc8383604051806060016040528060278152602001615be760279139614ca5565b9392505050565b60008060648363ffffffff161115614c5d5760405162461bcd60e51b815260206004820181905260248201527f70657263656e746167652073686f756c6420626520696e205b302c203130305d6044820152606401610a43565b60028401546064614c6e8582615b8f565b614c7e9063ffffffff1683615bb3565b614c889190615b7b565b9250614c9483826157ca565b600286018490559150509250929050565b6060600080856001600160a01b031685604051614cc29190615bca565b600060405180830381855af49150503d8060008114614cfd576040519150601f19603f3d011682016040523d82523d6000602084013e614d02565b606091505b5091509150613fab8683838760608315614d7d578251600003614d76576001600160a01b0385163b614d765760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a43565b5081614d87565b614d878383614d8f565b949350505050565b815115614d9f5781518083602001fd5b8060405162461bcd60e51b8152600401610a43919061574b565b6040805160e081018252600080825260208201819052909182019081526020016000815260200160608152602001614e216040518060a00160405280600061ffff168152602001600061ffff1681526020016060815260200160608152602001606081525090565b81526020016000905290565b82805482825590600052602060002090600101600290048101928215614ed55791602002820160005b83821115614ea057835183826101000a8154816001600160801b0302191690836001600160801b031602179055509260200192601001602081600f01049283019260010302614e56565b8015614ed35782816101000a8154906001600160801b030219169055601001602081600f01049283019260010302614ea0565b505b50614ee1929150614f79565b5090565b828054828255906000526020600020908101928215614ed5579160200282015b82811115614ed557825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614f05565b508054600082556001016002900490600052602060002090810190610f279190614f79565b5080546000825590600052602060002090810190610f2791905b5b80821115614ee15760008155600101614f7a565b600081518084526020808501945080840160005b83811015614fc75781516001600160a01b031687529582019590820190600101614fa2565b509495945050505050565b602081526000614bfc6020830184614f8e565b6001600160a01b0381168114610f2757600080fd5b60006020828403121561500c57600080fd5b8135614bfc81614fe5565b6000806040838503121561502a57600080fd5b823561503581614fe5565b946020939093013593505050565b634e487b7160e01b600052602160045260246000fd5b60038110610f2757610f27615043565b60005b8381101561508457818101518382015260200161506c565b50506000910152565b600081518084526150a5816020860160208601615069565b601f01601f19169290920160200192915050565b600081518084526020808501945080840160005b83811015614fc75781516001600160801b0316875295820195908201906001016150cd565b600061ffff8083511684526020818185015116818601526040840151915060a0604086015261512460a08601836150b9565b60608581015187830391880191909152805180835290830193506000918301905b8083101561516e5784516001600160a01b03168252938301936001929092019190830190615145565b5060808601519350868103608088015261518881856150b9565b979650505050505050565b600581106151a3576151a3615043565b9052565b6001600160a01b0388811682528716602082015260006151c687615059565b86604083015285606083015260e060808301526151e660e083018661508d565b82810360a08401526151f881866150f2565b91505061520860c0830184615193565b98975050505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561525357615253615214565b604052919050565b600067ffffffffffffffff83111561527557615275615214565b615288601f8401601f191660200161522a565b905082815283838301111561529c57600080fd5b828260208301376000602084830101529392505050565b600082601f8301126152c457600080fd5b614bfc8383356020850161525b565b600080604083850312156152e657600080fd5b82356152f181614fe5565b9150602083013567ffffffffffffffff81111561530d57600080fd5b615319858286016152b3565b9150509250929050565b60006020828403121561533557600080fd5b5035919050565b6020815260006001600160a01b0380845116602084015280602085015116604084015250604083015161536e81615059565b8060608401525060608301516080830152608083015160e060a084015261539961010084018261508d565b905060a0840151601f198483030160c08501526153b682826150f2565b91505060c08401516153cb60e0850182615193565b509392505050565b803561ffff811681146153e557600080fd5b919050565b60008060008060008060008060008060006101608c8e03121561540c57600080fd5b6154158c6153d3565b9a5060208c013561542581614fe5565b995061543360408d016153d3565b985061544160608d016153d3565b975061544f60808d016153d3565b965061545d60a08d016153d3565b955061546b60c08d016153d3565b945061547960e08d016153d3565b93506154886101008d016153d3565b92506154976101208d016153d3565b91506154a66101408d016153d3565b90509295989b509295989b9093969950565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101561552757888303603f19018552815180516001600160a01b031684528701518784018790526155148785018261508d565b95880195935050908601906001016154df565b509098975050505050505050565b8035600381106153e557600080fd5b6000806000806080858703121561555a57600080fd5b8435935061556a60208601615535565b9250604085013567ffffffffffffffff81111561558657600080fd5b8501601f8101871361559757600080fd5b6155a68782356020840161525b565b92505060608501356155b781614fe5565b939692955090935050565b6000806000606084860312156155d757600080fd5b6155e084615535565b925060208085013567ffffffffffffffff808211156155fe57600080fd5b61560a888389016152b3565b9450604087013591508082111561562057600080fd5b818701915087601f83011261563457600080fd5b81358181111561564657615646615214565b8060051b61565585820161522a565b918252838101850191858101908b84111561566f57600080fd5b86860192505b838310156156ab5782358581111561568d5760008081fd5b61569b8d89838a01016152b3565b8352509186019190860190615675565b809750505050505050509250925092565b6000602082840312156156ce57600080fd5b614bfc826153d3565b6000806000606084860312156156ec57600080fd5b83356156f781614fe5565b9250602084013561570781614fe5565b929592945050506040919091013590565b6000806040838503121561572b57600080fd5b615734836153d3565b9150615742602084016153d3565b90509250929050565b602081526000614bfc602083018461508d565b6040810161576c8285615193565b8260208301529392505050565b60006020828403121561578b57600080fd5b5051919050565b6000602082840312156157a457600080fd5b81518015158114614bfc57600080fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610da957610da96157b4565b600181811c908216806157f157607f821691505b60208210810361581157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b60006001820161583f5761583f6157b4565b5060010190565b601f82111561385b57600081815260208120601f850160051c8101602086101561586d5750805b601f850160051c820191505b81811015612da257828155600101615879565b815167ffffffffffffffff8111156158a6576158a6615214565b6158ba816158b484546157dd565b84615846565b602080601f8311600181146158ef57600084156158d75750858301515b600019600386901b1c1916600185901b178555612da2565b600085815260208120601f198616915b8281101561591e578886015182559484019460019091019084016158ff565b508582101561593c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610da957610da96157b4565b805160ff811681146153e557600080fd5b60006020828403121561598257600080fd5b614bfc8261595f565b61599484615059565b838152826020820152606060408201526000613e00606083018461508d565b6040815260006159c6604083018561508d565b8281036020840152613e00818561508d565b6000602082840312156159ea57600080fd5b8151614bfc81614fe5565b80516001600160801b03811681146153e557600080fd5b600080600060608486031215615a2157600080fd5b615a2a8461595f565b9250615a38602085016159f5565b91506040840151615a4881614fe5565b809150509250925092565b60008060008060808587031215615a6957600080fd5b615a728561595f565b9350615a80602086016159f5565b92506040850151615a9081614fe5565b9150615a9e606086016159f5565b905092959194509250565b600061ffff808316818103615ac057615ac06157b4565b6001019392505050565b61ffff8181168382160280821691908281146137be576137be6157b4565b634e487b7160e01b600052601260045260246000fd5b600061ffff80841680615b1357615b13615ae8565b92169190910492915050565b634e487b7160e01b600052603160045260246000fd5b60006001600160a01b03808716835280861660208401525060806040830152615b616080830185614f8e565b9050615b6c83615059565b82606083015295945050505050565b600082615b8a57615b8a615ae8565b500490565b63ffffffff828116828216039080821115615bac57615bac6157b4565b5092915050565b8082028115828204841417610da957610da96157b4565b60008251615bdc818460208701615069565b919091019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122019aa0081e69056404e40023f916698c2b116cb83388048dea2cf1b230e45ab7b64736f6c63430008110033", + "linkReferences": { + "contracts/SigUtil.sol": { + "SigUtil": [ + { + "length": 20, + "start": 10373 + } + ] + } + }, + "deployedLinkReferences": { + "contracts/SigUtil.sol": { + "SigUtil": [ + { + "length": 20, + "start": 10296 + } + ] + } + } +} diff --git a/docker/v03/validator_eth_key.json b/docker/v3/validator_eth_key.json similarity index 100% rename from docker/v03/validator_eth_key.json rename to docker/v3/validator_eth_key.json From adac7dc0b6ed7512c6fc2b8a74d98e4297055378 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Tue, 10 Sep 2024 01:44:21 +0700 Subject: [PATCH 08/25] add: docker which includes snodes (v2) --- README.md | 54 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index e9dd601..149d455 100644 --- a/README.md +++ b/README.md @@ -320,37 +320,47 @@ docker network create push-shared-network cd /Users/w/chain/push-node-smart-contracts docker build . -t hardhat-main -## prepare image for V +## prepare image for V (if needed) cd /Users/w/chain/push-vnode docker build . -t vnode-main + +## prepare image for S (if needed) +cd /Users/w/chain/push-snode +docker build . -t snode-main ``` -Run (2 shell tabs recommended) +Run (3 shell tabs recommended; remove '-d' for debug) + ```bash -## run mysql + redis + phpmyadmin (shell1) + hardhat -## add up -d for background cd /Users/w/chain/push-vnode -docker-compose up -## run vnode1 + vnode2 + vnode3 (shell2) -cd /Users/w/push-vnode -export DB_PASS=s1mpl3 -export DB_USER=2roor -docker-compose -f net.yml up +## run mysql + postgres + redis + phpmyadmin + hardhat +export POSTGRES_USER=postgres +export POSTGRES_PASSWORD=postgres +export DB_PASS=mysql +export DB_USER=mysql +docker-compose -f db.yml up -d + +## run vnode1 + vnode2 + vnode3 +docker-compose -f v.yml up -d + +## run snode1 + snode2 +docker-compose -f s.yml up -d -## up -d for background +## read logs +docker-compose -f s.yml logs -f ``` Check that all docker DNS is online (OPTIONAL) ```bash -docker exec redis-main bash -c " getent hosts redis.local " -docker exec redis-main bash -c " getent hosts mysql.local " -docker exec redis-main bash -c " getent hosts phpmyadmin.local " -docker exec redis-main bash -c " getent hosts hardhat.local " -docker exec redis-main bash -c " getent hosts vnode1.local " -docker exec redis-main bash -c " getent hosts vnode2.local " -docker exec redis-main bash -c " getent hosts vnode3.local " +docker exec redis bash -c " getent hosts redis.local " +docker exec redis bash -c " getent hosts mysql.local " +docker exec redis bash -c " getent hosts phpmyadmin.local " +docker exec redis bash -c " getent hosts hardhat.local " +docker exec redis bash -c " getent hosts vnode1.local " +docker exec redis bash -c " getent hosts vnode2.local " +docker exec redis bash -c " getent hosts vnode3.local " ``` Test @@ -386,7 +396,7 @@ echo ------------ ``` Smoke-test validator api ```shell -### get api token +### 1 get api token curl --location 'http://localhost:4001/api/v1/rpc/' \ --header 'Content-Type: application/json' \ --data '{ @@ -396,7 +406,7 @@ curl --location 'http://localhost:4001/api/v1/rpc/' \ "id": 1 }' echo ------------ -### send a test transaction (DUMMY DATA) +### 2 send a test transaction (DUMMY DATA) curl --location 'http://localhost:4001/api/v1/rpc/' \ --header 'Content-Type: application/json' \ --data '{ @@ -407,7 +417,7 @@ curl --location 'http://localhost:4001/api/v1/rpc/' \ }' echo ------------ -### read transaction queue size +### 3 read transaction queue size curl --location 'http://localhost:4001/api/v1/rpc/' \ --header 'Content-Type: application/json' \ --data '{ @@ -417,7 +427,7 @@ curl --location 'http://localhost:4001/api/v1/rpc/' \ "id": 1 }' -### read transaction queue +### 4 read transaction queue curl --location 'http://localhost:4001/api/v1/rpc/' \ --header 'Content-Type: application/json' \ --data '{ From 3ed88fbf07e470ee4d347a672f878a08fe56b0b5 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Wed, 11 Sep 2024 17:33:54 +0700 Subject: [PATCH 09/25] add: cleanup.sh to reset containers --- docker/cleanup.sh | 36 ++++++++++++++++++++++++++++++++++++ docker/dns.yml | 17 +++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100755 docker/cleanup.sh create mode 100644 docker/dns.yml diff --git a/docker/cleanup.sh b/docker/cleanup.sh new file mode 100755 index 0000000..6a42525 --- /dev/null +++ b/docker/cleanup.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +# stops everything +# deletes logs and database directory state + +read -p "Are you sure you want to stop containers and clear data? (y/n): " choice +case "$choice" in + y|Y ) echo "Proceeding with cleanup...";; + * ) echo "Cleanup aborted."; exit 1;; +esac + +echo "starting cleanup" + +echo "stopping s nodes" +docker-compose -f s.yml down +sleep 10 + +echo "stopping v nodes" +docker-compose -f v.yml down +sleep 10 + +echo "stopping db nodes" +docker-compose -f db.yml down +sleep 10 + +echo "removing logs" +for i in {1..10}; do + rm -f "v${i}/log/error.log" "v${i}/log/debug.log" + rm -f "s${i}/log/error.log" "s${i}/log/debug.log" +done +sleep 10 + +echo "removing db state" +rm -rf external + +echo "cleanup done" \ No newline at end of file diff --git a/docker/dns.yml b/docker/dns.yml new file mode 100644 index 0000000..0aad4c0 --- /dev/null +++ b/docker/dns.yml @@ -0,0 +1,17 @@ +version: '3.8' + +services: + dns: + image: dns-main + container_name: dns + networks: + push-shared-network: + aliases: + - dns.local + ports: + - "53:53/udp" + restart: unless-stopped + +networks: + push-shared-network: + external: true \ No newline at end of file From e6e913d7769ff7db32e732c58116469932e53358 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Wed, 11 Sep 2024 19:37:31 +0700 Subject: [PATCH 10/25] fix: added missing .env files for docker setup --- docker/s1/.env | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++ docker/s2/.env | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++ docker/v1/.env | 48 +++++++++++++++++++++++++++++++++++++++++++ docker/v2/.env | 48 +++++++++++++++++++++++++++++++++++++++++++ docker/v3/.env | 48 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 256 insertions(+) create mode 100644 docker/s1/.env create mode 100644 docker/s2/.env create mode 100644 docker/v1/.env create mode 100644 docker/v2/.env create mode 100644 docker/v3/.env diff --git a/docker/s1/.env b/docker/s1/.env new file mode 100644 index 0000000..33a2ff9 --- /dev/null +++ b/docker/s1/.env @@ -0,0 +1,56 @@ +# ENVIRONMENT | 'development' or 'production' +NODE_ENV='development' +PORT=3001 +RUNNING_ON_MACHINE=mac +LOG_LEVEL='debug' +# Server environment: PROD or STAGING or DEV +PUSH_NODES_NET=DEV + +# PG DATABASE (for inbox indexing) +PG_HOST=localhost +PG_NAME=snode1 +PG_USER=postgres +PG_PASS=postgres + +# MYSQL DATABASE (for everything else) +DB_HOST=localhost +DB_NAME=snode1 +DB_USER=2roor +DB_PASS=s1mpl3 + + + +######### Validator +# encrypted private key file +VALIDATOR_PRIVATE_KEY_FILE=validator_eth_key.json +# ! do not store this password on DISK in production, use only as ENV var +VALIDATOR_PRIVATE_KEY_PASS=test + +VALIDATOR_RPC_ENDPOINT=http://127.0.0.1:8545/ +VALIDATOR_RPC_NETWORK=1337 +# push token smart contract +VALIDATOR_PUSH_TOKEN_ADDRESS=0x5FbDB2315678afecb367f032d93F642f64180aa3 +# validator smart contract +VALIDATOR_CONTRACT_ADDRESS=0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9 +# storage smart contract +STORAGE_CONTRACT_ADDRESS=0x0165878A594ca255338adfa4d48449f69242Eb8F + +# development +# log sql +LOG_SQL_STATEMENTS=true +# no http handler starts +VALIDATOR_DISABLE_ALL_SERVICES=true +# do not fetch blockchain data +VALIDATOR_DISABLE_HISTORY_SYNC=true +# write logs +VALIDATOR_DEBUG_LOG=true +# do not validate payload +VALIDATOR_SKIP_PAYLOAD_VERIFICATION=true +# do not rate limit +VALIDATOR_SKIP_RATE_LIMITER=true +# write custom logs for every query +VALIDATOR_HTTP_LOG=true +# random tokens live forever +VALIDATOR_DISABLE_TOKEN_TIMEOUT=true +######## Validator ENDS +REDIS_URL=http://localhost:6379 \ No newline at end of file diff --git a/docker/s2/.env b/docker/s2/.env new file mode 100644 index 0000000..33a2ff9 --- /dev/null +++ b/docker/s2/.env @@ -0,0 +1,56 @@ +# ENVIRONMENT | 'development' or 'production' +NODE_ENV='development' +PORT=3001 +RUNNING_ON_MACHINE=mac +LOG_LEVEL='debug' +# Server environment: PROD or STAGING or DEV +PUSH_NODES_NET=DEV + +# PG DATABASE (for inbox indexing) +PG_HOST=localhost +PG_NAME=snode1 +PG_USER=postgres +PG_PASS=postgres + +# MYSQL DATABASE (for everything else) +DB_HOST=localhost +DB_NAME=snode1 +DB_USER=2roor +DB_PASS=s1mpl3 + + + +######### Validator +# encrypted private key file +VALIDATOR_PRIVATE_KEY_FILE=validator_eth_key.json +# ! do not store this password on DISK in production, use only as ENV var +VALIDATOR_PRIVATE_KEY_PASS=test + +VALIDATOR_RPC_ENDPOINT=http://127.0.0.1:8545/ +VALIDATOR_RPC_NETWORK=1337 +# push token smart contract +VALIDATOR_PUSH_TOKEN_ADDRESS=0x5FbDB2315678afecb367f032d93F642f64180aa3 +# validator smart contract +VALIDATOR_CONTRACT_ADDRESS=0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9 +# storage smart contract +STORAGE_CONTRACT_ADDRESS=0x0165878A594ca255338adfa4d48449f69242Eb8F + +# development +# log sql +LOG_SQL_STATEMENTS=true +# no http handler starts +VALIDATOR_DISABLE_ALL_SERVICES=true +# do not fetch blockchain data +VALIDATOR_DISABLE_HISTORY_SYNC=true +# write logs +VALIDATOR_DEBUG_LOG=true +# do not validate payload +VALIDATOR_SKIP_PAYLOAD_VERIFICATION=true +# do not rate limit +VALIDATOR_SKIP_RATE_LIMITER=true +# write custom logs for every query +VALIDATOR_HTTP_LOG=true +# random tokens live forever +VALIDATOR_DISABLE_TOKEN_TIMEOUT=true +######## Validator ENDS +REDIS_URL=http://localhost:6379 \ No newline at end of file diff --git a/docker/v1/.env b/docker/v1/.env new file mode 100644 index 0000000..ba4b6f3 --- /dev/null +++ b/docker/v1/.env @@ -0,0 +1,48 @@ +######### ENVIRONMENT +PORT=4001 +PUSH_NODES_NET=DEV +RUNNING_ON_MACHINE=mac +LOG_LEVEL=debug + +# DATABASE +DB_HOST=localhost +DB_NAME=vnode1 +DB_USER=2roor +DB_PASS=s1mpl3 +REDIS_URL=redis://localhost:6379 + +######### Validator +# encrypted private key file +VALIDATOR_PRIVATE_KEY_FILE=validator_eth_key.json +# ! do not store this password on DISK in production, use only as ENV var +VALIDATOR_PRIVATE_KEY_PASS=test + +VALIDATOR_RPC_ENDPOINT=http://localhost:8545 +VALIDATOR_RPC_NETWORK=1337 +# push token smart contract +VALIDATOR_PUSH_TOKEN_ADDRESS=0x5FbDB2315678afecb367f032d93F642f64180aa3 +# validator smart contract +VALIDATOR_CONTRACT_ADDRESS=0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9 +# storage smart contract +STORAGE_CONTRACT_ADDRESS=0x0165878A594ca255338adfa4d48449f69242Eb8F + +# development +# log sql +LOG_SQL_STATEMENTS=true +# no http handler starts +VALIDATOR_DISABLE_ALL_SERVICES=true +# do not fetch blockchain data +VALIDATOR_DISABLE_HISTORY_SYNC=true +# write logs +VALIDATOR_DEBUG_LOG=true +# do not validate payload +VALIDATOR_SKIP_PAYLOAD_VERIFICATION=true +# do not rate limit +VALIDATOR_SKIP_RATE_LIMITER=true +# write custom logs for every query +VALIDATOR_HTTP_LOG=true +# random tokens live forever +VALIDATOR_DISABLE_TOKEN_TIMEOUT=true +######## Validator ENDS + +BLOCK_SCHEDULE=*/15 * * * * * \ No newline at end of file diff --git a/docker/v2/.env b/docker/v2/.env new file mode 100644 index 0000000..2662cfa --- /dev/null +++ b/docker/v2/.env @@ -0,0 +1,48 @@ +######### ENVIRONMENT +PORT=4002 +PUSH_NODES_NET=DEV +RUNNING_ON_MACHINE=mac +LOG_LEVEL=debug + +# DATABASE +DB_HOST=localhost +DB_NAME=vnode2 +DB_USER=2roor +DB_PASS=s1mpl3 +REDIS_URL=redis://localhost:6379 + +######### Validator +# encrypted private key file +VALIDATOR_PRIVATE_KEY_FILE=validator_eth_key.json +# ! do not store this password on DISK in production, use only as ENV var +VALIDATOR_PRIVATE_KEY_PASS=test + +VALIDATOR_RPC_ENDPOINT=http://localhost:8545 +VALIDATOR_RPC_NETWORK=1337 +# push token smart contract +VALIDATOR_PUSH_TOKEN_ADDRESS=0x5FbDB2315678afecb367f032d93F642f64180aa3 +# validator smart contract +VALIDATOR_CONTRACT_ADDRESS=0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9 +# storage smart contract +STORAGE_CONTRACT_ADDRESS=0x0165878A594ca255338adfa4d48449f69242Eb8F + +# development +# log sql +LOG_SQL_STATEMENTS=true +# no http handler starts +VALIDATOR_DISABLE_ALL_SERVICES=true +# do not fetch blockchain data +VALIDATOR_DISABLE_HISTORY_SYNC=true +# write logs +VALIDATOR_DEBUG_LOG=true +# do not validate payload +VALIDATOR_SKIP_PAYLOAD_VERIFICATION=true +# do not rate limit +VALIDATOR_SKIP_RATE_LIMITER=true +# write custom logs for every query +VALIDATOR_HTTP_LOG=true +# random tokens live forever +VALIDATOR_DISABLE_TOKEN_TIMEOUT=true +######## Validator ENDS + +BLOCK_SCHEDULE=*/15 * * * * * \ No newline at end of file diff --git a/docker/v3/.env b/docker/v3/.env new file mode 100644 index 0000000..e877af1 --- /dev/null +++ b/docker/v3/.env @@ -0,0 +1,48 @@ +######### ENVIRONMENT +PORT=4003 +PUSH_NODES_NET=DEV +RUNNING_ON_MACHINE=mac +LOG_LEVEL=debug + +# DATABASE +DB_HOST=localhost +DB_NAME=vnode3 +DB_USER=2roor +DB_PASS=s1mpl3 +REDIS_URL=redis://localhost:6379 + +######### Validator +# encrypted private key file +VALIDATOR_PRIVATE_KEY_FILE=validator_eth_key.json +# ! do not store this password on DISK in production, use only as ENV var +VALIDATOR_PRIVATE_KEY_PASS=test + +VALIDATOR_RPC_ENDPOINT=http://localhost:8545 +VALIDATOR_RPC_NETWORK=1337 +# push token smart contract +VALIDATOR_PUSH_TOKEN_ADDRESS=0x5FbDB2315678afecb367f032d93F642f64180aa3 +# validator smart contract +VALIDATOR_CONTRACT_ADDRESS=0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9 +# storage smart contract +STORAGE_CONTRACT_ADDRESS=0x0165878A594ca255338adfa4d48449f69242Eb8F + +# development +# log sql +LOG_SQL_STATEMENTS=true +# no http handler starts +VALIDATOR_DISABLE_ALL_SERVICES=true +# do not fetch blockchain data +VALIDATOR_DISABLE_HISTORY_SYNC=true +# write logs +VALIDATOR_DEBUG_LOG=true +# do not validate payload +VALIDATOR_SKIP_PAYLOAD_VERIFICATION=true +# do not rate limit +VALIDATOR_SKIP_RATE_LIMITER=true +# write custom logs for every query +VALIDATOR_HTTP_LOG=true +# random tokens live forever +VALIDATOR_DISABLE_TOKEN_TIMEOUT=true +######## Validator ENDS + +BLOCK_SCHEDULE=*/15 * * * * * \ No newline at end of file From 28e7ccd1e91dbc994b36f7538842256b83c94905 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Wed, 11 Sep 2024 21:32:36 +0700 Subject: [PATCH 11/25] fix: fixed ENV propagation, fixed mysql access metadata --- README.md | 14 ++++++++----- docker/cleanup.sh | 14 ++++++------- docker/db.yml | 1 - docker/mysql-init/create_databases.sql | 27 -------------------------- docker/mysql-init/grant-privileges.sh | 24 +++++++++++++++++++++++ docker/v.yml | 6 ++++++ 6 files changed, 46 insertions(+), 40 deletions(-) delete mode 100644 docker/mysql-init/create_databases.sql create mode 100755 docker/mysql-init/grant-privileges.sh diff --git a/README.md b/README.md index 149d455..25eabf4 100644 --- a/README.md +++ b/README.md @@ -333,19 +333,23 @@ Run (3 shell tabs recommended; remove '-d' for debug) ```bash -cd /Users/w/chain/push-vnode +cd /Users/w/chain/push-vnode/docker ## run mysql + postgres + redis + phpmyadmin + hardhat -export POSTGRES_USER=postgres -export POSTGRES_PASSWORD=postgres -export DB_PASS=mysql -export DB_USER=mysql +export POSTGRES_USER=postgres101 +export POSTGRES_PASSWORD=lmnkdwhplk2 +export DB_PASS=sql101 +export DB_USER=lmnkdwhplk2 docker-compose -f db.yml up -d ## run vnode1 + vnode2 + vnode3 +export DB_PASS=2roor +export DB_USER=simple docker-compose -f v.yml up -d ## run snode1 + snode2 +export POSTGRES_USER=postgres101 +export POSTGRES_PASSWORD=lmnkdwhplk2 docker-compose -f s.yml up -d ## read logs diff --git a/docker/cleanup.sh b/docker/cleanup.sh index 6a42525..9920bfb 100755 --- a/docker/cleanup.sh +++ b/docker/cleanup.sh @@ -11,24 +11,24 @@ esac echo "starting cleanup" -echo "stopping s nodes" +echo "removing s nodes" docker-compose -f s.yml down -sleep 10 -echo "stopping v nodes" + +echo "removing v nodes" docker-compose -f v.yml down -sleep 10 -echo "stopping db nodes" + +echo "removing db nodes" docker-compose -f db.yml down -sleep 10 + echo "removing logs" for i in {1..10}; do rm -f "v${i}/log/error.log" "v${i}/log/debug.log" rm -f "s${i}/log/error.log" "s${i}/log/debug.log" done -sleep 10 +sleep 3 echo "removing db state" rm -rf external diff --git a/docker/db.yml b/docker/db.yml index 89a35c9..6fbb3a7 100644 --- a/docker/db.yml +++ b/docker/db.yml @@ -59,7 +59,6 @@ services: restart: always environment: MYSQL_ROOT_PASSWORD: 'pass' - MYSQL_DATABASE: ${DB_NAME} MYSQL_USER: ${DB_USER} MYSQL_PASSWORD: ${DB_PASS} ports: diff --git a/docker/mysql-init/create_databases.sql b/docker/mysql-init/create_databases.sql deleted file mode 100644 index df7e43b..0000000 --- a/docker/mysql-init/create_databases.sql +++ /dev/null @@ -1,27 +0,0 @@ - -CREATE DATABASE vnode2 CHARACTER SET utf8 COLLATE utf8_general_ci; -GRANT ALL PRIVILEGES ON vnode2.* TO '2roor'@'%'; - -CREATE DATABASE vnode3 CHARACTER SET utf8 COLLATE utf8_general_ci; -GRANT ALL PRIVILEGES ON vnode3.* TO '2roor'@'%'; - -CREATE DATABASE vnode4 CHARACTER SET utf8 COLLATE utf8_general_ci; -GRANT ALL PRIVILEGES ON vnode4.* TO '2roor'@'%'; - -CREATE DATABASE vnode5 CHARACTER SET utf8 COLLATE utf8_general_ci; -GRANT ALL PRIVILEGES ON vnode5.* TO '2roor'@'%'; - -CREATE DATABASE vnode6 CHARACTER SET utf8 COLLATE utf8_general_ci; -GRANT ALL PRIVILEGES ON vnode6.* TO '2roor'@'%'; - -CREATE DATABASE vnode7 CHARACTER SET utf8 COLLATE utf8_general_ci; -GRANT ALL PRIVILEGES ON vnode7.* TO '2roor'@'%'; - -CREATE DATABASE vnode8 CHARACTER SET utf8 COLLATE utf8_general_ci; -GRANT ALL PRIVILEGES ON vnode8.* TO '2roor'@'%'; - -CREATE DATABASE vnode9 CHARACTER SET utf8 COLLATE utf8_general_ci; -GRANT ALL PRIVILEGES ON vnode9.* TO '2roor'@'%'; - -CREATE DATABASE vnode10 CHARACTER SET utf8 COLLATE utf8_general_ci; -GRANT ALL PRIVILEGES ON vnode10.* TO '2roor'@'%'; diff --git a/docker/mysql-init/grant-privileges.sh b/docker/mysql-init/grant-privileges.sh new file mode 100755 index 0000000..8824739 --- /dev/null +++ b/docker/mysql-init/grant-privileges.sh @@ -0,0 +1,24 @@ +#!/bin/bash +echo "" > /docker-entrypoint-initdb.d/grant-privileges.sql + +# create user +# user is being created by docker-compose param MYSQL_USER +# additional users can be crated like this +# echo "CREATE USER '${MYSQL_USER}'@'%' IDENTIFIED BY '${MYSQL_PASSWORD}';" >> /docker-entrypoint-initdb.d/grant-privileges.sql + +# grant all permissions to every test db we have +echo "CREATE DATABASE vnode1 CHARACTER SET utf8 COLLATE utf8_general_ci; " >> /docker-entrypoint-initdb.d/grant-privileges.sql +echo "GRANT ALL PRIVILEGES ON vnode1.* TO '${MYSQL_USER}'@'%'; " >> /docker-entrypoint-initdb.d/grant-privileges.sql + +echo "CREATE DATABASE vnode2 CHARACTER SET utf8 COLLATE utf8_general_ci;" >> /docker-entrypoint-initdb.d/grant-privileges.sql +echo "GRANT ALL PRIVILEGES ON vnode2.* TO '${MYSQL_USER}'@'%'; " >> /docker-entrypoint-initdb.d/grant-privileges.sql + +echo "CREATE DATABASE vnode3 CHARACTER SET utf8 COLLATE utf8_general_ci;" >> /docker-entrypoint-initdb.d/grant-privileges.sql +echo "GRANT ALL PRIVILEGES ON vnode3.* TO '${MYSQL_USER}'@'%'; " >> /docker-entrypoint-initdb.d/grant-privileges.sql + +# apply +echo "FLUSH PRIVILEGES;" >> /docker-entrypoint-initdb.d/grant-privileges.sql + + +echo "FINAL GENERATED SQL:" +cat /docker-entrypoint-initdb.d/grant-privileges.sql diff --git a/docker/v.yml b/docker/v.yml index 5521c36..8c7b474 100644 --- a/docker/v.yml +++ b/docker/v.yml @@ -14,6 +14,8 @@ services: CONFIG_DIR: /config LOG_DIR: /log DB_HOST: mysql.local + DB_USER: ${DB_USER} + DB_PASS: ${DB_PASS} REDIS_URL: redis://redis.local:6379 VALIDATOR_RPC_ENDPOINT: http://hardhat.local:8545 VALIDATOR_RPC_NETWORK: 1337 @@ -37,6 +39,8 @@ services: CONFIG_DIR: /config LOG_DIR: /log DB_HOST: mysql.local + DB_USER: ${DB_USER} + DB_PASS: ${DB_PASS} REDIS_URL: redis://redis.local:6379 VALIDATOR_RPC_ENDPOINT: http://hardhat.local:8545 VALIDATOR_RPC_NETWORK: 1337 @@ -60,6 +64,8 @@ services: CONFIG_DIR: /config LOG_DIR: /log DB_HOST: mysql.local + DB_USER: ${DB_USER} + DB_PASS: ${DB_PASS} REDIS_URL: redis://redis.local:6379 VALIDATOR_RPC_ENDPOINT: http://hardhat.local:8545 VALIDATOR_RPC_NETWORK: 1337 From 457780f54a509cb90f3674399070ad2c4683da2e Mon Sep 17 00:00:00 2001 From: Igx22 Date: Wed, 11 Sep 2024 22:05:18 +0700 Subject: [PATCH 12/25] fix: fixed ENV propagation, fixed mysql access metadata (2) --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 25eabf4..ec6523a 100644 --- a/README.md +++ b/README.md @@ -338,13 +338,13 @@ cd /Users/w/chain/push-vnode/docker ## run mysql + postgres + redis + phpmyadmin + hardhat export POSTGRES_USER=postgres101 export POSTGRES_PASSWORD=lmnkdwhplk2 -export DB_PASS=sql101 -export DB_USER=lmnkdwhplk2 +export DB_USER=sql101 +export DB_PASS=lmnkdwhplk2 docker-compose -f db.yml up -d ## run vnode1 + vnode2 + vnode3 -export DB_PASS=2roor -export DB_USER=simple +export DB_USER=sql101 +export DB_PASS=lmnkdwhplk2 docker-compose -f v.yml up -d ## run snode1 + snode2 From 13f125e8f321fe7f38315a0cb6de23d4feba1882 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Wed, 11 Sep 2024 22:59:28 +0700 Subject: [PATCH 13/25] fix: new InitDid format --- src/generated/push/block_pb.d.ts | 7 ++-- src/generated/push/block_pb.js | 39 +++++++++++--------- src/proto/push/block.proto | 4 +- src/services/messaging-common/redisClient.ts | 3 +- 4 files changed, 29 insertions(+), 24 deletions(-) diff --git a/src/generated/push/block_pb.d.ts b/src/generated/push/block_pb.d.ts index 3135ecd..0e3e935 100644 --- a/src/generated/push/block_pb.d.ts +++ b/src/generated/push/block_pb.d.ts @@ -287,9 +287,8 @@ export class InitDid extends jspb.Message { getDerivedpubkey(): string; setDerivedpubkey(value: string): void; - getEncderivedprivkey(): string; - setEncderivedprivkey(value: string): void; - + getWallettoencderivedkeyMap(): jspb.Map; + clearWallettoencderivedkeyMap(): void; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): InitDid.AsObject; static toObject(includeInstance: boolean, msg: InitDid): InitDid.AsObject; @@ -306,7 +305,7 @@ export namespace InitDid { masterpubkey: string, derivedkeyindex: number, derivedpubkey: string, - encderivedprivkey: string, + wallettoencderivedkeyMap: Array<[string, string]>, } } diff --git a/src/generated/push/block_pb.js b/src/generated/push/block_pb.js index 05d5104..0cfdd3b 100644 --- a/src/generated/push/block_pb.js +++ b/src/generated/push/block_pb.js @@ -2427,7 +2427,7 @@ proto.push.InitDid.toObject = function(includeInstance, msg) { masterpubkey: jspb.Message.getFieldWithDefault(msg, 2, ""), derivedkeyindex: jspb.Message.getFieldWithDefault(msg, 3, 0), derivedpubkey: jspb.Message.getFieldWithDefault(msg, 4, ""), - encderivedprivkey: jspb.Message.getFieldWithDefault(msg, 5, "") + wallettoencderivedkeyMap: (f = msg.getWallettoencderivedkeyMap()) ? f.toObject(includeInstance, undefined) : [] }; if (includeInstance) { @@ -2480,9 +2480,11 @@ proto.push.InitDid.deserializeBinaryFromReader = function(msg, reader) { var value = /** @type {string} */ (reader.readString()); msg.setDerivedpubkey(value); break; - case 5: - var value = /** @type {string} */ (reader.readString()); - msg.setEncderivedprivkey(value); + case 6: + var value = msg.getWallettoencderivedkeyMap(); + reader.readMessage(value, function(message, reader) { + jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readString, null, "", ""); + }); break; default: reader.skipField(); @@ -2541,12 +2543,9 @@ proto.push.InitDid.serializeBinaryToWriter = function(message, writer) { f ); } - f = message.getEncderivedprivkey(); - if (f.length > 0) { - writer.writeString( - 5, - f - ); + f = message.getWallettoencderivedkeyMap(true); + if (f && f.getLength() > 0) { + f.serializeBinary(6, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeString); } }; @@ -2624,21 +2623,25 @@ proto.push.InitDid.prototype.setDerivedpubkey = function(value) { /** - * optional string encDerivedPrivKey = 5; - * @return {string} + * map walletToEncDerivedKey = 6; + * @param {boolean=} opt_noLazyCreate Do not create the map if + * empty, instead returning `undefined` + * @return {!jspb.Map} */ -proto.push.InitDid.prototype.getEncderivedprivkey = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "")); +proto.push.InitDid.prototype.getWallettoencderivedkeyMap = function(opt_noLazyCreate) { + return /** @type {!jspb.Map} */ ( + jspb.Message.getMapField(this, 6, opt_noLazyCreate, + null)); }; /** - * @param {string} value + * Clears values from the map. The map will be non-null. * @return {!proto.push.InitDid} returns this */ -proto.push.InitDid.prototype.setEncderivedprivkey = function(value) { - return jspb.Message.setProto3StringField(this, 5, value); -}; +proto.push.InitDid.prototype.clearWallettoencderivedkeyMap = function() { + this.getWallettoencderivedkeyMap().clear(); + return this;}; diff --git a/src/proto/push/block.proto b/src/proto/push/block.proto index 7c9ee6f..3ec9af1 100644 --- a/src/proto/push/block.proto +++ b/src/proto/push/block.proto @@ -105,7 +105,9 @@ message InitDid { string masterPubKey = 2; uint32 derivedKeyIndex = 3; string derivedPubKey = 4; - string encDerivedPrivKey = 5; + // Map to store wallet address and corresponding encrypted derived key + // Note:- There will always be altest 1 mapping + map walletToEncDerivedKey = 6; } enum KeyAction { diff --git a/src/services/messaging-common/redisClient.ts b/src/services/messaging-common/redisClient.ts index b765299..79d87d8 100644 --- a/src/services/messaging-common/redisClient.ts +++ b/src/services/messaging-common/redisClient.ts @@ -3,6 +3,7 @@ import config from '../../config' import { Logger } from 'winston' import { WinstonUtil } from '../../utilz/winstonUtil' import { Service } from 'typedi' +import {EnvLoader} from "../../utilz/envLoader"; @Service() export class RedisClient { @@ -11,7 +12,7 @@ export class RedisClient { public async postConstruct(): Promise { this.client = await createClient({ - url: config.REDIS_URL + url: EnvLoader.getPropertyOrFail("REDIS_URL") }) await this.client.connect() this.client.on('error', (err) => this.log.error('Redis Client Error', err)) From c0e730ca0c9ba9ea79be01dff54607c6f35d7470 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Thu, 12 Sep 2024 00:58:11 +0700 Subject: [PATCH 14/25] fix: running vnodes both local and dockerized: correct domains and port numbers for both cases --- README.md | 4 ++-- docker/dns-main/update-hosts.py | 6 +++--- docker/localz.sh | 10 ++++++++++ docker/s.yml | 2 +- docker/v.yml | 8 ++++---- .../messaging-common/validatorContractState.ts | 15 ++++++++++++--- 6 files changed, 32 insertions(+), 13 deletions(-) create mode 100755 docker/localz.sh diff --git a/README.md b/README.md index ec6523a..403826e 100644 --- a/README.md +++ b/README.md @@ -341,6 +341,8 @@ export POSTGRES_PASSWORD=lmnkdwhplk2 export DB_USER=sql101 export DB_PASS=lmnkdwhplk2 docker-compose -f db.yml up -d +## read logs: docker-compose -f db.yml logs -f +## stop: docker-compose -f db.yml stop ## run vnode1 + vnode2 + vnode3 export DB_USER=sql101 @@ -352,8 +354,6 @@ export POSTGRES_USER=postgres101 export POSTGRES_PASSWORD=lmnkdwhplk2 docker-compose -f s.yml up -d -## read logs -docker-compose -f s.yml logs -f ``` Check that all docker DNS is online (OPTIONAL) diff --git a/docker/dns-main/update-hosts.py b/docker/dns-main/update-hosts.py index d73ccec..c21aa46 100644 --- a/docker/dns-main/update-hosts.py +++ b/docker/dns-main/update-hosts.py @@ -33,12 +33,12 @@ def backup_hosts_file(): def host_entry_exists(hostname): with open("/etc/hosts", "r") as file: content = file.read() - return re.search(rf"127\.0\.0\.1\s+{re.escape(hostname)}\.local", content) + return re.search(rf"127\.0\.0\.1\s+{re.escape(hostname)}\.localz", content) # Function to append a new host entry to /etc/hosts def append_to_hosts(hostname): with open("/etc/hosts", "a") as file: - file.write(f"127.0.0.1 {hostname}.local\n") + file.write(f"127.0.0.1 {hostname}.localz\n") # Main function def update_hosts(): @@ -59,7 +59,7 @@ def update_hosts(): if network == "push-shared-network": # Check if the host entry already exists if not host_entry_exists(name): - print(f"Adding 127.0.0.1 {name}.local to /etc/hosts") + print(f"Adding 127.0.0.1 {name}.localz to /etc/hosts") append_to_hosts(name) else: print(f"{name}.local already exists in /etc/hosts, skipping.") diff --git a/docker/localz.sh b/docker/localz.sh new file mode 100755 index 0000000..c08dc13 --- /dev/null +++ b/docker/localz.sh @@ -0,0 +1,10 @@ +#!/bin/bash +read -p "Add CONTAINER.localz into /etc/hosts for every running container? (y/n): " choice +case "$choice" in + y|Y ) echo "Proceeding ...";; + * ) echo "Aborted."; exit 1;; +esac +echo "sudo for editing /etc/hosts" +sudo python3 dns-main/update-hosts.py +echo "showing /etc/hosts" +cat /etc/hosts | grep ".localz" \ No newline at end of file diff --git a/docker/s.yml b/docker/s.yml index 9abe95c..7fd9607 100644 --- a/docker/s.yml +++ b/docker/s.yml @@ -52,7 +52,7 @@ services: VALIDATOR_RPC_ENDPOINT: http://hardhat.local:8545 VALIDATOR_RPC_NETWORK: 1337 ports: - - "3002:3001" + - "3002:3002" volumes: - ./s2:/config - ./s2/log:/log diff --git a/docker/v.yml b/docker/v.yml index 8c7b474..d9609ff 100644 --- a/docker/v.yml +++ b/docker/v.yml @@ -35,7 +35,7 @@ services: - vnode2.local environment: DB_NAME: vnode2 - PORT: 4001 + PORT: 4002 CONFIG_DIR: /config LOG_DIR: /log DB_HOST: mysql.local @@ -45,7 +45,7 @@ services: VALIDATOR_RPC_ENDPOINT: http://hardhat.local:8545 VALIDATOR_RPC_NETWORK: 1337 ports: - - "4002:4001" + - "4002:4002" volumes: - ./v2:/config - ./v2/log:/log @@ -60,7 +60,7 @@ services: - vnode3.local environment: DB_NAME: vnode3 - PORT: 4001 + PORT: 4003 CONFIG_DIR: /config LOG_DIR: /log DB_HOST: mysql.local @@ -70,7 +70,7 @@ services: VALIDATOR_RPC_ENDPOINT: http://hardhat.local:8545 VALIDATOR_RPC_NETWORK: 1337 ports: - - "4003:4001" + - "4003:4003" volumes: - ./v3:/config - ./v3/log:/log diff --git a/src/services/messaging-common/validatorContractState.ts b/src/services/messaging-common/validatorContractState.ts index 6d00abd..fc15012 100644 --- a/src/services/messaging-common/validatorContractState.ts +++ b/src/services/messaging-common/validatorContractState.ts @@ -238,13 +238,21 @@ export class ValidatorCtClient { ) } + + private fixNodeUrl(nodeUrl: string) { + if (EnvLoader.getPropertyAsBool("LOCALZ") && !StrUtil.isEmpty(nodeUrl)) { + return nodeUrl.replace(".local", ".localz"); + } + return nodeUrl; + } + private async loadVSDNodesAndSubscribeToUpdates() { const vNodes = await this.contract.getVNodes() for (const nodeAddr of vNodes) { const niFromCt = await this.contract.getNodeInfo(nodeAddr) const ni = new NodeInfo( niFromCt.nodeWallet, - niFromCt.nodeApiBaseUrl, + this.fixNodeUrl(niFromCt.nodeApiBaseUrl), niFromCt.nodeType, niFromCt.status ) @@ -257,7 +265,7 @@ export class ValidatorCtClient { const niFromCt = await this.contract.getNodeInfo(nodeAddr) const ni = new NodeInfo( niFromCt.nodeWallet, - niFromCt.nodeApiBaseUrl, + this.fixNodeUrl(niFromCt.nodeApiBaseUrl), niFromCt.nodeType, niFromCt.status ) @@ -270,7 +278,7 @@ export class ValidatorCtClient { const niFromCt = await this.contract.getNodeInfo(nodeAddr) const ni = new NodeInfo( niFromCt.nodeWallet, - niFromCt.nodeApiBaseUrl, + this.fixNodeUrl(niFromCt.nodeApiBaseUrl), niFromCt.nodeType, niFromCt.status ) @@ -287,6 +295,7 @@ export class ValidatorCtClient { nodeTokens: number, nodeApiBaseUrl: string ) => { + nodeApiBaseUrl = this.fixNodeUrl(nodeApiBaseUrl); this.log.info('NodeAdded %o', arguments) this.log.info( 'NodeAdded %s %s %s %s %s', From ce01cd516c4eb7fe8abeeb5e358d87cb33f1fc01 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Thu, 12 Sep 2024 01:50:34 +0700 Subject: [PATCH 15/25] fix: docs --- README.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 403826e..9bd1653 100644 --- a/README.md +++ b/README.md @@ -340,9 +340,13 @@ export POSTGRES_USER=postgres101 export POSTGRES_PASSWORD=lmnkdwhplk2 export DB_USER=sql101 export DB_PASS=lmnkdwhplk2 -docker-compose -f db.yml up -d -## read logs: docker-compose -f db.yml logs -f -## stop: docker-compose -f db.yml stop +docker-compose -f db.yml up -d +## re-create container (non-existing) db.yml up -d +## read logs: db.yml logs -f +## start (existing) db.yml start +## stop (existing) db.yml stop +## delete container: db.yml down +## delete everything: ./cleanup.sh ## run vnode1 + vnode2 + vnode3 export DB_USER=sql101 From dfe379f2e8a7ab5423b2a0ec2889a526d89e7157 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Thu, 12 Sep 2024 14:22:50 +0700 Subject: [PATCH 16/25] fix: localh zone for local startup --- docker/dns-main/update-hosts.py | 6 +++--- docker/{localz.sh => localh.sh} | 4 ++-- src/services/messaging-common/validatorContractState.ts | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) rename docker/{localz.sh => localh.sh} (70%) diff --git a/docker/dns-main/update-hosts.py b/docker/dns-main/update-hosts.py index c21aa46..c442b9e 100644 --- a/docker/dns-main/update-hosts.py +++ b/docker/dns-main/update-hosts.py @@ -33,12 +33,12 @@ def backup_hosts_file(): def host_entry_exists(hostname): with open("/etc/hosts", "r") as file: content = file.read() - return re.search(rf"127\.0\.0\.1\s+{re.escape(hostname)}\.localz", content) + return re.search(rf"127\.0\.0\.1\s+{re.escape(hostname)}\.localh", content) # Function to append a new host entry to /etc/hosts def append_to_hosts(hostname): with open("/etc/hosts", "a") as file: - file.write(f"127.0.0.1 {hostname}.localz\n") + file.write(f"127.0.0.1 {hostname}.localh\n") # Main function def update_hosts(): @@ -59,7 +59,7 @@ def update_hosts(): if network == "push-shared-network": # Check if the host entry already exists if not host_entry_exists(name): - print(f"Adding 127.0.0.1 {name}.localz to /etc/hosts") + print(f"Adding 127.0.0.1 {name}.localh to /etc/hosts") append_to_hosts(name) else: print(f"{name}.local already exists in /etc/hosts, skipping.") diff --git a/docker/localz.sh b/docker/localh.sh similarity index 70% rename from docker/localz.sh rename to docker/localh.sh index c08dc13..e13c40b 100755 --- a/docker/localz.sh +++ b/docker/localh.sh @@ -1,5 +1,5 @@ #!/bin/bash -read -p "Add CONTAINER.localz into /etc/hosts for every running container? (y/n): " choice +read -p "Add CONTAINER.localh into /etc/hosts for every running container? (y/n): " choice case "$choice" in y|Y ) echo "Proceeding ...";; * ) echo "Aborted."; exit 1;; @@ -7,4 +7,4 @@ esac echo "sudo for editing /etc/hosts" sudo python3 dns-main/update-hosts.py echo "showing /etc/hosts" -cat /etc/hosts | grep ".localz" \ No newline at end of file +cat /etc/hosts | grep ".localh" \ No newline at end of file diff --git a/src/services/messaging-common/validatorContractState.ts b/src/services/messaging-common/validatorContractState.ts index fc15012..97dce79 100644 --- a/src/services/messaging-common/validatorContractState.ts +++ b/src/services/messaging-common/validatorContractState.ts @@ -240,8 +240,8 @@ export class ValidatorCtClient { private fixNodeUrl(nodeUrl: string) { - if (EnvLoader.getPropertyAsBool("LOCALZ") && !StrUtil.isEmpty(nodeUrl)) { - return nodeUrl.replace(".local", ".localz"); + if (EnvLoader.getPropertyAsBool("LOCALH") && !StrUtil.isEmpty(nodeUrl)) { + return nodeUrl.replace(".local", ".localh"); } return nodeUrl; } From c706a0005dcc3c7e27cb64ddbb8e48d78b5d0e24 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Thu, 12 Sep 2024 20:29:52 +0700 Subject: [PATCH 17/25] fix: InitDid transaction docs & code --- README.md | 31 +++++----- src/services/messaging/validatorNode.ts | 8 +-- src/utilz/bitUtil.ts | 4 ++ tests/block/block.test.ts | 76 ++++++++++++++++++++++++- 4 files changed, 95 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 9bd1653..c88bc73 100644 --- a/README.md +++ b/README.md @@ -404,28 +404,18 @@ echo ------------ ``` Smoke-test validator api ```shell -### 1 get api token -curl --location 'http://localhost:4001/api/v1/rpc/' \ ---header 'Content-Type: application/json' \ ---data '{ - "jsonrpc": "2.0", - "method": "push_getApiToken", - "params": [], - "id": 1 -}' -echo ------------ -### 2 send a test transaction (DUMMY DATA) +### 1 send a test transaction (DUMMY DATA) (INCLUDES API TOKEN) curl --location 'http://localhost:4001/api/v1/rpc/' \ --header 'Content-Type: application/json' \ --data '{ "jsonrpc": "2.0", "method": "push_sendTransaction", - "params": ["1208494e49545f4449441a0d6569703135353a313a30784141220d6569703135353a313a30784242220d6569703135353a313a307843432a1a0a043078414112043078424218012204307843432a04307844443210d8555d2a5c474fa0a5f588563d50b2873ab40b7b226e6f646573223a5b7b226e6f64654964223a22307838653132644531324333356541426633356235366230344535334334453436386534363732374538222c2274734d696c6c6973223a313732343637333234303033302c2272616e646f6d486578223a2266376266376266303366656130613732353135363965303564653635363832646235353935353765222c2270696e67526573756c7473223a5b7b226e6f64654964223a22307866444145616637616643466262346534643136444336366244323033396664363030344346636538222c2274734d696c6c6973223a313732343637333234303032302c22737461747573223a317d2c7b226e6f64654964223a22307839384639443931304165663942334239413435313337616631434137363735654439306135333535222c2274734d696c6c6973223a313732343637333234303031392c22737461747573223a317d5d2c227369676e6174757265223a22307862333333636331623731633434633430386439366237626662363338353439336366313637636232626432353532376437383664333866376239383065616433303132663736636137386533616231613337653661316363666432306236393364656664303039633837313163666338396630353262333933363866316365383162227d2c7b226e6f64654964223a22307866444145616637616643466262346534643136444336366244323033396664363030344346636538222c2274734d696c6c6973223a313732343637333234303032352c2272616e646f6d486578223a2239323136383734646630653134383539376639643434643064666661656465393538343464643137222c2270696e67526573756c7473223a5b7b226e6f64654964223a22307838653132644531324333356541426633356235366230344535334334453436386534363732374538222c2274734d696c6c6973223a313732343637333232343635302c22737461747573223a317d2c7b226e6f64654964223a22307839384639443931304165663942334239413435313337616631434137363735654439306135333535222c2274734d696c6c6973223a313732343637333232343635352c22737461747573223a317d5d2c227369676e6174757265223a22307837626663343432343464633431376132383463313038353064613335313663353035613036326662323262623538353438383661613239393739653032663139376565633263393664356439343864306131643635306563323334646130356330663933626535653230393136316563326363626331653963396537343238623162227d2c7b226e6f64654964223a22307839384639443931304165663942334239413435313337616631434137363735654439306135333535222c2274734d696c6c6973223a313732343637333234303032342c2272616e646f6d486578223a2230643961313661383939636164306566633838336633343564306638306237666131356136353666222c2270696e67526573756c7473223a5b7b226e6f64654964223a22307838653132644531324333356541426633356235366230344535334334453436386534363732374538222c2274734d696c6c6973223a313732343637333232363934332c22737461747573223a317d2c7b226e6f64654964223a22307866444145616637616643466262346534643136444336366244323033396664363030344346636538222c2274734d696c6c6973223a313732343637333232363934372c22737461747573223a317d5d2c227369676e6174757265223a22307862613632393639366565653830343864313639303730336166656361663866626333663834333139643439316164623363663364663333313131396530303239303531373732303237393137313335333332653430666233323639333963626137663634373636663262363933343065366534663066623336333639386663393162227d5d7d4201ee4a0131"], + "params": ["1208494e49545f4449441a0d6569703135353a313a30784141220d6569703135353a313a30784242220d6569703135353a313a307843432a220a04307841411204307842421801220430784343320c0a043078414112043078424232102efe2783fee44a4d811100b08d0b55483ab40b7b226e6f646573223a5b7b226e6f64654964223a22307838653132644531324333356541426633356235366230344535334334453436386534363732374538222c2274734d696c6c6973223a313732343637333234303033302c2272616e646f6d486578223a2266376266376266303366656130613732353135363965303564653635363832646235353935353765222c2270696e67526573756c7473223a5b7b226e6f64654964223a22307866444145616637616643466262346534643136444336366244323033396664363030344346636538222c2274734d696c6c6973223a313732343637333234303032302c22737461747573223a317d2c7b226e6f64654964223a22307839384639443931304165663942334239413435313337616631434137363735654439306135333535222c2274734d696c6c6973223a313732343637333234303031392c22737461747573223a317d5d2c227369676e6174757265223a22307862333333636331623731633434633430386439366237626662363338353439336366313637636232626432353532376437383664333866376239383065616433303132663736636137386533616231613337653661316363666432306236393364656664303039633837313163666338396630353262333933363866316365383162227d2c7b226e6f64654964223a22307866444145616637616643466262346534643136444336366244323033396664363030344346636538222c2274734d696c6c6973223a313732343637333234303032352c2272616e646f6d486578223a2239323136383734646630653134383539376639643434643064666661656465393538343464643137222c2270696e67526573756c7473223a5b7b226e6f64654964223a22307838653132644531324333356541426633356235366230344535334334453436386534363732374538222c2274734d696c6c6973223a313732343637333232343635302c22737461747573223a317d2c7b226e6f64654964223a22307839384639443931304165663942334239413435313337616631434137363735654439306135333535222c2274734d696c6c6973223a313732343637333232343635352c22737461747573223a317d5d2c227369676e6174757265223a22307837626663343432343464633431376132383463313038353064613335313663353035613036326662323262623538353438383661613239393739653032663139376565633263393664356439343864306131643635306563323334646130356330663933626535653230393136316563326363626331653963396537343238623162227d2c7b226e6f64654964223a22307839384639443931304165663942334239413435313337616631434137363735654439306135333535222c2274734d696c6c6973223a313732343637333234303032342c2272616e646f6d486578223a2230643961313661383939636164306566633838336633343564306638306237666131356136353666222c2270696e67526573756c7473223a5b7b226e6f64654964223a22307838653132644531324333356541426633356235366230344535334334453436386534363732374538222c2274734d696c6c6973223a313732343637333232363934332c22737461747573223a317d2c7b226e6f64654964223a22307866444145616637616643466262346534643136444336366244323033396664363030344346636538222c2274734d696c6c6973223a313732343637333232363934372c22737461747573223a317d5d2c227369676e6174757265223a22307862613632393639366565653830343864313639303730336166656361663866626333663834333139643439316164623363663364663333313131396530303239303531373732303237393137313335333332653430666233323639333963626137663634373636663262363933343065366534663066623336333639386663393162227d5d7d4a01314201ee"], "id": 1 }' echo ------------ -### 3 read transaction queue size +### 2 read transaction queue size curl --location 'http://localhost:4001/api/v1/rpc/' \ --header 'Content-Type: application/json' \ --data '{ @@ -435,7 +425,7 @@ curl --location 'http://localhost:4001/api/v1/rpc/' \ "id": 1 }' -### 4 read transaction queue +### 3 read transaction queue curl --location 'http://localhost:4001/api/v1/rpc/' \ --header 'Content-Type: application/json' \ --data '{ @@ -446,3 +436,16 @@ curl --location 'http://localhost:4001/api/v1/rpc/' \ }' ``` +Smoke test api token +```sh +### 1 get api token +curl --location 'http://localhost:4001/api/v1/rpc/' \ +--header 'Content-Type: application/json' \ +--data '{ +"jsonrpc": "2.0", +"method": "push_getApiToken", +"params": [], +"id": 1 +}' +echo ------------ +``` diff --git a/src/services/messaging/validatorNode.ts b/src/services/messaging/validatorNode.ts index e21d252..dffa6f7 100644 --- a/src/services/messaging/validatorNode.ts +++ b/src/services/messaging/validatorNode.ts @@ -196,7 +196,7 @@ export class ValidatorNode implements StorageContractListener { if (StrUtil.isEmpty(txData.getDerivedpubkey())) { throw new TransactionError(`derivedPubKey missing`); } - if (StrUtil.isEmpty(txData.getEncderivedprivkey())) { + if (txData.getWallettoencderivedkeyMap().size > 0) { throw new TransactionError(`encDerivedPrivKey missing`); } } else if (tx.getCategory() === 'NOTIFICATION') { @@ -290,18 +290,12 @@ export class ValidatorNode implements StorageContractListener { } // todo fake signing as of now let vSign = new Signer(); - vSign.setNode(this.nodeId); - vSign.setRole(1); vSign.setSig("AA11"); let aSign1 = new Signer(); - aSign1.setNode("11"); - aSign1.setRole(2); aSign1.setSig("11"); let aSign2 = new Signer(); - aSign1.setNode("22"); - aSign1.setRole(2); aSign1.setSig("22"); block.setSignersList([vSign, aSign1, aSign2]); diff --git a/src/utilz/bitUtil.ts b/src/utilz/bitUtil.ts index 0830276..a7e7a6c 100644 --- a/src/utilz/bitUtil.ts +++ b/src/utilz/bitUtil.ts @@ -81,6 +81,10 @@ export class BitUtil { return Buffer.from(bytes).toString('base64'); } + public static base64ToBytes(base64String:string):Uint8Array { + return new Uint8Array(Buffer.from(base64String, 'base64')); + } + public static bytesToString(bytes:Uint8Array):string { return Buffer.from(bytes).toString('utf8'); } diff --git a/tests/block/block.test.ts b/tests/block/block.test.ts index 985ed7a..2d2167a 100644 --- a/tests/block/block.test.ts +++ b/tests/block/block.test.ts @@ -1,3 +1,5 @@ +// noinspection DuplicatedCode + import 'mocha' import chai from 'chai' import { @@ -27,6 +29,67 @@ now you can use .proto stubs for typescript describe('block tests', function () { + it('sample transaction 1', async function () { + const data = new InitDid(); + data.setDid('0xAA'); + data.setMasterpubkey('0xBB'); + data.setDerivedkeyindex(1); + data.setDerivedpubkey('0xCC'); + data.getWallettoencderivedkeyMap().set('0xAA', '0xBB'); + + const t = new Transaction(); + t.setType(0); + t.setCategory('INIT_DID'); + t.setSender('eip155:1:0xAA'); + t.setRecipientsList(['eip155:1:0xBB', 'eip155:1:0xCC']); + t.setData(data.serializeBinary()); + t.setSalt(IdUtil.getUuidV4AsBytes()); // uuid.parse(uuid.v4()) + t.setFee("1"); // tbd + t.setSignature(BitUtil.base16ToBytes("EE")); // fake signature + let token = "eyJub2RlcyI6W3sibm9kZUlkIjoiMHg4ZTEyZEUxMkMzNWVBQmYzNWI1NmIwNEU1M0M0RTQ2OGU0NjcyN0U4IiwidHNNaWxsaXMiOjE3MjQ2NzMyNDAwMzAsInJhbmRvbUhleCI6ImY3YmY3YmYwM2ZlYTBhNzI1MTU2OWUwNWRlNjU2ODJkYjU1OTU1N2UiLCJwaW5nUmVzdWx0cyI6W3sibm9kZUlkIjoiMHhmREFFYWY3YWZDRmJiNGU0ZDE2REM2NmJEMjAzOWZkNjAwNENGY2U4IiwidHNNaWxsaXMiOjE3MjQ2NzMyNDAwMjAsInN0YXR1cyI6MX0seyJub2RlSWQiOiIweDk4RjlEOTEwQWVmOUIzQjlBNDUxMzdhZjFDQTc2NzVlRDkwYTUzNTUiLCJ0c01pbGxpcyI6MTcyNDY3MzI0MDAxOSwic3RhdHVzIjoxfV0sInNpZ25hdHVyZSI6IjB4YjMzM2NjMWI3MWM0NGM0MDhkOTZiN2JmYjYzODU0OTNjZjE2N2NiMmJkMjU1MjdkNzg2ZDM4ZjdiOTgwZWFkMzAxMmY3NmNhNzhlM2FiMWEzN2U2YTFjY2ZkMjBiNjkzZGVmZDAwOWM4NzExY2ZjODlmMDUyYjM5MzY4ZjFjZTgxYiJ9LHsibm9kZUlkIjoiMHhmREFFYWY3YWZDRmJiNGU0ZDE2REM2NmJEMjAzOWZkNjAwNENGY2U4IiwidHNNaWxsaXMiOjE3MjQ2NzMyNDAwMjUsInJhbmRvbUhleCI6IjkyMTY4NzRkZjBlMTQ4NTk3ZjlkNDRkMGRmZmFlZGU5NTg0NGRkMTciLCJwaW5nUmVzdWx0cyI6W3sibm9kZUlkIjoiMHg4ZTEyZEUxMkMzNWVBQmYzNWI1NmIwNEU1M0M0RTQ2OGU0NjcyN0U4IiwidHNNaWxsaXMiOjE3MjQ2NzMyMjQ2NTAsInN0YXR1cyI6MX0seyJub2RlSWQiOiIweDk4RjlEOTEwQWVmOUIzQjlBNDUxMzdhZjFDQTc2NzVlRDkwYTUzNTUiLCJ0c01pbGxpcyI6MTcyNDY3MzIyNDY1NSwic3RhdHVzIjoxfV0sInNpZ25hdHVyZSI6IjB4N2JmYzQ0MjQ0ZGM0MTdhMjg0YzEwODUwZGEzNTE2YzUwNWEwNjJmYjIyYmI1ODU0ODg2YWEyOTk3OWUwMmYxOTdlZWMyYzk2ZDVkOTQ4ZDBhMWQ2NTBlYzIzNGRhMDVjMGY5M2JlNWUyMDkxNjFlYzJjY2JjMWU5YzllNzQyOGIxYiJ9LHsibm9kZUlkIjoiMHg5OEY5RDkxMEFlZjlCM0I5QTQ1MTM3YWYxQ0E3Njc1ZUQ5MGE1MzU1IiwidHNNaWxsaXMiOjE3MjQ2NzMyNDAwMjQsInJhbmRvbUhleCI6IjBkOWExNmE4OTljYWQwZWZjODgzZjM0NWQwZjgwYjdmYTE1YTY1NmYiLCJwaW5nUmVzdWx0cyI6W3sibm9kZUlkIjoiMHg4ZTEyZEUxMkMzNWVBQmYzNWI1NmIwNEU1M0M0RTQ2OGU0NjcyN0U4IiwidHNNaWxsaXMiOjE3MjQ2NzMyMjY5NDMsInN0YXR1cyI6MX0seyJub2RlSWQiOiIweGZEQUVhZjdhZkNGYmI0ZTRkMTZEQzY2YkQyMDM5ZmQ2MDA0Q0ZjZTgiLCJ0c01pbGxpcyI6MTcyNDY3MzIyNjk0Nywic3RhdHVzIjoxfV0sInNpZ25hdHVyZSI6IjB4YmE2Mjk2OTZlZWU4MDQ4ZDE2OTA3MDNhZmVjYWY4ZmJjM2Y4NDMxOWQ0OTFhZGIzY2YzZGYzMzExMTllMDAyOTA1MTc3MjAyNzkxNzEzNTMzMmU0MGZiMzI2OTM5Y2JhN2Y2NDc2NmYyYjY5MzQwZTZlNGYwZmIzNjM2OThmYzkxYiJ9XX0="; + t.setApitoken(token); + let tBlob = t.serializeBinary(); + + console.log("\n\n\ntx as base16", BitUtil.bytesToBase16(tBlob)); + console.log("\n\n\ntx as json", JSON.stringify(t.toObject())); + let parsedT = Transaction.deserializeBinary(tBlob); + console.log("\n\n\ntx as json (re-parsed)", JSON.stringify(parsedT.toObject())); + console.log("\n\n\ntx hash", BitUtil.bytesToBase16(HashUtil.sha256AsBytes(tBlob))); + + }) + + it('check 2 types of bytes in tx', async function () { + const t = new Transaction(); + t.setType(0); + t.setCategory('INIT_DID'); + t.setSender('eip155:1:0xAA'); + t.setRecipientsList(['eip155:1:0xBB', 'eip155:1:0xCC']); + t.setData(new Uint8Array()); + t.setSalt(IdUtil.getUuidV4AsBytes()); // uuid.parse(uuid.v4()) + + t.setFee("1"); // tbd + t.setSignature(BitUtil.base16ToBytes("EE")); // fake signature + console.log("-".repeat(40)); + console.log("tx as json", JSON.stringify(t.toObject())); + + + let token = "eyJub2RlcyI6W3sibm9kZUlkIjoiMHg4ZTEyZEUxMkMzNWVBQmYzNWI1NmIwNEU1M0M0RTQ2OGU0NjcyN0U4IiwidHNNaWxsaXMiOjE3MjQ2NzMyNDAwMzAsInJhbmRvbUhleCI6ImY3YmY3YmYwM2ZlYTBhNzI1MTU2OWUwNWRlNjU2ODJkYjU1OTU1N2UiLCJwaW5nUmVzdWx0cyI6W3sibm9kZUlkIjoiMHhmREFFYWY3YWZDRmJiNGU0ZDE2REM2NmJEMjAzOWZkNjAwNENGY2U4IiwidHNNaWxsaXMiOjE3MjQ2NzMyNDAwMjAsInN0YXR1cyI6MX0seyJub2RlSWQiOiIweDk4RjlEOTEwQWVmOUIzQjlBNDUxMzdhZjFDQTc2NzVlRDkwYTUzNTUiLCJ0c01pbGxpcyI6MTcyNDY3MzI0MDAxOSwic3RhdHVzIjoxfV0sInNpZ25hdHVyZSI6IjB4YjMzM2NjMWI3MWM0NGM0MDhkOTZiN2JmYjYzODU0OTNjZjE2N2NiMmJkMjU1MjdkNzg2ZDM4ZjdiOTgwZWFkMzAxMmY3NmNhNzhlM2FiMWEzN2U2YTFjY2ZkMjBiNjkzZGVmZDAwOWM4NzExY2ZjODlmMDUyYjM5MzY4ZjFjZTgxYiJ9LHsibm9kZUlkIjoiMHhmREFFYWY3YWZDRmJiNGU0ZDE2REM2NmJEMjAzOWZkNjAwNENGY2U4IiwidHNNaWxsaXMiOjE3MjQ2NzMyNDAwMjUsInJhbmRvbUhleCI6IjkyMTY4NzRkZjBlMTQ4NTk3ZjlkNDRkMGRmZmFlZGU5NTg0NGRkMTciLCJwaW5nUmVzdWx0cyI6W3sibm9kZUlkIjoiMHg4ZTEyZEUxMkMzNWVBQmYzNWI1NmIwNEU1M0M0RTQ2OGU0NjcyN0U4IiwidHNNaWxsaXMiOjE3MjQ2NzMyMjQ2NTAsInN0YXR1cyI6MX0seyJub2RlSWQiOiIweDk4RjlEOTEwQWVmOUIzQjlBNDUxMzdhZjFDQTc2NzVlRDkwYTUzNTUiLCJ0c01pbGxpcyI6MTcyNDY3MzIyNDY1NSwic3RhdHVzIjoxfV0sInNpZ25hdHVyZSI6IjB4N2JmYzQ0MjQ0ZGM0MTdhMjg0YzEwODUwZGEzNTE2YzUwNWEwNjJmYjIyYmI1ODU0ODg2YWEyOTk3OWUwMmYxOTdlZWMyYzk2ZDVkOTQ4ZDBhMWQ2NTBlYzIzNGRhMDVjMGY5M2JlNWUyMDkxNjFlYzJjY2JjMWU5YzllNzQyOGIxYiJ9LHsibm9kZUlkIjoiMHg5OEY5RDkxMEFlZjlCM0I5QTQ1MTM3YWYxQ0E3Njc1ZUQ5MGE1MzU1IiwidHNNaWxsaXMiOjE3MjQ2NzMyNDAwMjQsInJhbmRvbUhleCI6IjBkOWExNmE4OTljYWQwZWZjODgzZjM0NWQwZjgwYjdmYTE1YTY1NmYiLCJwaW5nUmVzdWx0cyI6W3sibm9kZUlkIjoiMHg4ZTEyZEUxMkMzNWVBQmYzNWI1NmIwNEU1M0M0RTQ2OGU0NjcyN0U4IiwidHNNaWxsaXMiOjE3MjQ2NzMyMjY5NDMsInN0YXR1cyI6MX0seyJub2RlSWQiOiIweGZEQUVhZjdhZkNGYmI0ZTRkMTZEQzY2YkQyMDM5ZmQ2MDA0Q0ZjZTgiLCJ0c01pbGxpcyI6MTcyNDY3MzIyNjk0Nywic3RhdHVzIjoxfV0sInNpZ25hdHVyZSI6IjB4YmE2Mjk2OTZlZWU4MDQ4ZDE2OTA3MDNhZmVjYWY4ZmJjM2Y4NDMxOWQ0OTFhZGIzY2YzZGYzMzExMTllMDAyOTA1MTc3MjAyNzkxNzEzNTMzMmU0MGZiMzI2OTM5Y2JhN2Y2NDc2NmYyYjY5MzQwZTZlNGYwZmIzNjM2OThmYzkxYiJ9XX0="; + t.setApitoken(token); + + // A have a sting in base64, you want to set(Uint8Array) + + let txAsBytes = t.serializeBinary(); + console.log("tx as base16", BitUtil.bytesToBase16(txAsBytes)); + console.log("tx hash", BitUtil.bytesToBase16(HashUtil.sha256AsBytes(txAsBytes))); + + t.setApitoken(BitUtil.base64ToBytes(token)); + let txAsBytes2 = t.serializeBinary(); + console.log("tx as base16", BitUtil.bytesToBase16(txAsBytes2)); + console.log("tx hash", BitUtil.bytesToBase16(HashUtil.sha256AsBytes(txAsBytes2))); + + }) + + it('create transaction and block, serialize/deserialize', async function () { console.log("building ------------------------- "); @@ -36,20 +99,27 @@ describe('block tests', function () { data.setMasterpubkey('0xBB'); data.setDerivedkeyindex(1); data.setDerivedpubkey('0xCC'); - data.setEncderivedprivkey('0xDD'); + data.getWallettoencderivedkeyMap().set('0xAA', '0xBB'); console.log("data as json", JSON.stringify(data.toObject())); // build transaction const t = new Transaction(); - t.setType(3); + t.setType(0); t.setCategory('INIT_DID'); t.setSender('eip155:1:0xAA'); t.setRecipientsList(['eip155:1:0xBB', 'eip155:1:0xCC']); t.setData(data.serializeBinary()) t.setSalt(IdUtil.getUuidV4AsBytes()); // uuid.parse(uuid.v4()) - t.setApitoken("eyJub2RlcyI6W3sibm9kZUlkIjoiMHg4ZTEyZEUxMkMzNWVBQmYzNWI1NmIwNEU1M0M0RTQ2OGU0NjcyN0U4IiwidHNNaWxsaXMiOjE3MjQ2NzMyNDAwMzAsInJhbmRvbUhleCI6ImY3YmY3YmYwM2ZlYTBhNzI1MTU2OWUwNWRlNjU2ODJkYjU1OTU1N2UiLCJwaW5nUmVzdWx0cyI6W3sibm9kZUlkIjoiMHhmREFFYWY3YWZDRmJiNGU0ZDE2REM2NmJEMjAzOWZkNjAwNENGY2U4IiwidHNNaWxsaXMiOjE3MjQ2NzMyNDAwMjAsInN0YXR1cyI6MX0seyJub2RlSWQiOiIweDk4RjlEOTEwQWVmOUIzQjlBNDUxMzdhZjFDQTc2NzVlRDkwYTUzNTUiLCJ0c01pbGxpcyI6MTcyNDY3MzI0MDAxOSwic3RhdHVzIjoxfV0sInNpZ25hdHVyZSI6IjB4YjMzM2NjMWI3MWM0NGM0MDhkOTZiN2JmYjYzODU0OTNjZjE2N2NiMmJkMjU1MjdkNzg2ZDM4ZjdiOTgwZWFkMzAxMmY3NmNhNzhlM2FiMWEzN2U2YTFjY2ZkMjBiNjkzZGVmZDAwOWM4NzExY2ZjODlmMDUyYjM5MzY4ZjFjZTgxYiJ9LHsibm9kZUlkIjoiMHhmREFFYWY3YWZDRmJiNGU0ZDE2REM2NmJEMjAzOWZkNjAwNENGY2U4IiwidHNNaWxsaXMiOjE3MjQ2NzMyNDAwMjUsInJhbmRvbUhleCI6IjkyMTY4NzRkZjBlMTQ4NTk3ZjlkNDRkMGRmZmFlZGU5NTg0NGRkMTciLCJwaW5nUmVzdWx0cyI6W3sibm9kZUlkIjoiMHg4ZTEyZEUxMkMzNWVBQmYzNWI1NmIwNEU1M0M0RTQ2OGU0NjcyN0U4IiwidHNNaWxsaXMiOjE3MjQ2NzMyMjQ2NTAsInN0YXR1cyI6MX0seyJub2RlSWQiOiIweDk4RjlEOTEwQWVmOUIzQjlBNDUxMzdhZjFDQTc2NzVlRDkwYTUzNTUiLCJ0c01pbGxpcyI6MTcyNDY3MzIyNDY1NSwic3RhdHVzIjoxfV0sInNpZ25hdHVyZSI6IjB4N2JmYzQ0MjQ0ZGM0MTdhMjg0YzEwODUwZGEzNTE2YzUwNWEwNjJmYjIyYmI1ODU0ODg2YWEyOTk3OWUwMmYxOTdlZWMyYzk2ZDVkOTQ4ZDBhMWQ2NTBlYzIzNGRhMDVjMGY5M2JlNWUyMDkxNjFlYzJjY2JjMWU5YzllNzQyOGIxYiJ9LHsibm9kZUlkIjoiMHg5OEY5RDkxMEFlZjlCM0I5QTQ1MTM3YWYxQ0E3Njc1ZUQ5MGE1MzU1IiwidHNNaWxsaXMiOjE3MjQ2NzMyNDAwMjQsInJhbmRvbUhleCI6IjBkOWExNmE4OTljYWQwZWZjODgzZjM0NWQwZjgwYjdmYTE1YTY1NmYiLCJwaW5nUmVzdWx0cyI6W3sibm9kZUlkIjoiMHg4ZTEyZEUxMkMzNWVBQmYzNWI1NmIwNEU1M0M0RTQ2OGU0NjcyN0U4IiwidHNNaWxsaXMiOjE3MjQ2NzMyMjY5NDMsInN0YXR1cyI6MX0seyJub2RlSWQiOiIweGZEQUVhZjdhZkNGYmI0ZTRkMTZEQzY2YkQyMDM5ZmQ2MDA0Q0ZjZTgiLCJ0c01pbGxpcyI6MTcyNDY3MzIyNjk0Nywic3RhdHVzIjoxfV0sInNpZ25hdHVyZSI6IjB4YmE2Mjk2OTZlZWU4MDQ4ZDE2OTA3MDNhZmVjYWY4ZmJjM2Y4NDMxOWQ0OTFhZGIzY2YzZGYzMzExMTllMDAyOTA1MTc3MjAyNzkxNzEzNTMzMmU0MGZiMzI2OTM5Y2JhN2Y2NDc2NmYyYjY5MzQwZTZlNGYwZmIzNjM2OThmYzkxYiJ9XX0="); // fake token + let token = "eyJub2RlcyI6W3sibm9kZUlkIjoiMHg4ZTEyZEUxMkMzNWVBQmYzNWI1NmIwNEU1M0M0RTQ2OGU0NjcyN0U4IiwidHNNaWxsaXMiOjE3MjQ2NzMyNDAwMzAsInJhbmRvbUhleCI6ImY3YmY3YmYwM2ZlYTBhNzI1MTU2OWUwNWRlNjU2ODJkYjU1OTU1N2UiLCJwaW5nUmVzdWx0cyI6W3sibm9kZUlkIjoiMHhmREFFYWY3YWZDRmJiNGU0ZDE2REM2NmJEMjAzOWZkNjAwNENGY2U4IiwidHNNaWxsaXMiOjE3MjQ2NzMyNDAwMjAsInN0YXR1cyI6MX0seyJub2RlSWQiOiIweDk4RjlEOTEwQWVmOUIzQjlBNDUxMzdhZjFDQTc2NzVlRDkwYTUzNTUiLCJ0c01pbGxpcyI6MTcyNDY3MzI0MDAxOSwic3RhdHVzIjoxfV0sInNpZ25hdHVyZSI6IjB4YjMzM2NjMWI3MWM0NGM0MDhkOTZiN2JmYjYzODU0OTNjZjE2N2NiMmJkMjU1MjdkNzg2ZDM4ZjdiOTgwZWFkMzAxMmY3NmNhNzhlM2FiMWEzN2U2YTFjY2ZkMjBiNjkzZGVmZDAwOWM4NzExY2ZjODlmMDUyYjM5MzY4ZjFjZTgxYiJ9LHsibm9kZUlkIjoiMHhmREFFYWY3YWZDRmJiNGU0ZDE2REM2NmJEMjAzOWZkNjAwNENGY2U4IiwidHNNaWxsaXMiOjE3MjQ2NzMyNDAwMjUsInJhbmRvbUhleCI6IjkyMTY4NzRkZjBlMTQ4NTk3ZjlkNDRkMGRmZmFlZGU5NTg0NGRkMTciLCJwaW5nUmVzdWx0cyI6W3sibm9kZUlkIjoiMHg4ZTEyZEUxMkMzNWVBQmYzNWI1NmIwNEU1M0M0RTQ2OGU0NjcyN0U4IiwidHNNaWxsaXMiOjE3MjQ2NzMyMjQ2NTAsInN0YXR1cyI6MX0seyJub2RlSWQiOiIweDk4RjlEOTEwQWVmOUIzQjlBNDUxMzdhZjFDQTc2NzVlRDkwYTUzNTUiLCJ0c01pbGxpcyI6MTcyNDY3MzIyNDY1NSwic3RhdHVzIjoxfV0sInNpZ25hdHVyZSI6IjB4N2JmYzQ0MjQ0ZGM0MTdhMjg0YzEwODUwZGEzNTE2YzUwNWEwNjJmYjIyYmI1ODU0ODg2YWEyOTk3OWUwMmYxOTdlZWMyYzk2ZDVkOTQ4ZDBhMWQ2NTBlYzIzNGRhMDVjMGY5M2JlNWUyMDkxNjFlYzJjY2JjMWU5YzllNzQyOGIxYiJ9LHsibm9kZUlkIjoiMHg5OEY5RDkxMEFlZjlCM0I5QTQ1MTM3YWYxQ0E3Njc1ZUQ5MGE1MzU1IiwidHNNaWxsaXMiOjE3MjQ2NzMyNDAwMjQsInJhbmRvbUhleCI6IjBkOWExNmE4OTljYWQwZWZjODgzZjM0NWQwZjgwYjdmYTE1YTY1NmYiLCJwaW5nUmVzdWx0cyI6W3sibm9kZUlkIjoiMHg4ZTEyZEUxMkMzNWVBQmYzNWI1NmIwNEU1M0M0RTQ2OGU0NjcyN0U4IiwidHNNaWxsaXMiOjE3MjQ2NzMyMjY5NDMsInN0YXR1cyI6MX0seyJub2RlSWQiOiIweGZEQUVhZjdhZkNGYmI0ZTRkMTZEQzY2YkQyMDM5ZmQ2MDA0Q0ZjZTgiLCJ0c01pbGxpcyI6MTcyNDY3MzIyNjk0Nywic3RhdHVzIjoxfV0sInNpZ25hdHVyZSI6IjB4YmE2Mjk2OTZlZWU4MDQ4ZDE2OTA3MDNhZmVjYWY4ZmJjM2Y4NDMxOWQ0OTFhZGIzY2YzZGYzMzExMTllMDAyOTA1MTc3MjAyNzkxNzEzNTMzMmU0MGZiMzI2OTM5Y2JhN2Y2NDc2NmYyYjY5MzQwZTZlNGYwZmIzNjM2OThmYzkxYiJ9XX0="; + t.setApitoken(BitUtil.base64ToBytes(token)); // fake token + + + + // A have a sting in base64, you want to set(Uint8Array) + t.setFee("1"); // tbd t.setSignature(BitUtil.base16ToBytes("EE")); // fake signature + console.log("-".repeat(40)); console.log("tx as json", JSON.stringify(t.toObject())); const txAsBytes = t.serializeBinary(); From 1eb1c7159dea5591385d67d7596ead1095e3e896 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Fri, 13 Sep 2024 17:40:20 +0700 Subject: [PATCH 18/25] fix: node.local points to localhost --- .../messaging-common/validatorContractState.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/services/messaging-common/validatorContractState.ts b/src/services/messaging-common/validatorContractState.ts index 97dce79..4ebd242 100644 --- a/src/services/messaging-common/validatorContractState.ts +++ b/src/services/messaging-common/validatorContractState.ts @@ -238,12 +238,17 @@ export class ValidatorCtClient { ) } - - private fixNodeUrl(nodeUrl: string) { - if (EnvLoader.getPropertyAsBool("LOCALH") && !StrUtil.isEmpty(nodeUrl)) { - return nodeUrl.replace(".local", ".localh"); + private fixNodeUrl(nodeUrl: string): string { + try { + const url = new URL(nodeUrl); + if (url.hostname.endsWith('.local')) { + url.hostname = 'localhost'; + } + return url.toString(); + } catch (error) { + // Handle invalid URLs if necessary + return nodeUrl; } - return nodeUrl; } private async loadVSDNodesAndSubscribeToUpdates() { From eb09db2b560c1405dc30121d53c83452b9a055f6 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Fri, 13 Sep 2024 19:46:41 +0700 Subject: [PATCH 19/25] add: running anode1 --- docker-compose.yml | 75 ----------------------------- docker/a.yml | 19 ++++++++ docker/pg-init/create_databases.sql | 2 +- 3 files changed, 20 insertions(+), 76 deletions(-) delete mode 100644 docker-compose.yml create mode 100644 docker/a.yml diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 663c275..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,75 +0,0 @@ -version: '3' -services: - - redis: - image: 'redis:latest' - container_name: redis - restart: always - networks: - push-shared-network: - aliases: - - redis.local - ports: - - 6379:6379 - volumes: - - ./external/redis:/data - - mysql: - image: mysql:8.0 - container_name: mysql - command: --default-authentication-plugin=mysql_native_password - restart: always - environment: - MYSQL_ROOT_PASSWORD: 'pass' - MYSQL_DATABASE: ${DB_NAME} - MYSQL_USER: ${DB_USER} - MYSQL_PASSWORD: ${DB_PASS} - ports: - - 3306:3306 - volumes: - - ./external/mysql:/var/lib/mysql/ - - ./mysql-init:/docker-entrypoint-initdb.d/ - networks: - push-shared-network: - aliases: - - mysql.local - - phpmyadmin: - image: phpmyadmin/phpmyadmin - container_name: phpmyadmin - depends_on: - - mysql - environment: - PMA_HOST: mysql - PMA_PORT: 3306 - PMA_ARBITRARY: 1 - UPLOAD_LIMIT: 3000M - restart: always - ports: - - 8183:80 - networks: - push-shared-network: - aliases: - - phpmyadmin.local - - hardhat: - image: hardhat-main - container_name: hardhat - networks: - push-shared-network: - aliases: - - hardhat.local - ports: - - "8545:8545" - restart: always - environment: - SEPOLIA_RPC_URL: 11 - SEPOLIA_PRIVATE_KEY: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - depends_on: - - mysql - - phpmyadmin - - redis - -networks: - push-shared-network: - external: true \ No newline at end of file diff --git a/docker/a.yml b/docker/a.yml new file mode 100644 index 0000000..1f59109 --- /dev/null +++ b/docker/a.yml @@ -0,0 +1,19 @@ +version: '3' +services: + + anode1: + image: anode-main + container_name: anode1 + ports: + - "5001:3000" + networks: + push-shared-network: + aliases: + - anode1.local + environment: + DATABASE_URL: postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres.local:5432/anode1 + + +networks: + push-shared-network: + external: true \ No newline at end of file diff --git a/docker/pg-init/create_databases.sql b/docker/pg-init/create_databases.sql index a01cc13..1efe8bc 100755 --- a/docker/pg-init/create_databases.sql +++ b/docker/pg-init/create_databases.sql @@ -1 +1 @@ -CREATE DATABASE snode2; CREATE DATABASE snode3; CREATE DATABASE snode4; CREATE DATABASE snode5; CREATE DATABASE snode6; CREATE DATABASE snode7; CREATE DATABASE snode8; CREATE DATABASE snode9; CREATE DATABASE snode10; \ No newline at end of file +CREATE DATABASE snode2; CREATE DATABASE snode3; CREATE DATABASE snode4; CREATE DATABASE snode5; CREATE DATABASE snode6; CREATE DATABASE snode7; CREATE DATABASE snode8; CREATE DATABASE snode9; CREATE DATABASE snode10; CREATE DATABASE anode1; \ No newline at end of file From 04cba28e8a3ad104b104c81dd4754554eedb31c2 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Fri, 13 Sep 2024 19:51:49 +0700 Subject: [PATCH 20/25] add: running anode1 (2) --- README.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c88bc73..4ac56ed 100644 --- a/README.md +++ b/README.md @@ -327,9 +327,13 @@ docker build . -t vnode-main ## prepare image for S (if needed) cd /Users/w/chain/push-snode docker build . -t snode-main + +## prepare image for A (if needed) +cd /Users/w/chain/push-anode +docker build -t anode-main -f Dockerfile.light . ``` -Run (3 shell tabs recommended; remove '-d' for debug) +Run ```bash @@ -340,9 +344,10 @@ export POSTGRES_USER=postgres101 export POSTGRES_PASSWORD=lmnkdwhplk2 export DB_USER=sql101 export DB_PASS=lmnkdwhplk2 -docker-compose -f db.yml up -d -## re-create container (non-existing) db.yml up -d +docker-compose -f db.yml up -d +## hints: ## read logs: db.yml logs -f +## re-create container (non-existing) db.yml up -d ## start (existing) db.yml start ## stop (existing) db.yml stop ## delete container: db.yml down @@ -358,6 +363,9 @@ export POSTGRES_USER=postgres101 export POSTGRES_PASSWORD=lmnkdwhplk2 docker-compose -f s.yml up -d +## run anode1 +docker-compose -f a.yml up -d + ``` Check that all docker DNS is online (OPTIONAL) From 6c27b6e0bdd748c16d0efa1675318ec0e807491a Mon Sep 17 00:00:00 2001 From: Igx22 Date: Fri, 13 Sep 2024 19:56:41 +0700 Subject: [PATCH 21/25] add: running anode1 (3) --- README.md | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 4ac56ed..8d151d1 100644 --- a/README.md +++ b/README.md @@ -379,9 +379,9 @@ docker exec redis bash -c " getent hosts vnode2.local " docker exec redis bash -c " getent hosts vnode3.local " ``` -Test +Test vnodes: vnode1, vnode2, vnode3 are online and visible from the host machine ```shell -## vnode1, vnode2, vnode3 are online and visible from the host machine +## curl --location 'http://localhost:4001/api/v1/rpc/' \ --header 'Content-Type: application/json' \ --data '{ @@ -410,7 +410,7 @@ curl --location 'http://localhost:4003/api/v1/rpc/' \ }' echo ------------ ``` -Smoke-test validator api +Test vnodes: Smoke-test validator api ```shell ### 1 send a test transaction (DUMMY DATA) (INCLUDES API TOKEN) curl --location 'http://localhost:4001/api/v1/rpc/' \ @@ -444,7 +444,7 @@ curl --location 'http://localhost:4001/api/v1/rpc/' \ }' ``` -Smoke test api token +Test vnodes: Smoke test api token ```sh ### 1 get api token curl --location 'http://localhost:4001/api/v1/rpc/' \ @@ -457,3 +457,21 @@ curl --location 'http://localhost:4001/api/v1/rpc/' \ }' echo ------------ ``` + +Test anodes: Get blocks +```shell +curl --location 'http://localhost:5001/rpc' \ +--header 'Content-Type: application/json' \ +--data '{ + "jsonrpc": "2.0", + "method": "RpcService.getBlocks", + "params": { + "startTime": 1724771470, + "direction": "DESC", + "showDetails": true, + "pageSize": 10, + "page": 1 + }, + "id": 1 +}' +``` \ No newline at end of file From 165198dec7808db8da785602e5f27468c85a3805 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Fri, 13 Sep 2024 20:40:57 +0700 Subject: [PATCH 22/25] fix: parsing test transactions correctly --- src/generated/push/block_pb.d.ts | 8 +-- src/generated/push/block_pb.js | 60 +++++++++---------- src/proto/push/block.proto | 2 +- .../validatorContractState.ts | 25 +++++--- src/utilz/urlUtil.ts | 12 ++++ tests/block/block.test.ts | 34 +++++++++++ 6 files changed, 99 insertions(+), 42 deletions(-) create mode 100755 src/utilz/urlUtil.ts diff --git a/src/generated/push/block_pb.d.ts b/src/generated/push/block_pb.d.ts index 0e3e935..deca6f1 100644 --- a/src/generated/push/block_pb.d.ts +++ b/src/generated/push/block_pb.d.ts @@ -242,14 +242,14 @@ export class Transaction extends jspb.Message { getApitoken_asB64(): string; setApitoken(value: Uint8Array | string): void; - getFee(): string; - setFee(value: string): void; - getSignature(): Uint8Array | string; getSignature_asU8(): Uint8Array; getSignature_asB64(): string; setSignature(value: Uint8Array | string): void; + getFee(): string; + setFee(value: string): void; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): Transaction.AsObject; static toObject(includeInstance: boolean, msg: Transaction): Transaction.AsObject; @@ -269,8 +269,8 @@ export namespace Transaction { data: Uint8Array | string, salt: Uint8Array | string, apitoken: Uint8Array | string, - fee: string, signature: Uint8Array | string, + fee: string, } } diff --git a/src/generated/push/block_pb.js b/src/generated/push/block_pb.js index 0cfdd3b..168c4c9 100644 --- a/src/generated/push/block_pb.js +++ b/src/generated/push/block_pb.js @@ -1945,8 +1945,8 @@ proto.push.Transaction.toObject = function(includeInstance, msg) { data: msg.getData_asB64(), salt: msg.getSalt_asB64(), apitoken: msg.getApitoken_asB64(), - fee: jspb.Message.getFieldWithDefault(msg, 9, ""), - signature: msg.getSignature_asB64() + signature: msg.getSignature_asB64(), + fee: jspb.Message.getFieldWithDefault(msg, 9, "") }; if (includeInstance) { @@ -2011,14 +2011,14 @@ proto.push.Transaction.deserializeBinaryFromReader = function(msg, reader) { var value = /** @type {!Uint8Array} */ (reader.readBytes()); msg.setApitoken(value); break; - case 9: - var value = /** @type {string} */ (reader.readString()); - msg.setFee(value); - break; case 8: var value = /** @type {!Uint8Array} */ (reader.readBytes()); msg.setSignature(value); break; + case 9: + var value = /** @type {string} */ (reader.readString()); + msg.setFee(value); + break; default: reader.skipField(); break; @@ -2097,17 +2097,17 @@ proto.push.Transaction.serializeBinaryToWriter = function(message, writer) { f ); } - f = message.getFee(); + f = message.getSignature_asU8(); if (f.length > 0) { - writer.writeString( - 9, + writer.writeBytes( + 8, f ); } - f = message.getSignature_asU8(); + f = message.getFee(); if (f.length > 0) { - writer.writeBytes( - 8, + writer.writeString( + 9, f ); } @@ -2331,24 +2331,6 @@ proto.push.Transaction.prototype.setApitoken = function(value) { }; -/** - * optional string fee = 9; - * @return {string} - */ -proto.push.Transaction.prototype.getFee = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 9, "")); -}; - - -/** - * @param {string} value - * @return {!proto.push.Transaction} returns this - */ -proto.push.Transaction.prototype.setFee = function(value) { - return jspb.Message.setProto3StringField(this, 9, value); -}; - - /** * optional bytes signature = 8; * @return {!(string|Uint8Array)} @@ -2391,6 +2373,24 @@ proto.push.Transaction.prototype.setSignature = function(value) { }; +/** + * optional string fee = 9; + * @return {string} + */ +proto.push.Transaction.prototype.getFee = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 9, "")); +}; + + +/** + * @param {string} value + * @return {!proto.push.Transaction} returns this + */ +proto.push.Transaction.prototype.setFee = function(value) { + return jspb.Message.setProto3StringField(this, 9, value); +}; + + diff --git a/src/proto/push/block.proto b/src/proto/push/block.proto index 3ec9af1..6ac9d38 100644 --- a/src/proto/push/block.proto +++ b/src/proto/push/block.proto @@ -90,8 +90,8 @@ message Transaction { bytes data = 5; // data is also a protobuf message, depending on tx_type bytes salt = 6; bytes apiToken = 7; // f(apiToken) = v1 - string fee = 9; // we don't use this as of now, no native 256bits int support in protobuf bytes signature = 8; + string fee = 9; // we don't use this as of now, no native 256bits int support in protobuf } diff --git a/src/services/messaging-common/validatorContractState.ts b/src/services/messaging-common/validatorContractState.ts index 4ebd242..5c2aba9 100644 --- a/src/services/messaging-common/validatorContractState.ts +++ b/src/services/messaging-common/validatorContractState.ts @@ -238,16 +238,27 @@ export class ValidatorCtClient { ) } + // todo work with corrupted url's: returning nulls as of now private fixNodeUrl(nodeUrl: string): string { + if (nodeUrl.length > 100) { + this.log.error('nodeUrl should be less than 100 chars'); + return null; + } + try { - const url = new URL(nodeUrl); - if (url.hostname.endsWith('.local')) { - url.hostname = 'localhost'; + const urlObj = new URL(nodeUrl); + if (urlObj.hostname.endsWith('.local')) { + urlObj.hostname = 'localhost'; + } + + let fixedUrl = urlObj.toString(); + if (fixedUrl.endsWith('/')) { + fixedUrl = fixedUrl.slice(0, -1); } - return url.toString(); - } catch (error) { - // Handle invalid URLs if necessary - return nodeUrl; + return fixedUrl; + } catch (e) { + this.log.error(e); + return null; } } diff --git a/src/utilz/urlUtil.ts b/src/utilz/urlUtil.ts new file mode 100755 index 0000000..b145774 --- /dev/null +++ b/src/utilz/urlUtil.ts @@ -0,0 +1,12 @@ +export class UrlUtil { + + public static append(baseUrl: string, path: string): string { + if (baseUrl.endsWith('/')) { + baseUrl = baseUrl.slice(0, -1); // Remove the trailing slash + } + if (path.startsWith('/')) { + path = path.slice(1); // Remove the leading slash + } + return `${baseUrl}/${path}`; + } +} \ No newline at end of file diff --git a/tests/block/block.test.ts b/tests/block/block.test.ts index 2d2167a..8535627 100644 --- a/tests/block/block.test.ts +++ b/tests/block/block.test.ts @@ -15,6 +15,7 @@ import IdUtil from "../../src/utilz/idUtil"; import {BitUtil} from "../../src/utilz/bitUtil"; import {HashUtil} from "../../src/utilz/hashUtil"; import DateUtil from "../../src/utilz/dateUtil"; +import {BlockUtil} from "../../src/services/messaging-common/blockUtil"; const expect = chai.expect; @@ -29,6 +30,39 @@ now you can use .proto stubs for typescript describe('block tests', function () { + + it('reparse1', async function () { + let txRaw = BitUtil.base16ToBytes("1208494e49545f4449441a336569703135353a313a30783335423834643638343844313634313531373763363444363435303436363362393938413661623422336569703135353a313a30783335423834643638343844313634313531373763363444363435303436363362393938413661623422346569703135353a39373a3078443836333443333942424664343033336330643332383943343531353237353130323432333638312a670a0f6469643a6578616d706c653a313233120e6d61737465725f7075625f6b6579220f646572697665645f7075625f6b657932330a177075736831303232326e333233326d7764656963656a331218737472696e6769666965645f656e637279707465645f706b321071d60eecc00f4cc8ac898784a7eeb98f3ab40b7b226e6f646573223a5b7b226e6f64654964223a22307838653132644531324333356541426633356235366230344535334334453436386534363732374538222c2274734d696c6c6973223a313732363134383637303032342c2272616e646f6d486578223a2262323637636131656661626366386264323063623763616336356330633534323865656664663338222c2270696e67526573756c7473223a5b7b226e6f64654964223a22307866444145616637616643466262346534643136444336366244323033396664363030344346636538222c2274734d696c6c6973223a313732363134383637303032302c22737461747573223a317d2c7b226e6f64654964223a22307839384639443931304165663942334239413435313337616631434137363735654439306135333535222c2274734d696c6c6973223a313732363134383637303031362c22737461747573223a317d5d2c227369676e6174757265223a22307834366331643237316663383637343435393138356132616265636637373736323961303133373066343366303766343965623431363235616565656631643033356431396664326164326437323232373162343166336536636231653735303338343730366162383336363437363837653539346362636462636632316165663162227d2c7b226e6f64654964223a22307839384639443931304165663942334239413435313337616631434137363735654439306135333535222c2274734d696c6c6973223a313732363134383637303032392c2272616e646f6d486578223a2263316662333961383232623964383261643264373437333230626165383634303634386632356137222c2270696e67526573756c7473223a5b7b226e6f64654964223a22307838653132644531324333356541426633356235366230344535334334453436386534363732374538222c2274734d696c6c6973223a313732363134383637303031372c22737461747573223a317d2c7b226e6f64654964223a22307866444145616637616643466262346534643136444336366244323033396664363030344346636538222c2274734d696c6c6973223a313732363134383637303032342c22737461747573223a317d5d2c227369676e6174757265223a22307866663737366563393736306235646134373238323130333862646631646363656162333130666531323030376262336634336636346236343535303264663466333733323234333066653333366535313661356336613734363038353465343033306235363334343633646338613064613135386131623063373861323630653162227d2c7b226e6f64654964223a22307866444145616637616643466262346534643136444336366244323033396664363030344346636538222c2274734d696c6c6973223a313732363134383637303033352c2272616e646f6d486578223a2262393331656334316233393763623164656234396536353764396437623739383764316361373530222c2270696e67526573756c7473223a5b7b226e6f64654964223a22307838653132644531324333356541426633356235366230344535334334453436386534363732374538222c2274734d696c6c6973223a313732363134383637303031352c22737461747573223a317d2c7b226e6f64654964223a22307839384639443931304165663942334239413435313337616631434137363735654439306135333535222c2274734d696c6c6973223a313732363134383637303032352c22737461747573223a317d5d2c227369676e6174757265223a22307837633964343832396336616161363535396465643833323433623665386438623665623333366439303932613261306466323533316463336364396532623335353735626462386261313134323263326663346262363737653064396365356266343464353466653538373266396530373661633339643530316237343934333163227d5d7d42412592af30c62ac73025e37826d60a250e7c4f44c3697d2868307255bcff52a4b61e9a3fa015761ebd89b3d9d1ce3e4a7ad4691c5259e56f8be2e79a486a1eb01b1b4a0130") + const tx = BlockUtil.parseTransaction(txRaw); + let txRaw2 = tx.serializeBinary(); + + console.log('txRaw: %s', BitUtil.bytesToBase16(txRaw)); + console.log('txRaw2: %s', BitUtil.bytesToBase16(txRaw2)); + console.log('equals: ', BitUtil.bytesToBase16(txRaw)===BitUtil.bytesToBase16(txRaw2)); + console.log('processing tx: %o', tx.toObject()); + console.log('tx hash raw %s', BlockUtil.calculateTransactionHashBase16(txRaw)); + + console.log('tx hash after reparse %s', BlockUtil.calculateTransactionHashBase16(txRaw2)); + console.log('reparsed tx: %o', Transaction.deserializeBinary(txRaw).toObject()); + }); + + + /// todo TRY TO REBUILD THE OBJECT MYSQL + it('reparse2', async function () { + let txRaw = BitUtil.base16ToBytes("1208494e49545f4449441a336569703135353a313a30783335423834643638343844313634313531373763363444363435303436363362393938413661623422336569703135353a313a30783335423834643638343844313634313531373763363444363435303436363362393938413661623422346569703135353a39373a3078443836333443333942424664343033336330643332383943343531353237353130323432333638312a670a0f6469643a6578616d706c653a313233120e6d61737465725f7075625f6b6579220f646572697665645f7075625f6b657932330a177075736831303232326e333233326d7764656963656a331218737472696e6769666965645f656e637279707465645f706b321071d60eecc00f4cc8ac898784a7eeb98f3ab40b7b226e6f646573223a5b7b226e6f64654964223a22307838653132644531324333356541426633356235366230344535334334453436386534363732374538222c2274734d696c6c6973223a313732363134383637303032342c2272616e646f6d486578223a2262323637636131656661626366386264323063623763616336356330633534323865656664663338222c2270696e67526573756c7473223a5b7b226e6f64654964223a22307866444145616637616643466262346534643136444336366244323033396664363030344346636538222c2274734d696c6c6973223a313732363134383637303032302c22737461747573223a317d2c7b226e6f64654964223a22307839384639443931304165663942334239413435313337616631434137363735654439306135333535222c2274734d696c6c6973223a313732363134383637303031362c22737461747573223a317d5d2c227369676e6174757265223a22307834366331643237316663383637343435393138356132616265636637373736323961303133373066343366303766343965623431363235616565656631643033356431396664326164326437323232373162343166336536636231653735303338343730366162383336363437363837653539346362636462636632316165663162227d2c7b226e6f64654964223a22307839384639443931304165663942334239413435313337616631434137363735654439306135333535222c2274734d696c6c6973223a313732363134383637303032392c2272616e646f6d486578223a2263316662333961383232623964383261643264373437333230626165383634303634386632356137222c2270696e67526573756c7473223a5b7b226e6f64654964223a22307838653132644531324333356541426633356235366230344535334334453436386534363732374538222c2274734d696c6c6973223a313732363134383637303031372c22737461747573223a317d2c7b226e6f64654964223a22307866444145616637616643466262346534643136444336366244323033396664363030344346636538222c2274734d696c6c6973223a313732363134383637303032342c22737461747573223a317d5d2c227369676e6174757265223a22307866663737366563393736306235646134373238323130333862646631646363656162333130666531323030376262336634336636346236343535303264663466333733323234333066653333366535313661356336613734363038353465343033306235363334343633646338613064613135386131623063373861323630653162227d2c7b226e6f64654964223a22307866444145616637616643466262346534643136444336366244323033396664363030344346636538222c2274734d696c6c6973223a313732363134383637303033352c2272616e646f6d486578223a2262393331656334316233393763623164656234396536353764396437623739383764316361373530222c2270696e67526573756c7473223a5b7b226e6f64654964223a22307838653132644531324333356541426633356235366230344535334334453436386534363732374538222c2274734d696c6c6973223a313732363134383637303031352c22737461747573223a317d2c7b226e6f64654964223a22307839384639443931304165663942334239413435313337616631434137363735654439306135333535222c2274734d696c6c6973223a313732363134383637303032352c22737461747573223a317d5d2c227369676e6174757265223a22307837633964343832396336616161363535396465643833323433623665386438623665623333366439303932613261306466323533316463336364396532623335353735626462386261313134323263326663346262363737653064396365356266343464353466653538373266396530373661633339643530316237343934333163227d5d7d42412592af30c62ac73025e37826d60a250e7c4f44c3697d2868307255bcff52a4b61e9a3fa015761ebd89b3d9d1ce3e4a7ad4691c5259e56f8be2e79a486a1eb01b1b4a0130") + const tx = BlockUtil.parseTransaction(txRaw); + let txRaw2 = tx.serializeBinary(); + + console.log('txRaw: %s', BitUtil.bytesToBase16(txRaw)); + console.log('txRaw2: %s', BitUtil.bytesToBase16(txRaw2)); + console.log('equals: ', BitUtil.bytesToBase16(txRaw)===BitUtil.bytesToBase16(txRaw2)); + console.log('processing tx: %o', tx.toObject()); + console.log('tx hash raw %s', BlockUtil.calculateTransactionHashBase16(txRaw)); + + console.log('tx hash after reparse %s', BlockUtil.calculateTransactionHashBase16(txRaw2)); + console.log('reparsed tx: %o', Transaction.deserializeBinary(txRaw).toObject()); + }); + it('sample transaction 1', async function () { const data = new InitDid(); data.setDid('0xAA'); From a5afa93b2f9e83b257a1c6b23f72406e820610a1 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Fri, 13 Sep 2024 21:32:58 +0700 Subject: [PATCH 23/25] fix: docker running issues --- Dockerfile | 2 ++ src/services/messaging-common/validatorContractState.ts | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index ac89662..4eb0c16 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,6 +2,8 @@ FROM node:20.6.1 WORKDIR /app COPY . . RUN yarn install +# size reduction: "--production" removes dev deps; "cache clean" reduces cache +#RUN yarn install --production && yarn cache clean EXPOSE 4001 EXPOSE 4002 EXPOSE 4003 diff --git a/src/services/messaging-common/validatorContractState.ts b/src/services/messaging-common/validatorContractState.ts index 5c2aba9..f658959 100644 --- a/src/services/messaging-common/validatorContractState.ts +++ b/src/services/messaging-common/validatorContractState.ts @@ -247,8 +247,10 @@ export class ValidatorCtClient { try { const urlObj = new URL(nodeUrl); - if (urlObj.hostname.endsWith('.local')) { - urlObj.hostname = 'localhost'; + if (EnvLoader.getPropertyAsBool("LOCALH") && !StrUtil.isEmpty(nodeUrl)) { + if (urlObj.hostname.endsWith('.local')) { + urlObj.hostname = 'localhost'; + } } let fixedUrl = urlObj.toString(); From 671a1c8ac6195723d04f93f3997e9ffd8ce06177 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Mon, 16 Sep 2024 19:00:06 +0700 Subject: [PATCH 24/25] fix: validation fix --- README.md | 2 +- src/services/messaging/validatorNode.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8d151d1..2a6948a 100644 --- a/README.md +++ b/README.md @@ -418,7 +418,7 @@ curl --location 'http://localhost:4001/api/v1/rpc/' \ --data '{ "jsonrpc": "2.0", "method": "push_sendTransaction", - "params": ["1208494e49545f4449441a0d6569703135353a313a30784141220d6569703135353a313a30784242220d6569703135353a313a307843432a220a04307841411204307842421801220430784343320c0a043078414112043078424232102efe2783fee44a4d811100b08d0b55483ab40b7b226e6f646573223a5b7b226e6f64654964223a22307838653132644531324333356541426633356235366230344535334334453436386534363732374538222c2274734d696c6c6973223a313732343637333234303033302c2272616e646f6d486578223a2266376266376266303366656130613732353135363965303564653635363832646235353935353765222c2270696e67526573756c7473223a5b7b226e6f64654964223a22307866444145616637616643466262346534643136444336366244323033396664363030344346636538222c2274734d696c6c6973223a313732343637333234303032302c22737461747573223a317d2c7b226e6f64654964223a22307839384639443931304165663942334239413435313337616631434137363735654439306135333535222c2274734d696c6c6973223a313732343637333234303031392c22737461747573223a317d5d2c227369676e6174757265223a22307862333333636331623731633434633430386439366237626662363338353439336366313637636232626432353532376437383664333866376239383065616433303132663736636137386533616231613337653661316363666432306236393364656664303039633837313163666338396630353262333933363866316365383162227d2c7b226e6f64654964223a22307866444145616637616643466262346534643136444336366244323033396664363030344346636538222c2274734d696c6c6973223a313732343637333234303032352c2272616e646f6d486578223a2239323136383734646630653134383539376639643434643064666661656465393538343464643137222c2270696e67526573756c7473223a5b7b226e6f64654964223a22307838653132644531324333356541426633356235366230344535334334453436386534363732374538222c2274734d696c6c6973223a313732343637333232343635302c22737461747573223a317d2c7b226e6f64654964223a22307839384639443931304165663942334239413435313337616631434137363735654439306135333535222c2274734d696c6c6973223a313732343637333232343635352c22737461747573223a317d5d2c227369676e6174757265223a22307837626663343432343464633431376132383463313038353064613335313663353035613036326662323262623538353438383661613239393739653032663139376565633263393664356439343864306131643635306563323334646130356330663933626535653230393136316563326363626331653963396537343238623162227d2c7b226e6f64654964223a22307839384639443931304165663942334239413435313337616631434137363735654439306135333535222c2274734d696c6c6973223a313732343637333234303032342c2272616e646f6d486578223a2230643961313661383939636164306566633838336633343564306638306237666131356136353666222c2270696e67526573756c7473223a5b7b226e6f64654964223a22307838653132644531324333356541426633356235366230344535334334453436386534363732374538222c2274734d696c6c6973223a313732343637333232363934332c22737461747573223a317d2c7b226e6f64654964223a22307866444145616637616643466262346534643136444336366244323033396664363030344346636538222c2274734d696c6c6973223a313732343637333232363934372c22737461747573223a317d5d2c227369676e6174757265223a22307862613632393639366565653830343864313639303730336166656361663866626333663834333139643439316164623363663364663333313131396530303239303531373732303237393137313335333332653430666233323639333963626137663634373636663262363933343065366534663066623336333639386663393162227d5d7d4a01314201ee"], + "params": ["1208494e49545f4449441a336569703135353a313a30783335423834643638343844313634313531373763363444363435303436363362393938413661623422336569703135353a313a30783335423834643638343844313634313531373763363444363435303436363362393938413661623422346569703135353a39373a3078443836333443333942424664343033336330643332383943343531353237353130323432333638312a670a0f6469643a6578616d706c653a313233120e6d61737465725f7075625f6b6579220f646572697665645f7075625f6b657932330a177075736831303232326e333233326d7764656963656a331218737472696e6769666965645f656e637279707465645f706b321071d60eecc00f4cc8ac898784a7eeb98f3ab40b7b226e6f646573223a5b7b226e6f64654964223a22307838653132644531324333356541426633356235366230344535334334453436386534363732374538222c2274734d696c6c6973223a313732363134383637303032342c2272616e646f6d486578223a2262323637636131656661626366386264323063623763616336356330633534323865656664663338222c2270696e67526573756c7473223a5b7b226e6f64654964223a22307866444145616637616643466262346534643136444336366244323033396664363030344346636538222c2274734d696c6c6973223a313732363134383637303032302c22737461747573223a317d2c7b226e6f64654964223a22307839384639443931304165663942334239413435313337616631434137363735654439306135333535222c2274734d696c6c6973223a313732363134383637303031362c22737461747573223a317d5d2c227369676e6174757265223a22307834366331643237316663383637343435393138356132616265636637373736323961303133373066343366303766343965623431363235616565656631643033356431396664326164326437323232373162343166336536636231653735303338343730366162383336363437363837653539346362636462636632316165663162227d2c7b226e6f64654964223a22307839384639443931304165663942334239413435313337616631434137363735654439306135333535222c2274734d696c6c6973223a313732363134383637303032392c2272616e646f6d486578223a2263316662333961383232623964383261643264373437333230626165383634303634386632356137222c2270696e67526573756c7473223a5b7b226e6f64654964223a22307838653132644531324333356541426633356235366230344535334334453436386534363732374538222c2274734d696c6c6973223a313732363134383637303031372c22737461747573223a317d2c7b226e6f64654964223a22307866444145616637616643466262346534643136444336366244323033396664363030344346636538222c2274734d696c6c6973223a313732363134383637303032342c22737461747573223a317d5d2c227369676e6174757265223a22307866663737366563393736306235646134373238323130333862646631646363656162333130666531323030376262336634336636346236343535303264663466333733323234333066653333366535313661356336613734363038353465343033306235363334343633646338613064613135386131623063373861323630653162227d2c7b226e6f64654964223a22307866444145616637616643466262346534643136444336366244323033396664363030344346636538222c2274734d696c6c6973223a313732363134383637303033352c2272616e646f6d486578223a2262393331656334316233393763623164656234396536353764396437623739383764316361373530222c2270696e67526573756c7473223a5b7b226e6f64654964223a22307838653132644531324333356541426633356235366230344535334334453436386534363732374538222c2274734d696c6c6973223a313732363134383637303031352c22737461747573223a317d2c7b226e6f64654964223a22307839384639443931304165663942334239413435313337616631434137363735654439306135333535222c2274734d696c6c6973223a313732363134383637303032352c22737461747573223a317d5d2c227369676e6174757265223a22307837633964343832396336616161363535396465643833323433623665386438623665623333366439303932613261306466323533316463336364396532623335353735626462386261313134323263326663346262363737653064396365356266343464353466653538373266396530373661633339643530316237343934333163227d5d7d42412592af30c62ac73025e37826d60a250e7c4f44c3697d2868307255bcff52a4b61e9a3fa015761ebd89b3d9d1ce3e4a7ad4691c5259e56f8be2e79a486a1eb01b1b4a0130"], "id": 1 }' echo ------------ diff --git a/src/services/messaging/validatorNode.ts b/src/services/messaging/validatorNode.ts index dffa6f7..8430629 100644 --- a/src/services/messaging/validatorNode.ts +++ b/src/services/messaging/validatorNode.ts @@ -196,7 +196,7 @@ export class ValidatorNode implements StorageContractListener { if (StrUtil.isEmpty(txData.getDerivedpubkey())) { throw new TransactionError(`derivedPubKey missing`); } - if (txData.getWallettoencderivedkeyMap().size > 0) { + if (txData.getWallettoencderivedkeyMap().size < 1) { throw new TransactionError(`encDerivedPrivKey missing`); } } else if (tx.getCategory() === 'NOTIFICATION') { From 059e07fc4c29b90f785aa87654915c770a18e4fe Mon Sep 17 00:00:00 2001 From: Mohammed S Date: Mon, 16 Sep 2024 17:32:55 +0530 Subject: [PATCH 25/25] fix: add to git ignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 82fc88e..89fa175 100644 --- a/.gitignore +++ b/.gitignore @@ -146,3 +146,4 @@ src/devtools/devtools.secrets.json yarn.lock yarn.lock package-lock.json +/docker/mysql-init