60806040526064600955662386f26fc10000600a55661550f7dca70000600b556005600c556010805461ffff191660011790553480156200003e575f80fd5b50336040518060400160405280601981526020017f47484f53542e20627920416c6f6e6520417263686974656374000000000000008152506040518060400160405280600681526020016523a427a9aa1760d11b8152508160029081620000a69190620001eb565b506003620000b58282620001eb565b5060015f5550506001600160a01b038116620000ea57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b620000f581620000fc565b50620002b7565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200017657607f821691505b6020821081036200019557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620001e657805f5260205f20601f840160051c81016020851015620001c25750805b601f840160051c820191505b81811015620001e3575f8155600101620001ce565b50505b505050565b81516001600160401b038111156200020757620002076200014d565b6200021f8162000218845462000161565b846200019b565b602080601f83116001811462000255575f84156200023d5750858301515b5f19600386901b1c1916600185901b178555620002af565b5f85815260208120601f198616915b82811015620002855788860151825594840194600190910190840162000264565b5085821015620002a357878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6127ef80620002c55f395ff3fe608060405260043610610275575f3560e01c8063715018a61161014a578063a22cb465116100be578063c87b56dd11610078578063c87b56dd14610703578063d5abeb0114610722578063e0a8085314610737578063e985e9c514610756578063f1ba98be1461079d578063f2fde38b146107b0575f80fd5b8063a22cb46514610648578063ad668a3a14610667578063b88d4fde14610686578063bbaac02f14610699578063c23dc68f146106b8578063c3a71999146106e4575f80fd5b80638da5cb5b1161010f5780638da5cb5b146105b157806391b7f5ed146105ce57806395d89b41146105ed57806399a2557a14610601578063a035b1fe14610620578063a0712d6814610635575f80fd5b8063715018a61461051f5780637ab519a5146105335780637cb64759146105525780638462151c146105715780638cc54e7f1461059d575f80fd5b80632eb4a7ab116101ec5780635bbb2177116101a65780635bbb2177146104695780635c975abb146104955780636352211e146104ae5780636c0360eb146104cd5780636f8b44b0146104e157806370a0823114610500575f80fd5b80632eb4a7ab146103dc5780633ccfd60b146103f157806342842e0e1461040557806351830227146104185780635503a0e81461043657806355f804b31461044a575f80fd5b80630c9e04951161023d5780630c9e04951461033957806316ba10e01461035c57806316c38b3c1461037b57806318160ddd1461039a5780631b2674e0146103b457806323b872dd146103c9575f80fd5b8063014774cd1461027957806301ffc9a7146102ad57806306fdde03146102cc578063081812fc146102ed578063095ea7b314610324575b5f80fd5b348015610284575f80fd5b5061029861029336600461205e565b6107cf565b60405190151581526020015b60405180910390f35b3480156102b8575f80fd5b506102986102c73660046120c1565b610855565b3480156102d7575f80fd5b506102e06108a6565b6040516102a49190612129565b3480156102f8575f80fd5b5061030c61030736600461213b565b610936565b6040516001600160a01b0390911681526020016102a4565b610337610332366004612152565b610978565b005b348015610344575f80fd5b5061034e600b5481565b6040519081526020016102a4565b348015610367575f80fd5b50610337610376366004612200565b610a16565b348015610386575f80fd5b50610337610395366004612253565b610a2e565b3480156103a5575f80fd5b506001545f54035f190161034e565b3480156103bf575f80fd5b5061034e600c5481565b6103376103d736600461226c565b610a49565b3480156103e7575f80fd5b5061034e60115481565b3480156103fc575f80fd5b50610337610bd9565b61033761041336600461226c565b610e1f565b348015610423575f80fd5b5060105461029890610100900460ff1681565b348015610441575f80fd5b506102e0610e3e565b348015610455575f80fd5b50610337610464366004612200565b610eca565b348015610474575f80fd5b506104886104833660046122a5565b610ede565b6040516102a4919061231f565b3480156104a0575f80fd5b506010546102989060ff1681565b3480156104b9575f80fd5b5061030c6104c836600461213b565b610fa5565b3480156104d8575f80fd5b506102e0610faf565b3480156104ec575f80fd5b506103376104fb36600461213b565b610fbc565b34801561050b575f80fd5b5061034e61051a366004612360565b611021565b34801561052a575f80fd5b5061033761106d565b34801561053e575f80fd5b5061033761054d36600461213b565b611080565b34801561055d575f80fd5b5061033761056c36600461213b565b61108d565b34801561057c575f80fd5b5061059061058b366004612360565b61109a565b6040516102a49190612379565b3480156105a8575f80fd5b506102e061119e565b3480156105bc575f80fd5b506008546001600160a01b031661030c565b3480156105d9575f80fd5b506103376105e836600461213b565b6111ab565b3480156105f8575f80fd5b506102e06111b8565b34801561060c575f80fd5b5061059061061b3660046123b0565b6111c7565b34801561062b575f80fd5b5061034e600a5481565b61033761064336600461213b565b611344565b348015610653575f80fd5b506103376106623660046123e0565b6114bc565b348015610672575f80fd5b5061033761068136600461213b565b611527565b610337610694366004612411565b611534565b3480156106a4575f80fd5b506103376106b3366004612200565b61157e565b3480156106c3575f80fd5b506106d76106d236600461213b565b611592565b6040516102a49190612487565b3480156106ef575f80fd5b506103376106fe366004612152565b611617565b34801561070e575f80fd5b506102e061071d36600461213b565b611661565b34801561072d575f80fd5b5061034e60095481565b348015610742575f80fd5b50610337610751366004612253565b6117b8565b348015610761575f80fd5b50610298610770366004612495565b6001600160a01b039182165f90815260076020908152604080832093909416825291909152205460ff1690565b6103376107ab3660046124bd565b6117da565b3480156107bb575f80fd5b506103376107ca366004612360565b6119a9565b6040516bffffffffffffffffffffffff19606085901b1660208201525f90819060340160405160208183030381529060405280519060200120905061084a8484808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152505060115491508490506119e6565b9150505b9392505050565b5f6301ffc9a760e01b6001600160e01b03198316148061088557506380ac58cd60e01b6001600160e01b03198316145b806108a05750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600280546108b5906124eb565b80601f01602080910402602001604051908101604052809291908181526020018280546108e1906124eb565b801561092c5780601f106109035761010080835404028352916020019161092c565b820191905f5260205f20905b81548152906001019060200180831161090f57829003601f168201915b5050505050905090565b5f610940826119fb565b61095d576040516333d1c03960e21b815260040160405180910390fd5b505f908152600660205260409020546001600160a01b031690565b5f61098282610fa5565b9050336001600160a01b038216146109bb5761099e8133610770565b6109bb576040516367d9dca160e11b815260040160405180910390fd5b5f8281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610a1e611a2d565b600f610a2a8282612567565b5050565b610a36611a2d565b6010805460ff1916911515919091179055565b5f610a5382611a5a565b9050836001600160a01b0316816001600160a01b031614610a865760405162a1148160e81b815260040160405180910390fd5b5f8281526006602052604090208054338082146001600160a01b03881690911417610ad257610ab58633610770565b610ad257604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610af957604051633a954ecd60e21b815260040160405180910390fd5b8015610b03575f82555b6001600160a01b038681165f9081526005602052604080822080545f19019055918716808252919020805460010190554260a01b17600160e11b175f85815260046020526040812091909155600160e11b84169003610b8f57600184015f818152600460205260408120549003610b8d575f548114610b8d575f8181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b610be1611a2d565b475f731f290704cdb8942eb15e831a1c907c1d294677656064610c05846044612636565b610c0f919061264d565b6040515f81818185875af1925050503d805f8114610c48576040519150601f19603f3d011682016040523d82523d5f602084013e610c4d565b606091505b50508091505080610ca55760405162461bcd60e51b815260206004820152601a60248201527f5472616e73616374696f6e203120556e7375636365737366756c00000000000060448201526064015b60405180910390fd5b73f2a28b6c17b7e8c86ef8f5fd785e99d2e45617886064610cc784600c612636565b610cd1919061264d565b6040515f81818185875af1925050503d805f8114610d0a576040519150601f19603f3d011682016040523d82523d5f602084013e610d0f565b606091505b50508091505080610d625760405162461bcd60e51b815260206004820152601a60248201527f5472616e73616374696f6e203220556e7375636365737366756c0000000000006044820152606401610c9c565b73072377fec29fff72654e0e5b3ba46f69d3d2a9ae6064610d84846014612636565b610d8e919061264d565b6040515f81818185875af1925050503d805f8114610dc7576040519150601f19603f3d011682016040523d82523d5f602084013e610dcc565b606091505b50508091505080610a2a5760405162461bcd60e51b815260206004820152601a60248201527f5472616e73616374696f6e203320556e7375636365737366756c0000000000006044820152606401610c9c565b610e3983838360405180602001604052805f815250611534565b505050565b600f8054610e4b906124eb565b80601f0160208091040260200160405190810160405280929190818152602001828054610e77906124eb565b8015610ec25780601f10610e9957610100808354040283529160200191610ec2565b820191905f5260205f20905b815481529060010190602001808311610ea557829003601f168201915b505050505081565b610ed2611a2d565b600e610a2a8282612567565b6060815f816001600160401b03811115610efa57610efa61217a565b604051908082528060200260200182016040528015610f4a57816020015b604080516080810182525f8082526020808301829052928201819052606082015282525f19909201910181610f185790505b5090505f5b828114610f9c57610f77868683818110610f6b57610f6b61266c565b90506020020135611592565b828281518110610f8957610f8961266c565b6020908102919091010152600101610f4f565b50949350505050565b5f6108a082611a5a565b600e8054610e4b906124eb565b610fc4611a2d565b5f545f19018110158015610fda57506009548111155b61101c5760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21026b0bc1029bab838363c9760691b6044820152606401610c9c565b600955565b5f6001600160a01b038216611049576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03165f908152600560205260409020546001600160401b031690565b611075611a2d565b61107e5f611ac3565b565b611088611a2d565b600c55565b611095611a2d565b601155565b60605f805f6110a885611021565b90505f816001600160401b038111156110c3576110c361217a565b6040519080825280602002602001820160405280156110ec578160200160208202803683370190505b509050611118604080516080810182525f80825260208201819052918101829052606081019190915290565b60015b8386146111925761112b81611b14565b9150816040015161118a5781516001600160a01b03161561114b57815194505b876001600160a01b0316856001600160a01b03160361118a578083878060010198508151811061117d5761117d61266c565b6020026020010181815250505b60010161111b565b50909695505050505050565b600d8054610e4b906124eb565b6111b3611a2d565b600a55565b6060600380546108b5906124eb565b60608183106111e957604051631960ccad60e11b815260040160405180910390fd5b5f806111f35f5490565b9050600185101561120357600194505b8084111561120f578093505b5f61121987611021565b9050848610156112385785850381811015611232578091505b5061123b565b505f5b5f816001600160401b038111156112545761125461217a565b60405190808252806020026020018201604052801561127d578160200160208202803683370190505b509050815f0361129257935061084e92505050565b5f61129c88611592565b90505f81604001516112ac575080515b885b8881141580156112be5750848714155b15611333576112cc81611b14565b9250826040015161132b5782516001600160a01b0316156112ec57825191505b8a6001600160a01b0316826001600160a01b03160361132b578084888060010199508151811061131e5761131e61266c565b6020026020010181815250505b6001016112ae565b505050928352509095945050505050565b33321461137e5760405162461bcd60e51b81526020600482015260086024820152674e6f20626f74732160c01b6044820152606401610c9c565b60105460ff16156113cb5760405162461bcd60e51b815260206004820152601760248201527654686520636f6e7472616374206973207061757365642160481b6044820152606401610c9c565b80600954816113db5f545f190190565b6113e59190612680565b11156114035760405162461bcd60e51b8152600401610c9c90612693565b600c548210156114555760405162461bcd60e51b815260206004820152601c60248201527f5175616e746974792062656c6f77206d696e696d756d206d696e742e000000006044820152606401610c9c565b81600a546114639190612636565b3410156114b25760405162461bcd60e51b815260206004820152601b60248201527f5075626c69633a20496e73756666696369656e742066756e64732e00000000006044820152606401610c9c565b610a2a3383611b4e565b335f8181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61152f611a2d565b600b55565b61153f848484610a49565b6001600160a01b0383163b156115785761155b84848484611b67565b611578576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b611586611a2d565b600d610a2a8282612567565b604080516080810182525f808252602082018190529181018290526060810191909152604080516080810182525f80825260208201819052918101829052606081019190915260018310806115e857505f548310155b156115f35792915050565b6115fc83611b14565b905080604001511561160e5792915050565b61084e83611c4f565b61161f611a2d565b806009548161162f5f545f190190565b6116399190612680565b11156116575760405162461bcd60e51b8152600401610c9c90612693565b610e398383611b4e565b606061166c826119fb565b6116b85760405162461bcd60e51b815260206004820152601f60248201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e006044820152606401610c9c565b601054610100900460ff1615155f0361175b57600d80546116d8906124eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611704906124eb565b801561174f5780601f106117265761010080835404028352916020019161174f565b820191905f5260205f20905b81548152906001019060200180831161173257829003601f168201915b50505050509050919050565b5f600e8054611769906124eb565b9050116117845760405180602001604052805f8152506108a0565b600e61178f83611c83565b600f6040516020016117a393929190612730565b60405160208183030381529060405292915050565b6117c0611a2d565b601080549115156101000261ff0019909216919091179055565b3332146118145760405162461bcd60e51b81526020600482015260086024820152674e6f20626f74732160c01b6044820152606401610c9c565b60105460ff16156118615760405162461bcd60e51b815260206004820152601760248201527654686520636f6e7472616374206973207061757365642160481b6044820152606401610c9c565b82600954816118715f545f190190565b61187b9190612680565b11156118995760405162461bcd60e51b8152600401610c9c90612693565b600c548410156118eb5760405162461bcd60e51b815260206004820152601c60248201527f5175616e746974792062656c6f77206d696e696d756d206d696e742e000000006044820152606401610c9c565b83600b546118f99190612636565b3410156119485760405162461bcd60e51b815260206004820152601e60248201527f416c6c6f776c6973743a20496e73756666696369656e742066756e64732e00006044820152606401610c9c565b6119533384846107cf565b61199f5760405162461bcd60e51b815260206004820152601960248201527f416c6c6f776c6973743a204e6f7420456c6c696769626c652e000000000000006044820152606401610c9c565b6115783385611b4e565b6119b1611a2d565b6001600160a01b0381166119da57604051631e4fbdf760e01b81525f6004820152602401610c9c565b6119e381611ac3565b50565b5f826119f28584611d12565b14949350505050565b5f81600111158015611a0d57505f5482105b80156108a05750505f90815260046020526040902054600160e01b161590565b6008546001600160a01b0316331461107e5760405163118cdaa760e01b8152336004820152602401610c9c565b5f8180600111611aaa575f54811015611aaa575f8181526004602052604081205490600160e01b82169003611aa8575b805f0361084e57505f19015f81815260046020526040902054611a8a565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b604080516080810182525f8082526020820181905291810182905260608101919091525f828152600460205260409020546108a090611d54565b610a2a828260405180602001604052805f815250611d9b565b604051630a85bd0160e11b81525f906001600160a01b0385169063150b7a0290611b9b903390899088908890600401612762565b6020604051808303815f875af1925050508015611bd5575060408051601f3d908101601f19168201909252611bd29181019061279e565b60015b611c31573d808015611c02576040519150601f19603f3d011682016040523d82523d5f602084013e611c07565b606091505b5080515f03611c29576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b604080516080810182525f8082526020820181905291810182905260608101919091526108a0611c7e83611a5a565b611d54565b60605f611c8f83611e04565b60010190505f816001600160401b03811115611cad57611cad61217a565b6040519080825280601f01601f191660200182016040528015611cd7576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611ce157509392505050565b5f81815b8451811015611d4c57611d4282868381518110611d3557611d3561266c565b6020026020010151611edb565b9150600101611d16565b509392505050565b604080516080810182526001600160a01b038316815260a083901c6001600160401b03166020820152600160e01b831615159181019190915260e89190911c606082015290565b611da58383611f04565b6001600160a01b0383163b15610e39575f548281035b611dcd5f868380600101945086611b67565b611dea576040516368d2bf6b60e11b815260040160405180910390fd5b818110611dbb57815f5414611dfd575f80fd5b5050505050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611e425772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611e6e576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611e8c57662386f26fc10000830492506010015b6305f5e1008310611ea4576305f5e100830492506008015b6127108310611eb857612710830492506004015b60648310611eca576064830492506002015b600a83106108a05760010192915050565b5f818310611ef5575f82815260208490526040902061084e565b505f9182526020526040902090565b5f805490829003611f285760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b0383165f8181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b818114611fd45780835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600101611f9e565b50815f03611ff457604051622e076360e81b815260040160405180910390fd5b5f5550505050565b80356001600160a01b0381168114612012575f80fd5b919050565b5f8083601f840112612027575f80fd5b5081356001600160401b0381111561203d575f80fd5b6020830191508360208260051b8501011115612057575f80fd5b9250929050565b5f805f60408486031215612070575f80fd5b61207984611ffc565b925060208401356001600160401b03811115612093575f80fd5b61209f86828701612017565b9497909650939450505050565b6001600160e01b0319811681146119e3575f80fd5b5f602082840312156120d1575f80fd5b813561084e816120ac565b5f5b838110156120f65781810151838201526020016120de565b50505f910152565b5f81518084526121158160208601602086016120dc565b601f01601f19169290920160200192915050565b602081525f61084e60208301846120fe565b5f6020828403121561214b575f80fd5b5035919050565b5f8060408385031215612163575f80fd5b61216c83611ffc565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b5f6001600160401b03808411156121a7576121a761217a565b604051601f8501601f19908116603f011681019082821181831017156121cf576121cf61217a565b816040528093508581528686860111156121e7575f80fd5b858560208301375f602087830101525050509392505050565b5f60208284031215612210575f80fd5b81356001600160401b03811115612225575f80fd5b8201601f81018413612235575f80fd5b611c478482356020840161218e565b80358015158114612012575f80fd5b5f60208284031215612263575f80fd5b61084e82612244565b5f805f6060848603121561227e575f80fd5b61228784611ffc565b925061229560208501611ffc565b9150604084013590509250925092565b5f80602083850312156122b6575f80fd5b82356001600160401b038111156122cb575f80fd5b6122d785828601612017565b90969095509350505050565b80516001600160a01b031682526020808201516001600160401b03169083015260408082015115159083015260609081015162ffffff16910152565b602080825282518282018190525f9190848201906040850190845b818110156111925761234d8385516122e3565b928401926080929092019160010161233a565b5f60208284031215612370575f80fd5b61084e82611ffc565b602080825282518282018190525f9190848201906040850190845b8181101561119257835183529284019291840191600101612394565b5f805f606084860312156123c2575f80fd5b6123cb84611ffc565b95602085013595506040909401359392505050565b5f80604083850312156123f1575f80fd5b6123fa83611ffc565b915061240860208401612244565b90509250929050565b5f805f8060808587031215612424575f80fd5b61242d85611ffc565b935061243b60208601611ffc565b92506040850135915060608501356001600160401b0381111561245c575f80fd5b8501601f8101871361246c575f80fd5b61247b8782356020840161218e565b91505092959194509250565b608081016108a082846122e3565b5f80604083850312156124a6575f80fd5b6124af83611ffc565b915061240860208401611ffc565b5f805f604084860312156124cf575f80fd5b8335925060208401356001600160401b03811115612093575f80fd5b600181811c908216806124ff57607f821691505b60208210810361251d57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610e3957805f5260205f20601f840160051c810160208510156125485750805b601f840160051c820191505b81811015611dfd575f8155600101612554565b81516001600160401b038111156125805761258061217a565b6125948161258e84546124eb565b84612523565b602080601f8311600181146125c7575f84156125b05750858301515b5f19600386901b1c1916600185901b178555610bd1565b5f85815260208120601f198616915b828110156125f5578886015182559484019460019091019084016125d6565b508582101561261257878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176108a0576108a0612622565b5f8261266757634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52603260045260245ffd5b808201808211156108a0576108a0612622565b60208082526014908201527326b0bc1029bab838363c9022bc31b2b2b232b21760611b604082015260600190565b5f81546126cd816124eb565b600182811680156126e557600181146126fa57612726565b60ff1984168752821515830287019450612726565b855f526020805f205f5b8581101561271d5781548a820152908401908201612704565b50505082870194505b5050505092915050565b5f61273b82866126c1565b845161274b8183602089016120dc565b612757818301866126c1565b979650505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f90612794908301846120fe565b9695505050505050565b5f602082840312156127ae575f80fd5b815161084e816120ac56fea26469706673582212200b37a98add85e41d22370b957f6cea37bcd0646fbf562c25915cd536fd1c4dfc64736f6c63430008160033