608060405234801561001057600080fd5b506124b2806100206000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c806370a0823111610104578063bf86d690116100a2578063c6b61e4c11610071578063c6b61e4c146104ba578063dc9ac796146104e7578063f3283fba146104fa578063fc0e74d11461050d57600080fd5b8063bf86d690146103de578063c23f001f146103fb578063c42cf53514610473578063c4a44de31461048657600080fd5b806395d89b41116100de57806395d89b411461039b57806396c3bdb9146103a3578063a1dc063d146103c3578063b97dd9e2146103d657600080fd5b806370a082311461035d5780638f05d8e7146103705780639075becf1461038357600080fd5b8063313ce56711610171578063485d38341161014b578063485d38341461030a5780634eb665af1461031357806352e5b7e4146103265780636ff1c9bc1461034a57600080fd5b8063313ce5671461028e57806342129a50146102a3578063485cc955146102f757600080fd5b80631fad6d6e116101ad5780631fad6d6e14610233578063282d3fdf146102465780632f6c493c1461025b578063302112271461026e57600080fd5b806306fdde03146101d45780630c340a24146101f257806318160ddd1461021d575b600080fd5b6101dc610515565b6040516101e991906120f7565b60405180910390f35b603354610205906001600160a01b031681565b6040516001600160a01b0390911681526020016101e9565b6102256105a7565b6040519081526020016101e9565b610225610241366004612146565b610600565b610259610254366004612179565b61062d565b005b6102596102693660046121a3565b6106e6565b61022561027c3660046121a3565b60396020526000908152604090205481565b60408054905160ff90911681526020016101e9565b6102d76102b13660046121a3565b603660205260009081526040902080546001909101546001600160a01b03918216911682565b604080516001600160a01b039384168152929091166020830152016101e9565b610259610305366004612146565b61074f565b61022560375481565b6102596103213660046121be565b61099e565b610339610334366004612146565b610a23565b6040516101e99594939291906121d7565b6102596103583660046121a3565b610d08565b61022561036b3660046121a3565b610e83565b61022561037e366004612179565b610eeb565b603d546102059061010090046001600160a01b031681565b6101dc611065565b6102256103b13660046121a3565b60386020526000908152604090205481565b6102596103d1366004612146565b611074565b6102256111b4565b603d546103eb9060ff1681565b60405190151581526020016101e9565b610447610409366004612146565b603b60209081526000928352604080842090915290825290208054600182015460029092015490919063ffffffff8082169164010000000090041684565b60408051948552602085019390935263ffffffff918216928401929092521660608201526080016101e9565b6102596104813660046121a3565b6111d3565b610499610494366004612255565b61124b565b60408051938452602084019290925263ffffffff16908201526060016101e9565b6104cd6104c83660046121be565b6112a1565b6040805192835263ffffffff9091166020830152016101e9565b6102596104f53660046121a3565b6112d5565b6102596105083660046121a3565b6114e0565b61025961155e565b6060603e805461052490612291565b80601f016020809104026020016040519081016040528092919081815260200182805461055090612291565b801561059d5780601f106105725761010080835404028352916020019161059d565b820191906000526020600020905b81548152906001019060200180831161058057829003601f168201915b5050505050905090565b6000805b6034548110156105fc576000818152603560209081526040808320546001600160a01b03168084526039909252909120546105e690846122dc565b92505080806105f4906122f4565b9150506105ab565b5090565b6001600160a01b038083166000908152603b60209081526040808320938516835292905220545b92915050565b600260015414156106855760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b600260019081556001600160a01b0380841660009081526036602090815260409182902082518084019093528054841680845294015490921691810191909152906106d2903330856115b6565b6106dd83338461166d565b50506001805550565b600260015414156107395760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161067c565b600260015561074881336118a5565b5060018055565b600054610100900460ff1661076a5760005460ff161561076e565b303b155b6107e05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161067c565b600054610100900460ff16158015610802576000805461ffff19166101011790555b61080a611bd5565b6033805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0385811691909117909155603d805474ffffffffffffffffffffffffffffffffffffffff001916610100928516929092029190911790556040805180820190915260168082527f4f6e582e46696e616e636520476f7665726e616e63650000000000000000000060209092019182526108a791603e9161203b565b506040805180820190915260058082527f6f6e4f4e5800000000000000000000000000000000000000000000000000000060209092019182526108ec91603f9161203b565b506040805460ff191660121790556228de80603755603a546109785760006109126111b4565b9050603a60405180604001604052806000815260200161093184611c4a565b63ffffffff9081169091528254600181810185556000948552602094859020845160029093020191825593909201519190920180549190921663ffffffff19909116179055505b6000603455603d805460ff191690558015610999576000805461ff00191690555b505050565b603d5461010090046001600160a01b031633148015906109c957506033546001600160a01b03163314155b156109e75760405163310fc72960e21b815260040160405180910390fd5b80610a1e576040517f08927dbf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603755565b6001600160a01b038083166000908152603c6020908152604080832093851683529281528282208054845181840281018401909552808552929384938493849360609385939092849084015b82821015610ac15760008481526020908190206040805160608101825260038602909201805483526001808201548486015260029091015463ffffffff16918301919091529083529092019101610a6f565b505050506001600160a01b038981166000908152603b60209081526040808320938c1683529281528282208351608081018552815481526001820154928101929092526002015463ffffffff808216948301859052640100000000909104166060820152929350815b8451811015610cf657848181518110610b4557610b4561230f565b60200260200101516040015163ffffffff1660001415610b8f57848181518110610b7157610b7161230f565b60200260200101516000015189610b8891906122dc565b9850610ce4565b42858281518110610ba257610ba261230f565b60200260200101516040015163ffffffff161115610cb85781610c4357808551610bcc9190612325565b67ffffffffffffffff811115610be457610be461233c565b604051908082528060200260200182016040528015610c3f57816020015b610c2c60405180606001604052806000815260200160008152602001600063ffffffff1681525090565b815260200190600190039081610c025790505b5095505b848181518110610c5557610c5561230f565b6020026020010151868381518110610c6f57610c6f61230f565b60200260200101819052508180610c85906122f4565b925050848181518110610c9a57610c9a61230f565b60200260200101516000015187610cb191906122dc565b9650610ce4565b848181518110610cca57610cca61230f565b60200260200101516000015188610ce191906122dc565b97505b80610cee816122f4565b915050610b2a565b50509051965050509295509295909350565b603d5461010090046001600160a01b03163314801590610d3357506033546001600160a01b03163314155b15610d515760405163310fc72960e21b815260040160405180910390fd5b6001600160a01b038181166000908152603660209081526040808320815180830183528154861680825260019092015490951692850192909252517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526370a082319060240160206040518083038186803b158015610dd657600080fd5b505afa158015610dea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0e9190612352565b603d548351919250610e32916001600160a01b039081169161010090041683611cc6565b603d54604080516101009092046001600160a01b031682526020820183905233917ff24ef89f38eadc1bde50701ad6e4d6d11a2dc24f7cf834a486991f3883328504910160405180910390a2505050565b6000805b603454811015610ee5576000818152603560209081526040808320546001600160a01b038781168552603b84528285209116808552925290912060010154610ecf90846122dc565b9250508080610edd906122f4565b915050610e87565b50919050565b6001600160a01b0380831660009081526036602090815260408083208151808301909252805485168252600101549093169083018190529091901561105c576000816020015190506000816001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f6e57600080fd5b505afa158015610f82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa69190612352565b90506000826001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015610fe357600080fd5b505afa158015610ff7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101b9190612389565b506dffffffffffffffffffffffffffff1691508290508661103d8360026123d9565b61104791906123d9565b61105191906123f8565b945050505050610627565b82915050610627565b6060603f805461052490612291565b603d5461010090046001600160a01b0316331480159061109f57506033546001600160a01b03163314155b156110bd5760405163310fc72960e21b815260040160405180910390fd5b6001600160a01b0382166110e457604051630e1478bb60e41b815260040160405180910390fd5b6001600160a01b038281166000908152603660205260409020541661114e57603480546000908152603560205260408120805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03861617905581549190611148836122f4565b91905055505b6040805180820182526001600160a01b039384168082529284166020808301918252600094855260369052919092209151825490841673ffffffffffffffffffffffffffffffffffffffff19918216178355905160019092018054929093169116179055565b6037546000906111c481426123f8565b6111ce91906123d9565b905090565b603d5461010090046001600160a01b031633148015906111fe57506033546001600160a01b03163314155b1561121c5760405163310fc72960e21b815260040160405180910390fd5b6033805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b603c602052826000526040600020602052816000526040600020818154811061127357600080fd5b600091825260209091206003909102018054600182015460029092015490945090925063ffffffff16905083565b603a81815481106112b157600080fd5b60009182526020909120600290910201805460019091015490915063ffffffff1682565b600260015414156113285760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161067c565b60026001553361133882826118a5565b6001600160a01b038082166000818152603c60209081526040808320948716808452948252808320938352603b82528083209483529390529190912081546113935760405163b0fded3560e01b815260040160405180910390fd5b81546037546000906113a590426122dc565b603d5490915060ff16806113ed5750836113c0600184612325565b815481106113d0576113d061230f565b600091825260209091206002600390920201015463ffffffff1615155b15611422576113fb82611c4a565b8360020160046101000a81548163ffffffff021916908363ffffffff1602179055506114d4565b6002830154640100000000900463ffffffff16805b838110156114aa5761144883611c4a565b86828154811061145a5761145a61230f565b906000526020600020906003020160020160006101000a81548163ffffffff021916908363ffffffff16021790555081806114949061241a565b92505080806114a2906122f4565b915050611437565b5060028401805463ffffffff9092166401000000000267ffffffff00000000199092169190911790555b50506001805550505050565b603d5461010090046001600160a01b0316331480159061150b57506033546001600160a01b03163314155b156115295760405163310fc72960e21b815260040160405180910390fd5b603d80546001600160a01b039092166101000274ffffffffffffffffffffffffffffffffffffffff0019909216919091179055565b603d5461010090046001600160a01b0316331480159061158957506033546001600160a01b03163314155b156115a75760405163310fc72960e21b815260040160405180910390fd5b603d805460ff19166001179055565b6040516001600160a01b03808516602483015283166044820152606481018290526116679085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611d0f565b50505050565b806116a4576040517f6e0ccc0700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03838116600090815260366020526040902054166116dc57604051630e1478bb60e41b815260040160405180910390fd5b603d5460ff1615611719576040517fbdf1cb2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038083166000908152603b60209081526040808320938716835292905290812090829061174d8683610eeb565b835490915061175d9083906122dc565b8355600183015461176f9082906122dc565b60018401556001600160a01b0386166000908152603860205260409020546117989083906122dc565b6001600160a01b0387166000908152603860209081526040808320939093556039905220546117c89082906122dc565b6001600160a01b03878116600081815260396020908152604080832095909555928916808252603c8452848220838352845284822085516060808201885289825281870189815282890186815284546001808201875595885296899020935160039097029093019586555192850192909255516002909301805463ffffffff191663ffffffff909416939093179092558451928352928201889052928101859052918201839052907fad3fa07f4195b47e64892eb944ecbfc253384053c119852bb2bcae484c2fcb699060800160405180910390a2505050505050565b6001600160a01b038082166000818152603c60209081526040808320948716808452948252808320938352603b82528083209483529390529190912081546119005760405163b0fded3560e01b815260040160405180910390fd5b8154603d54600091829160ff168061198c57508461191f600183612325565b8154811061192f5761192f61230f565b600091825260209091206002600390920201015463ffffffff161580159061198c5750428561195f600184612325565b8154811061196f5761196f61230f565b600091825260209091206002600390920201015463ffffffff1611155b156119c7578354600185015490935091506119a681611c4a565b60028501805463ffffffff191663ffffffff92909216919091179055611ae8565b600284015463ffffffff16805b82811015611aca578681815481106119ee576119ee61230f565b600091825260209091206002600390920201015463ffffffff16611a1157611aca565b42878281548110611a2457611a2461230f565b600091825260209091206002600390920201015463ffffffff161115611a4957611aca565b868181548110611a5b57611a5b61230f565b90600052602060002090600302016000015485611a7891906122dc565b9450868181548110611a8c57611a8c61230f565b90600052602060002090600302016001015484611aa991906122dc565b935081611ab58161241a565b92505080611ac2816122f4565b9150506119d4565b5060028501805463ffffffff191663ffffffff929092169190911790555b8215611bcc578354611afb908490612325565b84556001840154611b0d908390612325565b60018501556001600160a01b038716600090815260386020526040902054611b36908490612325565b6001600160a01b038816600090815260386020908152604080832093909355603990522054611b66908390612325565b6001600160a01b03808916600081815260396020908152604091829020949094558051918252928101869052908816917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb910160405180910390a2611bcc878785611df4565b50505050505050565b600054610100900460ff16611c405760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161067c565b611c48611e39565b565b600063ffffffff8211156105fc5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201527f3220626974730000000000000000000000000000000000000000000000000000606482015260840161067c565b6040516001600160a01b0383166024820152604481018290526109999084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401611603565b6000611d64826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611eaa9092919063ffffffff16565b8051909150156109995780806020019051810190611d82919061243e565b6109995760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161067c565b6001600160a01b038084166000908152603660209081526040918290208251808401909352805484168084526001909101549093169082015290611667908484611cc6565b600054610100900460ff16611ea45760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161067c565b60018055565b6060611eb98484600085611ec3565b90505b9392505050565b606082471015611f3b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161067c565b843b611f895760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161067c565b600080866001600160a01b03168587604051611fa59190612460565b60006040518083038185875af1925050503d8060008114611fe2576040519150601f19603f3d011682016040523d82523d6000602084013e611fe7565b606091505b5091509150611ff7828286612002565b979650505050505050565b60608315612011575081611ebc565b8251156120215782518084602001fd5b8160405162461bcd60e51b815260040161067c91906120f7565b82805461204790612291565b90600052602060002090601f01602090048101928261206957600085556120af565b82601f1061208257805160ff19168380011785556120af565b828001600101855582156120af579182015b828111156120af578251825591602001919060010190612094565b506105fc9291505b808211156105fc57600081556001016120b7565b60005b838110156120e65781810151838201526020016120ce565b838111156116675750506000910152565b60208152600082518060208401526121168160408501602087016120cb565b601f01601f19169190910160400192915050565b80356001600160a01b038116811461214157600080fd5b919050565b6000806040838503121561215957600080fd5b6121628361212a565b91506121706020840161212a565b90509250929050565b6000806040838503121561218c57600080fd5b6121958361212a565b946020939093013593505050565b6000602082840312156121b557600080fd5b611ebc8261212a565b6000602082840312156121d057600080fd5b5035919050565b600060a0820187835260208781850152604087818601526060878187015260a0608087015283875180865260c088019150848901955060005b8181101561224357865180518452868101518785015285015163ffffffff16858401529585019591830191600101612210565b50909c9b505050505050505050505050565b60008060006060848603121561226a57600080fd5b6122738461212a565b92506122816020850161212a565b9150604084013590509250925092565b600181811c908216806122a557607f821691505b60208210811415610ee557634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082198211156122ef576122ef6122c6565b500190565b6000600019821415612308576123086122c6565b5060010190565b634e487b7160e01b600052603260045260246000fd5b600082821015612337576123376122c6565b500390565b634e487b7160e01b600052604160045260246000fd5b60006020828403121561236457600080fd5b5051919050565b80516dffffffffffffffffffffffffffff8116811461214157600080fd5b60008060006060848603121561239e57600080fd5b6123a78461236b565b92506123b56020850161236b565b9150604084015163ffffffff811681146123ce57600080fd5b809150509250925092565b60008160001904831182151516156123f3576123f36122c6565b500290565b60008261241557634e487b7160e01b600052601260045260246000fd5b500490565b600063ffffffff80831681811415612434576124346122c6565b6001019392505050565b60006020828403121561245057600080fd5b81518015158114611ebc57600080fd5b600082516124728184602087016120cb565b919091019291505056fea26469706673582212206e85dbf9d66914c00d616e719b6b04cb6c66a064c9d3cf5b50e0c7e7d24a8df564736f6c63430008090033