60a0604052610e6a60805234801562000016575f80fd5b50604051620021f5380380620021f5833981016040819052620000399162000220565b60408051808201825260048082526323a6242360e11b6020808401829052845180860190955291845290830152906002620000758382620002f4565b506003620000848282620002f4565b506200009591505f905083620000ab565b50620000a38160326200015b565b5050620003c0565b5f8281526008602090815260408083206001600160a01b038516845290915281205460ff1662000152575f8381526008602090815260408083206001600160a01b03861684529091529020805460ff19166001179055620001093390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600162000155565b505f5b92915050565b6127106001600160601b038216811015620001a057604051636f483d0960e01b81526001600160601b0383166004820152602481018290526044015b60405180910390fd5b6001600160a01b038316620001cb57604051635b6cc80560e11b81525f600482015260240162000197565b50604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b909102175f55565b80516001600160a01b03811681146200021b575f80fd5b919050565b5f806040838503121562000232575f80fd5b6200023d8362000204565b91506200024d6020840162000204565b90509250929050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200027f57607f821691505b6020821081036200029e57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620002ef57805f5260205f20601f840160051c81016020851015620002cb5750805b601f840160051c820191505b81811015620002ec575f8155600101620002d7565b50505b505050565b81516001600160401b0381111562000310576200031062000256565b62000328816200032184546200026a565b84620002a4565b602080601f8311600181146200035e575f8415620003465750858301515b5f19600386901b1c1916600185901b178555620003b8565b5f85815260208120601f198616915b828110156200038e578886015182559484019460019091019084016200036d565b5085821015620003ac57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b608051611e15620003e05f395f818161045d01526108150152611e155ff3fe608060405234801561000f575f80fd5b50600436106101c6575f3560e01c80636352211e116100fe578063a22cb4651161009e578063d53913931161006e578063d53913931461041e578063d547741f14610445578063d5abeb0114610458578063e985e9c51461047f575f80fd5b8063a22cb465146103d2578063af2b8c52146103e5578063b88d4fde146103f8578063c87b56dd1461040b575f80fd5b80638f2fc60b116100d95780638f2fc60b1461037857806391d148541461038b57806395d89b41146103c3578063a217fddf146103cb575f80fd5b80636352211e1461033f57806370a08231146103525780638ada6b0f14610365575f80fd5b8063248a9ca31161016957806336568abe1161014457806336568abe146102e657806340c10f19146102f957806342842e0e1461031957806356d3163d1461032c575f80fd5b8063248a9ca31461027f5780632a55205a146102a15780632f2ff15d146102d3575f80fd5b8063081812fc116101a4578063081812fc1461021c578063095ea7b31461024757806318160ddd1461025a57806323b872dd1461026c575f80fd5b806301ffc9a7146101ca578063057afdf4146101f257806306fdde0314610207575b5f80fd5b6101dd6101d836600461182b565b6104ba565b60405190151581526020015b60405180910390f35b610205610200366004611861565b6104ca565b005b61020f61050f565b6040516101e991906118e7565b61022f61022a3660046118f9565b61059f565b6040516001600160a01b0390911681526020016101e9565b610205610255366004611910565b6105c6565b600b545b6040519081526020016101e9565b61020561027a36600461193a565b6105d5565b61025e61028d3660046118f9565b5f9081526008602052604090206001015490565b6102b46102af366004611978565b610695565b604080516001600160a01b0390931683526020830191909152016101e9565b6102056102e1366004611998565b61076f565b6102056102f4366004611998565b610793565b61030c610307366004611910565b6107e4565b6040516101e991906119c6565b61020561032736600461193a565b6108f8565b61020561033a366004611861565b610912565b61022f61034d3660046118f9565b6109c7565b61025e610360366004611861565b6109d1565b60095461022f906001600160a01b031681565b610205610386366004611a09565b610a2f565b6101dd610399366004611998565b5f9182526008602090815260408084206001600160a01b0393909316845291905290205460ff1690565b61020f610a43565b61025e5f81565b6102056103e0366004611a45565b610a52565b600a5461022f906001600160a01b031681565b610205610406366004611b36565b610a5d565b61020f6104193660046118f9565b610a74565b61025e7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610205610453366004611998565b610b24565b61025e7f000000000000000000000000000000000000000000000000000000000000000081565b6101dd61048d366004611bde565b6001600160a01b039182165f90815260076020908152604080832093909416825291909152205460ff1690565b5f6104c482610b48565b92915050565b5f6104d481610b9d565b50600a80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60606002805461051e90611c0a565b80601f016020809104026020016040519081016040528092919081815260200182805461054a90611c0a565b80156105955780601f1061056c57610100808354040283529160200191610595565b820191905f5260205f20905b81548152906001019060200180831161057857829003601f168201915b5050505050905090565b5f6105a982610baa565b505f828152600660205260409020546001600160a01b03166104c4565b6105d1828233610bfb565b5050565b6001600160a01b03821661061c576040517f64a0ae920000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b5f610628838333610c08565b9050836001600160a01b0316816001600160a01b03161461068f576040517f64283d7b0000000000000000000000000000000000000000000000000000000081526001600160a01b0380861660048301526024820184905282166044820152606401610613565b50505050565b5f8281526001602090815260408083208151808301909252546001600160a01b038116808352740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff169282019290925282916107345750604080518082019091525f546001600160a01b03811682527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1660208201525b60208101515f9061271090610757906bffffffffffffffffffffffff1687611c88565b6107619190611c9f565b915196919550909350505050565b5f8281526008602052604090206001015461078981610b9d565b61068f8383610cb7565b6001600160a01b03811633146107d5576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107df8282610d80565b505050565b60607f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661081081610b9d565b600b547f000000000000000000000000000000000000000000000000000000000000000061083e8583611cd7565b11156108a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f45786365656473206d617820737570706c7900000000000000000000000000006044820152606401610613565b5f5b848110156108cb576108c3866108be8385611cd7565b610e23565b6001016108a8565b5083600b5f8282546108dd9190611cd7565b909155506108ed90508185610eb6565b9250505b5092915050565b6107df83838360405180602001604052805f815250610a5d565b5f61091c81610b9d565b6001600160a01b03821661098c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f43616e27742073657420746f207a65726f2061646472657373000000000000006044820152606401610613565b50600980547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b5f6104c482610baa565b5f6001600160a01b038216610a14576040517f89c62b640000000000000000000000000000000000000000000000000000000081525f6004820152602401610613565b506001600160a01b03165f9081526005602052604090205490565b5f610a3981610b9d565b6107df8383610f36565b60606003805461051e90611c0a565b6105d1338383611029565b610a688484846105d5565b61068f848484846110fe565b6060610a7f82610baa565b506009546040517fc87b56dd000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b039091169063c87b56dd906024015f60405180830381865afa158015610adf573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526104c49190810190611cea565b5f82815260086020526040902060010154610b3e81610b9d565b61068f8383610d80565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806104c457506104c4826112be565b610ba781336112c8565b50565b5f818152600460205260408120546001600160a01b0316806104c4576040517f7e27328900000000000000000000000000000000000000000000000000000000815260048101849052602401610613565b6107df8383836001611335565b600a545f906001600160a01b031615610ca457600a546040517f7d4c447b0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03868116602483015260448201869052848116606483015290911690637d4c447b906084015f604051808303815f87803b158015610c8d575f80fd5b505af1158015610c9f573d5f803e3d5ffd5b505050505b610caf848484611488565b949350505050565b5f8281526008602090815260408083206001600160a01b038516845290915281205460ff16610d79575f8381526008602090815260408083206001600160a01b0386168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610d313390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016104c4565b505f6104c4565b5f8281526008602090815260408083206001600160a01b038516845290915281205460ff1615610d79575f8381526008602090815260408083206001600160a01b038616808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016104c4565b6001600160a01b038216610e65576040517f64a0ae920000000000000000000000000000000000000000000000000000000081525f6004820152602401610613565b5f610e7183835f610c08565b90506001600160a01b038116156107df576040517f73c6ac6e0000000000000000000000000000000000000000000000000000000081525f6004820152602401610613565b60608167ffffffffffffffff811115610ed157610ed1611a75565b604051908082528060200260200182016040528015610efa578160200160208202803683370190505b5090505f5b828110156108f157610f118185611cd7565b828281518110610f2357610f23611d5c565b6020908102919091010152600101610eff565b6127106bffffffffffffffffffffffff8216811015610f98576040517f6f483d090000000000000000000000000000000000000000000000000000000081526bffffffffffffffffffffffff8316600482015260248101829052604401610613565b6001600160a01b038316610fda576040517fb6d9900a0000000000000000000000000000000000000000000000000000000081525f6004820152602401610613565b50604080518082019091526001600160a01b039092168083526bffffffffffffffffffffffff909116602090920182905274010000000000000000000000000000000000000000909102175f55565b6001600160a01b038216611074576040517f5b08ba180000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610613565b6001600160a01b038381165f8181526007602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b1561068f576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063150b7a0290611159903390889087908790600401611d89565b6020604051808303815f875af19250505080156111b1575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526111ae91810190611dc4565b60015b611231573d8080156111de576040519150601f19603f3d011682016040523d82523d5f602084013e6111e3565b606091505b5080515f03611229576040517f64a0ae920000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610613565b805181602001fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081167f150b7a0200000000000000000000000000000000000000000000000000000000146112b7576040517f64a0ae920000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610613565b5050505050565b5f6104c4826115b1565b5f8281526008602090815260408083206001600160a01b038516845290915290205460ff166105d1576040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260248101839052604401610613565b808061134957506001600160a01b03821615155b15611441575f61135884610baa565b90506001600160a01b038316158015906113845750826001600160a01b0316816001600160a01b031614155b80156113b557506001600160a01b038082165f9081526007602090815260408083209387168352929052205460ff16155b156113f7576040517fa9fbf51f0000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401610613565b811561143f5783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b50505f90815260066020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b5f828152600460205260408120546001600160a01b03908116908316156114b4576114b4818486611652565b6001600160a01b0381161561150d576114cf5f855f80611335565b6001600160a01b0381165f90815260056020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190555b6001600160a01b0385161561153b576001600160a01b0385165f908152600560205260409020805460010190555b5f8481526004602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061164357507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806104c457506104c4826116e8565b61165d83838361177e565b6107df576001600160a01b0383166116a4576040517f7e27328900000000000000000000000000000000000000000000000000000000815260048101829052602401610613565b6040517f177e802f0000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260248101829052604401610613565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a0000000000000000000000000000000000000000000000000000000014806104c457507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146104c4565b5f6001600160a01b03831615801590610caf5750826001600160a01b0316846001600160a01b031614806117d657506001600160a01b038085165f9081526007602090815260408083209387168352929052205460ff165b80610caf5750505f908152600660205260409020546001600160a01b03908116911614919050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610ba7575f80fd5b5f6020828403121561183b575f80fd5b8135611846816117fe565b9392505050565b6001600160a01b0381168114610ba7575f80fd5b5f60208284031215611871575f80fd5b81356118468161184d565b5f5b8381101561189657818101518382015260200161187e565b50505f910152565b5f81518084526118b581602086016020860161187c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f611846602083018461189e565b5f60208284031215611909575f80fd5b5035919050565b5f8060408385031215611921575f80fd5b823561192c8161184d565b946020939093013593505050565b5f805f6060848603121561194c575f80fd5b83356119578161184d565b925060208401356119678161184d565b929592945050506040919091013590565b5f8060408385031215611989575f80fd5b50508035926020909101359150565b5f80604083850312156119a9575f80fd5b8235915060208301356119bb8161184d565b809150509250929050565b602080825282518282018190525f9190848201906040850190845b818110156119fd578351835292840192918401916001016119e1565b50909695505050505050565b5f8060408385031215611a1a575f80fd5b8235611a258161184d565b915060208301356bffffffffffffffffffffffff811681146119bb575f80fd5b5f8060408385031215611a56575f80fd5b8235611a618161184d565b9150602083013580151581146119bb575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611ae957611ae9611a75565b604052919050565b5f67ffffffffffffffff821115611b0a57611b0a611a75565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f805f8060808587031215611b49575f80fd5b8435611b548161184d565b93506020850135611b648161184d565b925060408501359150606085013567ffffffffffffffff811115611b86575f80fd5b8501601f81018713611b96575f80fd5b8035611ba9611ba482611af1565b611aa2565b818152886020838501011115611bbd575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215611bef575f80fd5b8235611bfa8161184d565b915060208301356119bb8161184d565b600181811c90821680611c1e57607f821691505b602082108103611c55577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820281158282048414176104c4576104c4611c5b565b5f82611cd2577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b808201808211156104c4576104c4611c5b565b5f60208284031215611cfa575f80fd5b815167ffffffffffffffff811115611d10575f80fd5b8201601f81018413611d20575f80fd5b8051611d2e611ba482611af1565b818152856020838501011115611d42575f80fd5b611d5382602083016020860161187c565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6001600160a01b03808716835280861660208401525083604083015260806060830152611dba608083018461189e565b9695505050505050565b5f60208284031215611dd4575f80fd5b8151611846816117fe56fea2646970667358221220db8bddc8e60ac065a5d9b6717b58b221a81e6499ea4440e77ee16b015f938e4c64736f6c63430008170033000000000000000000000000618fd347e5f67dffa5dd7011b517c1e9c9e9fc3900000000000000000000000066aac71209f9654bb56f4092b84937a2dcdf27d3