0x608060405234801561001057600080fd5b50611ecc806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80638fe1c6cd1461003b578063fba21b3d14610092575b600080fd5b6100616004803603602081101561005157600080fd5b50356001600160a01b03166100d8565b604080516001600160a01b03909416845260029290920b602084015263ffffffff1682820152519081900360600190f35b6100c6600480360360608110156100a857600080fd5b506001600160a01b0381351690602081013515159060400135610161565b60408051918252519081900360200190f35b600080600080600080866001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b15801561011a57600080fd5b505afa15801561012e573d6000803e3d6000fd5b505050506040513d60e081101561014457600080fd5b508051602082015160a09092015190999198509650945050505050565b600080600080856101865773fffd8963efd1fc6a506488495d951d5263988d2561018d565b6401000276a45b9050600061019a8861027b565b90508060000b6003141561024457876001600160a01b0316635d41514b8888856040518463ffffffff1660e01b8152600401808415158152602001838152602001826001600160a01b03168152602001935050505060a06040518083038186803b15801561020757600080fd5b505afa15801561021b573d6000803e3d6000fd5b505050506040513d60a081101561023157600080fd5b5080516020909101519094509250610257565b61025188828989866102f7565b90945092505b861561026b57505060000391506102749050565b50505060000390505b9392505050565b600080826001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156102b757600080fd5b505afa1580156102cb573d6000803e3d6000fd5b505050506040513d60208110156102e157600080fd5b505190506102ee81610772565b9150505b919050565b600080610302611e05565b61030a611e2c565b60006103158a6100d8565b600291820b90910b60608501526001600160a01b039091166040840152905061033f81898b6109e9565b9050896001600160a01b031663d0c93a7c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561037a57600080fd5b505afa15801561038e573d6000803e3d6000fd5b505050506040513d60208110156103a457600080fd5b5051600290810b900b83526103b98a8a610a65565b62ffffff1660208085019190915260408051630d34328160e11b815290516001600160a01b038d1692631a6865029260048082019391829003018186803b15801561040357600080fd5b505afa158015610417573d6000803e3d6000fd5b505050506040513d602081101561042d57600080fd5b50516001600160801b039081166060850190815263ffffffff90921660408501528783529051166080820152600086135b8151158015906104845750856001600160a01b031682604001516001600160a01b031614155b1561073b57610491611e5a565b60408301516001600160a01b03168152606083015184516104b4918d918c610b5b565b15156040830152600290810b810b60208301819052620d89e719910b12156104e557620d89e7196020820152610504565b6020810151620d89e860029190910b131561050457620d89e860208201525b6105118160200151610d57565b6001600160a01b031660608201526040830151610586908a61054b57886001600160a01b031683606001516001600160a01b031611610565565b886001600160a01b031683606001516001600160a01b0316105b610573578260600151610575565b885b608086015186516020890151611089565b60c085015260a084015260808301526001600160a01b0316604084015281156105e8576105bc8160c0015182608001510161127b565b835103835260a08101516105de906105d39061127b565b602085015190611291565b6020840152610623565b6105f58160a0015161127b565b835101835260c0810151608082015161061d91610612910161127b565b6020850151906112a7565b60208401525b604084015163ffffffff16156106565760006106488260c0015186604001518d6112bd565b60c083018051919091039052505b80606001516001600160a01b031683604001516001600160a01b031614156106fa578060400151156106d157600089156106a2576106988c8360200151611353565b60000390506106b3565b6106b08c8360200151611353565b90505b6106c18460800151826113d4565b6001600160801b03166080850152505b886106e05780602001516106e9565b60018160200151035b600290810b900b6060840152610735565b80600001516001600160a01b031683604001516001600160a01b03161461073557610728836040015161148a565b600290810b900b60608401525b5061045e565b8015158815151461075457602082015182518803610761565b8160000151870382602001515b909b909a5098505050505050505050565b600080829050806001600160a01b03166388e8006d60006040518263ffffffff1660e01b815260040180828152602001915050604080518083038186803b1580156107bc57600080fd5b505afa9250505080156107e857506040513d60408110156107dc57600080fd5b50805160209091015160015b6107f1576107fd565b505060029150506102f2565b6040805163bc8520d360e01b81526000600482015290516001600160a01b0383169163bc8520d3916024808301926020929190829003018186803b15801561084457600080fd5b505afa92505050801561086957506040513d602081101561086457600080fd5b505160015b6108725761087d565b5060039150506102f2565b806001600160a01b03166397e9dc316040518163ffffffff1660e01b815260040160206040518083038186803b1580156108b657600080fd5b505afa9250505080156108db57506040513d60208110156108d657600080fd5b505160015b6108e4576108ef565b5060049150506102f2565b806001600160a01b0316634f2bfe5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561092857600080fd5b505afa92505050801561094d57506040513d602081101561094857600080fd5b505160015b61095657610961565b5060059150506102f2565b806001600160a01b03166322afcccb60006040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156109a657600080fd5b505afa9250505080156109cb57506040513d60208110156109c657600080fd5b505160015b6109d4576109df565b5060019150506102f2565b5060001992915050565b60008160000b60011480610a0057508160000b6004145b15610a2d5782610a1a5760048463ffffffff16901c610a26565b601063ffffffff85165b065b9050610274565b8160000b60021415610a5e5782610a4e5760108463ffffffff16901c610a26565b6201000063ffffffff8516610a24565b5082610274565b60008160000b60041480610a7c57508160000b6005145b15610aed57826001600160a01b031663da3c300d6040518163ffffffff1660e01b815260040160206040518083038186803b158015610aba57600080fd5b505afa158015610ace573d6000803e3d6000fd5b505050506040513d6020811015610ae457600080fd5b50519050610b55565b826001600160a01b031663ddca3f436040518163ffffffff1660e01b815260040160206040518083038186803b158015610b2657600080fd5b505afa158015610b3a573d6000803e3d6000fd5b505050506040513d6020811015610b5057600080fd5b505190505b92915050565b60008060008460020b8660020b81610b6f57fe5b05905060008660020b128015610b9657508460020b8660020b81610b8f57fe5b0760020b15155b15610ba057600019015b8315610c7757600080610bb2836117a9565b6040805163299ce14b60e11b8152600184810b6004830152915193955091935060ff84161b8001600019019160009183916001600160a01b038e1691635339c296916024808301926020929190829003018186803b158015610c1357600080fd5b505afa158015610c27573d6000803e3d6000fd5b505050506040513d6020811015610c3d57600080fd5b5051168015159650905085610c5957888360ff16860302610c6c565b88610c63826117bb565b840360ff168603025b965050505050610d4d565b600080610c86836001016117a9565b91509150600060018260ff166001901b031990506000818b6001600160a01b0316635339c296866040518263ffffffff1660e01b8152600401808260010b815260200191505060206040518083038186803b158015610ce457600080fd5b505afa158015610cf8573d6000803e3d6000fd5b505050506040513d6020811015610d0e57600080fd5b5051168015159650905085610d3057888360ff0360ff16866001010102610d46565b8883610d3b8361185b565b0360ff168660010101025b9650505050505b5094509492505050565b60008060008360020b12610d6e578260020b610d76565b8260020b6000035b9050620d89e8811115610db4576040805162461bcd60e51b81526020600482015260016024820152601560fa1b604482015290519081900360640190fd5b600060018216610dc857600160801b610dda565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615610e0e576ffff97272373d413259a46990580e213a0260801c5b6004821615610e2d576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615610e4c576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615610e6b576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615610e8a576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615610ea9576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615610ec8576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615610ee8576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615610f08576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615610f28576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615610f48576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615610f68576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615610f88576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615610fa8576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615610fc8576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615610fe9576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615611009576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615611028576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615611045576b048a170391f7dc42444e8fa20260801c5b60008460020b131561106057806000198161105c57fe5b0490505b640100000000810615611074576001611077565b60005b60ff16602082901c0192505050919050565b60008080806001600160a01b03808916908a16101581871280159061110e5760006110c28989620f42400362ffffff16620f4240611945565b9050826110db576110d68c8c8c60016119f4565b6110e8565b6110e88b8d8c6001611a6f565b95508581106110f9578a9650611108565b6111058c8b8386611b1a565b96505b50611158565b81611125576111208b8b8b6000611a6f565b611132565b6111328a8c8b60006119f4565b935083886000031061114657899550611158565b6111558b8a8a60000385611b66565b95505b6001600160a01b038a81169087161482156111bb578080156111775750815b61118d57611188878d8c6001611a6f565b61118f565b855b955080801561119c575081155b6111b2576111ad878d8c60006119f4565b6111b4565b845b9450611205565b8080156111c55750815b6111db576111d68c888c60016119f4565b6111dd565b855b95508080156111ea575081155b611200576111fb8c888c6000611a6f565b611202565b845b94505b8115801561121557508860000385115b15611221578860000394505b81801561124057508a6001600160a01b0316876001600160a01b031614155b1561124f57858903935061126c565b611269868962ffffff168a620f42400362ffffff16611bb2565b93505b50505095509550955095915050565b6000600160ff1b821061128d57600080fd5b5090565b80820382811315600083121514610b5557600080fd5b81810182811215600083121514610b5557600080fd5b60008160000b600114156112e2578263ffffffff1684816112da57fe5b049050610274565b8160000b6002141561130b576127106113048563ffffffff80871690611bec16565b816112da57fe5b8160000b6004141561132d57606463ffffffff603260058602011685026112da565b8160000b6005141561134957606463ffffffff841685026112da565b5060009392505050565b6000826001600160a01b031663f30dba93836040518263ffffffff1660e01b8152600401808260020b81526020019150506101006040518083038186803b15801561139d57600080fd5b505afa1580156113b1573d6000803e3d6000fd5b505050506040513d6101008110156113c857600080fd5b50602001519392505050565b60008082600f0b121561143957826001600160801b03168260000384039150816001600160801b031610611434576040805162461bcd60e51b81526020600482015260026024820152614c5360f01b604482015290519081900360640190fd5b610b55565b826001600160801b03168284019150816001600160801b03161015610b55576040805162461bcd60e51b81526020600482015260026024820152614c4160f01b604482015290519081900360640190fd5b60006401000276a36001600160a01b038316108015906114c6575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038316105b6114fb576040805162461bcd60e51b81526020600482015260016024820152602960f91b604482015290519081900360640190fd5b640100000000600160c01b03602083901b166001600160801b03811160071b81811c67ffffffffffffffff811160061b90811c63ffffffff811160051b90811c61ffff811160041b90811c60ff8111600390811b91821c600f811160021b90811c918211600190811b92831c9790881196179094179092171790911717176080811061158f57607f810383901c9150611599565b80607f0383901b91505b908002607f81811c60ff83811c9190911c800280831c81831c1c800280841c81841c1c800280851c81851c1c800280861c81861c1c800280871c81871c1c800280881c81881c1c800280891c81891c1c8002808a1c818a1c1c8002808b1c818b1c1c8002808c1c818c1c1c8002808d1c818d1c1c8002808e1c9c81901c9c909c1c80029c8d901c9e9d607f198f0160401b60c09190911c678000000000000000161760c19b909b1c674000000000000000169a909a1760c29990991c672000000000000000169890981760c39790971c671000000000000000169690961760c49590951c670800000000000000169490941760c59390931c670400000000000000169290921760c69190911c670200000000000000161760c79190911c670100000000000000161760c89190911c6680000000000000161760c99190911c6640000000000000161760ca9190911c6620000000000000161760cb9190911c6610000000000000161760cc9190911c6608000000000000161760cd9190911c66040000000000001617693627a301d71055774c8581026f028f6481ab7f045a5af012a19d003aa9198101608090811d906fdb2df09e81959a81455e260799a0632f8301901d600281810b9083900b1461179a57886001600160a01b031661177e82610d57565b6001600160a01b031611156117935781611795565b805b61179c565b815b9998505050505050505050565b60020b600881901d9161010090910790565b60008082116117c957600080fd5b600160801b82106117dc57608091821c91015b6801000000000000000082106117f457604091821c91015b640100000000821061180857602091821c91015b62010000821061181a57601091821c91015b610100821061182b57600891821c91015b6010821061183b57600491821c91015b6004821061184b57600291821c91015b600282106102f257600101919050565b600080821161186957600080fd5b5060ff6001600160801b0382161561188457607f190161188c565b608082901c91505b67ffffffffffffffff8216156118a557603f19016118ad565b604082901c91505b63ffffffff8216156118c257601f19016118ca565b602082901c91505b61ffff8216156118dd57600f19016118e5565b601082901c91505b60ff8216156118f757600719016118ff565b600882901c91505b600f8216156119115760031901611919565b600482901c91505b600382161561192b5760011901611933565b600282901c91505b60018216156102f25760001901919050565b600080806000198587098686029250828110908390030390508061197b576000841161197057600080fd5b508290049050610274565b80841161198757600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b6000836001600160a01b0316856001600160a01b03161115611a14579293925b81611a4157611a3c836001600160801b03168686036001600160a01b0316600160601b611945565b611a64565b611a64836001600160801b03168686036001600160a01b0316600160601b611bb2565b90505b949350505050565b6000836001600160a01b0316856001600160a01b03161115611a8f579293925b600160601b600160e01b03606084901b166001600160a01b038686038116908716611ab957600080fd5b83611ae957866001600160a01b0316611adc8383896001600160a01b0316611945565b81611ae357fe5b04611b0f565b611b0f611b008383896001600160a01b0316611bb2565b886001600160a01b0316611c10565b979650505050505050565b600080856001600160a01b031611611b3157600080fd5b6000846001600160801b031611611b4757600080fd5b81611b5957611a3c8585856001611c1b565b611a648585856001611cfc565b600080856001600160a01b031611611b7d57600080fd5b6000846001600160801b031611611b9357600080fd5b81611ba557611a3c8585856000611cfc565b611a648585856000611c1b565b6000611bbf848484611945565b905060008280611bcb57fe5b8486091115610274576000198110611be257600080fd5b6001019392505050565b6000821580611c0757505081810281838281611c0457fe5b04145b610b5557600080fd5b808204910615150190565b60008115611c8e5760006001600160a01b03841115611c5157611c4c84600160601b876001600160801b0316611945565b611c69565b6001600160801b038516606085901b81611c6757fe5b045b9050611c86611c816001600160a01b03881683611ddf565b611def565b915050611a67565b60006001600160a01b03841115611cbc57611cb784600160601b876001600160801b0316611bb2565b611cd3565b611cd3606085901b6001600160801b038716611c10565b905080866001600160a01b031611611cea57600080fd5b6001600160a01b038616039050611a67565b600082611d0a575083611a67565b600160601b600160e01b03606085901b168215611d98576001600160a01b03861684810290858281611d3857fe5b041415611d6957818101828110611d6757611d5d83896001600160a01b031683611bb2565b9350505050611a67565b505b611d8f82611d8a878a6001600160a01b03168681611d8357fe5b0490611ddf565b611c10565b92505050611a67565b6001600160a01b03861684810290858281611daf57fe5b04148015611dbc57508082115b611dc557600080fd5b808203611d5d611c81846001600160a01b038b1684611bb2565b80820182811015610b5557600080fd5b806001600160a01b03811681146102f257600080fd5b60408051608081018252600080825260208201819052918101829052606081019190915290565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091529056fea2646970667358221220f63a91331eb3347d5d637ee10097ccde6a963f9dd45f99e37428099da7b83b0764736f6c63430007060033