60806040523480156200001157600080fd5b50336040518060400160405280600e81526020016d11195d9a58d953195d995b13919560921b8152506040518060400160405280600681526020016544657669636560d01b81525081600090816200006a9190620001b6565b506001620000798282620001b6565b5050506001600160a01b038116620000ab57604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b620000b681620000bd565b5062000282565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200013a57607f821691505b6020821081036200015b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620001b1576000816000526020600020601f850160051c810160208610156200018c5750805b601f850160051c820191505b81811015620001ad5782815560010162000198565b5050505b505050565b81516001600160401b03811115620001d257620001d26200010f565b620001ea81620001e3845462000125565b8462000161565b602080601f831160018114620002225760008415620002095750858301515b600019600386901b1c1916600185901b178555620001ad565b600085815260208120601f198616915b82811015620002535788860151825594840194600190910190840162000232565b5085821015620002725787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b611cc880620002926000396000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c80636352211e116100d857806395d89b411161008c578063c87b56dd11610066578063c87b56dd14610320578063e985e9c514610333578063f2fde38b1461037c57600080fd5b806395d89b41146102f2578063a22cb465146102fa578063b88d4fde1461030d57600080fd5b8063715018a6116100bd578063715018a6146102b95780637b47ec1a146102c15780638da5cb5b146102d457600080fd5b80636352211e1461029357806370a08231146102a657600080fd5b8063153ee5541161012f57806340d097c31161011457806340d097c31461024c57806342842e0e1461026d57806355f804b31461028057600080fd5b8063153ee5541461022657806323b872dd1461023957600080fd5b8063081812fc11610160578063081812fc146101b9578063095ea7b3146101f15780630f4ef8a61461020657600080fd5b806301ffc9a71461017c57806306fdde03146101a4575b600080fd5b61018f61018a366004611696565b61038f565b60405190151581526020015b60405180910390f35b6101ac610474565b60405161019b9190611721565b6101cc6101c7366004611734565b610506565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b6102046101ff366004611771565b61053c565b005b6009546101cc9073ffffffffffffffffffffffffffffffffffffffff1681565b61020461023436600461179b565b61054b565b6102046102473660046117b6565b610635565b61025f61025a36600461179b565b6106ca565b60405190815260200161019b565b61020461027b3660046117b6565b61075d565b61020461028e3660046118b5565b610778565b6101cc6102a1366004611734565b61078c565b61025f6102b436600461179b565b610797565b610204610817565b6102046102cf366004611734565b61082b565b60065473ffffffffffffffffffffffffffffffffffffffff166101cc565b6101ac61089e565b6102046103083660046118fe565b6108ad565b61020461031b36600461193a565b6108b8565b6101ac61032e366004611734565b6108d6565b61018f6103413660046119b6565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b61020461038a36600461179b565b61093e565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061042257507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061046e57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b606060008054610483906119e9565b80601f01602080910402602001604051908101604052809291908181526020018280546104af906119e9565b80156104fc5780601f106104d1576101008083540402835291602001916104fc565b820191906000526020600020905b8154815290600101906020018083116104df57829003601f168201915b5050505050905090565b60006105118261099f565b5060008281526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1661046e565b6105478282336109fe565b5050565b610553610a0b565b73ffffffffffffffffffffffffffffffffffffffff81166105a0576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81163b6105ee576040517fac1c29fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6009546040517f5859d5bf00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015290911690635859d5bf90602401600060405180830381600087803b1580156106a257600080fd5b505af11580156106b6573d6000803e3d6000fd5b505050506106c5838383610a5e565b505050565b60095460009073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610734576040517ff656c79b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780546000918261074583611a3c565b9190505590506107558382610b49565b90505b919050565b6106c5838383604051806020016040528060008152506108b8565b610780610a0b565b60086105478282611ae3565b600061046e8261099f565b600073ffffffffffffffffffffffffffffffffffffffff82166107ee576040517f89c62b64000000000000000000000000000000000000000000000000000000008152600060048201526024015b60405180910390fd5b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b61081f610a0b565b6108296000610b63565b565b60095473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610892576040517ff656c79b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61089b81610bda565b50565b606060018054610483906119e9565b610547338383610c3b565b6108c3848484610635565b6108d03385858585610d38565b50505050565b60606108e18261099f565b5060006108ec610f31565b9050600081511161090c5760405180602001604052806000815250610937565b8061091684610f40565b604051602001610927929190611bfd565b6040516020818303038152906040525b9392505050565b610946610a0b565b73ffffffffffffffffffffffffffffffffffffffff8116610996576040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600060048201526024016107e5565b61089b81610b63565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff1680610755576040517f7e273289000000000000000000000000000000000000000000000000000000008152600481018490526024016107e5565b6106c58383836001610ffe565b60065473ffffffffffffffffffffffffffffffffffffffff163314610829576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016107e5565b73ffffffffffffffffffffffffffffffffffffffff8216610aae576040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600060048201526024016107e5565b6000610abb8383336111c9565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146108d0576040517f64283d7b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808616600483015260248201849052821660448201526064016107e5565b610547828260405180602001604052806000815250611346565b6006805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000610be960008360006111c9565b905073ffffffffffffffffffffffffffffffffffffffff8116610547576040517f7e273289000000000000000000000000000000000000000000000000000000008152600481018390526024016107e5565b73ffffffffffffffffffffffffffffffffffffffff8216610ca0576040517f5b08ba1800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024016107e5565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff83163b15610f2a576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063150b7a0290610dad908890889087908790600401611c2c565b6020604051808303816000875af1925050508015610e06575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610e0391810190611c75565b60015b610e95573d808015610e34576040519150601f19603f3d011682016040523d82523d6000602084013e610e39565b606091505b508051600003610e8d576040517f64a0ae9200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016107e5565b805181602001fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081167f150b7a020000000000000000000000000000000000000000000000000000000014610f28576040517f64a0ae9200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016107e5565b505b5050505050565b606060088054610483906119e9565b60606000610f4d8361135e565b600101905060008167ffffffffffffffff811115610f6d57610f6d6117f2565b6040519080825280601f01601f191660200182016040528015610f97576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8504945084610fa157509392505050565b808061101f575073ffffffffffffffffffffffffffffffffffffffff821615155b1561117457600061102f8461099f565b905073ffffffffffffffffffffffffffffffffffffffff83161580159061108257508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156110c1575073ffffffffffffffffffffffffffffffffffffffff80821660009081526005602090815260408083209387168352929052205460ff16155b15611110576040517fa9fbf51f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024016107e5565b811561117257838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b5050600090815260046020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60008281526002602052604081205473ffffffffffffffffffffffffffffffffffffffff9081169083161561120357611203818486611440565b73ffffffffffffffffffffffffffffffffffffffff8116156112795761122d600085600080610ffe565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190555b73ffffffffffffffffffffffffffffffffffffffff8516156112c25773ffffffffffffffffffffffffffffffffffffffff85166000908152600360205260409020805460010190555b60008481526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b61135083836114f0565b6106c5336000858585610d38565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106113a7577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef810000000083106113d3576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106113f157662386f26fc10000830492506010015b6305f5e1008310611409576305f5e100830492506008015b612710831061141d57612710830492506004015b6064831061142f576064830492506002015b600a83106107555760010192915050565b61144b8383836115a1565b6106c55773ffffffffffffffffffffffffffffffffffffffff831661149f576040517f7e273289000000000000000000000000000000000000000000000000000000008152600481018290526024016107e5565b6040517f177e802f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602481018290526044016107e5565b73ffffffffffffffffffffffffffffffffffffffff8216611540576040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600060048201526024016107e5565b600061154e838360006111c9565b905073ffffffffffffffffffffffffffffffffffffffff8116156106c5576040517f73c6ac6e000000000000000000000000000000000000000000000000000000008152600060048201526024016107e5565b600073ffffffffffffffffffffffffffffffffffffffff83161580159061166057508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061162f575073ffffffffffffffffffffffffffffffffffffffff80851660009081526005602090815260408083209387168352929052205460ff165b80611660575060008281526004602052604090205473ffffffffffffffffffffffffffffffffffffffff8481169116145b949350505050565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461089b57600080fd5b6000602082840312156116a857600080fd5b813561093781611668565b60005b838110156116ce5781810151838201526020016116b6565b50506000910152565b600081518084526116ef8160208601602086016116b3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061093760208301846116d7565b60006020828403121561174657600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461075857600080fd5b6000806040838503121561178457600080fd5b61178d8361174d565b946020939093013593505050565b6000602082840312156117ad57600080fd5b6109378261174d565b6000806000606084860312156117cb57600080fd5b6117d48461174d565b92506117e26020850161174d565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561183c5761183c6117f2565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611882576118826117f2565b8160405280935085815286868601111561189b57600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156118c757600080fd5b813567ffffffffffffffff8111156118de57600080fd5b8201601f810184136118ef57600080fd5b61166084823560208401611821565b6000806040838503121561191157600080fd5b61191a8361174d565b91506020830135801515811461192f57600080fd5b809150509250929050565b6000806000806080858703121561195057600080fd5b6119598561174d565b93506119676020860161174d565b925060408501359150606085013567ffffffffffffffff81111561198a57600080fd5b8501601f8101871361199b57600080fd5b6119aa87823560208401611821565b91505092959194509250565b600080604083850312156119c957600080fd5b6119d28361174d565b91506119e06020840161174d565b90509250929050565b600181811c908216806119fd57607f821691505b602082108103611a36577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611a94577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b601f8211156106c5576000816000526020600020601f850160051c81016020861015611ac45750805b601f850160051c820191505b81811015610f2857828155600101611ad0565b815167ffffffffffffffff811115611afd57611afd6117f2565b611b1181611b0b84546119e9565b84611a9b565b602080601f831160018114611b645760008415611b2e5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610f28565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015611bb157888601518255948401946001909101908401611b92565b5085821015611bed57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60008351611c0f8184602088016116b3565b835190830190611c238183602088016116b3565b01949350505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152611c6b60808301846116d7565b9695505050505050565b600060208284031215611c8757600080fd5b81516109378161166856fea264697066735822122075a3e39af41be0a351d7dff53de21459341d272698c722d7d244722817afafd064736f6c63430008180033