0x608060405234801561001057600080fd5b5061243b806100206000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c80633ec6f326116100505780633ec6f326146100b257806350ec51f2146100c5578063b34a5f72146100d857600080fd5b80630a743f531461006c5780631555fe6b14610092575b600080fd5b61007f61007a3660046114ae565b610143565b6040519081526020015b60405180910390f35b6100a56100a0366004611525565b610201565b60405161008991906115e0565b61007f6100c03660046116a5565b6104a5565b6100a56100d33660046116f9565b6105d2565b6101366100e6366004611745565b60009081527fdb30d141cb14f7793ef507f58c70af081a451bad8a68a642aa3dfbd48964a80560205260409020600101547501000000000000000000000000000000000000000000900460ff1690565b604051610089919061178d565b6000806101a66101538585610655565b60008181527fdb30d141cb14f7793ef507f58c70af081a451bad8a68a642aa3dfbd48964a80560205260409020600101549093507501000000000000000000000000000000000000000000900460ff1690565b60028111156101b7576101b761175e565b036101fb5782826040517ffffed0ee0000000000000000000000000000000000000000000000000000000081526004016101f29291906117a7565b60405180910390fd5b92915050565b606061020b61135f565b6102536040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016060815260200160608152602001606081525090565b60008061026961026387806117f4565b3561069a565b50909250905061027c6040870187611832565b600081811061028d5761028d61189a565b6102a392602060409092020190810191506118c9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610365576102df86806117f4565b356102ed6040880188611832565b60008181106102fe576102fe61189a565b61031492602060409092020190810191506118c9565b6040517f60ae9350000000000000000000000000000000000000000000000000000000008152600481019290925273ffffffffffffffffffffffffffffffffffffffff1660248201526044016101f2565b73ffffffffffffffffffffffffffffffffffffffff8216845261038b6040870187611832565b600081811061039c5761039c61189a565b60206040918202939093018301358784015273ffffffffffffffffffffffffffffffffffffffff851687820152516000926103e692508a9185918b01359089908990602401611b58565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f60da086000000000000000000000000000000000000000000000000000000000179052815160608101835273888888888889758f76e7103c6cbf23abbf58f94681526000818301529182018390529192506104999184908a01356107bd565b98975050505050505050565b60006104b184846107ee565b60008181527fdb30d141cb14f7793ef507f58c70af081a451bad8a68a642aa3dfbd48964a80560205260409020600101549091507501000000000000000000000000000000000000000000900460ff1682801561051f5750600081600281111561051d5761051d61175e565b145b156105365761052e85856107fa565b9150506105cb565b828015610554575060028160028111156105525761055261175e565b145b1561056a57610564826001610a1d565b506105cb565b82158015610589575060018160028111156105875761058761175e565b145b1561059957610564826002610a1d565b6040517fde5f46d700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b606060006106056105e66020850185611c0a565b6040860135606087013561060060a0890160808a016118c9565b610aa6565b805160408051606080820183528285015173ffffffffffffffffffffffffffffffffffffffff168252600060208301528401518183015292935061064d9291908601356107bd565b949350505050565b60007fdb30d141cb14f7793ef507f58c70af081a451bad8a68a642aa3dfbd48964a804816106838585610bb7565b815260200190815260200160002054905092915050565b60008060008360006106f78260009081527fdb30d141cb14f7793ef507f58c70af081a451bad8a68a642aa3dfbd48964a805602052604090206001015460ff75010000000000000000000000000000000000000000009091041690565b9050600081600281111561070d5761070d61175e565b03610747576040517f9746888d000000000000000000000000000000000000000000000000000000008152600481018390526024016101f2565b505050600092835250507fdb30d141cb14f7793ef507f58c70af081a451bad8a68a642aa3dfbd48964a80560205260409020805460019091015473ffffffffffffffffffffffffffffffffffffffff91821692918116917401000000000000000000000000000000000000000090910460ff1690565b606081156107e5576107de846107d885876000015186610c59565b90610e7c565b90506105cb565b61064d84610f65565b60006105cb8383610655565b600080808061080b85870187611c6f565b925092509250600061083a7fdb30d141cb14f7793ef507f58c70af081a451bad8a68a642aa3dfbd48964a80390565b9050806000016000815461084d90611cef565b91829055506001820160006108628a8a610bb7565b81526020019081526020016000208190555060405180608001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018360ff1660028111156108cc576108cc61175e565b60028111156108dd576108dd61175e565b8152602001600190528154600081815260028085016020908152604092839020855181547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff9283161783559287015160018301805494851691909216908117825594870151959b5090949390927fffffffffffffffffffffff0000000000000000000000000000000000000000009092161790740100000000000000000000000000000000000000009084908111156109b0576109b061175e565b021790555060608201516001820180547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000836002811115610a0b57610a0b61175e565b02179055509050505050505092915050565b60008281527fdb30d141cb14f7793ef507f58c70af081a451bad8a68a642aa3dfbd48964a8056020526040902060010180548291907fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000836002811115610a9d57610a9d61175e565b02179055505050565b6040805160808101825260008082526020820181905291810191909152606080820152366000610ad9876004818b611d27565b90925090506000610aed6004828a8c611d27565b610af691611d51565b90507fa6b57734000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601610b5557610b4e8383898989610fd1565b9350610bab565b6040517ffdf396fd0000000000000000000000000000000000000000000000000000000081527fffffffff00000000000000000000000000000000000000000000000000000000821660048201526024016101f2565b50505095945050505050565b6000808080610bc885870187611c6f565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085811b8216602084015284901b1660348201527fff0000000000000000000000000000000000000000000000000000000000000060f883901b166048820152929550909350915060490160405160208183030381529060405280519060200120935050505092915050565b6040805160028082526060828101909352816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081610c6f579050506040805160608101825273ffffffffffffffffffffffffffffffffffffffff80881682526000602083018190528351918816602483015260448201529293509190820190606401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b300000000000000000000000000000000000000000000000000000000179052905281518290600090610d7057610d7061189a565b602002602001018190525060405180606001604052808573ffffffffffffffffffffffffffffffffffffffff168152602001600081526020018484604051602401610ddd92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b3000000000000000000000000000000000000000000000000000000001790529052815182906001908110610e6a57610e6a61189a565b60200260200101819052509392505050565b606082516001610e8c9190611dc8565b67ffffffffffffffff811115610ea457610ea4611d99565b604051908082528060200260200182016040528015610ef157816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081610ec25790505b50905060005b8351811015610f3f57838181518110610f1257610f1261189a565b6020026020010151828281518110610f2c57610f2c61189a565b6020908102919091010152600101610ef7565b508181845181518110610f5457610f5461189a565b602002602001018190525092915050565b604080516001808252818301909252606091816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081610f7c5790505090508181600081518110610fc157610fc161189a565b6020026020010181905250919050565b6040805160808101825260008082526020820181905291810182905260608082015290610ffe87876111b1565b90506000816020015190506000808273ffffffffffffffffffffffffffffffffffffffff16632c8ce6bc6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611057573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107b9190611ddb565b73ffffffffffffffffffffffffffffffffffffffff8083168952604080890180515183166020808d0191909152905181018d905281517fe184c9be00000000000000000000000000000000000000000000000000000000815291519497509295504294509087169263e184c9be926004808401939192918290030181865afa15801561110b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112f9190611e1d565b11156111735761114e8685602001518a876040015188606001516111f6565b606087015273ffffffffffffffffffffffffffffffffffffffff1660408601526111a4565b61118386828a87604001516112ac565b606087015273ffffffffffffffffffffffffffffffffffffffff1660408601525b5050505095945050505050565b6111b96113f9565b6111c58284018461224f565b606086015260408501525073ffffffffffffffffffffffffffffffffffffffff908116602084015216815292915050565b60405173888888888889758f76e7103c6cbf23abbf58f946906060906112289088908890889088908890602401611b58565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f594a88cc00000000000000000000000000000000000000000000000000000000179052919791965090945050505050565b60405173888888888889758f76e7103c6cbf23abbf58f946906060906112dc9087908790879087906024016123bc565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f47f1de22000000000000000000000000000000000000000000000000000000001790529196919550909350505050565b6040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016113f4604080516080810190915280600081526000602082018190526060604083018190529091015290565b905290565b604080516080810182526000808252602082015290810161141861135f565b81526020016113f46040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016060815260200160608152602001606081525090565b60008083601f84011261147757600080fd5b50813567ffffffffffffffff81111561148f57600080fd5b6020830191508360208285010111156114a757600080fd5b9250929050565b600080602083850312156114c157600080fd5b823567ffffffffffffffff8111156114d857600080fd5b6114e485828601611465565b90969095509350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461151257600080fd5b50565b8035611520816114f0565b919050565b6000806040838503121561153857600080fd5b8235611543816114f0565b9150602083013567ffffffffffffffff81111561155f57600080fd5b83016060818603121561157157600080fd5b809150509250929050565b6000815180845260005b818110156115a257602081850181015186830182015201611586565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b83811015611687578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00185528151805173ffffffffffffffffffffffffffffffffffffffff168452878101518885015286015160608785018190526116738186018361157c565b968901969450505090860190600101611609565b509098975050505050505050565b8035801515811461152057600080fd5b6000806000604084860312156116ba57600080fd5b833567ffffffffffffffff8111156116d157600080fd5b6116dd86828701611465565b90945092506116f0905060208501611695565b90509250925092565b6000806040838503121561170c57600080fd5b8235611717816114f0565b9150602083013567ffffffffffffffff81111561173357600080fd5b830160a0818603121561157157600080fd5b60006020828403121561175757600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60208101600383106117a1576117a161175e565b91905290565b60208152816020820152818360408301376000818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261182857600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261186757600080fd5b83018035915067ffffffffffffffff82111561188257600080fd5b6020019150600681901b36038213156114a757600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602082840312156118db57600080fd5b81356105cb816114f0565b600481106115125761151261175e565b600073ffffffffffffffffffffffffffffffffffffffff80835116845260208301516020850152806040840151166040850152806060840151166060850152608083015160a06080860152805161194c816118e6565b60a0860152602081015190911660c08501526040810151608060e08601529061197961012086018361157c565b915060608101511515610100860152508091505092915050565b61199c816118e6565b9052565b600082825180855260208086019550808260051b84010181860160005b84811015611b4b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08684030189528151606081518186528051828701528681015160808181890152604091508183015160a081818b015285850151955060c09150611a2b828b0187611993565b91840151945060e091611a558a84018773ffffffffffffffffffffffffffffffffffffffff169052565b8401519450610100611a7e8a82018773ffffffffffffffffffffffffffffffffffffffff169052565b90840151945061012090611aa98a83018773ffffffffffffffffffffffffffffffffffffffff169052565b91840151945061014091611ad48a84018773ffffffffffffffffffffffffffffffffffffffff169052565b8401516101608a81019190915290840151610180808b0191909152918401516101a08a01528301516101c08901919091529250611b156101e088018461157c565b925087840151915086830388880152611b2e838361157c565b9381015196019590955250988401989250908301906001016119bd565b5090979650505050505050565b600073ffffffffffffffffffffffffffffffffffffffff8088168352808716602084015285604084015260a06060840152611b9660a08401866118f6565b8381036080850152818551168152602085015160208201526040850151915060a06040820152611bc960a08201836119a0565b915060608501518183036060830152611be283826119a0565b92505060808501518183036080830152611bfc838261157c565b9a9950505050505050505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611c3f57600080fd5b83018035915067ffffffffffffffff821115611c5a57600080fd5b6020019150368190038213156114a757600080fd5b600080600060608486031215611c8457600080fd5b8335611c8f816114f0565b92506020840135611c9f816114f0565b9150604084013560ff81168114611cb557600080fd5b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611d2057611d20611cc0565b5060010190565b60008085851115611d3757600080fd5b83861115611d4457600080fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015611d915780818660040360031b1b83161692505b505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b808201808211156101fb576101fb611cc0565b600080600060608486031215611df057600080fd5b8351611dfb816114f0565b6020850151909350611e0c816114f0565b6040850151909250611cb5816114f0565b600060208284031215611e2f57600080fd5b5051919050565b6040516060810167ffffffffffffffff81118282101715611e5957611e59611d99565b60405290565b604051610180810167ffffffffffffffff81118282101715611e5957611e59611d99565b60405160a0810167ffffffffffffffff81118282101715611e5957611e59611d99565b6040516080810167ffffffffffffffff81118282101715611e5957611e59611d99565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611f1057611f10611d99565b604052919050565b6004811061151257600080fd5b803561152081611f18565b600082601f830112611f4157600080fd5b813567ffffffffffffffff811115611f5b57611f5b611d99565b611f8c60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611ec9565b818152846020838601011115611fa157600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f830112611fcf57600080fd5b8135602067ffffffffffffffff80831115611fec57611fec611d99565b8260051b611ffb838201611ec9565b938452858101830193838101908886111561201557600080fd5b84880192505b858310156104995782358481111561203257600080fd5b88017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06060828c038201121561206757600080fd5b61206f611e36565b878301358781111561208057600080fd5b8301610180818e038401121561209557600080fd5b61209d611e5f565b9250888101358352604081013589840152606081013560408401526120c460808201611f25565b60608401526120d560a08201611515565b60808401526120e660c08201611515565b60a08401526120f760e08201611515565b60c084015261010061210a818301611515565b60e085015261012080830135828601526101409150818301358186015250610160808301358286015261018083013591508982111561214857600080fd5b6121568f8c84860101611f30565b9085015250509081526040820135908682111561217257600080fd5b6121808c8984860101611f30565b81890152606092909201356040830152508252918401919084019061201b565b600060a082840312156121b257600080fd5b6121ba611e83565b90506121c582611515565b815260208201356020820152604082013567ffffffffffffffff808211156121ec57600080fd5b6121f885838601611fbe565b6040840152606084013591508082111561221157600080fd5b61221d85838601611fbe565b6060840152608084013591508082111561223657600080fd5b5061224384828501611f30565b60808301525092915050565b600080600080600060a0868803121561226757600080fd5b8535612272816114f0565b94506020860135612282816114f0565b935060408601359250606086013567ffffffffffffffff808211156122a657600080fd5b9087019060a0828a0312156122ba57600080fd5b6122c2611e83565b82356122cd816114f0565b81526020838101359082015260408301356122e7816114f0565b604082015260608301356122fa816114f0565b606082015260808301358281111561231157600080fd5b92909201916080838b03121561232657600080fd5b61232e611ea6565b833561233981611f18565b81526020840135612349816114f0565b602082015260408401358381111561236057600080fd5b61236c8c828701611f30565b60408301525061237e60608501611695565b6060820152806080830152508094505060808801359150808211156123a257600080fd5b506123af888289016121a0565b9150509295509295909350565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526123fb60808301846118f6565b969550505050505056fea26469706673582212203c30f78dc29de3598eeb597bbc3e172482cb70897ce83cdf960de563596c9e5d64736f6c63430008160033