608060405234801561001057600080fd5b50615167806100206000396000f3fe6080604052600436106103295760003560e01c80638462151c116101a5578063cdd94d4d116100ec578063e030565e11610095578063ecba222a1161006f578063ecba222a146109d9578063f2fde38b14610a10578063f636f0eb14610a30578063fdd7fbcc14610a5057600080fd5b8063e030565e14610936578063e163e60714610956578063e985e9c51461097157600080fd5b8063d8d988da116100c6578063d8d988da146108ce578063d92d1602146108ee578063dc33e6811461091657600080fd5b8063cdd94d4d1461087c578063d111515d146108a4578063d58bcaf0146108b957600080fd5b806399a2557a1161014e578063c23dc68f11610128578063c23dc68f146107dc578063c2f1f14a14610809578063c87b56dd1461085c57600080fd5b806399a2557a14610789578063a22cb465146107a9578063b88d4fde146107c957600080fd5b80639293a5c71161017f5780639293a5c71461073457806395d89b411461075457806398fa6c451461076957600080fd5b80638462151c146106a35780638da5cb5b146106d05780638fc88c48146106e557600080fd5b80633f4ba83a116102745780635c975abb1161021d5780636352211e116101f75780636352211e1461063957806370a0823114610659578063715018a6146106795780638456cb591461068e57600080fd5b80635c975abb146105ec5780635ef9432a146106045780635fd84c281461061957600080fd5b806355f804b31161024e57806355f804b3146105635780635a32baec146105835780635bbb2177146105bf57600080fd5b80633f4ba83a1461051b57806342842e0e146105305780634d8e0ea31461054357600080fd5b806318160ddd116102d65780632a55205a116102b05780632a55205a146104b25780633ccfd60b146104f15780633e5c68ba1461050657600080fd5b806318160ddd1461041a5780631b7d0ffe1461047f57806323b872dd1461049f57600080fd5b8063081812fc11610307578063081812fc146103a7578063095ea7b3146103df57806314d3fcf8146103f257600080fd5b806301ffc9a71461032e5780630662069d1461036357806306fdde0314610385575b600080fd5b34801561033a57600080fd5b5061034e610349366004614484565b610a70565b60405190151581526020015b60405180910390f35b34801561036f57600080fd5b5061038361037e3660046144b5565b610a81565b005b34801561039157600080fd5b5061039a610b56565b60405161035a9190614520565b3480156103b357600080fd5b506103c76103c2366004614533565b610c0b565b6040516001600160a01b03909116815260200161035a565b6103836103ed366004614563565b610c87565b3480156103fe57600080fd5b506103c773e1fac470de8de91c66778eaa155c64c7ceefc85181565b34801561042657600080fd5b507f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c41547f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c405403600019015b60405190815260200161035a565b34801561048b57600080fd5b5061038361049a36600461459e565b610d1a565b6103836104ad3660046145b9565b610d84565b3480156104be57600080fd5b506104d26104cd3660046145f5565b610daf565b604080516001600160a01b03909316835260208301919091520161035a565b3480156104fd57600080fd5b50610383610e82565b34801561051257600080fd5b506104716111eb565b34801561052757600080fd5b5061038361122b565b61038361053e3660046145b9565b61123b565b34801561054f57600080fd5b5061038361055e36600461459e565b611260565b34801561056f57600080fd5b5061038361057e366004614617565b6112c8565b34801561058f57600080fd5b507fa0c8dcc8fe7bbc6a8ab6722606bd806b13362a51b3f32ec96b5da72f99e615495463ffffffff16421061034e565b3480156105cb57600080fd5b506105df6105da366004614689565b61137a565b60405161035a91906146ec565b3480156105f857600080fd5b5060655460ff1661034e565b34801561061057600080fd5b50610383611446565b34801561062557600080fd5b506103836106343660046144b5565b61154b565b34801561064557600080fd5b506103c7610654366004614533565b6115c2565b34801561066557600080fd5b50610471610674366004614769565b6115cd565b34801561068557600080fd5b50610383611654565b34801561069a57600080fd5b50610383611666565b3480156106af57600080fd5b506106c36106be366004614769565b611676565b60405161035a9190614784565b3480156106dc57600080fd5b506103c761177a565b3480156106f157600080fd5b50610471610700366004614533565b60009081527f3afe07c861b9a7bc7a9e79bc19e0c388d1919cadc55b9bca778f1b978d308326602052604090205460a01c90565b34801561074057600080fd5b5061038361074f3660046147d5565b611793565b34801561076057600080fd5b5061039a6117cf565b34801561077557600080fd5b50610383610784366004614804565b611800565b34801561079557600080fd5b506106c36107a436600461481f565b611970565b3480156107b557600080fd5b506103836107c4366004614852565b611b30565b6103836107d7366004614958565b611bbe565b3480156107e857600080fd5b506107fc6107f7366004614533565b611beb565b60405161035a91906149d4565b34801561081557600080fd5b506103c7610824366004614533565b60009081527f3afe07c861b9a7bc7a9e79bc19e0c388d1919cadc55b9bca778f1b978d30832660205260409020544260a01b81110290565b34801561086857600080fd5b5061039a610877366004614533565b611c92565b34801561088857600080fd5b506103c7733cc6cdda760b79bafa08df41ecfa224f810dceb681565b3480156108b057600080fd5b50610383611e74565b3480156108c557600080fd5b50610471611ed0565b3480156108da57600080fd5b506103836108e93660046144b5565b611f20565b3480156108fa57600080fd5b506103c773511af84166215d528abf8ba6437ec4becf31934b81565b34801561092257600080fd5b50610471610931366004614769565b611f95565b34801561094257600080fd5b50610383610951366004614a19565b611fdf565b34801561096257600080fd5b506104716602d79883d2000081565b34801561097d57600080fd5b5061034e61098c366004614a66565b6001600160a01b0391821660009081527f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c476020908152604080832093909416825291909152205460ff1690565b3480156109e557600080fd5b507f5763ff58c27377b9a9b40e9e2f5e53a9dd7cff5464aac8fc758a651823f78e5e5460ff1661034e565b348015610a1c57600080fd5b50610383610a2b366004614769565b612137565b348015610a3c57600080fd5b50610383610a4b3660046147d5565b6121c7565b348015610a5c57600080fd5b50610383610a6b366004614acc565b612225565b6000610a7b82612c6b565b92915050565b610a89612cd1565b428163ffffffff1611610ae35760405162461bcd60e51b815260206004820152600c60248201527f54494d455f494e5f50415354000000000000000000000000000000000000000060448201526064015b60405180910390fd5b7fa0c8dcc8fe7bbc6a8ab6722606bd806b13362a51b3f32ec96b5da72f99e6154680547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000063ffffffff90931692909202919091179055565b60607f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c405b6002018054610b8890614d85565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb490614d85565b8015610c015780601f10610bd657610100808354040283529160200191610c01565b820191906000526020600020905b815481529060010190602001808311610be457829003601f168201915b5050505050905090565b6000610c1682612d30565b610c4c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060009081527f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c4660205260409020546001600160a01b031690565b81610c9181612dbc565b7fa0c8dcc8fe7bbc6a8ab6722606bd806b13362a51b3f32ec96b5da72f99e6154354640100000000900460ff1615610d0b5760405162461bcd60e51b815260206004820152601260248201527f544f4b454e5f49535f534f554c424f554e4400000000000000000000000000006044820152606401610ada565b610d158383612ed7565b505050565b610d22612cd1565b7fa0c8dcc8fe7bbc6a8ab6722606bd806b13362a51b3f32ec96b5da72f99e6154380547fffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff166a010000000000000000000060ff90931692909202919091179055565b826001600160a01b0381163314610d9e57610d9e33612dbc565b610da9848484612ee7565b50505050565b7fa0c8dcc8fe7bbc6a8ab6722606bd806b13362a51b3f32ec96b5da72f99e6154f5460009081907fa0c8dcc8fe7bbc6a8ab6722606bd806b13362a51b3f32ec96b5da72f99e615439082906001600160a01b0316610e1457610e0f61177a565b610e23565b600c8201546001600160a01b03165b90506001600160a01b038116610e4057925060009150610e7b9050565b8154819061271090610e6a90700100000000000000000000000000000000900461ffff1688614e07565b610e749190614e1e565b9350935050505b9250929050565b610e8a613201565b610e92612cd1565b7fa0c8dcc8fe7bbc6a8ab6722606bd806b13362a51b3f32ec96b5da72f99e61547547fa0c8dcc8fe7bbc6a8ab6722606bd806b13362a51b3f32ec96b5da72f99e6154390640100000000900463ffffffff1615610f3d57601581015460ff16610f3d5760405162461bcd60e51b815260206004820152601a60248201527f46554e44494e475f5441524745545f4e4f545f524541434845440000000000006044820152606401610ada565b600681015463ffffffff1615610fc4577fa0c8dcc8fe7bbc6a8ab6722606bd806b13362a51b3f32ec96b5da72f99e615495463ffffffff16421015610fc45760405162461bcd60e51b815260206004820152601d60248201527f524546554e445f47554152414e5445455f5354494c4c5f4143544956450000006044820152606401610ada565b600b8101544790600003611082576000610fdc61177a565b6001600160a01b03168260405160006040518083038185875af1925050503d8060008114611026576040519150601f19603f3d011682016040523d82523d6000602084013e61102b565b606091505b505090508061107c5760405162461bcd60e51b815260206004820152600f60248201527f5452414e534645525f4641494c454400000000000000000000000000000000006044820152606401610ada565b506111dd565b60005b600b8301548110156111db5760006127108460050160050183815481106110ae576110ae614e59565b600091825260209091206010820401546110d891600f166002026101000a900461ffff1685614e07565b6110e29190614e1e565b905060007fa0c8dcc8fe7bbc6a8ab6722606bd806b13362a51b3f32ec96b5da72f99e61543600b0180548490811061111c5761111c614e59565b60009182526020822001546040516001600160a01b039091169184919081818185875af1925050503d8060008114611170576040519150601f19603f3d011682016040523d82523d6000602084013e611175565b606091505b50509050806111c65760405162461bcd60e51b815260206004820152600f60248201527f5452414e534645525f4641494c454400000000000000000000000000000000006044820152606401610ada565b505080806111d390614e88565b915050611085565b505b50506111e96001609755565b565b7fa0c8dcc8fe7bbc6a8ab6722606bd806b13362a51b3f32ec96b5da72f99e6155554600090801561121c5780611225565b6602d79883d200005b91505090565b611233612cd1565b6111e9613261565b826001600160a01b03811633146112555761125533612dbc565b610da98484846132b3565b611268612cd1565b7fa0c8dcc8fe7bbc6a8ab6722606bd806b13362a51b3f32ec96b5da72f99e6154380547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff166801000000000000000060ff90931692909202919091179055565b6112d0612cd1565b7fa0c8dcc8fe7bbc6a8ab6722606bd806b13362a51b3f32ec96b5da72f99e615495468010000000000000000900460ff161561134e5760405162461bcd60e51b815260206004820152600a60248201527f4e4f545f414354495645000000000000000000000000000000000000000000006044820152606401610ada565b7fa0c8dcc8fe7bbc6a8ab6722606bd806b13362a51b3f32ec96b5da72f99e61545610d15828483614ee8565b60608160008167ffffffffffffffff81111561139857611398614889565b6040519080825280602002602001820160405280156113ea57816020015b6040805160808101825260008082526020808301829052928201819052606082015282526000199092019101816113b65790505b50905060005b82811461143d5761141886868381811061140c5761140c614e59565b90506020020135611beb565b82828151811061142a5761142a614e59565b60209081029190910101526001016113f0565b50949350505050565b61144e61177a565b6001600160a01b0316336001600160a01b031614611498576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f5763ff58c27377b9a9b40e9e2f5e53a9dd7cff5464aac8fc758a651823f78e5e5460ff16156114f4576040517f905e710700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f5763ff58c27377b9a9b40e9e2f5e53a9dd7cff5464aac8fc758a651823f78e5e805460ff191660011790556040517f51e2d870cc2e10853e38dc06fcdae46ad3c3f588f326608803dac6204541ad1690600090a1565b611553612cd1565b7fa0c8dcc8fe7bbc6a8ab6722606bd806b13362a51b3f32ec96b5da72f99e6154680547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000063ffffffff90931692909202919091179055565b6000610a7b826132ce565b60006001600160a01b03821661160f576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b031660009081527f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c45602052604090205467ffffffffffffffff1690565b61165c612cd1565b6111e96000613401565b61166e612cd1565b6111e961346b565b60606000806000611686856115cd565b905060008167ffffffffffffffff8111156116a3576116a3614889565b6040519080825280602002602001820160405280156116cc578160200160208202803683370190505b5060408051608081018252600080825260208201819052918101829052606081019190915290915060015b83861461176e57611707816134a8565b915081604001516117665781516001600160a01b03161561172757815194505b876001600160a01b0316856001600160a01b031603611766578083878060010198508151811061175957611759614e59565b6020026020010181815250505b6001016116f7565b50909695505050505050565b600061178e6033546001600160a01b031690565b905090565b61179b612cd1565b807fa0c8dcc8fe7bbc6a8ab6722606bd806b13362a51b3f32ec96b5da72f99e61543805460ff191691151591909117905550565b60607f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c406003018054610b8890614d85565b611808612cd1565b7fa0c8dcc8fe7bbc6a8ab6722606bd806b13362a51b3f32ec96b5da72f99e6154380546c01000000000000000000000000900461ffff908116908316106118915760405162461bcd60e51b815260206004820152601760248201527f4e45575f4d41585f535550504c595f544f4f5f484947480000000000000000006044820152606401610ada565b7f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c41547f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c405403600019018261ffff16101561192d5760405162461bcd60e51b815260206004820152601f60248201527f535550504c595f4c4f5745525f5448414e5f4d494e5445445f544f4b454e53006044820152606401610ada565b805461ffff9092166c01000000000000000000000000027fffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffff909216919091179055565b60608183106119ab576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806119d67f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c405490565b905060018510156119e657600194505b808411156119f2578093505b60006119fd876115cd565b905084861015611a1c5785850381811015611a16578091505b50611a20565b5060005b60008167ffffffffffffffff811115611a3b57611a3b614889565b604051908082528060200260200182016040528015611a64578160200160208202803683370190505b50905081600003611a7a579350611b2992505050565b6000611a8588611beb565b905060008160400151611a96575080515b885b888114158015611aa85750848714155b15611b1d57611ab6816134a8565b92508260400151611b155782516001600160a01b031615611ad657825191505b8a6001600160a01b0316826001600160a01b031603611b155780848880600101995081518110611b0857611b08614e59565b6020026020010181815250505b600101611a98565b50505092835250909150505b9392505050565b81611b3a81612dbc565b7fa0c8dcc8fe7bbc6a8ab6722606bd806b13362a51b3f32ec96b5da72f99e6154354640100000000900460ff1615611bb45760405162461bcd60e51b815260206004820152601260248201527f544f4b454e5f49535f534f554c424f554e4400000000000000000000000000006044820152606401610ada565b610d158383613564565b836001600160a01b0381163314611bd857611bd833612dbc565b611be4858585856135ef565b5050505050565b6040805160808101825260008082526020820181905291810182905260608101919091526040805160808101825260008082526020820181905291810182905260608101919091526001831080611c6357507f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c40548310155b15611c6e5792915050565b611c77836134a8565b9050806040015115611c895792915050565b611b298361364c565b6060611c9d82612d30565b611cd3576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281527fa0c8dcc8fe7bbc6a8ab6722606bd806b13362a51b3f32ec96b5da72f99e615576020526040812080547fa0c8dcc8fe7bbc6a8ab6722606bd806b13362a51b3f32ec96b5da72f99e61543929190611d2f90614d85565b80601f0160208091040260200160405190810160405280929190818152602001828054611d5b90614d85565b8015611da85780601f10611d7d57610100808354040283529160200191611da8565b820191906000526020600020905b815481529060010190602001808311611d8b57829003601f168201915b505050505090508051600014611dbf579392505050565b6000611dc96136dd565b90508051600003611dec5750506040805160208101909152600081529392505050565b60008581526018840160205260408120546005850154909190790100000000000000000000000000000000000000000000000000900460ff168015611e3057508115155b611e3a5786611e3c565b815b905082611e4882613705565b604051602001611e59929190614fa8565b60405160208183030381529060405295505050505050919050565b611e7c612cd1565b7fa0c8dcc8fe7bbc6a8ab6722606bd806b13362a51b3f32ec96b5da72f99e6154980547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff1668010000000000000000179055565b60007fa0c8dcc8fe7bbc6a8ab6722606bd806b13362a51b3f32ec96b5da72f99e615435461178e907201000000000000000000000000000000000000900463ffffffff166509184e72a000614e07565b611f28612cd1565b7fa0c8dcc8fe7bbc6a8ab6722606bd806b13362a51b3f32ec96b5da72f99e6154380547fffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffff16720100000000000000000000000000000000000063ffffffff90931692909202919091179055565b6001600160a01b03811660009081527f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c4560205260408082205467ffffffffffffffff911c16610a7b565b6000611fea846115c2565b9050336001600160a01b03821614612090576001600160a01b03811660009081527f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c476020908152604080832033845290915290205460ff16612090573361205085610c0b565b6001600160a01b031614612090576040517f4f1dd8e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481527f3afe07c861b9a7bc7a9e79bc19e0c388d1919cadc55b9bca778f1b978d30832660209081526040918290206001600160a01b03861660a086901b7bffffffffffffffff0000000000000000000000000000000000000000168117909155825167ffffffffffffffff861681529251909287927f4e06b4e7000e659094299b3533b47b6aa8ad048e95e872d23d1f4ee55af89cfe92918290030190a350505050565b61213f612cd1565b6001600160a01b0381166121bb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610ada565b6121c481613401565b50565b6121cf612cd1565b7fa0c8dcc8fe7bbc6a8ab6722606bd806b13362a51b3f32ec96b5da72f99e615438054911515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909216919091179055565b7fee151c8401928dc223602bb187aff91b9a56c7cae5476ef1b3287b085a16c85f54610100900460ff1661227e577fee151c8401928dc223602bb187aff91b9a56c7cae5476ef1b3287b085a16c85f5460ff1615612282565b303b155b6122f45760405162461bcd60e51b815260206004820152603760248201527f455243373231415f5f496e697469616c697a61626c653a20636f6e747261637460448201527f20697320616c726561647920696e697469616c697a65640000000000000000006064820152608401610ada565b7fee151c8401928dc223602bb187aff91b9a56c7cae5476ef1b3287b085a16c85f54610100900460ff16158015612371577fee151c8401928dc223602bb187aff91b9a56c7cae5476ef1b3287b085a16c85f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000166101011790555b600054610100900460ff16158080156123915750600054600160ff909116105b806123ab5750303b1580156123ab575060005460ff166001145b61241d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610ada565b6000805460ff19166001179055801561245d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6124678585613749565b61246f6137ef565b612477613874565b6124c18360c00151151560011515146124a45773511af84166215d528abf8ba6437ec4becf31934b6124ba565b733cc6cdda760b79bafa08df41ecfa224f810dceb65b60016138f9565b827fa0c8dcc8fe7bbc6a8ab6722606bd806b13362a51b3f32ec96b5da72f99e6154360000160008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548160ff02191690831515021790555060408201518160000160026101000a81548160ff02191690831515021790555060608201518160000160036101000a81548160ff02191690831515021790555060808201518160000160046101000a81548160ff02191690831515021790555060a08201518160000160056101000a81548160ff02191690831515021790555060c08201518160000160066101000a81548160ff02191690831515021790555060e08201518160000160076101000a81548160ff0219169083151502179055506101008201518160000160086101000a81548160ff021916908360ff1602179055506101208201518160000160096101000a81548160ff021916908360ff16021790555061014082015181600001600a6101000a81548160ff021916908360ff16021790555061016082015181600001600b6101000a81548160ff021916908360ff16021790555061018082015181600001600c6101000a81548161ffff021916908361ffff1602179055506101a082015181600001600e6101000a81548161ffff021916908361ffff1602179055506101c08201518160000160106101000a81548161ffff021916908361ffff1602179055506101e08201518160000160126101000a81548163ffffffff021916908363ffffffff1602179055506102008201518160000160166101000a81548163ffffffff021916908363ffffffff16021790555061022082015181600001601a6101000a81548162ffffff021916908362ffffff16021790555061024082015181600001601d6101000a81548160ff02191690831515021790555061026082015181600001601e6101000a81548160ff0219169083151502179055506102808201518160010160006101000a81548161ffff021916908361ffff1602179055506102a08201518160020190816127cc9190614fd7565b506102c08201516003820180546102e08086015161030087015161032088015163ffffffff9081167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9282167801000000000000000000000000000000000000000000000000029290921677ffffffffffffffffffffffffffffffffffffffffffffffff93821674010000000000000000000000000000000000000000027fffffffffffffffff0000000000000000000000000000000000000000000000009096166001600160a01b0390981697909717949094179190911694909417939093179091556103408401516004909301805461036086015161038090960151831668010000000000000000027fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff968416640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090921695841695909517179490941692909217909255908401511615801590612970575061030083015163ffffffff16155b156129fb576102e0830151612989906312bed400615097565b7fa0c8dcc8fe7bbc6a8ab6722606bd806b13362a51b3f32ec96b5da72f99e61546805463ffffffff929092167801000000000000000000000000000000000000000000000000027fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff9092169190911790555b600083610300015163ffffffff16118015612a1f57506102e083015163ffffffff16155b15612a8b577fa0c8dcc8fe7bbc6a8ab6722606bd806b13362a51b3f32ec96b5da72f99e6154680547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000063ffffffff4216021790555b600083610320015163ffffffff16118015612aaf575061034083015163ffffffff16155b15612b2057610320830151612ac8906312bed400615097565b7fa0c8dcc8fe7bbc6a8ab6722606bd806b13362a51b3f32ec96b5da72f99e6154360040180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff929092169190911790555b600083610340015163ffffffff16118015612b44575061032083015163ffffffff16155b15612bb4577fa0c8dcc8fe7bbc6a8ab6722606bd806b13362a51b3f32ec96b5da72f99e6154680547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167c010000000000000000000000000000000000000000000000000000000063ffffffff4216021790555b8015612c1757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b508015610da95750507fee151c8401928dc223602bb187aff91b9a56c7cae5476ef1b3287b085a16c85f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555050565b6000612c7682613b52565b80612cc257507f2a55205a000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b80610a7b5750610a7b82613c33565b33612cda61177a565b6001600160a01b0316146111e95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ada565b600081600111158015612d6357507f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c405482105b8015610a7b57505060009081527f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c4460205260409020547c0100000000000000000000000000000000000000000000000000000000161590565b7f5763ff58c27377b9a9b40e9e2f5e53a9dd7cff5464aac8fc758a651823f78e5e5460ff16158015612dfc57506daaeb6d7670e522a718067333cd4e3b15155b156121c4576040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015612e72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e9691906150bb565b6121c4576040517fede71dcc0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610ada565b612ee382826001613c8c565b5050565b6000612ef2826132ce565b9050836001600160a01b0316816001600160a01b031614612f3f576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281527f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c46602052604090208054338082146001600160a01b03881690911417613000576001600160a01b03861660009081527f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c476020908152604080832033845290915290205460ff16613000576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038516613040576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61304d8686866001613dbf565b801561305857600082555b6001600160a01b0386811660009081527f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c4560205260408082208054600019019055918716808252919020805460010190554260a01b177c02000000000000000000000000000000000000000000000000000000001760008581527f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c4460205260408120919091557c0200000000000000000000000000000000000000000000000000000000841690036131b7576001840160008181527f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c44602052604081205490036131b5577f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c405481146131b55760008181527f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c44602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6002609754036132535760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610ada565b6002609755565b6001609755565b613269613fb2565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b610d1583838360405180602001604052806000815250611bbe565b6000816001116133cf575060008181527f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c446020526040812054907c0100000000000000000000000000000000000000000000000000000000821690036133cf57806000036133ca577f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c40548210613390576040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000190160008181527f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c4460205260409020548015613390575b919050565b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b613473614004565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586132963390565b604080516080810182526000808252602082018190529181018290526060810191909152610a7b7f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c4060008481526004919091016020526040902054604080516080810182526001600160a01b038316815260a083901c67ffffffffffffffff1660208201527c0100000000000000000000000000000000000000000000000000000000831615159181019190915260e89190911c606082015290565b3360008181527f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c47602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6135fa848484610d84565b6001600160a01b0383163b15610da95761361684848484614057565b610da9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516080810182526000808252602082018190529181018290526060810191909152610a7b61367c836132ce565b604080516080810182526001600160a01b038316815260a083901c67ffffffffffffffff1660208201527c0100000000000000000000000000000000000000000000000000000000831615159181019190915260e89190911c606082015290565b60607fa0c8dcc8fe7bbc6a8ab6722606bd806b13362a51b3f32ec96b5da72f99e61543610b7a565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a90048061371f5750819003601f19909101908152919050565b7fee151c8401928dc223602bb187aff91b9a56c7cae5476ef1b3287b085a16c85f54610100900460ff166137e55760405162461bcd60e51b815260206004820152603460248201527f455243373231415f5f496e697469616c697a61626c653a20636f6e747261637460448201527f206973206e6f7420696e697469616c697a696e670000000000000000000000006064820152608401610ada565b612ee382826141a5565b600054610100900460ff1661386c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610ada565b6111e96142c1565b600054610100900460ff166138f15760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610ada565b6111e9614347565b600054610100900460ff166139765760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610ada565b6daaeb6d7670e522a718067333cd4e3b15612ee3576040517fc3c5a5470000000000000000000000000000000000000000000000000000000081523060048201526daaeb6d7670e522a718067333cd4e9063c3c5a547906024016020604051808303816000875af11580156139ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a1391906150bb565b612ee3578015613aa0576040517f7d3e3dbe0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b158015613a8c57600080fd5b505af11580156131f9573d6000803e3d6000fd5b6001600160a01b03821615613b08576040517fa0af29030000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af290390604401613a72565b6040517f4420e4860000000000000000000000000000000000000000000000000000000081523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401613a72565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161480613be557507f80ac58cd000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b80610a7b5750507fffffffff00000000000000000000000000000000000000000000000000000000167f5b5e139f000000000000000000000000000000000000000000000000000000001490565b6000613c3e82613b52565b80610a7b5750507fffffffff00000000000000000000000000000000000000000000000000000000167fad092b5c000000000000000000000000000000000000000000000000000000001490565b6000613c97836115c2565b90508115613d2b57336001600160a01b03821614613d2b576001600160a01b03811660009081527f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c476020908152604080832033845290915290205460ff16613d2b576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381527f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c46602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0388811691821790925591518693918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a450505050565b613dc7614004565b836001600160a01b0381163314613de157613de133612dbc565b7fa0c8dcc8fe7bbc6a8ab6722606bd806b13362a51b3f32ec96b5da72f99e61548547fa0c8dcc8fe7bbc6a8ab6722606bd806b13362a51b3f32ec96b5da72f99e615439060ff161580613e385750601981015460ff165b80613e5157506000848152601a82016020526040902054155b613e9d5760405162461bcd60e51b815260206004820152600f60248201527f544f4b454e5f49535f5354414b454400000000000000000000000000000000006044820152606401610ada565b6000848152601e820160205260409020546001600160a01b031615613f045760405162461bcd60e51b815260206004820152601c60248201527f43414e4e4f545f5452414e534645525f4c4f414e45445f544f4b454e000000006044820152606401610ada565b8054640100000000900460ff168015613f225750601781015460ff16155b15613f7e576001600160a01b03861615613f7e5760405162461bcd60e51b815260206004820152601260248201527f544f4b454e5f49535f534f554c424f554e4400000000000000000000000000006044820152606401610ada565b805465010000000000900460ff168015613f9f57506001600160a01b038616155b15613fad57613fad846143c4565b6131f9565b60655460ff166111e95760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610ada565b60655460ff16156111e95760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610ada565b6040517f150b7a020000000000000000000000000000000000000000000000000000000081526000906001600160a01b0385169063150b7a02906140a59033908990889088906004016150d8565b6020604051808303816000875af19250505080156140e0575060408051601f3d908101601f191682019092526140dd91810190615114565b60015b614157573d80801561410e576040519150601f19603f3d011682016040523d82523d6000602084013e614113565b606091505b50805160000361414f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050949350505050565b7fee151c8401928dc223602bb187aff91b9a56c7cae5476ef1b3287b085a16c85f54610100900460ff166142415760405162461bcd60e51b815260206004820152603460248201527f455243373231415f5f496e697469616c697a61626c653a20636f6e747261637460448201527f206973206e6f7420696e697469616c697a696e670000000000000000000000006064820152608401610ada565b7f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c4261426c8382614fd7565b507f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c436142988282614fd7565b5060017f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c40555050565b600054610100900460ff1661433e5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610ada565b6111e933613401565b600054610100900460ff1661325a5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610ada565b60008181527fa0c8dcc8fe7bbc6a8ab6722606bd806b13362a51b3f32ec96b5da72f99e6156360205260409020547fa0c8dcc8fe7bbc6a8ab6722606bd806b13362a51b3f32ec96b5da72f99e6155590612ee3576040805144602082015290810183905260600160408051601f1981840301815291815281516020928301206000858152600e85019093529120555050565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146121c457600080fd5b60006020828403121561449657600080fd5b8135611b2981614456565b803563ffffffff811681146133ca57600080fd5b6000602082840312156144c757600080fd5b611b29826144a1565b60005b838110156144eb5781810151838201526020016144d3565b50506000910152565b6000815180845261450c8160208601602086016144d0565b601f01601f19169290920160200192915050565b602081526000611b2960208301846144f4565b60006020828403121561454557600080fd5b5035919050565b80356001600160a01b03811681146133ca57600080fd5b6000806040838503121561457657600080fd5b61457f8361454c565b946020939093013593505050565b803560ff811681146133ca57600080fd5b6000602082840312156145b057600080fd5b611b298261458d565b6000806000606084860312156145ce57600080fd5b6145d78461454c565b92506145e56020850161454c565b9150604084013590509250925092565b6000806040838503121561460857600080fd5b50508035926020909101359150565b6000806020838503121561462a57600080fd5b823567ffffffffffffffff8082111561464257600080fd5b818501915085601f83011261465657600080fd5b81358181111561466557600080fd5b86602082850101111561467757600080fd5b60209290920196919550909350505050565b6000806020838503121561469c57600080fd5b823567ffffffffffffffff808211156146b457600080fd5b818501915085601f8301126146c857600080fd5b8135818111156146d757600080fd5b8660208260051b850101111561467757600080fd5b6020808252825182820181905260009190848201906040850190845b8181101561176e576147568385516001600160a01b03815116825267ffffffffffffffff602082015116602083015260408101511515604083015262ffffff60608201511660608301525050565b9284019260809290920191600101614708565b60006020828403121561477b57600080fd5b611b298261454c565b6020808252825182820181905260009190848201906040850190845b8181101561176e578351835292840192918401916001016147a0565b80151581146121c457600080fd5b80356133ca816147bc565b6000602082840312156147e757600080fd5b8135611b29816147bc565b803561ffff811681146133ca57600080fd5b60006020828403121561481657600080fd5b611b29826147f2565b60008060006060848603121561483457600080fd5b61483d8461454c565b95602085013595506040909401359392505050565b6000806040838503121561486557600080fd5b61486e8361454c565b9150602083013561487e816147bc565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516103a0810167ffffffffffffffff811182821017156148dc576148dc614889565b60405290565b600067ffffffffffffffff808411156148fd576148fd614889565b604051601f8501601f19908116603f0116810190828211818310171561492557614925614889565b8160405280935085815286868601111561493e57600080fd5b858560208301376000602087830101525050509392505050565b6000806000806080858703121561496e57600080fd5b6149778561454c565b93506149856020860161454c565b925060408501359150606085013567ffffffffffffffff8111156149a857600080fd5b8501601f810187136149b957600080fd5b6149c8878235602084016148e2565b91505092959194509250565b81516001600160a01b0316815260208083015167ffffffffffffffff169082015260408083015115159082015260608083015162ffffff169082015260808101610a7b565b600080600060608486031215614a2e57600080fd5b83359250614a3e6020850161454c565b9150604084013567ffffffffffffffff81168114614a5b57600080fd5b809150509250925092565b60008060408385031215614a7957600080fd5b614a828361454c565b9150614a906020840161454c565b90509250929050565b600082601f830112614aaa57600080fd5b611b29838335602085016148e2565b803562ffffff811681146133ca57600080fd5b600080600060608486031215614ae157600080fd5b833567ffffffffffffffff80821115614af957600080fd5b614b0587838801614a99565b94506020860135915080821115614b1b57600080fd5b614b2787838801614a99565b93506040860135915080821115614b3d57600080fd5b908501906103a08288031215614b5257600080fd5b614b5a6148b8565b614b63836147ca565b8152614b71602084016147ca565b6020820152614b82604084016147ca565b6040820152614b93606084016147ca565b6060820152614ba4608084016147ca565b6080820152614bb560a084016147ca565b60a0820152614bc660c084016147ca565b60c0820152614bd760e084016147ca565b60e0820152610100614bea81850161458d565b90820152610120614bfc84820161458d565b90820152610140614c0e84820161458d565b90820152610160614c2084820161458d565b90820152610180614c328482016147f2565b908201526101a0614c448482016147f2565b908201526101c0614c568482016147f2565b908201526101e0614c688482016144a1565b90820152610200614c7a8482016144a1565b90820152610220614c8c848201614ab9565b90820152610240614c9e8482016147ca565b90820152610260614cb08482016147ca565b90820152610280614cc28482016147f2565b908201526102a08381013583811115614cda57600080fd5b614ce68a828701614a99565b8284015250506102c09150614cfc82840161454c565b828201526102e09150614d108284016144a1565b828201526103009150614d248284016144a1565b828201526103209150614d388284016144a1565b828201526103409150614d4c8284016144a1565b828201526103609150614d608284016144a1565b828201526103809150614d748284016144a1565b828201528093505050509250925092565b600181811c90821680614d9957607f821691505b602082108103614dd2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082028115828204841417610a7b57610a7b614dd8565b600082614e54577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006000198203614e9b57614e9b614dd8565b5060010190565b601f821115610d1557600081815260208120601f850160051c81016020861015614ec95750805b601f850160051c820191505b818110156131f957828155600101614ed5565b67ffffffffffffffff831115614f0057614f00614889565b614f1483614f0e8354614d85565b83614ea2565b6000601f841160018114614f485760008515614f305750838201355b600019600387901b1c1916600186901b178355611be4565b600083815260209020601f19861690835b82811015614f795786850135825560209485019460019092019101614f59565b5086821015614f965760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60008351614fba8184602088016144d0565b835190830190614fce8183602088016144d0565b01949350505050565b815167ffffffffffffffff811115614ff157614ff1614889565b61500581614fff8454614d85565b84614ea2565b602080601f83116001811461503a57600084156150225750858301515b600019600386901b1c1916600185901b1785556131f9565b600085815260208120601f198616915b828110156150695788860151825594840194600190910190840161504a565b50858210156150875787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b63ffffffff8181168382160190808211156150b4576150b4614dd8565b5092915050565b6000602082840312156150cd57600080fd5b8151611b29816147bc565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261510a60808301846144f4565b9695505050505050565b60006020828403121561512657600080fd5b8151611b298161445656fea26469706673582212208b3a4e41c38bfd7ddfb628a9e044342348fbb4e74341ba84c9d9be7dba429e8964736f6c63430008120033