0x608060405234801561000f575f80fd5b506004361061037d575f3560e01c806388b7ab63116101d4578063c2ee3a0811610109578063dd62ed3e116100a9578063edc41f6411610079578063edc41f641461090b578063ef55bec61461091e578063f8520c0814610931578063fbfa77cf14610944575f80fd5b8063dd62ed3e1461087a578063e3ee160e146108a4578063e7a324dc146108b7578063e94a0102146108de575f80fd5b8063c8f4a893116100e4578063c8f4a89314610825578063cf0929951461082d578063d505accf14610840578063d916948714610853575f80fd5b8063c2ee3a08146107f6578063c3cda520146107ff578063c580b26914610812575f80fd5b8063a584119411610174578063a9059cbb1161014f578063a9059cbb146107aa578063ac9ebbd0146107bd578063ace150a5146107d0578063b7b72899146107e3575f80fd5b8063a584119414610768578063a72246871461077b578063a797d91614610783575f80fd5b80639ab24eb0116101af5780639ab24eb0146107085780639fd5a6cf1461071b578063a08cb48b1461072e578063a0cc6a6814610741575f80fd5b806388b7ab63146106ce57806391ddadf4146106e157806395d89b4114610700575f80fd5b8063406f84de116102b55780635c19a95c116102555780637b3a3d19116102255780637b3a3d19146106245780637ecebe001461066d5780637f2eecc31461068c57806384b0196e146106b3575f80fd5b80635c19a95c146105d85780635c7e5d5f146105eb57806370a08231146105fe57806377eea14614610611575f80fd5b8063532992c511610290578063532992c51461058c578063587cde1e1461059f5780635a049a70146105b25780635a4dd47d146105c5575f80fd5b8063406f84de1461054a5780634bf5d7e91461055d5780634d6d744114610565575f80fd5b80632a1eafd911610320578063313ce567116102fb578063313ce567146104aa5780633644e515146104e3578063397da79d146104eb5780633a46b1a814610537575f80fd5b80632a1eafd9146104715780632ff2e9dc1461047957806330adf81f14610483575f80fd5b80630db3a5581161035b5780630db3a558146103f957806318160ddd1461043357806323b872dd14610449578063286b1d0b1461045c575f80fd5b806306fdde0314610381578063095ea7b31461039f57806309dc8d92146103c2575b5f80fd5b61038961096b565b6040516103969190614294565b60405180910390f35b6103b26103ad3660046142ce565b6109fa565b6040519015158152602001610396565b6103ca610a10565b6040517dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9091168152602001610396565b6104207f000000000000000000000000000000000000000000000000000000000000000181565b60405161ffff9091168152602001610396565b61043b610aa1565b604051908152602001610396565b6103b26104573660046142f6565b610ad2565b61046f61046a36600461432f565b610bc5565b005b61043b610d30565b6103ca620f424081565b61043b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b6104d17f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff9091168152602001610396565b61043b610d39565b6105127f0000000000000000000000002ef826926087614ab4779ff8dbcf7b98573719f281565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610396565b61043b6105453660046142ce565b610d93565b61043b6105583660046142ce565b610ddb565b610389610dfb565b6105127f000000000000000000000000b024ac5a7c6bc92fbacc8c3387e628a07e1da01681565b61046f61059a366004614348565b610e05565b6105126105ad36600461432f565b610e2a565b61046f6105c036600461438e565b610e40565b61043b6105d33660046143d8565b610e67565b61046f6105e636600461432f565b610f8d565b61043b6105f93660046143d8565b610f9a565b61043b61060c36600461432f565b610fe0565b61051261061f3660046142ce565b611018565b6106376106323660046143ef565b611044565b604080517dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093168352602083019190915201610396565b61043b61067b36600461432f565b60016020525f908152604090205481565b61043b7fd099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de881565b6106bb61130f565b604051610396979695949392919061443a565b61046f6106dc3660046145ce565b611447565b6106e9611476565b60405165ffffffffffff9091168152602001610396565b610389611488565b61043b61071636600461432f565b611514565b61046f61072936600461464d565b611526565b61046f61073c3660046146ba565b611536565b61043b7f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226781565b61046f61077636600461432f565b611560565b6105126115ac565b6104207f00000000000000000000000000000000000000000000000000000000000003e881565b6103b26107b83660046142ce565b611607565b61043b6107cb36600461471c565b611613565b61046f6107de3660046146ba565b61161f565b61046f6107f136600461474c565b61163f565b61042061271081565b61046f61080d36600461479f565b61165c565b61046f61082036600461432f565b611696565b61046f6116a7565b61046f61083b3660046145ce565b6118c0565b61046f61084e3660046147f3565b6118e0565b61043b7f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a159742981565b61043b610888366004614858565b600460209081525f928352604080842090915290825290205481565b61046f6108b2366004614889565b6118f0565b61043b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b6103b26108ec3660046142ce565b600260209081525f928352604080842090915290825290205460ff1681565b61046f61091936600461464d565b61191b565b61046f61092c366004614889565b611947565b6103b261093f3660046142ce565b611967565b6105127f000000000000000000000000d7298f620b0f752cf41bd818a16c756d9dcaa34f81565b60605f805461097990614901565b80601f01602080910402602001604051908101604052809291908181526020018280546109a590614901565b80156109f05780601f106109c7576101008083540402835291602001916109f0565b820191905f5260205f20905b8154815290600101906020018083116109d357829003601f168201915b5050505050905090565b5f610a06338484611985565b5060015b92915050565b5f610a21610a1c6119f2565b6119fb565b15610a2b57505f90565b5f610a34611a15565b90505f610a47610a426119f2565b611a96565b9050807dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16827dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1611610a96575f610a9a565b8082035b9250505090565b5f610aad610a426119f2565b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16905090565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526004602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610bad5782811015610b78576040517f192b9e4e00000000000000000000000000000000000000000000000000000000815233600482015260248101829052604481018490526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff85165f908152600460209081526040808320338452909152902083820390555b610bb8858585611adf565b60019150505b9392505050565b610bcd611b37565b73ffffffffffffffffffffffffffffffffffffffff8116610c1a576040517f9ce2462600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610c236119f2565b90505f610c31826001614979565b600a5490915061ffff90811690831610610cba57600b54600a80547fffffffffffffffffffff000000000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000169190911761ffff83161790555b600b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff851690811790915560405161ffff8316907f9f25fdcf794a19f398e3f72072c7ced095c8dedada1ce1fcd07194d1241bb2e0905f90a3505050565b5f610aad611a15565b5f7f00000000000000000000000000000000000000000000000000000000000000014614610d6e57610d69611ba8565b905090565b507fc09b823ff3f4844c967c203fdc9cb9bf3b992cde734770b3906fd44c7416630b90565b5f80610d9e83611c42565b9050610da981611c83565b610db38482611ce1565b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16949350505050565b5f80610de683611c42565b9050610df181611c83565b610db38482611cef565b6060610d69611cfd565b610e1a84610e138686611d1d565b8484611d91565b610e248484611da5565b50505050565b5f610a0a82610e376119f2565b61ffff16611e33565b610e5685610e4e8787611d1d565b858585611f14565b610e608585611da5565b5050505050565b5f80610e716119f2565b90505f610e7d826119fb565b610e8e57610e89611f24565b610e93565b6213c6805b90505f610ea460646213c6806149c1565b90505f610eb182846149c1565b64ffffffffff166001901b90505f8284610ecb91906149e4565b9050610f82600183901c610edf8386614a07565b64ffffffffff16610ef09190614a25565b610f018464ffffffffff8516614a25565b610f0b9190614a3c565b610f1489611f58565b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610f3e9190614a25565b610f4c610a42600189614a4f565b610f7d907dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1664ffffffffff8716614a25565b611fb1565b979650505050505050565b610f97338261202c565b50565b5f80610fa583611c42565b9050610fb081611c83565b610fb981611a96565b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff169392505050565b5f610ff282610fed6119f2565b611cef565b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1692915050565b5f8061102383611c42565b905061102e81611c83565b61103c848261ffff16611e33565b949350505050565b5f808261ffff166110536119f2565b61ffff16111561108f576040517fc32cae0a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85158061109a575084155b156110d1576040517f31e5050700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6110da610a10565b90505f6110e688611f58565b90505f6110f288611f58565b9050807dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16837dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16116111415782611143565b805b9450817dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16857dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1610156111e9576040517f557b2dbd0000000000000000000000000000000000000000000000000000000081527dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808516600483015283166024820152604401610b6f565b337fbb7c3dcaa7b43f7670119fdaf5a34790f80be05722782103263b2f6a83496238866112357dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216610e67565b604080517dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093168352602083018290529097500160405180910390a261129a87867dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16612072565b6112cd6112a56115ac565b337f000000000000000000000000d7298f620b0f752cf41bd818a16c756d9dcaa34f8761208d565b611303576040517f7939f42400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505094509492505050565b5f606080828080838146308280604051908082528060200260200182016040528015611345578160200160208202803683370190505b507f0f00000000000000000000000000000000000000000000000000000000000000949392919084805461137890614901565b80601f01602080910402602001604051908101604052809291908181526020018280546113a490614901565b80156113ef5780601f106113c6576101008083540402835291602001916113ef565b820191905f5260205f20905b8154815290600101906020018083116113d257829003601f168201915b505050505094506040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525093929190965096509650965096509650965090919293949596565b61145f8761145989898989898961212d565b836121a9565b61146d8787878787876121f4565b50505050505050565b5f61147f6119f2565b61ffff16905090565b6003805461149590614901565b80601f01602080910402602001604051908101604052809291908181526020018280546114c190614901565b801561150c5780601f106114e35761010080835404028352916020019161150c565b820191905f5260205f20905b8154815290600101906020018083116114ef57829003601f168201915b505050505081565b5f610ff2826115216119f2565b611ce1565b610e608561145987878787612277565b61154888610e138a8a8a8a8a8a61212d565b6115568888888888886121f4565b5050505050505050565b61156981612314565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f7c0c782cfb9e4eead85a014c03770fc21db63aea6d76999f12599b5f87b45e5d905f90a250565b600a545f9061ffff166115bd6119f2565b61ffff1610156115ea5750600a5462010000900473ffffffffffffffffffffffffffffffffffffffff1690565b50600b5473ffffffffffffffffffffffffffffffffffffffff1690565b5f610a06338484611adf565b5f61103c848484612326565b61163188610e138a8a8a8a8a8a61238a565b611556888888888888612406565b61164d836114598585611d1d565b6116578383611da5565b505050565b5f611668878787612326565b90505f6116778286868661251f565b905061168286612543565b61168c8188612586565b611556818961202c565b61169e611b37565b610f97816125f7565b6116af611b37565b5f6116b86119f2565b90505f6116c4826119fb565b6116cf5760016116d2565b60025b6116df9060ff1683614979565b600b5490915061ffff740100000000000000000000000000000000000000009091048116908316106117a457600d54600c80547fffff000000000000000000000000000000000000000000000000000000000000167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055600b805461ffff831674010000000000000000000000000000000000000000027fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff9091161790555b600c545f9061183c9061271090611800907f00000000000000000000000000000000000000000000000000000000000003e861ffff16907dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16614a25565b61180a9190614a6a565b600c5461183791907dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16614a3c565b61276b565b600d80547fffff000000000000000000000000000000000000000000000000000000000000167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83169081179091556040519192509061ffff8416907f96314a09a36c5d72a0a2217d361631d67fa044438d6568c1c4436d10aeec76f7905f90a3505050565b6118d28761145989898989898961238a565b61146d878787878787612406565b61146d87610e4e89898989612277565b61190289610e4e8b8b8b8b8b8b61238a565b611910898989898989612406565b505050505050505050565b61192482612543565b61193385611459868686612326565b61193d8584612586565b610e60858561202c565b61195989610e4e8b8b8b8b8b8b61212d565b6119108989898989896121f4565b5f610bbe8361197584611c42565b612794565b5f610bbe8284614a7d565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f610d6961286b565b5f611a07600283614ab4565b61ffff166001149050919050565b600b545f9074010000000000000000000000000000000000000000900461ffff16611a3e6119f2565b61ffff161015611a6f5750600c547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690565b50600d547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690565b5f7f000000000000000000000000000000000000000000000000000000000000000161ffff168261ffff161115611ad557611ad082612893565b610a0a565b620f424092915050565b611ae761289f565b611af083612314565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611b2c57611b2c82612314565b6116578383836128e1565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000b024ac5a7c6bc92fbacc8c3387e628a07e1da0161614611ba6576040517fe09ee43b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f1b5f604051611bda9190614ac8565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f61ffff821115611c7f576040517f43e3c0d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5090565b5f611c8c6119f2565b90508061ffff168261ffff1610611cdd576040517f6ef3d3ec00000000000000000000000000000000000000000000000000000000815261ffff808416600483015282166024820152604401610b6f565b5050565b5f610bbe83836129aa6129d8565b5f610bbe8383612a7c6129d8565b60606040518060a0016040528060658152602001614cc560659139905090565b604080517f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a1597429602082015273ffffffffffffffffffffffffffffffffffffffff841691810191909152606081018290525f90610bbe906080015b60405160208183030381529060405280519060200120612ada565b610e24611da085858585612b3b565b612b76565b611daf8282612d3a565b73ffffffffffffffffffffffffffffffffffffffff82165f81815260026020908152604080832085845290915280822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055518392917f1cdd46ff242716cdaa72d159d339a485b3438398348d68f09d7c8c0a59353d8191a35050565b5f815f03611e6d576040517ffadd880a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83165f90815260076020526040902080545b8015611f0b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015f611ecf83835f91825260209091200190565b805490915061ffff168510611f05575462010000900473ffffffffffffffffffffffffffffffffffffffff169250610a0a915050565b50611e94565b50929392505050565b610e60611da08686868686612dc3565b5f426213c680611f3261286b565b61ffff16611f409190614b9d565b611f4e9063661bd350614bc6565b610d699190614a07565b5f7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821115611c7f576040517f2a49c10d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f815f03611feb576040517f23d359a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f03611ff957505f610a0a565b8161200661271085614a25565b6120109190614a3c565b905081600182038161202457612024614994565b049392505050565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146120685761206881612314565b611cdd8282612e0b565b61207a61289f565b61208382612314565b611cdd8282612e26565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790525f90612124908690612eec565b95945050505050565b604080517fd099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de8602082015273ffffffffffffffffffffffffffffffffffffffff8089169282019290925290861660608201526080810185905260a0810184905260c0810183905260e081018290525f90610f829061010001611d76565b5f6121b5848484612fa0565b90505f8160058111156121ca576121ca614be4565b036121d55750505050565b6121e0848484612fe4565b156121eb5750505050565b610e2481612b76565b3373ffffffffffffffffffffffffffffffffffffffff861614612261576040517f1c5939f300000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff86166024820152604401610b6f565b61226f868686868686612406565b505050505050565b5f61228182612543565b61228c858585611985565b73ffffffffffffffffffffffffffffffffffffffff8581165f818152600160208181526040928390208054928301905582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918101919091529182019290925291861660608301526080820185905260a082015260c081018390526121249060e001611d76565b61231d8161312c565b610f9781613374565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf602082015273ffffffffffffffffffffffffffffffffffffffff85169181019190915260608101839052608081018290525f9061103c9060a001611d76565b604080517f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a2267602082015273ffffffffffffffffffffffffffffffffffffffff8089169282019290925290861660608201526080810185905260a0810184905260c0810183905260e081018290525f90610f829061010001611d76565b824211612448576040517f498ff9a200000000000000000000000000000000000000000000000000000000815242600482015260248101849052604401610b6f565b81421061248a576040517fb3fcd33e00000000000000000000000000000000000000000000000000000000815242600482015260248101839052604401610b6f565b6124948682612d3a565b73ffffffffffffffffffffffffffffffffffffffff86165f81815260026020908152604080832085845290915280822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055518392917f98de503528ee59b575ef0c0a2576a82497bfc029a5685b209e9ec333479b10a591a361226f868686611adf565b5f8061252d86868686613426565b9250905061253a81612b76565b50949350505050565b80421115610f97576040517ff88f049000000000000000000000000000000000000000000000000000000000815260048101829052426024820152604401610b6f565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260016020819052604090912080549182019055818114611657576040517fd021c5570000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610b6f565b6125ff613533565b5f6126086119f2565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526009602052604090209091506126399082613574565b61266f576040517f22ce1a0700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61267882612314565b5f6126d86126868484611ce1565b5f6127107dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83167f00000000000000000000000000000000000000000000000000000000000003e861ffff16020492915050565b90507dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811615612758576040517dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216815230905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b6127618161361d565b611657838261362b565b5f610a0a827dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff613638565b5f8161ffff165f036127d2576040517ffadd880a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83165f90815260096020526040902080545b8015612861577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015f61283483835f91825260209091200190565b5461ffff9081169150851681111561284c57506127f9565b8461ffff168161ffff16149350505050610a0a565b505f949350505050565b5f6213c68061287e63661bd35042614c11565b6128889190614a6a565b610d69906001614a3c565b5f610a0a60058361364d565b6128aa610a1c6119f2565b15611ba6576040517f66f21c3500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128ea8261371a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161294991815260200190565b60405180910390a35f61295b82611f58565b90505f6129666119f2565b9050612972858361377f565b612989612983868361ffff16611e33565b8361378c565b6129938483613799565b610e606129a4858361ffff16611e33565b8361362b565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600860205260408120610bbe908361364d565b5f7f000000000000000000000000000000000000000000000000000000000000000161ffff168361ffff1611612a1957612a1284846137a6565b9050610bbe565b73ffffffffffffffffffffffffffffffffffffffff84165f908152600660205260408120549003612a6e57612a12847f00000000000000000000000000000000000000000000000000000000000000016137a6565b61103c84848463ffffffff16565b5f610bbe612a8a84846138b7565b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16612ab48585613a58565b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff160161276b565b5f612ae3610d39565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b5f805f612b49868686613a86565b90925090505f826005811115612b6157612b61614be4565b14612b6c5781610f82565b610f828782613ace565b5f816005811115612b8957612b89614be4565b03612b915750565b6001816005811115612ba557612ba5614be4565b03612bdc576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002816005811115612bf057612bf0614be4565b03612c27576040517f4be6321b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003816005811115612c3b57612c3b614be4565b03612c72576040517fbf4bf5b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004816005811115612c8657612c86614be4565b03612cbd576040517fff551e8900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005816005811115612cd157612cd1614be4565b03612d08576040517f10c74b0300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82165f90815260026020908152604080832084845290915290205460ff1615611cdd576040517fd309466d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015260248101829052604401610b6f565b5f805f612dd287878787613426565b90925090505f826005811115612dea57612dea614be4565b14612df55781612dff565b612dff8882613ace565b98975050505050505050565b612e1361289f565b612e1c82612314565b611cdd8282613b11565b612e2f8261371a565b805f03612e6b576040517f77b8dde300000000000000000000000000000000000000000000000000000000815260048101829052602401610b6f565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35f612ec282611f58565b9050612ecd8161361d565b612ed78382613799565b611657612ee684610e376119f2565b8261362b565b5f73ffffffffffffffffffffffffffffffffffffffff83163b612f1057505f610a0a565b60608373ffffffffffffffffffffffffffffffffffffffff1683604051612f379190614c24565b5f604051808303815f865af19150503d805f8114612f70576040519150601f19603f3d011682016040523d82523d5f602084013e612f75565b606091505b50909250905081801561103c57508051158061103c57508080602001905181019061103c9190614c3f565b5f805f612fad8585613b7c565b90925090505f826005811115612fc557612fc5614be4565b14612fd05781612fda565b612fda8682613ace565b9695505050505050565b5f805f8573ffffffffffffffffffffffffffffffffffffffff168585604051602401613011929190614c5e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1626ba7e00000000000000000000000000000000000000000000000000000000179052516130929190614c24565b5f60405180830381855afa9150503d805f81146130ca576040519150601f19603f3d011682016040523d82523d5f602084013e6130cf565b606091505b50915091508180156130e357506020815110155b8015612fda575080517f1626ba7e00000000000000000000000000000000000000000000000000000000906131219083016020908101908401614c76565b149695505050505050565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260066020526040902054156131595750565b5f613184827f00000000000000000000000000000000000000000000000000000000000000016137a6565b73ffffffffffffffffffffffffffffffffffffffff83165f818152600660209081526040808320815180830183527f000000000000000000000000000000000000000000000000000000000000000161ffff9081168083527dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898116848801818152865460018082018955978b52898b2096519151918616620100009285168302179601959095559888526008875285882086518088019097529186528587018981528254958601835591885295872094519051911694160292909217910155919250900361326f575050565b6040517dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216815273ffffffffffffffffffffffffffffffffffffffff808416917f0000000000000000000000002ef826926087614ab4779ff8dbcf7b98573719f2909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3604080515f81527dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316602082015273ffffffffffffffffffffffffffffffffffffffff8416917fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724910160405180910390a25050565b5f613386826133816119f2565b6138b7565b90507dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81161561341c576040517dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216815273ffffffffffffffffffffffffffffffffffffffff83169030907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b611cdd8282613799565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561345b5750600390505f61352a565b8460ff16601b1415801561347357508460ff16601c14155b156134835750600490505f61352a565b604080515f81526020810180835288905260ff871691810191909152606081018590526080810184905260019060a0016020604051602081039080840390855afa1580156134d3573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615613521575f81613525565b60015f5b915091505b94509492505050565b61353e610a1c6119f2565b611ba6576040517f90bfab2000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81545f908015806135b857505f8481526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015461ffff908116908416115b915081156136165760408051602080820190925261ffff858116825286546001810188555f8881529390932091519190920180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016919092161790555b5092915050565b611657600561197a83613bc0565b611cdd82613d7f83613d83565b5f8183106136465781610bbe565b5090919050565b5f8161ffff165f0361368b576040517ffadd880a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82545b8015613711577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015f6136c985835f91825260209091200190565b805490915061ffff80861691161161370b57546201000090047dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff169150610a0a9050565b5061368e565b505f9392505050565b73ffffffffffffffffffffffffffffffffffffffff8116610f97576040517f17858bbe00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610b6f565b611cdd82613e3383613e3e565b611cdd82613e3383613d83565b611cdd82613d7f83613e3e565b6040517f406f84de00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015261ffff831660248301525f917f00000000000000000000000000000000000000000000000000000000000f42407dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1691620f4240917f0000000000000000000000002ef826926087614ab4779ff8dbcf7b98573719f29091169063406f84de90604401602060405180830381865afa158015613885573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138a99190614c76565b028161202457612024614994565b5f806138c38484613e6d565b9050807dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff165f036138f5575f915050610a0a565b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81165f6139258661ffff8716611e33565b90505f6139328787613e78565b90505b8561ffff168161ffff161015613a2d5761394e816119fb565b1580613961575061395f8282612794565b155b613a255761271061ffff7f00000000000000000000000000000000000000000000000000000000000003e8167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff851602047dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16830192507dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80168310613a25575050507dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff039050610a0a565b600101613935565b50612fda7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841683614c11565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600660205260408120610bbe908361364d565b5f80601b60ff84901c017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416613abf87838884613426565b9350935050505b935093915050565b5f8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613b09576005610bbe565b505f92915050565b5f613b1c8284613ed9565b90505f613b298483613f02565b90505f613b3885610fed6119f2565b9050807dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff165f03613b68575050505050565b613b72828261378c565b610e60838261362b565b5f808251604114613b925750600290505f613bb9565b6020830151604084015160608501515f1a9190613bb187848484613426565b945094505050505b9250929050565b5f805f613bcb6119f2565b86549091505f819003613c5b578660405180604001604052808461ffff168152602001613bfc5f898b63ffffffff16565b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90811690915282546001810184555f938452602080852084519190940151909216620100000261ffff909216919091179101559350849250613ac6915050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015f613c9088835f91825260209091200190565b80546201000090047dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1695509050613cca858763ffffffff8a16565b815490945061ffff9081169084161115613d44576040805180820190915261ffff80851682527dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80871660208085019182528c54600181018e555f8e815291909120945191519092166201000002921691909117910155613d74565b805461ffff16620100007dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8616021781555b505050935093915050565b0190565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526008602052604081208190613db4908585613bc0565b604080517dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80851682528316602082015292945090925073ffffffffffffffffffffffffffffffffffffffff8716917fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724910160405180910390a25050505050565b5f610bbe8284614c8d565b73ffffffffffffffffffffffffffffffffffffffff83165f908152600660205260409020610e60908383613bc0565b5f610bbe8383613a58565b73ffffffffffffffffffffffffffffffffffffffff82165f9081526006602052604081205415613eb157613eac8383614168565b610bbe565b507f000000000000000000000000000000000000000000000000000000000000000192915050565b5f73ffffffffffffffffffffffffffffffffffffffff831615613efc5782610bbe565b50919050565b5f80613f0c6119f2565b73ffffffffffffffffffffffffffffffffffffffff85165f90815260076020526040812080549293509190819003613ff85760408051808201825261ffff808616825273ffffffffffffffffffffffffffffffffffffffff80891660208085018281528854600181018a555f8a81529283209651960180549151851662010000027fffffffffffffffffffff000000000000000000000000000000000000000000009092169690951695909517949094179092559251909289169182917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4859350505050610a0a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015f61402d83835f91825260209091200190565b805460405173ffffffffffffffffffffffffffffffffffffffff62010000909204821697509192508781169187918a16907f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f905f90a4805461ffff908116908516111561411a576040805180820190915261ffff808616825273ffffffffffffffffffffffffffffffffffffffff808916602080850191825287546001810189555f89815291909120945194018054915190921662010000027fffffffffffffffffffff00000000000000000000000000000000000000000000909116939092169290921717905561415e565b80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8816021781555b5050505092915050565b5f8161ffff165f036141a6576040517ffadd880a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83165f90815260066020526040902080545b8015612861577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015f61420883835f91825260209091200190565b5461ffff908116915085168111614223579250610a0a915050565b506141cd565b5f5b8381101561424357818101518382015260200161422b565b50505f910152565b5f8151808452614262816020860160208601614229565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f610bbe602083018461424b565b803573ffffffffffffffffffffffffffffffffffffffff811681146142c9575f80fd5b919050565b5f80604083850312156142df575f80fd5b6142e8836142a6565b946020939093013593505050565b5f805f60608486031215614308575f80fd5b614311846142a6565b925061431f602085016142a6565b9150604084013590509250925092565b5f6020828403121561433f575f80fd5b610bbe826142a6565b5f805f806080858703121561435b575f80fd5b614364856142a6565b966020860135965060408601359560600135945092505050565b803560ff811681146142c9575f80fd5b5f805f805f60a086880312156143a2575f80fd5b6143ab866142a6565b9450602086013593506143c06040870161437e565b94979396509394606081013594506080013592915050565b5f602082840312156143e8575f80fd5b5035919050565b5f805f8060808587031215614402575f80fd5b8435935060208501359250614419604086016142a6565b9150606085013561ffff8116811461442f575f80fd5b939692955090935050565b7fff00000000000000000000000000000000000000000000000000000000000000881681525f602060e0602084015261447660e084018a61424b565b8381036040850152614488818a61424b565b6060850189905273ffffffffffffffffffffffffffffffffffffffff8816608086015260a0850187905284810360c0860152855180825260208088019350909101905f5b818110156144e8578351835292840192918401916001016144cc565b50909c9b505050505050505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112614536575f80fd5b813567ffffffffffffffff80821115614551576145516144fa565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715614597576145976144fa565b816040528381528660208588010111156145af575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a0312156145e4575f80fd5b6145ed886142a6565b96506145fb602089016142a6565b955060408801359450606088013593506080880135925060a0880135915060c088013567ffffffffffffffff811115614632575f80fd5b61463e8a828b01614527565b91505092959891949750929550565b5f805f805f60a08688031215614661575f80fd5b61466a866142a6565b9450614678602087016142a6565b93506040860135925060608601359150608086013567ffffffffffffffff8111156146a1575f80fd5b6146ad88828901614527565b9150509295509295909350565b5f805f805f805f80610100898b0312156146d2575f80fd5b6146db896142a6565b97506146e960208a016142a6565b979a9799505050506040860135956060810135956080820135955060a0820135945060c0820135935060e0909101359150565b5f805f6060848603121561472e575f80fd5b614737846142a6565b95602085013595506040909401359392505050565b5f805f6060848603121561475e575f80fd5b614767846142a6565b925060208401359150604084013567ffffffffffffffff811115614789575f80fd5b61479586828701614527565b9150509250925092565b5f805f805f8060c087890312156147b4575f80fd5b6147bd876142a6565b955060208701359450604087013593506147d96060880161437e565b92506080870135915060a087013590509295509295509295565b5f805f805f805f60e0888a031215614809575f80fd5b614812886142a6565b9650614820602089016142a6565b9550604088013594506060880135935061483c6080890161437e565b925060a0880135915060c0880135905092959891949750929550565b5f8060408385031215614869575f80fd5b614872836142a6565b9150614880602084016142a6565b90509250929050565b5f805f805f805f805f6101208a8c0312156148a2575f80fd5b6148ab8a6142a6565b98506148b960208b016142a6565b975060408a0135965060608a0135955060808a0135945060a08a013593506148e360c08b0161437e565b925060e08a013591506101008a013590509295985092959850929598565b600181811c9082168061491557607f821691505b602082108103613efc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b61ffff8181168382160190808211156136165761361661494c565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f64ffffffffff808416806149d8576149d8614994565b92169190910492915050565b5f64ffffffffff808416806149fb576149fb614994565b92169190910692915050565b64ffffffffff8281168282160390808211156136165761361661494c565b8082028115828204841417610a0a57610a0a61494c565b80820180821115610a0a57610a0a61494c565b61ffff8281168282160390808211156136165761361661494c565b5f82614a7857614a78614994565b500490565b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8181168382160190808211156136165761361661494c565b5f61ffff808416806149fb576149fb614994565b5f8083545f60018260011c91506001831680614ae557607f831692505b60208084108203614b1d577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b818015614b315760018114614b6457614b8f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0086168952841515850289019650614b8f565b5f8a8152602090205f5b86811015614b875781548b820152908501908301614b6e565b505084890196505b509498975050505050505050565b64ffffffffff818116838216028082169190828114614bbe57614bbe61494c565b505092915050565b64ffffffffff8181168382160190808211156136165761361661494c565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b81810381811115610a0a57610a0a61494c565b5f8251614c35818460208701614229565b9190910192915050565b5f60208284031215614c4f575f80fd5b81518015158114610bbe575f80fd5b828152604060208201525f61103c604083018461424b565b5f60208284031215614c86575f80fd5b5051919050565b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8281168282160390808211156136165761361661494c56fe6d6f64653d65706f63682665706f6368556e6465726c79696e67536f757263653d626c6f636b54696d657374616d702665706f63685374617274696e6754696d657374616d703d313731333039393630302665706f6368506572696f643d31323936303030a2646970667358221220e9a5c323e4846d510175bc0850b5b24bacb87eb2cacb699699eb4a357169f82b64736f6c63430008170033
0x6101a0604052600d80546001600160f01b031916620f424017905534801562000026575f80fd5b50604051620056e5380380620056e583398101604081905262000049916200059b565b6040518060400160405280600c81526020016b0506f776572206279204d5e360a41b815250604051806040016040528060058152602001642827aba2a960d91b8152505f600a6127106200009e91906200061d565b8383838282828280805f620000b48282620006dd565b5046608052620000c362000328565b60a0525060039150620000d990508382620006dd565b5060ff1660c05250505061271061ffff8416111591506200010f9050576040516368c6e15960e01b815260040160405180910390fd5b61ffff1660e0525050506001600160a01b0384166101008190526200014757604051635345eea560e01b815260040160405180910390fd5b6001600160a01b0383166101208190526200017557604051637301473d60e11b815260040160405180910390fd5b600b80546001600160a01b0319166001600160a01b038416908117909155620001b157604051634e71231360e11b815260040160405180910390fd5b6001600160a01b038116610140819052620001df57604051630306120160e01b815260040160405180910390fd5b5f6001620001ec620003c4565b620001f89190620007a9565b61ffff16610160819052604051635c7e5d5f60e01b8152600481018290529091505f906001600160a01b03871690635c7e5d5f90602401602060405180830381865afa1580156200024b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002719190620007ce565b9050805f036200029457604051637d5b431760e11b815260040160405180910390fd5b6001600160f01b03811115620002bd576040516303ca7dbd60e61b815260040160405180910390fd5b6001600160f01b03811661018052620002d9620f4240620003d4565b604051620f424081526001600160a01b038716905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050505050620008c5565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f1b5f6040516200035c9190620007e6565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f620003cf620003f2565b905090565b620003ed60056200197a6200042060201b178362000436565b505050565b5f6213c6806200040763661bd3504262000860565b62000413919062000876565b620003cf9060016200088c565b5f6200042d8284620008a2565b90505b92915050565b5f808062000443620003c4565b86549091505f819003620004bc578660405180604001604052808461ffff168152602001620004735f898b60201c565b6001600160f01b0390811690915282546001810184555f938452602080852084519190940151909216620100000261ffff90921691909117910155935084925062000577915050565b5f19015f620004d388835f91825260209091200190565b80546201000090046001600160f01b031695509050620004f5858760208a901c565b815490945061ffff90811690841611156200055a576040805180820190915261ffff80851682526001600160f01b0380871660208085019182528c54600181018e555f8e81529190912094519151909216620100000292169190911791015562000573565b805461ffff16620100006001600160f01b038616021781555b5050505b935093915050565b80516001600160a01b038116811462000596575f80fd5b919050565b5f805f8060808587031215620005af575f80fd5b620005ba856200057f565b9350620005ca602086016200057f565b9250620005da604086016200057f565b9150620005ea606086016200057f565b905092959194509250565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f61ffff80841680620006345762000634620005f5565b92169190910492915050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200066957607f821691505b6020821081036200068857634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620003ed57805f5260205f20601f840160051c81016020851015620006b55750805b601f840160051c820191505b81811015620006d6575f8155600101620006c1565b5050505050565b81516001600160401b03811115620006f957620006f962000640565b62000711816200070a845462000654565b846200068e565b602080601f83116001811462000747575f84156200072f5750858301515b5f19600386901b1c1916600185901b178555620007a1565b5f85815260208120601f198616915b82811015620007775788860151825594840194600190910190840162000756565b50858210156200079557878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b61ffff828116828216039080821115620007c757620007c762000609565b5092915050565b5f60208284031215620007df575f80fd5b5051919050565b5f808354620007f58162000654565b60018281168015620008105760018114620008265762000854565b60ff198416875282151583028701945062000854565b875f526020805f205f5b858110156200084b5781548a82015290840190820162000830565b50505082870194505b50929695505050505050565b8181038181111562000430576200043062000609565b5f82620008875762000887620005f5565b500490565b8082018082111562000430576200043062000609565b6001600160f01b03818116838216019080821115620007c757620007c762000609565b60805160a05160c05160e0516101005161012051610140516101605161018051614d5f620009865f395f6137f701525f81816103fe01528181611a99015281816129db01528181612a4a01528181613160015281816131b40152613eb401525f818161094901526112a801525f818161056a0152611b4f01525f81816104f0015281816132b0015261383e01525f8181610788015281816117b7015281816126ad015261396d01525f6104af01525f610d7101525f610d3c0152614d5f5ff3fe608060405234801561000f575f80fd5b506004361061037d575f3560e01c806388b7ab63116101d4578063c2ee3a0811610109578063dd62ed3e116100a9578063edc41f6411610079578063edc41f641461090b578063ef55bec61461091e578063f8520c0814610931578063fbfa77cf14610944575f80fd5b8063dd62ed3e1461087a578063e3ee160e146108a4578063e7a324dc146108b7578063e94a0102146108de575f80fd5b8063c8f4a893116100e4578063c8f4a89314610825578063cf0929951461082d578063d505accf14610840578063d916948714610853575f80fd5b8063c2ee3a08146107f6578063c3cda520146107ff578063c580b26914610812575f80fd5b8063a584119411610174578063a9059cbb1161014f578063a9059cbb146107aa578063ac9ebbd0146107bd578063ace150a5146107d0578063b7b72899146107e3575f80fd5b8063a584119414610768578063a72246871461077b578063a797d91614610783575f80fd5b80639ab24eb0116101af5780639ab24eb0146107085780639fd5a6cf1461071b578063a08cb48b1461072e578063a0cc6a6814610741575f80fd5b806388b7ab63146106ce57806391ddadf4146106e157806395d89b4114610700575f80fd5b8063406f84de116102b55780635c19a95c116102555780637b3a3d19116102255780637b3a3d19146106245780637ecebe001461066d5780637f2eecc31461068c57806384b0196e146106b3575f80fd5b80635c19a95c146105d85780635c7e5d5f146105eb57806370a08231146105fe57806377eea14614610611575f80fd5b8063532992c511610290578063532992c51461058c578063587cde1e1461059f5780635a049a70146105b25780635a4dd47d146105c5575f80fd5b8063406f84de1461054a5780634bf5d7e91461055d5780634d6d744114610565575f80fd5b80632a1eafd911610320578063313ce567116102fb578063313ce567146104aa5780633644e515146104e3578063397da79d146104eb5780633a46b1a814610537575f80fd5b80632a1eafd9146104715780632ff2e9dc1461047957806330adf81f14610483575f80fd5b80630db3a5581161035b5780630db3a558146103f957806318160ddd1461043357806323b872dd14610449578063286b1d0b1461045c575f80fd5b806306fdde0314610381578063095ea7b31461039f57806309dc8d92146103c2575b5f80fd5b61038961096b565b6040516103969190614294565b60405180910390f35b6103b26103ad3660046142ce565b6109fa565b6040519015158152602001610396565b6103ca610a10565b6040517dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9091168152602001610396565b6104207f000000000000000000000000000000000000000000000000000000000000000081565b60405161ffff9091168152602001610396565b61043b610aa1565b604051908152602001610396565b6103b26104573660046142f6565b610ad2565b61046f61046a36600461432f565b610bc5565b005b61043b610d30565b6103ca620f424081565b61043b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b6104d17f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff9091168152602001610396565b61043b610d39565b6105127f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610396565b61043b6105453660046142ce565b610d93565b61043b6105583660046142ce565b610ddb565b610389610dfb565b6105127f000000000000000000000000000000000000000000000000000000000000000081565b61046f61059a366004614348565b610e05565b6105126105ad36600461432f565b610e2a565b61046f6105c036600461438e565b610e40565b61043b6105d33660046143d8565b610e67565b61046f6105e636600461432f565b610f8d565b61043b6105f93660046143d8565b610f9a565b61043b61060c36600461432f565b610fe0565b61051261061f3660046142ce565b611018565b6106376106323660046143ef565b611044565b604080517dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093168352602083019190915201610396565b61043b61067b36600461432f565b60016020525f908152604090205481565b61043b7fd099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de881565b6106bb61130f565b604051610396979695949392919061443a565b61046f6106dc3660046145ce565b611447565b6106e9611476565b60405165ffffffffffff9091168152602001610396565b610389611488565b61043b61071636600461432f565b611514565b61046f61072936600461464d565b611526565b61046f61073c3660046146ba565b611536565b61043b7f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226781565b61046f61077636600461432f565b611560565b6105126115ac565b6104207f000000000000000000000000000000000000000000000000000000000000000081565b6103b26107b83660046142ce565b611607565b61043b6107cb36600461471c565b611613565b61046f6107de3660046146ba565b61161f565b61046f6107f136600461474c565b61163f565b61042061271081565b61046f61080d36600461479f565b61165c565b61046f61082036600461432f565b611696565b61046f6116a7565b61046f61083b3660046145ce565b6118c0565b61046f61084e3660046147f3565b6118e0565b61043b7f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a159742981565b61043b610888366004614858565b600460209081525f928352604080842090915290825290205481565b61046f6108b2366004614889565b6118f0565b61043b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b6103b26108ec3660046142ce565b600260209081525f928352604080842090915290825290205460ff1681565b61046f61091936600461464d565b61191b565b61046f61092c366004614889565b611947565b6103b261093f3660046142ce565b611967565b6105127f000000000000000000000000000000000000000000000000000000000000000081565b60605f805461097990614901565b80601f01602080910402602001604051908101604052809291908181526020018280546109a590614901565b80156109f05780601f106109c7576101008083540402835291602001916109f0565b820191905f5260205f20905b8154815290600101906020018083116109d357829003601f168201915b5050505050905090565b5f610a06338484611985565b5060015b92915050565b5f610a21610a1c6119f2565b6119fb565b15610a2b57505f90565b5f610a34611a15565b90505f610a47610a426119f2565b611a96565b9050807dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16827dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1611610a96575f610a9a565b8082035b9250505090565b5f610aad610a426119f2565b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16905090565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526004602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610bad5782811015610b78576040517f192b9e4e00000000000000000000000000000000000000000000000000000000815233600482015260248101829052604481018490526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff85165f908152600460209081526040808320338452909152902083820390555b610bb8858585611adf565b60019150505b9392505050565b610bcd611b37565b73ffffffffffffffffffffffffffffffffffffffff8116610c1a576040517f9ce2462600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610c236119f2565b90505f610c31826001614979565b600a5490915061ffff90811690831610610cba57600b54600a80547fffffffffffffffffffff000000000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000169190911761ffff83161790555b600b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff851690811790915560405161ffff8316907f9f25fdcf794a19f398e3f72072c7ced095c8dedada1ce1fcd07194d1241bb2e0905f90a3505050565b5f610aad611a15565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610d6e57610d69611ba8565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b5f80610d9e83611c42565b9050610da981611c83565b610db38482611ce1565b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16949350505050565b5f80610de683611c42565b9050610df181611c83565b610db38482611cef565b6060610d69611cfd565b610e1a84610e138686611d1d565b8484611d91565b610e248484611da5565b50505050565b5f610a0a82610e376119f2565b61ffff16611e33565b610e5685610e4e8787611d1d565b858585611f14565b610e608585611da5565b5050505050565b5f80610e716119f2565b90505f610e7d826119fb565b610e8e57610e89611f24565b610e93565b6213c6805b90505f610ea460646213c6806149c1565b90505f610eb182846149c1565b64ffffffffff166001901b90505f8284610ecb91906149e4565b9050610f82600183901c610edf8386614a07565b64ffffffffff16610ef09190614a25565b610f018464ffffffffff8516614a25565b610f0b9190614a3c565b610f1489611f58565b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610f3e9190614a25565b610f4c610a42600189614a4f565b610f7d907dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1664ffffffffff8716614a25565b611fb1565b979650505050505050565b610f97338261202c565b50565b5f80610fa583611c42565b9050610fb081611c83565b610fb981611a96565b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff169392505050565b5f610ff282610fed6119f2565b611cef565b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1692915050565b5f8061102383611c42565b905061102e81611c83565b61103c848261ffff16611e33565b949350505050565b5f808261ffff166110536119f2565b61ffff16111561108f576040517fc32cae0a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85158061109a575084155b156110d1576040517f31e5050700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6110da610a10565b90505f6110e688611f58565b90505f6110f288611f58565b9050807dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16837dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16116111415782611143565b805b9450817dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16857dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1610156111e9576040517f557b2dbd0000000000000000000000000000000000000000000000000000000081527dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808516600483015283166024820152604401610b6f565b337fbb7c3dcaa7b43f7670119fdaf5a34790f80be05722782103263b2f6a83496238866112357dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216610e67565b604080517dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093168352602083018290529097500160405180910390a261129a87867dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16612072565b6112cd6112a56115ac565b337f00000000000000000000000000000000000000000000000000000000000000008761208d565b611303576040517f7939f42400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505094509492505050565b5f606080828080838146308280604051908082528060200260200182016040528015611345578160200160208202803683370190505b507f0f00000000000000000000000000000000000000000000000000000000000000949392919084805461137890614901565b80601f01602080910402602001604051908101604052809291908181526020018280546113a490614901565b80156113ef5780601f106113c6576101008083540402835291602001916113ef565b820191905f5260205f20905b8154815290600101906020018083116113d257829003601f168201915b505050505094506040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525093929190965096509650965096509650965090919293949596565b61145f8761145989898989898961212d565b836121a9565b61146d8787878787876121f4565b50505050505050565b5f61147f6119f2565b61ffff16905090565b6003805461149590614901565b80601f01602080910402602001604051908101604052809291908181526020018280546114c190614901565b801561150c5780601f106114e35761010080835404028352916020019161150c565b820191905f5260205f20905b8154815290600101906020018083116114ef57829003601f168201915b505050505081565b5f610ff2826115216119f2565b611ce1565b610e608561145987878787612277565b61154888610e138a8a8a8a8a8a61212d565b6115568888888888886121f4565b5050505050505050565b61156981612314565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f7c0c782cfb9e4eead85a014c03770fc21db63aea6d76999f12599b5f87b45e5d905f90a250565b600a545f9061ffff166115bd6119f2565b61ffff1610156115ea5750600a5462010000900473ffffffffffffffffffffffffffffffffffffffff1690565b50600b5473ffffffffffffffffffffffffffffffffffffffff1690565b5f610a06338484611adf565b5f61103c848484612326565b61163188610e138a8a8a8a8a8a61238a565b611556888888888888612406565b61164d836114598585611d1d565b6116578383611da5565b505050565b5f611668878787612326565b90505f6116778286868661251f565b905061168286612543565b61168c8188612586565b611556818961202c565b61169e611b37565b610f97816125f7565b6116af611b37565b5f6116b86119f2565b90505f6116c4826119fb565b6116cf5760016116d2565b60025b6116df9060ff1683614979565b600b5490915061ffff740100000000000000000000000000000000000000009091048116908316106117a457600d54600c80547fffff000000000000000000000000000000000000000000000000000000000000167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055600b805461ffff831674010000000000000000000000000000000000000000027fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff9091161790555b600c545f9061183c9061271090611800907f000000000000000000000000000000000000000000000000000000000000000061ffff16907dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16614a25565b61180a9190614a6a565b600c5461183791907dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16614a3c565b61276b565b600d80547fffff000000000000000000000000000000000000000000000000000000000000167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83169081179091556040519192509061ffff8416907f96314a09a36c5d72a0a2217d361631d67fa044438d6568c1c4436d10aeec76f7905f90a3505050565b6118d28761145989898989898961238a565b61146d878787878787612406565b61146d87610e4e89898989612277565b61190289610e4e8b8b8b8b8b8b61238a565b611910898989898989612406565b505050505050505050565b61192482612543565b61193385611459868686612326565b61193d8584612586565b610e60858561202c565b61195989610e4e8b8b8b8b8b8b61212d565b6119108989898989896121f4565b5f610bbe8361197584611c42565b612794565b5f610bbe8284614a7d565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f610d6961286b565b5f611a07600283614ab4565b61ffff166001149050919050565b600b545f9074010000000000000000000000000000000000000000900461ffff16611a3e6119f2565b61ffff161015611a6f5750600c547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690565b50600d547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690565b5f7f000000000000000000000000000000000000000000000000000000000000000061ffff168261ffff161115611ad557611ad082612893565b610a0a565b620f424092915050565b611ae761289f565b611af083612314565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611b2c57611b2c82612314565b6116578383836128e1565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614611ba6576040517fe09ee43b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f1b5f604051611bda9190614ac8565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f61ffff821115611c7f576040517f43e3c0d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5090565b5f611c8c6119f2565b90508061ffff168261ffff1610611cdd576040517f6ef3d3ec00000000000000000000000000000000000000000000000000000000815261ffff808416600483015282166024820152604401610b6f565b5050565b5f610bbe83836129aa6129d8565b5f610bbe8383612a7c6129d8565b60606040518060a0016040528060658152602001614cc560659139905090565b604080517f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a1597429602082015273ffffffffffffffffffffffffffffffffffffffff841691810191909152606081018290525f90610bbe906080015b60405160208183030381529060405280519060200120612ada565b610e24611da085858585612b3b565b612b76565b611daf8282612d3a565b73ffffffffffffffffffffffffffffffffffffffff82165f81815260026020908152604080832085845290915280822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055518392917f1cdd46ff242716cdaa72d159d339a485b3438398348d68f09d7c8c0a59353d8191a35050565b5f815f03611e6d576040517ffadd880a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83165f90815260076020526040902080545b8015611f0b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015f611ecf83835f91825260209091200190565b805490915061ffff168510611f05575462010000900473ffffffffffffffffffffffffffffffffffffffff169250610a0a915050565b50611e94565b50929392505050565b610e60611da08686868686612dc3565b5f426213c680611f3261286b565b61ffff16611f409190614b9d565b611f4e9063661bd350614bc6565b610d699190614a07565b5f7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821115611c7f576040517f2a49c10d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f815f03611feb576040517f23d359a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f03611ff957505f610a0a565b8161200661271085614a25565b6120109190614a3c565b905081600182038161202457612024614994565b049392505050565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146120685761206881612314565b611cdd8282612e0b565b61207a61289f565b61208382612314565b611cdd8282612e26565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790525f90612124908690612eec565b95945050505050565b604080517fd099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de8602082015273ffffffffffffffffffffffffffffffffffffffff8089169282019290925290861660608201526080810185905260a0810184905260c0810183905260e081018290525f90610f829061010001611d76565b5f6121b5848484612fa0565b90505f8160058111156121ca576121ca614be4565b036121d55750505050565b6121e0848484612fe4565b156121eb5750505050565b610e2481612b76565b3373ffffffffffffffffffffffffffffffffffffffff861614612261576040517f1c5939f300000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff86166024820152604401610b6f565b61226f868686868686612406565b505050505050565b5f61228182612543565b61228c858585611985565b73ffffffffffffffffffffffffffffffffffffffff8581165f818152600160208181526040928390208054928301905582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918101919091529182019290925291861660608301526080820185905260a082015260c081018390526121249060e001611d76565b61231d8161312c565b610f9781613374565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf602082015273ffffffffffffffffffffffffffffffffffffffff85169181019190915260608101839052608081018290525f9061103c9060a001611d76565b604080517f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a2267602082015273ffffffffffffffffffffffffffffffffffffffff8089169282019290925290861660608201526080810185905260a0810184905260c0810183905260e081018290525f90610f829061010001611d76565b824211612448576040517f498ff9a200000000000000000000000000000000000000000000000000000000815242600482015260248101849052604401610b6f565b81421061248a576040517fb3fcd33e00000000000000000000000000000000000000000000000000000000815242600482015260248101839052604401610b6f565b6124948682612d3a565b73ffffffffffffffffffffffffffffffffffffffff86165f81815260026020908152604080832085845290915280822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055518392917f98de503528ee59b575ef0c0a2576a82497bfc029a5685b209e9ec333479b10a591a361226f868686611adf565b5f8061252d86868686613426565b9250905061253a81612b76565b50949350505050565b80421115610f97576040517ff88f049000000000000000000000000000000000000000000000000000000000815260048101829052426024820152604401610b6f565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260016020819052604090912080549182019055818114611657576040517fd021c5570000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610b6f565b6125ff613533565b5f6126086119f2565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526009602052604090209091506126399082613574565b61266f576040517f22ce1a0700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61267882612314565b5f6126d86126868484611ce1565b5f6127107dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83167f000000000000000000000000000000000000000000000000000000000000000061ffff16020492915050565b90507dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811615612758576040517dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216815230905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b6127618161361d565b611657838261362b565b5f610a0a827dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff613638565b5f8161ffff165f036127d2576040517ffadd880a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83165f90815260096020526040902080545b8015612861577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015f61283483835f91825260209091200190565b5461ffff9081169150851681111561284c57506127f9565b8461ffff168161ffff16149350505050610a0a565b505f949350505050565b5f6213c68061287e63661bd35042614c11565b6128889190614a6a565b610d69906001614a3c565b5f610a0a60058361364d565b6128aa610a1c6119f2565b15611ba6576040517f66f21c3500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128ea8261371a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161294991815260200190565b60405180910390a35f61295b82611f58565b90505f6129666119f2565b9050612972858361377f565b612989612983868361ffff16611e33565b8361378c565b6129938483613799565b610e606129a4858361ffff16611e33565b8361362b565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600860205260408120610bbe908361364d565b5f7f000000000000000000000000000000000000000000000000000000000000000061ffff168361ffff1611612a1957612a1284846137a6565b9050610bbe565b73ffffffffffffffffffffffffffffffffffffffff84165f908152600660205260408120549003612a6e57612a12847f00000000000000000000000000000000000000000000000000000000000000006137a6565b61103c84848463ffffffff16565b5f610bbe612a8a84846138b7565b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16612ab48585613a58565b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff160161276b565b5f612ae3610d39565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b5f805f612b49868686613a86565b90925090505f826005811115612b6157612b61614be4565b14612b6c5781610f82565b610f828782613ace565b5f816005811115612b8957612b89614be4565b03612b915750565b6001816005811115612ba557612ba5614be4565b03612bdc576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002816005811115612bf057612bf0614be4565b03612c27576040517f4be6321b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003816005811115612c3b57612c3b614be4565b03612c72576040517fbf4bf5b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004816005811115612c8657612c86614be4565b03612cbd576040517fff551e8900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005816005811115612cd157612cd1614be4565b03612d08576040517f10c74b0300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82165f90815260026020908152604080832084845290915290205460ff1615611cdd576040517fd309466d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015260248101829052604401610b6f565b5f805f612dd287878787613426565b90925090505f826005811115612dea57612dea614be4565b14612df55781612dff565b612dff8882613ace565b98975050505050505050565b612e1361289f565b612e1c82612314565b611cdd8282613b11565b612e2f8261371a565b805f03612e6b576040517f77b8dde300000000000000000000000000000000000000000000000000000000815260048101829052602401610b6f565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35f612ec282611f58565b9050612ecd8161361d565b612ed78382613799565b611657612ee684610e376119f2565b8261362b565b5f73ffffffffffffffffffffffffffffffffffffffff83163b612f1057505f610a0a565b60608373ffffffffffffffffffffffffffffffffffffffff1683604051612f379190614c24565b5f604051808303815f865af19150503d805f8114612f70576040519150601f19603f3d011682016040523d82523d5f602084013e612f75565b606091505b50909250905081801561103c57508051158061103c57508080602001905181019061103c9190614c3f565b5f805f612fad8585613b7c565b90925090505f826005811115612fc557612fc5614be4565b14612fd05781612fda565b612fda8682613ace565b9695505050505050565b5f805f8573ffffffffffffffffffffffffffffffffffffffff168585604051602401613011929190614c5e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1626ba7e00000000000000000000000000000000000000000000000000000000179052516130929190614c24565b5f60405180830381855afa9150503d805f81146130ca576040519150601f19603f3d011682016040523d82523d5f602084013e6130cf565b606091505b50915091508180156130e357506020815110155b8015612fda575080517f1626ba7e00000000000000000000000000000000000000000000000000000000906131219083016020908101908401614c76565b149695505050505050565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260066020526040902054156131595750565b5f613184827f00000000000000000000000000000000000000000000000000000000000000006137a6565b73ffffffffffffffffffffffffffffffffffffffff83165f818152600660209081526040808320815180830183527f000000000000000000000000000000000000000000000000000000000000000061ffff9081168083527dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898116848801818152865460018082018955978b52898b2096519151918616620100009285168302179601959095559888526008875285882086518088019097529186528587018981528254958601835591885295872094519051911694160292909217910155919250900361326f575050565b6040517dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216815273ffffffffffffffffffffffffffffffffffffffff808416917f0000000000000000000000000000000000000000000000000000000000000000909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3604080515f81527dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316602082015273ffffffffffffffffffffffffffffffffffffffff8416917fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724910160405180910390a25050565b5f613386826133816119f2565b6138b7565b90507dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81161561341c576040517dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216815273ffffffffffffffffffffffffffffffffffffffff83169030907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b611cdd8282613799565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561345b5750600390505f61352a565b8460ff16601b1415801561347357508460ff16601c14155b156134835750600490505f61352a565b604080515f81526020810180835288905260ff871691810191909152606081018590526080810184905260019060a0016020604051602081039080840390855afa1580156134d3573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615613521575f81613525565b60015f5b915091505b94509492505050565b61353e610a1c6119f2565b611ba6576040517f90bfab2000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81545f908015806135b857505f8481526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015461ffff908116908416115b915081156136165760408051602080820190925261ffff858116825286546001810188555f8881529390932091519190920180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016919092161790555b5092915050565b611657600561197a83613bc0565b611cdd82613d7f83613d83565b5f8183106136465781610bbe565b5090919050565b5f8161ffff165f0361368b576040517ffadd880a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82545b8015613711577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015f6136c985835f91825260209091200190565b805490915061ffff80861691161161370b57546201000090047dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff169150610a0a9050565b5061368e565b505f9392505050565b73ffffffffffffffffffffffffffffffffffffffff8116610f97576040517f17858bbe00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610b6f565b611cdd82613e3383613e3e565b611cdd82613e3383613d83565b611cdd82613d7f83613e3e565b6040517f406f84de00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015261ffff831660248301525f917f00000000000000000000000000000000000000000000000000000000000000007dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1691620f4240917f00000000000000000000000000000000000000000000000000000000000000009091169063406f84de90604401602060405180830381865afa158015613885573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138a99190614c76565b028161202457612024614994565b5f806138c38484613e6d565b9050807dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff165f036138f5575f915050610a0a565b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81165f6139258661ffff8716611e33565b90505f6139328787613e78565b90505b8561ffff168161ffff161015613a2d5761394e816119fb565b1580613961575061395f8282612794565b155b613a255761271061ffff7f0000000000000000000000000000000000000000000000000000000000000000167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff851602047dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16830192507dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80168310613a25575050507dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff039050610a0a565b600101613935565b50612fda7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841683614c11565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600660205260408120610bbe908361364d565b5f80601b60ff84901c017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416613abf87838884613426565b9350935050505b935093915050565b5f8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613b09576005610bbe565b505f92915050565b5f613b1c8284613ed9565b90505f613b298483613f02565b90505f613b3885610fed6119f2565b9050807dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff165f03613b68575050505050565b613b72828261378c565b610e60838261362b565b5f808251604114613b925750600290505f613bb9565b6020830151604084015160608501515f1a9190613bb187848484613426565b945094505050505b9250929050565b5f805f613bcb6119f2565b86549091505f819003613c5b578660405180604001604052808461ffff168152602001613bfc5f898b63ffffffff16565b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90811690915282546001810184555f938452602080852084519190940151909216620100000261ffff909216919091179101559350849250613ac6915050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015f613c9088835f91825260209091200190565b80546201000090047dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1695509050613cca858763ffffffff8a16565b815490945061ffff9081169084161115613d44576040805180820190915261ffff80851682527dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80871660208085019182528c54600181018e555f8e815291909120945191519092166201000002921691909117910155613d74565b805461ffff16620100007dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8616021781555b505050935093915050565b0190565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526008602052604081208190613db4908585613bc0565b604080517dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80851682528316602082015292945090925073ffffffffffffffffffffffffffffffffffffffff8716917fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724910160405180910390a25050505050565b5f610bbe8284614c8d565b73ffffffffffffffffffffffffffffffffffffffff83165f908152600660205260409020610e60908383613bc0565b5f610bbe8383613a58565b73ffffffffffffffffffffffffffffffffffffffff82165f9081526006602052604081205415613eb157613eac8383614168565b610bbe565b507f000000000000000000000000000000000000000000000000000000000000000092915050565b5f73ffffffffffffffffffffffffffffffffffffffff831615613efc5782610bbe565b50919050565b5f80613f0c6119f2565b73ffffffffffffffffffffffffffffffffffffffff85165f90815260076020526040812080549293509190819003613ff85760408051808201825261ffff808616825273ffffffffffffffffffffffffffffffffffffffff80891660208085018281528854600181018a555f8a81529283209651960180549151851662010000027fffffffffffffffffffff000000000000000000000000000000000000000000009092169690951695909517949094179092559251909289169182917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4859350505050610a0a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015f61402d83835f91825260209091200190565b805460405173ffffffffffffffffffffffffffffffffffffffff62010000909204821697509192508781169187918a16907f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f905f90a4805461ffff908116908516111561411a576040805180820190915261ffff808616825273ffffffffffffffffffffffffffffffffffffffff808916602080850191825287546001810189555f89815291909120945194018054915190921662010000027fffffffffffffffffffff00000000000000000000000000000000000000000000909116939092169290921717905561415e565b80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8816021781555b5050505092915050565b5f8161ffff165f036141a6576040517ffadd880a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83165f90815260066020526040902080545b8015612861577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015f61420883835f91825260209091200190565b5461ffff908116915085168111614223579250610a0a915050565b506141cd565b5f5b8381101561424357818101518382015260200161422b565b50505f910152565b5f8151808452614262816020860160208601614229565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f610bbe602083018461424b565b803573ffffffffffffffffffffffffffffffffffffffff811681146142c9575f80fd5b919050565b5f80604083850312156142df575f80fd5b6142e8836142a6565b946020939093013593505050565b5f805f60608486031215614308575f80fd5b614311846142a6565b925061431f602085016142a6565b9150604084013590509250925092565b5f6020828403121561433f575f80fd5b610bbe826142a6565b5f805f806080858703121561435b575f80fd5b614364856142a6565b966020860135965060408601359560600135945092505050565b803560ff811681146142c9575f80fd5b5f805f805f60a086880312156143a2575f80fd5b6143ab866142a6565b9450602086013593506143c06040870161437e565b94979396509394606081013594506080013592915050565b5f602082840312156143e8575f80fd5b5035919050565b5f805f8060808587031215614402575f80fd5b8435935060208501359250614419604086016142a6565b9150606085013561ffff8116811461442f575f80fd5b939692955090935050565b7fff00000000000000000000000000000000000000000000000000000000000000881681525f602060e0602084015261447660e084018a61424b565b8381036040850152614488818a61424b565b6060850189905273ffffffffffffffffffffffffffffffffffffffff8816608086015260a0850187905284810360c0860152855180825260208088019350909101905f5b818110156144e8578351835292840192918401916001016144cc565b50909c9b505050505050505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112614536575f80fd5b813567ffffffffffffffff80821115614551576145516144fa565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715614597576145976144fa565b816040528381528660208588010111156145af575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a0312156145e4575f80fd5b6145ed886142a6565b96506145fb602089016142a6565b955060408801359450606088013593506080880135925060a0880135915060c088013567ffffffffffffffff811115614632575f80fd5b61463e8a828b01614527565b91505092959891949750929550565b5f805f805f60a08688031215614661575f80fd5b61466a866142a6565b9450614678602087016142a6565b93506040860135925060608601359150608086013567ffffffffffffffff8111156146a1575f80fd5b6146ad88828901614527565b9150509295509295909350565b5f805f805f805f80610100898b0312156146d2575f80fd5b6146db896142a6565b97506146e960208a016142a6565b979a9799505050506040860135956060810135956080820135955060a0820135945060c0820135935060e0909101359150565b5f805f6060848603121561472e575f80fd5b614737846142a6565b95602085013595506040909401359392505050565b5f805f6060848603121561475e575f80fd5b614767846142a6565b925060208401359150604084013567ffffffffffffffff811115614789575f80fd5b61479586828701614527565b9150509250925092565b5f805f805f8060c087890312156147b4575f80fd5b6147bd876142a6565b955060208701359450604087013593506147d96060880161437e565b92506080870135915060a087013590509295509295509295565b5f805f805f805f60e0888a031215614809575f80fd5b614812886142a6565b9650614820602089016142a6565b9550604088013594506060880135935061483c6080890161437e565b925060a0880135915060c0880135905092959891949750929550565b5f8060408385031215614869575f80fd5b614872836142a6565b9150614880602084016142a6565b90509250929050565b5f805f805f805f805f6101208a8c0312156148a2575f80fd5b6148ab8a6142a6565b98506148b960208b016142a6565b975060408a0135965060608a0135955060808a0135945060a08a013593506148e360c08b0161437e565b925060e08a013591506101008a013590509295985092959850929598565b600181811c9082168061491557607f821691505b602082108103613efc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b61ffff8181168382160190808211156136165761361661494c565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f64ffffffffff808416806149d8576149d8614994565b92169190910492915050565b5f64ffffffffff808416806149fb576149fb614994565b92169190910692915050565b64ffffffffff8281168282160390808211156136165761361661494c565b8082028115828204841417610a0a57610a0a61494c565b80820180821115610a0a57610a0a61494c565b61ffff8281168282160390808211156136165761361661494c565b5f82614a7857614a78614994565b500490565b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8181168382160190808211156136165761361661494c565b5f61ffff808416806149fb576149fb614994565b5f8083545f60018260011c91506001831680614ae557607f831692505b60208084108203614b1d577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b818015614b315760018114614b6457614b8f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0086168952841515850289019650614b8f565b5f8a8152602090205f5b86811015614b875781548b820152908501908301614b6e565b505084890196505b509498975050505050505050565b64ffffffffff818116838216028082169190828114614bbe57614bbe61494c565b505092915050565b64ffffffffff8181168382160190808211156136165761361661494c565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b81810381811115610a0a57610a0a61494c565b5f8251614c35818460208701614229565b9190910192915050565b5f60208284031215614c4f575f80fd5b81518015158114610bbe575f80fd5b828152604060208201525f61103c604083018461424b565b5f60208284031215614c86575f80fd5b5051919050565b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8281168282160390808211156136165761361661494c56fe6d6f64653d65706f63682665706f6368556e6465726c79696e67536f757263653d626c6f636b54696d657374616d702665706f63685374617274696e6754696d657374616d703d313731333039393630302665706f6368506572696f643d31323936303030a2646970667358221220e9a5c323e4846d510175bc0850b5b24bacb87eb2cacb699699eb4a357169f82b64736f6c634300081700330000000000000000000000002ef826926087614ab4779ff8dbcf7b98573719f2000000000000000000000000b024ac5a7c6bc92fbacc8c3387e628a07e1da016000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000d7298f620b0f752cf41bd818a16c756d9dcaa34f