608060405234801561001057600080fd5b50610ec1806100206000396000f3fe6080604052600436106100b55760003560e01c806380d1cb3511610069578063bf64a82d1161004e578063bf64a82d14610299578063c8a4c3d5146102ac578063f851a440146102c1576100bc565b806380d1cb3514610221578063913a0ef214610255576100bc565b80636e9960c31161009a5780636e9960c3146101995780636faf275b146101cd578063704b6c0214610201576100bc565b80634827ae0c146100ee5780634ddf47d414610148576100bc565b366100bc57005b60006100c66102d6565b90503660008037600080366000845af43d6000803e8080156100e7573d6000f35b3d6000fd5b005b3480156100fa57600080fd5b507fb4107f746e9496e8452accc7de63d1c5e14c19f510932daa04077cd49e8bd77a545b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561015457600080fd5b50610168610163366004610b5b565b610414565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200161013f565b3480156101a557600080fd5b507f3f106594dc74eeef980dae234cde8324dc2497b13d27a0c59e55bd2ca10a07c95461011e565b3480156101d957600080fd5b507f27d542086d1e831d40b749e7f5509a626c3047a36d160781c40d5acc83e5b0745461011e565b34801561020d57600080fd5b506100ec61021c366004610c00565b6108b8565b34801561022d57600080fd5b507f9172848b0f1df776dc924b58e7fa303087ae0409bbf611608529e7f747d55de35461011e565b34801561026157600080fd5b507fd49ffd6af8249d6e6b5963d9d2b22c6db30ad594cb468453047a14e1c1bcde4d5460405163ffffffff909116815260200161013f565b6100ec6102a7366004610c24565b610992565b3480156102b857600080fd5b5061011e6102d6565b3480156102cd57600080fd5b5061011e610a68565b60008060007fb4107f746e9496e8452accc7de63d1c5e14c19f510932daa04077cd49e8bd77a5491507f0b671eb65810897366dd82c4cbb7d9dff8beda8484194956e81e89b8a361d9c75490508173ffffffffffffffffffffffffffffffffffffffff16635ab1bd536040518163ffffffff1660e01b8152600401602060405180830381865afa15801561036e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103929190610ca9565b73ffffffffffffffffffffffffffffffffffffffff1663cc2913f9826040518263ffffffff1660e01b81526004016103cc91815260200190565b602060405180830381865afa1580156103e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061040d9190610ca9565b9250505090565b600061043e7f4e5f991bca30eca2d4643aaefa807e88f96a4a97398933d572a3c0d973004a015490565b156104aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f484f4c4f475241504845523a20616c726561647920696e697469616c697a656460448201526064015b60405180910390fd5b600080838060200190518101906104c19190610d43565b91509150600080600080858060200190518101906104df9190610da7565b9350935093509350337f3f106594dc74eeef980dae234cde8324dc2497b13d27a0c59e55bd2ca10a07c955437f9172848b0f1df776dc924b58e7fa303087ae0409bbf611608529e7f747d55de355817f0b671eb65810897366dd82c4cbb7d9dff8beda8484194956e81e89b8a361d9c755827fb4107f746e9496e8452accc7de63d1c5e14c19f510932daa04077cd49e8bd77a55837fd49ffd6af8249d6e6b5963d9d2b22c6db30ad594cb468453047a14e1c1bcde4d55807f27d542086d1e831d40b749e7f5509a626c3047a36d160781c40d5acc83e5b074556000808473ffffffffffffffffffffffffffffffffffffffff16635ab1bd536040518163ffffffff1660e01b8152600401602060405180830381865afa158015610607573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062b9190610ca9565b73ffffffffffffffffffffffffffffffffffffffff1663cc2913f9856040518263ffffffff1660e01b815260040161066591815260200190565b602060405180830381865afa158015610682573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a69190610ca9565b73ffffffffffffffffffffffffffffffffffffffff16876040516024016106cd9190610e05565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f4ddf47d4000000000000000000000000000000000000000000000000000000001790525161074e9190610e56565b600060405180830381855af49150503d8060008114610789576040519150601f19603f3d011682016040523d82523d6000602084013e61078e565b606091505b50915091506000818060200190518101906107a99190610e72565b90508280156107f957507fffffffff0000000000000000000000000000000000000000000000000000000081167f4ddf47d400000000000000000000000000000000000000000000000000000000145b61085f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e697469616c697a6174696f6e206661696c6564000000000000000000000060448201526064016104a1565b61088860017f4e5f991bca30eca2d4643aaefa807e88f96a4a97398933d572a3c0d973004a0155565b507f4ddf47d4000000000000000000000000000000000000000000000000000000009a9950505050505050505050565b7f3f106594dc74eeef980dae234cde8324dc2497b13d27a0c59e55bd2ca10a07c95473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461096e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f484f4c4f47524150483a2061646d696e206f6e6c792066756e6374696f6e000060448201526064016104a1565b7f3f106594dc74eeef980dae234cde8324dc2497b13d27a0c59e55bd2ca10a07c955565b7f3f106594dc74eeef980dae234cde8324dc2497b13d27a0c59e55bd2ca10a07c95473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f484f4c4f47524150483a2061646d696e206f6e6c792066756e6374696f6e000060448201526064016104a1565b808260003760008082600034875af13d6000803e8080156100e7573d6000f35b6000610a927f3f106594dc74eeef980dae234cde8324dc2497b13d27a0c59e55bd2ca10a07c95490565b905090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610b0d57610b0d610a97565b604052919050565b600067ffffffffffffffff821115610b2f57610b2f610a97565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600060208284031215610b6d57600080fd5b813567ffffffffffffffff811115610b8457600080fd5b8201601f81018413610b9557600080fd5b8035610ba8610ba382610b15565b610ac6565b818152856020838501011115610bbd57600080fd5b81602084016020830137600091810160200191909152949350505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610bfd57600080fd5b50565b600060208284031215610c1257600080fd5b8135610c1d81610bdb565b9392505050565b600080600060408486031215610c3957600080fd5b8335610c4481610bdb565b9250602084013567ffffffffffffffff80821115610c6157600080fd5b818601915086601f830112610c7557600080fd5b813581811115610c8457600080fd5b876020828501011115610c9657600080fd5b6020830194508093505050509250925092565b600060208284031215610cbb57600080fd5b8151610c1d81610bdb565b60005b83811015610ce1578181015183820152602001610cc9565b83811115610cf0576000848401525b50505050565b600082601f830112610d0757600080fd5b8151610d15610ba382610b15565b818152846020838601011115610d2a57600080fd5b610d3b826020830160208701610cc6565b949350505050565b60008060408385031215610d5657600080fd5b825167ffffffffffffffff80821115610d6e57600080fd5b610d7a86838701610cf6565b93506020850151915080821115610d9057600080fd5b50610d9d85828601610cf6565b9150509250929050565b60008060008060808587031215610dbd57600080fd5b845163ffffffff81168114610dd157600080fd5b6020860151909450610de281610bdb565b604086015160608701519194509250610dfa81610bdb565b939692955090935050565b6020815260008251806020840152610e24816040850160208701610cc6565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60008251610e68818460208701610cc6565b9190910192915050565b600060208284031215610e8457600080fd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114610c1d57600080fdfea164736f6c634300080d000a