60806040523480156200001157600080fd5b5060405162001e6c38038062001e6c833981016040819052620000349162000119565b60405180604001604052806006815260200165155392d3919560d21b81525060405180604001604052806006815260200165155392d3919560d21b8152506200008c62000086620000c560201b60201c565b620000c9565b60036200009a8382620001e3565b506004620000a98282620001e3565b50600060019081556009555050600b91909155600c55620002af565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080604083850312156200012d57600080fd5b505080516020909101519092909150565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200016957607f821691505b6020821081036200018a57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620001de57600081815260208120601f850160051c81016020861015620001b95750805b601f850160051c820191505b81811015620001da57828155600101620001c5565b5050505b505050565b81516001600160401b03811115620001ff57620001ff6200013e565b620002178162000210845462000154565b8462000190565b602080601f8311600181146200024f5760008415620002365750858301515b600019600386901b1c1916600185901b178555620001da565b600085815260208120601f198616915b8281101562000280578886015182559484019460019091019084016200025f565b50858210156200029f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b611bad80620002bf6000396000f3fe60806040526004361061018e5760003560e01c8063715018a6116100d6578063a22cb4651161007f578063d5abeb0111610059578063d5abeb011461041a578063e985e9c514610430578063f2fde38b1461048657600080fd5b8063a22cb465146103c7578063b88d4fde146103e7578063c87b56dd146103fa57600080fd5b80639580c4bc116100b05780639580c4bc1461038a57806395d89b411461039f578063a0712d68146103b457600080fd5b8063715018a61461032a5780638da5cb5b1461033f57806390edbfee1461036a57600080fd5b806323b872dd116101385780636352211e116101125780636352211e146102d45780636817c76c146102f457806370a082311461030a57600080fd5b806323b872dd1461028e57806342842e0e146102a157806355f804b3146102b457600080fd5b8063081812fc11610169578063081812fc14610213578063095ea7b31461025857806318160ddd1461026b57600080fd5b8062728e461461019a57806301ffc9a7146101bc57806306fdde03146101f157600080fd5b3661019557005b600080fd5b3480156101a657600080fd5b506101ba6101b5366004611573565b6104a6565b005b3480156101c857600080fd5b506101dc6101d73660046115ba565b6104b3565b60405190151581526020015b60405180910390f35b3480156101fd57600080fd5b50610206610598565b6040516101e89190611645565b34801561021f57600080fd5b5061023361022e366004611573565b61062a565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101e8565b6101ba610266366004611681565b610694565b34801561027757600080fd5b50600254600154035b6040519081526020016101e8565b6101ba61029c3660046116ab565b6107a9565b6101ba6102af3660046116ab565b610a63565b3480156102c057600080fd5b506101ba6102cf3660046116e7565b610a83565b3480156102e057600080fd5b506102336102ef366004611573565b610a98565b34801561030057600080fd5b50610280600c5481565b34801561031657600080fd5b50610280610325366004611759565b610aa3565b34801561033657600080fd5b506101ba610b25565b34801561034b57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610233565b34801561037657600080fd5b506101ba610385366004611573565b610b39565b34801561039657600080fd5b506101ba610b5b565b3480156103ab57600080fd5b50610206610c1d565b6101ba6103c2366004611573565b610c2c565b3480156103d357600080fd5b506101ba6103e2366004611774565b610ce1565b6101ba6103f53660046117df565b610d78565b34801561040657600080fd5b50610206610415366004611573565b610de8565b34801561042657600080fd5b50610280600b5481565b34801561043c57600080fd5b506101dc61044b3660046118d9565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260086020908152604080832093909416825291909152205460ff1690565b34801561049257600080fd5b506101ba6104a1366004611759565b610e85565b6104ae610f39565b600c55565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061054657507f80ac58cd000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b8061059257507f5b5e139f000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060600380546105a79061190c565b80601f01602080910402602001604051908101604052809291908181526020018280546105d39061190c565b80156106205780601f106105f557610100808354040283529160200191610620565b820191906000526020600020905b81548152906001019060200180831161060357829003601f168201915b5050505050905090565b600061063582610fba565b61066b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060009081526007602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b600061069f82610a98565b90503373ffffffffffffffffffffffffffffffffffffffff8216146107285773ffffffffffffffffffffffffffffffffffffffff8116600090815260086020908152604080832033845290915290205460ff16610728576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526007602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006107b482610ffb565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461081b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260076020526040902080543380821473ffffffffffffffffffffffffffffffffffffffff8816909114176108b85773ffffffffffffffffffffffffffffffffffffffff8616600090815260086020908152604080832033845290915290205460ff166108b8576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516610905576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b801561091057600082555b73ffffffffffffffffffffffffffffffffffffffff86811660009081526006602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019055918716808252919020805460010190554260a01b177c0200000000000000000000000000000000000000000000000000000000176000858152600560205260408120919091557c0200000000000000000000000000000000000000000000000000000000841690036109ff576001840160008181526005602052604081205490036109fd5760015481146109fd5760008181526005602052604090208490555b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b610a7e83838360405180602001604052806000815250610d78565b505050565b610a8b610f39565b600a610a7e8284836119a5565b600061059282610ffb565b600073ffffffffffffffffffffffffffffffffffffffff8216610af2576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5073ffffffffffffffffffffffffffffffffffffffff1660009081526006602052604090205467ffffffffffffffff1690565b610b2d610f39565b610b3760006110b2565b565b610b41610f39565b80600b6000828254610b539190611aee565b909155505050565b610b63610f39565b604051600090339047908381818185875af1925050503d8060008114610ba5576040519150601f19603f3d011682016040523d82523d6000602084013e610baa565b606091505b5050905080610c1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5472616e73666572206661696c65642e0000000000000000000000000000000060448201526064015b60405180910390fd5b50565b6060600480546105a79061190c565b610c34611127565b600b5481610c456002546001540390565b610c4f9190611aee565b1115610c87576040517fd05cb60900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c54610c949082611b01565b341015610ccd576040517ff14a42b700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cd7338261119a565b610c1a6001600955565b33600081815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610d838484846107a9565b73ffffffffffffffffffffffffffffffffffffffff83163b15610de257610dac848484846111b8565b610de2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060610df382610fba565b610e29576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610e33611331565b90508051600003610e535760405180602001604052806000815250610e7e565b80610e5d84611340565b604051602001610e6e929190611b18565b6040516020818303038152906040525b9392505050565b610e8d610f39565b73ffffffffffffffffffffffffffffffffffffffff8116610f30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610c11565b610c1a816110b2565b60005473ffffffffffffffffffffffffffffffffffffffff163314610b37576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c11565b6000600154821080156105925750506000908152600560205260409020547c0100000000000000000000000000000000000000000000000000000000161590565b60008160015481101561108057600081815260056020526040812054907c01000000000000000000000000000000000000000000000000000000008216900361107e575b80600003610e7e57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160008181526005602052604090205461103f565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600260095403611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610c11565b6002600955565b6111b48282604051806020016040528060008152506113a2565b5050565b6040517f150b7a0200000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290611213903390899088908890600401611b47565b6020604051808303816000875af192505050801561126c575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261126991810190611b90565b60015b6112e3573d80801561129a576040519150601f19603f3d011682016040523d82523d6000602084013e61129f565b606091505b5080516000036112db576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050949350505050565b6060600a80546105a79061190c565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a90048061135a57508190037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101908152919050565b6113ac8383611435565b73ffffffffffffffffffffffffffffffffffffffff83163b15610a7e576001548281035b6113e360008683806001019450866111b8565b611419576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106113d057816001541461142e57600080fd5b5050505050565b6001546000829003611473576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff831660008181526006602090815260408083208054680100000000000000018802019055848352600590915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b81811461152f57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001016114f7565b508160000361156a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60015550505050565b60006020828403121561158557600080fd5b5035919050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610c1a57600080fd5b6000602082840312156115cc57600080fd5b8135610e7e8161158c565b60005b838110156115f25781810151838201526020016115da565b50506000910152565b600081518084526116138160208601602086016115d7565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610e7e60208301846115fb565b803573ffffffffffffffffffffffffffffffffffffffff8116811461167c57600080fd5b919050565b6000806040838503121561169457600080fd5b61169d83611658565b946020939093013593505050565b6000806000606084860312156116c057600080fd5b6116c984611658565b92506116d760208501611658565b9150604084013590509250925092565b600080602083850312156116fa57600080fd5b823567ffffffffffffffff8082111561171257600080fd5b818501915085601f83011261172657600080fd5b81358181111561173557600080fd5b86602082850101111561174757600080fd5b60209290920196919550909350505050565b60006020828403121561176b57600080fd5b610e7e82611658565b6000806040838503121561178757600080fd5b61179083611658565b9150602083013580151581146117a557600080fd5b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080600080608085870312156117f557600080fd5b6117fe85611658565b935061180c60208601611658565b925060408501359150606085013567ffffffffffffffff8082111561183057600080fd5b818701915087601f83011261184457600080fd5b813581811115611856576118566117b0565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561189c5761189c6117b0565b816040528281528a60208487010111156118b557600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080604083850312156118ec57600080fd5b6118f583611658565b915061190360208401611658565b90509250929050565b600181811c9082168061192057607f821691505b602082108103611959577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f821115610a7e57600081815260208120601f850160051c810160208610156119865750805b601f850160051c820191505b81811015610a5b57828155600101611992565b67ffffffffffffffff8311156119bd576119bd6117b0565b6119d1836119cb835461190c565b8361195f565b6000601f841160018114611a2357600085156119ed5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b17835561142e565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015611a725786850135825560209485019460019092019101611a52565b5086821015611aad577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561059257610592611abf565b808202811582820484141761059257610592611abf565b60008351611b2a8184602088016115d7565b835190830190611b3e8183602088016115d7565b01949350505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152611b8660808301846115fb565b9695505050505050565b600060208284031215611ba257600080fd5b8151610e7e8161158c5600000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000b1a2bc2ec50000