60806040523480156200001157600080fd5b5060405162002b1338038062002b138339810160408190526200003491620001c2565b81816200004181620000a1565b506001600160a01b0381166200007257604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b6200007d81620000b3565b506003805460ff60a01b19169055620000998261032062000105565b505062000413565b6002620000af828262000347565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6127106001600160601b0382168110156200014657604051636f483d0960e01b81526001600160601b03831660048201526024810182905260440162000069565b6001600160a01b0383166200017257604051635b6cc80560e11b81526000600482015260240162000069565b50604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600455565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215620001d657600080fd5b82516001600160a01b0381168114620001ee57600080fd5b602084810151919350906001600160401b03808211156200020e57600080fd5b818601915086601f8301126200022357600080fd5b815181811115620002385762000238620001ac565b604051601f8201601f19908116603f01168101908382118183101715620002635762000263620001ac565b8160405282815289868487010111156200027c57600080fd5b600093505b82841015620002a0578484018601518185018701529285019262000281565b60008684830101528096505050505050509250929050565b600181811c90821680620002cd57607f821691505b602082108103620002ee57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200034257600081815260208120601f850160051c810160208610156200031d5750805b601f850160051c820191505b818110156200033e5782815560010162000329565b5050505b505050565b81516001600160401b03811115620003635762000363620001ac565b6200037b81620003748454620002b8565b84620002f4565b602080601f831160018114620003b357600084156200039a5750858301515b600019600386901b1c1916600185901b1785556200033e565b600085815260208120601f198616915b82811015620003e457888601518255948401946001909101908401620003c3565b5085821015620004035787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6126f080620004236000396000f3fe608060405234801561001057600080fd5b50600436106101b85760003560e01c80635c975abb116100f9578063a22cb46511610097578063e985e9c511610071578063e985e9c5146103d8578063f242432a14610414578063f2fde38b14610427578063f5298aca1461043a57600080fd5b8063a22cb46514610392578063bd85b039146103a5578063c5667291146103c557600080fd5b8063731133e9116100d3578063731133e9146103495780638456cb591461035c5780638a616bc0146103645780638da5cb5b1461037757600080fd5b80635c975abb1461030b5780636b20c4541461032e578063715018a61461034157600080fd5b80631f7fdffa116101665780633f4ba83a116101405780633f4ba83a146102ae5780634e1273f4146102b65780634f558e79146102d65780635944c753146102f857600080fd5b80631f7fdffa146102565780632a55205a146102695780632eb2c2d61461029b57600080fd5b806304634d8d1161019757806304634d8d1461021b5780630e89341c1461022e57806318160ddd1461024e57600080fd5b8062fdd58e146101bd57806301ffc9a7146101e357806302fe530514610206575b600080fd5b6101d06101cb366004611b54565b61044d565b6040519081526020015b60405180910390f35b6101f66101f1366004611bac565b610475565b60405190151581526020016101da565b610219610214366004611c88565b610480565b005b610219610229366004611cf5565b610494565b61024161023c366004611d28565b6104aa565b6040516101da9190611d87565b6007546101d0565b610219610264366004611e49565b61053e565b61027c610277366004611ee2565b610558565b604080516001600160a01b0390931683526020830191909152016101da565b6102196102a9366004611f04565b610635565b6102196106d9565b6102c96102c4366004612010565b6106eb565b6040516101da91906120af565b6101f66102e4366004611d28565b600090815260066020526040902054151590565b6102196103063660046120c2565b6107d9565b60035474010000000000000000000000000000000000000000900460ff166101f6565b61021961033c3660046120fe565b6107f1565b610219610869565b610219610357366004612172565b61087b565b61021961088f565b610219610372366004611d28565b61089f565b6003546040516001600160a01b0390911681526020016101da565b6102196103a03660046121c7565b6108b8565b6101d06103b3366004611d28565b60009081526006602052604090205490565b6102196103d3366004612203565b6108c3565b6101f66103e6366004612261565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b61021961042236600461228b565b6109bc565b6102196104353660046122f0565b610a53565b61021961044836600461230b565b610aa7565b6000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b600061046f82610add565b610488610b33565b61049181610b79565b50565b61049c610b33565b6104a68282610b85565b5050565b6060600280546104b99061233e565b80601f01602080910402602001604051908101604052809291908181526020018280546104e59061233e565b80156105325780601f1061050757610100808354040283529160200191610532565b820191906000526020600020905b81548152906001019060200180831161051557829003601f168201915b50505050509050919050565b610546610b33565b61055284848484610c7a565b50505050565b60008281526005602090815260408083208151808301909252546001600160a01b038116808352740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff169282019290925282916105f95750604080518082019091526004546001600160a01b03811682527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1660208201525b60208101516000906127109061061d906bffffffffffffffffffffffff16876123c0565b61062791906123d7565b915196919550909350505050565b336001600160a01b038616811480159061067557506001600160a01b0380871660009081526001602090815260408083209385168352929052205460ff16155b156106c4576040517fe237d9220000000000000000000000000000000000000000000000000000000081526001600160a01b038083166004830152871660248201526044015b60405180910390fd5b6106d18686868686610ccb565b505050505050565b6106e1610b33565b6106e9610d65565b565b6060815183511461073557815183516040517f5b059991000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016106bb565b6000835167ffffffffffffffff81111561075157610751611bd0565b60405190808252806020026020018201604052801561077a578160200160208202803683370190505b50905060005b84518110156107d1576020808202860101516107a49060208084028701015161044d565b8282815181106107b6576107b6612412565b60209081029190910101526107ca81612441565b9050610780565b509392505050565b6107e1610b33565b6107ec838383610dd5565b505050565b6001600160a01b0383163314801590610811575061080f83336103e6565b155b1561085e57335b6040517fe237d9220000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015290841660248201526044016106bb565b6107ec838383610ee9565b610871610b33565b6106e96000610f49565b610883610b33565b61055284848484610fb3565b610897610b33565b6106e9611029565b6108a7610b33565b600090815260056020526040812055565b6104a6338383611098565b336001600160a01b038516811480159061090357506001600160a01b0380861660009081526001602090815260408083209385168352929052205460ff16155b1561094d576040517fe237d9220000000000000000000000000000000000000000000000000000000081526001600160a01b038083166004830152861660248201526044016106bb565b60005b84518110156106d1576109b48686838151811061096f5761096f612412565b602002602001015186866040518060400160405280600481526020017f3078303000000000000000000000000000000000000000000000000000000000815250611166565b600101610950565b336001600160a01b03861681148015906109fc57506001600160a01b0380871660009081526001602090815260408083209385168352929052205460ff16155b15610a46576040517fe237d9220000000000000000000000000000000000000000000000000000000081526001600160a01b038083166004830152871660248201526044016106bb565b6106d18686868686611166565b610a5b610b33565b6001600160a01b038116610a9e576040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600060048201526024016106bb565b61049181610f49565b6001600160a01b0383163314801590610ac75750610ac583336103e6565b155b15610ad25733610818565b6107ec838383611227565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a00000000000000000000000000000000000000000000000000000000148061046f575061046f826112a9565b6003546001600160a01b031633146106e9576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016106bb565b60026104a682826124bf565b6127106bffffffffffffffffffffffff8216811015610be7576040517f6f483d090000000000000000000000000000000000000000000000000000000081526bffffffffffffffffffffffff83166004820152602481018290526044016106bb565b6001600160a01b038316610c2a576040517fb6d9900a000000000000000000000000000000000000000000000000000000008152600060048201526024016106bb565b50604080518082019091526001600160a01b039092168083526bffffffffffffffffffffffff90911660209092018290527401000000000000000000000000000000000000000090910217600455565b6001600160a01b038416610cbd576040517f57f447ce000000000000000000000000000000000000000000000000000000008152600060048201526024016106bb565b61055260008585858561138c565b6001600160a01b038416610d0e576040517f57f447ce000000000000000000000000000000000000000000000000000000008152600060048201526024016106bb565b6001600160a01b038516610d51576040517f01a83514000000000000000000000000000000000000000000000000000000008152600060048201526024016106bb565b610d5e858585858561138c565b5050505050565b610d6d6113df565b600380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6127106bffffffffffffffffffffffff8216811015610e3e576040517fdfd1fc1b000000000000000000000000000000000000000000000000000000008152600481018590526bffffffffffffffffffffffff83166024820152604481018290526064016106bb565b6001600160a01b038316610e88576040517f969f085200000000000000000000000000000000000000000000000000000000815260048101859052600060248201526044016106bb565b506040805180820182526001600160a01b0393841681526bffffffffffffffffffffffff9283166020808301918252600096875260059052919094209351905190911674010000000000000000000000000000000000000000029116179055565b6001600160a01b038316610f2c576040517f01a83514000000000000000000000000000000000000000000000000000000008152600060048201526024016106bb565b6107ec83600084846040518060200160405280600081525061138c565b600380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038416610ff6576040517f57f447ce000000000000000000000000000000000000000000000000000000008152600060048201526024016106bb565b604080516001808252602082018690528183019081526060820185905260808201909252906106d160008784848761138c565b611031611433565b600380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610db83390565b6001600160a01b0382166110db576040517fced3e100000000000000000000000000000000000000000000000000000000008152600060048201526024016106bb565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0384166111a9576040517f57f447ce000000000000000000000000000000000000000000000000000000008152600060048201526024016106bb565b6001600160a01b0385166111ec576040517f01a83514000000000000000000000000000000000000000000000000000000008152600060048201526024016106bb565b6040805160018082526020820186905281830190815260608201859052608082019092529061121e878784848761138c565b50505050505050565b6001600160a01b03831661126a576040517f01a83514000000000000000000000000000000000000000000000000000000008152600060048201526024016106bb565b604080516001808252602082018590528183019081526060820184905260a08201909252600060808201818152919291610d5e9187918590859061138c565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a2600000000000000000000000000000000000000000000000000000000148061133c57507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b8061046f57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461046f565b61139885858585611488565b6001600160a01b03841615610d5e57825133906001036113d157602084810151908401516113ca838989858589611494565b50506106d1565b6106d1818787878787611634565b60035474010000000000000000000000000000000000000000900460ff166106e9576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035474010000000000000000000000000000000000000000900460ff16156106e9576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61055284848484611780565b6001600160a01b0384163b156106d1576040517ff23a6e610000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063f23a6e61906114f190899089908890889088906004016125bb565b6020604051808303816000875af192505050801561152c575060408051601f3d908101601f19168201909252611529918101906125fe565b60015b6115ae573d80801561155a576040519150601f19603f3d011682016040523d82523d6000602084013e61155f565b606091505b5080516000036115a6576040517f57f447ce0000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526024016106bb565b805181602001fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e61000000000000000000000000000000000000000000000000000000001461121e576040517f57f447ce0000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526024016106bb565b6001600160a01b0384163b156106d1576040517fbc197c810000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063bc197c8190611691908990899088908890889060040161261b565b6020604051808303816000875af19250505080156116cc575060408051601f3d908101601f191682019092526116c9918101906125fe565b60015b6116fa573d80801561155a576040519150601f19603f3d011682016040523d82523d6000602084013e61155f565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c81000000000000000000000000000000000000000000000000000000001461121e576040517f57f447ce0000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526024016106bb565b61178c848484846118da565b6001600160a01b03841661183f576000805b83518110156118255760008382815181106117bb576117bb612412565b6020026020010151905080600660008785815181106117dc576117dc612412565b6020026020010151815260200190815260200160002060008282546118019190612679565b9091555061181190508184612679565b9250508061181e90612441565b905061179e565b5080600760008282546118389190612679565b9091555050505b6001600160a01b038316610552576000805b83518110156118c957600083828151811061186e5761186e612412565b60200260200101519050806006600087858151811061188f5761188f612412565b6020026020010151815260200190815260200160002060008282540392505081905550808301925050806118c290612441565b9050611851565b506007805491909103905550505050565b6118e2611433565b61055284848484805182511461193157815181516040517f5b059991000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016106bb565b3360005b8351811015611a59576020818102858101820151908501909101516001600160a01b03881615611a01576000828152602081815260408083206001600160a01b038c168452909152902054818110156119da576040517f03dee4c50000000000000000000000000000000000000000000000000000000081526001600160a01b038a1660048201526024810182905260448101839052606481018490526084016106bb565b6000838152602081815260408083206001600160a01b038d16845290915290209082900390555b6001600160a01b03871615611a46576000828152602081815260408083206001600160a01b038b16845290915281208054839290611a40908490612679565b90915550505b505080611a5290612441565b9050611935565b508251600103611ada5760208301516000906020840151909150856001600160a01b0316876001600160a01b0316846001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051611acb929190918252602082015260400190565b60405180910390a45050610d5e565b836001600160a01b0316856001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611b2992919061268c565b60405180910390a45050505050565b80356001600160a01b0381168114611b4f57600080fd5b919050565b60008060408385031215611b6757600080fd5b611b7083611b38565b946020939093013593505050565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461049157600080fd5b600060208284031215611bbe57600080fd5b8135611bc981611b7e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611c2857611c28611bd0565b604052919050565b600067ffffffffffffffff831115611c4a57611c4a611bd0565b611c5d6020601f19601f86011601611bff565b9050828152838383011115611c7157600080fd5b828260208301376000602084830101529392505050565b600060208284031215611c9a57600080fd5b813567ffffffffffffffff811115611cb157600080fd5b8201601f81018413611cc257600080fd5b611cd184823560208401611c30565b949350505050565b80356bffffffffffffffffffffffff81168114611b4f57600080fd5b60008060408385031215611d0857600080fd5b611d1183611b38565b9150611d1f60208401611cd9565b90509250929050565b600060208284031215611d3a57600080fd5b5035919050565b6000815180845260005b81811015611d6757602081850181015186830182015201611d4b565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000611bc96020830184611d41565b600067ffffffffffffffff821115611db457611db4611bd0565b5060051b60200190565b600082601f830112611dcf57600080fd5b81356020611de4611ddf83611d9a565b611bff565b82815260059290921b84018101918181019086841115611e0357600080fd5b8286015b84811015611e1e5780358352918301918301611e07565b509695505050505050565b600082601f830112611e3a57600080fd5b611bc983833560208501611c30565b60008060008060808587031215611e5f57600080fd5b611e6885611b38565b9350602085013567ffffffffffffffff80821115611e8557600080fd5b611e9188838901611dbe565b94506040870135915080821115611ea757600080fd5b611eb388838901611dbe565b93506060870135915080821115611ec957600080fd5b50611ed687828801611e29565b91505092959194509250565b60008060408385031215611ef557600080fd5b50508035926020909101359150565b600080600080600060a08688031215611f1c57600080fd5b611f2586611b38565b9450611f3360208701611b38565b9350604086013567ffffffffffffffff80821115611f5057600080fd5b611f5c89838a01611dbe565b94506060880135915080821115611f7257600080fd5b611f7e89838a01611dbe565b93506080880135915080821115611f9457600080fd5b50611fa188828901611e29565b9150509295509295909350565b600082601f830112611fbf57600080fd5b81356020611fcf611ddf83611d9a565b82815260059290921b84018101918181019086841115611fee57600080fd5b8286015b84811015611e1e5761200381611b38565b8352918301918301611ff2565b6000806040838503121561202357600080fd5b823567ffffffffffffffff8082111561203b57600080fd5b61204786838701611fae565b9350602085013591508082111561205d57600080fd5b5061206a85828601611dbe565b9150509250929050565b600081518084526020808501945080840160005b838110156120a457815187529582019590820190600101612088565b509495945050505050565b602081526000611bc96020830184612074565b6000806000606084860312156120d757600080fd5b833592506120e760208501611b38565b91506120f560408501611cd9565b90509250925092565b60008060006060848603121561211357600080fd5b61211c84611b38565b9250602084013567ffffffffffffffff8082111561213957600080fd5b61214587838801611dbe565b9350604086013591508082111561215b57600080fd5b5061216886828701611dbe565b9150509250925092565b6000806000806080858703121561218857600080fd5b61219185611b38565b93506020850135925060408501359150606085013567ffffffffffffffff8111156121bb57600080fd5b611ed687828801611e29565b600080604083850312156121da57600080fd5b6121e383611b38565b9150602083013580151581146121f857600080fd5b809150509250929050565b6000806000806080858703121561221957600080fd5b61222285611b38565b9350602085013567ffffffffffffffff81111561223e57600080fd5b61224a87828801611fae565b949794965050505060408301359260600135919050565b6000806040838503121561227457600080fd5b61227d83611b38565b9150611d1f60208401611b38565b600080600080600060a086880312156122a357600080fd5b6122ac86611b38565b94506122ba60208701611b38565b93506040860135925060608601359150608086013567ffffffffffffffff8111156122e457600080fd5b611fa188828901611e29565b60006020828403121561230257600080fd5b611bc982611b38565b60008060006060848603121561232057600080fd5b61232984611b38565b95602085013595506040909401359392505050565b600181811c9082168061235257607f821691505b60208210810361238b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808202811582820484141761046f5761046f612391565b60008261240d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361247257612472612391565b5060010190565b601f8211156107ec57600081815260208120601f850160051c810160208610156124a05750805b601f850160051c820191505b818110156106d1578281556001016124ac565b815167ffffffffffffffff8111156124d9576124d9611bd0565b6124ed816124e7845461233e565b84612479565b602080601f831160018114612540576000841561250a5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556106d1565b600085815260208120601f198616915b8281101561256f57888601518255948401946001909101908401612550565b50858210156125ab57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a060808301526125f360a0830184611d41565b979650505050505050565b60006020828403121561261057600080fd5b8151611bc981611b7e565b60006001600160a01b03808816835280871660208401525060a0604083015261264760a0830186612074565b82810360608401526126598186612074565b9050828103608084015261266d8185611d41565b98975050505050505050565b8082018082111561046f5761046f612391565b60408152600061269f6040830185612074565b82810360208401526126b18185612074565b9594505050505056fea264697066735822122029b46a0b44b5f531721e2ee677d03b91ad4b6cab32454fce2f839b47a5dc041864736f6c634300081400330000000000000000000000003dd7cdeb5757602b1425143b79ba83cddd1958360000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002768747470733a2f2f76612e646f6d696f6e6c696e652e696f2f6a736f6e2f7b69647d2e6a736f6e00000000000000000000000000000000000000000000000000