608060405234801561000f575f80fd5b5060405180602001604052805f81525061002e8161003460201b60201c565b50610350565b80600290816100439190610281565b5050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806100c257607f821691505b6020821081036100d5576100d461007e565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026101377fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826100fc565b61014186836100fc565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61018561018061017b84610159565b610162565b610159565b9050919050565b5f819050919050565b61019e8361016b565b6101b26101aa8261018c565b848454610108565b825550505050565b5f90565b6101c66101ba565b6101d1818484610195565b505050565b5b818110156101f4576101e95f826101be565b6001810190506101d7565b5050565b601f8211156102395761020a816100db565b610213846100ed565b81016020851015610222578190505b61023661022e856100ed565b8301826101d6565b50505b505050565b5f82821c905092915050565b5f6102595f198460080261023e565b1980831691505092915050565b5f610271838361024a565b9150826002028217905092915050565b61028a82610047565b67ffffffffffffffff8111156102a3576102a2610051565b5b6102ad82546100ab565b6102b88282856101f8565b5f60209050601f8311600181146102e9575f84156102d7578287015190505b6102e18582610266565b865550610348565b601f1984166102f7866100db565b5f5b8281101561031e578489015182556001820191506020850194506020810190506102f9565b8683101561033b5784890151610337601f89168261024a565b8355505b6001600288020188555050505b505050505050565b6121d18061035d5f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c80636b20c454116100645780636b20c4541461017b578063a22cb46514610197578063e985e9c5146101b3578063f242432a146101e3578063f5298aca146101ff5761009b565b8062fdd58e1461009f57806301ffc9a7146100cf5780630e89341c146100ff5780632eb2c2d61461012f5780634e1273f41461014b575b5f80fd5b6100b960048036038101906100b491906115c7565b61021b565b6040516100c69190611614565b60405180910390f35b6100e960048036038101906100e49190611682565b610270565b6040516100f691906116c7565b60405180910390f35b610119600480360381019061011491906116e0565b610351565b604051610126919061177b565b60405180910390f35b6101496004803603810190610144919061198b565b6103e3565b005b61016560048036038101906101609190611b16565b61048a565b6040516101729190611c43565b60405180910390f35b61019560048036038101906101909190611c63565b610591565b005b6101b160048036038101906101ac9190611d15565b61063d565b005b6101cd60048036038101906101c89190611d53565b610653565b6040516101da91906116c7565b60405180910390f35b6101fd60048036038101906101f89190611d91565b6106e1565b005b61021960048036038101906102149190611e24565b610788565b005b5f805f8381526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b5f7fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061033a57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061034a575061034982610834565b5b9050919050565b60606002805461036090611ea1565b80601f016020809104026020016040519081016040528092919081815260200182805461038c90611ea1565b80156103d75780601f106103ae576101008083540402835291602001916103d7565b820191905f5260205f20905b8154815290600101906020018083116103ba57829003601f168201915b50505050509050919050565b5f6103ec61089d565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015610431575061042f8682610653565b155b156104755780866040517fe237d92200000000000000000000000000000000000000000000000000000000815260040161046c929190611ee0565b60405180910390fd5b61048286868686866108a4565b505050505050565b606081518351146104d657815183516040517f5b0599910000000000000000000000000000000000000000000000000000000081526004016104cd929190611f07565b60405180910390fd5b5f835167ffffffffffffffff8111156104f2576104f161179f565b5b6040519080825280602002602001820160405280156105205781602001602082028036833780820191505090505b5090505f5b84518110156105865761055c610544828761099890919063ffffffff16565b61055783876109ab90919063ffffffff16565b61021b565b82828151811061056f5761056e611f2e565b5b602002602001018181525050806001019050610525565b508091505092915050565b61059961089d565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156105e257506105e0836105db61089d565b610653565b155b1561062d576105ef61089d565b836040517fe237d922000000000000000000000000000000000000000000000000000000008152600401610624929190611ee0565b60405180910390fd5b6106388383836109be565b505050565b61064f61064861089d565b8383610a4e565b5050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f6106ea61089d565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415801561072f575061072d8682610653565b155b156107735780866040517fe237d92200000000000000000000000000000000000000000000000000000000815260040161076a929190611ee0565b60405180910390fd5b6107808686868686610bb7565b505050505050565b61079061089d565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156107d957506107d7836107d261089d565b610653565b155b15610824576107e661089d565b836040517fe237d92200000000000000000000000000000000000000000000000000000000815260040161081b929190611ee0565b60405180910390fd5b61082f838383610cbd565b505050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610914575f6040517f57f447ce00000000000000000000000000000000000000000000000000000000815260040161090b9190611f5b565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610984575f6040517f01a8351400000000000000000000000000000000000000000000000000000000815260040161097b9190611f5b565b60405180910390fd5b6109918585858585610d5f565b5050505050565b5f60208202602084010151905092915050565b5f60208202602084010151905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a2e575f6040517f01a83514000000000000000000000000000000000000000000000000000000008152600401610a259190611f5b565b60405180910390fd5b610a49835f848460405180602001604052805f815250610d5f565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610abe575f6040517fced3e100000000000000000000000000000000000000000000000000000000008152600401610ab59190611f5b565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610baa91906116c7565b60405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610c27575f6040517f57f447ce000000000000000000000000000000000000000000000000000000008152600401610c1e9190611f5b565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610c97575f6040517f01a83514000000000000000000000000000000000000000000000000000000008152600401610c8e9190611f5b565b60405180910390fd5b5f80610ca38585610e0b565b91509150610cb48787848487610d5f565b50505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610d2d575f6040517f01a83514000000000000000000000000000000000000000000000000000000008152600401610d249190611f5b565b60405180910390fd5b5f80610d398484610e0b565b91509150610d58855f848460405180602001604052805f815250610d5f565b5050505050565b610d6b85858585610e3b565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614610e04575f610da761089d565b90506001845103610df3575f610dc65f866109ab90919063ffffffff16565b90505f610ddc5f866109ab90919063ffffffff16565b9050610dec8389898585896111cb565b5050610e02565b610e0181878787878761137a565b5b505b5050505050565b60608060405191506001825283602083015260408201905060018152826020820152604081016040529250929050565b8051825114610e8557815181516040517f5b059991000000000000000000000000000000000000000000000000000000008152600401610e7c929190611f07565b60405180910390fd5b5f610e8e61089d565b90505f5b835181101561108a575f610eaf82866109ab90919063ffffffff16565b90505f610ec583866109ab90919063ffffffff16565b90505f73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614610fe8575f805f8481526020019081526020015f205f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015610f9457888183856040517f03dee4c5000000000000000000000000000000000000000000000000000000008152600401610f8b9493929190611f74565b60405180910390fd5b8181035f808581526020019081526020015f205f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161461107d57805f808481526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546110759190611fe4565b925050819055505b5050806001019050610e92565b506001835103611145575f6110a85f856109ab90919063ffffffff16565b90505f6110be5f856109ab90919063ffffffff16565b90508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051611136929190611f07565b60405180910390a450506111c4565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516111bb929190612017565b60405180910390a45b5050505050565b5f8473ffffffffffffffffffffffffffffffffffffffff163b1115611372578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b815260040161122b95949392919061209e565b6020604051808303815f875af192505050801561126657506040513d601f19601f82011682018060405250810190611263919061210a565b60015b6112e7573d805f8114611294576040519150601f19603f3d011682016040523d82523d5f602084013e611299565b606091505b505f8151036112df57846040517f57f447ce0000000000000000000000000000000000000000000000000000000081526004016112d69190611f5b565b60405180910390fd5b805181602001fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461137057846040517f57f447ce0000000000000000000000000000000000000000000000000000000081526004016113679190611f5b565b60405180910390fd5b505b505050505050565b5f8473ffffffffffffffffffffffffffffffffffffffff163b1115611521578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016113da959493929190612135565b6020604051808303815f875af192505050801561141557506040513d601f19601f82011682018060405250810190611412919061210a565b60015b611496573d805f8114611443576040519150601f19603f3d011682016040523d82523d5f602084013e611448565b606091505b505f81510361148e57846040517f57f447ce0000000000000000000000000000000000000000000000000000000081526004016114859190611f5b565b60405180910390fd5b805181602001fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461151f57846040517f57f447ce0000000000000000000000000000000000000000000000000000000081526004016115169190611f5b565b60405180910390fd5b505b505050505050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6115638261153a565b9050919050565b61157381611559565b811461157d575f80fd5b50565b5f8135905061158e8161156a565b92915050565b5f819050919050565b6115a681611594565b81146115b0575f80fd5b50565b5f813590506115c18161159d565b92915050565b5f80604083850312156115dd576115dc611532565b5b5f6115ea85828601611580565b92505060206115fb858286016115b3565b9150509250929050565b61160e81611594565b82525050565b5f6020820190506116275f830184611605565b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6116618161162d565b811461166b575f80fd5b50565b5f8135905061167c81611658565b92915050565b5f6020828403121561169757611696611532565b5b5f6116a48482850161166e565b91505092915050565b5f8115159050919050565b6116c1816116ad565b82525050565b5f6020820190506116da5f8301846116b8565b92915050565b5f602082840312156116f5576116f4611532565b5b5f611702848285016115b3565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61174d8261170b565b6117578185611715565b9350611767818560208601611725565b61177081611733565b840191505092915050565b5f6020820190508181035f8301526117938184611743565b905092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6117d582611733565b810181811067ffffffffffffffff821117156117f4576117f361179f565b5b80604052505050565b5f611806611529565b905061181282826117cc565b919050565b5f67ffffffffffffffff8211156118315761183061179f565b5b602082029050602081019050919050565b5f80fd5b5f61185861185384611817565b6117fd565b9050808382526020820190506020840283018581111561187b5761187a611842565b5b835b818110156118a4578061189088826115b3565b84526020840193505060208101905061187d565b5050509392505050565b5f82601f8301126118c2576118c161179b565b5b81356118d2848260208601611846565b91505092915050565b5f80fd5b5f67ffffffffffffffff8211156118f9576118f861179f565b5b61190282611733565b9050602081019050919050565b828183375f83830152505050565b5f61192f61192a846118df565b6117fd565b90508281526020810184848401111561194b5761194a6118db565b5b61195684828561190f565b509392505050565b5f82601f8301126119725761197161179b565b5b813561198284826020860161191d565b91505092915050565b5f805f805f60a086880312156119a4576119a3611532565b5b5f6119b188828901611580565b95505060206119c288828901611580565b945050604086013567ffffffffffffffff8111156119e3576119e2611536565b5b6119ef888289016118ae565b935050606086013567ffffffffffffffff811115611a1057611a0f611536565b5b611a1c888289016118ae565b925050608086013567ffffffffffffffff811115611a3d57611a3c611536565b5b611a498882890161195e565b9150509295509295909350565b5f67ffffffffffffffff821115611a7057611a6f61179f565b5b602082029050602081019050919050565b5f611a93611a8e84611a56565b6117fd565b90508083825260208201905060208402830185811115611ab657611ab5611842565b5b835b81811015611adf5780611acb8882611580565b845260208401935050602081019050611ab8565b5050509392505050565b5f82601f830112611afd57611afc61179b565b5b8135611b0d848260208601611a81565b91505092915050565b5f8060408385031215611b2c57611b2b611532565b5b5f83013567ffffffffffffffff811115611b4957611b48611536565b5b611b5585828601611ae9565b925050602083013567ffffffffffffffff811115611b7657611b75611536565b5b611b82858286016118ae565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b611bbe81611594565b82525050565b5f611bcf8383611bb5565b60208301905092915050565b5f602082019050919050565b5f611bf182611b8c565b611bfb8185611b96565b9350611c0683611ba6565b805f5b83811015611c36578151611c1d8882611bc4565b9750611c2883611bdb565b925050600181019050611c09565b5085935050505092915050565b5f6020820190508181035f830152611c5b8184611be7565b905092915050565b5f805f60608486031215611c7a57611c79611532565b5b5f611c8786828701611580565b935050602084013567ffffffffffffffff811115611ca857611ca7611536565b5b611cb4868287016118ae565b925050604084013567ffffffffffffffff811115611cd557611cd4611536565b5b611ce1868287016118ae565b9150509250925092565b611cf4816116ad565b8114611cfe575f80fd5b50565b5f81359050611d0f81611ceb565b92915050565b5f8060408385031215611d2b57611d2a611532565b5b5f611d3885828601611580565b9250506020611d4985828601611d01565b9150509250929050565b5f8060408385031215611d6957611d68611532565b5b5f611d7685828601611580565b9250506020611d8785828601611580565b9150509250929050565b5f805f805f60a08688031215611daa57611da9611532565b5b5f611db788828901611580565b9550506020611dc888828901611580565b9450506040611dd9888289016115b3565b9350506060611dea888289016115b3565b925050608086013567ffffffffffffffff811115611e0b57611e0a611536565b5b611e178882890161195e565b9150509295509295909350565b5f805f60608486031215611e3b57611e3a611532565b5b5f611e4886828701611580565b9350506020611e59868287016115b3565b9250506040611e6a868287016115b3565b9150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611eb857607f821691505b602082108103611ecb57611eca611e74565b5b50919050565b611eda81611559565b82525050565b5f604082019050611ef35f830185611ed1565b611f006020830184611ed1565b9392505050565b5f604082019050611f1a5f830185611605565b611f276020830184611605565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082019050611f6e5f830184611ed1565b92915050565b5f608082019050611f875f830187611ed1565b611f946020830186611605565b611fa16040830185611605565b611fae6060830184611605565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611fee82611594565b9150611ff983611594565b925082820190508082111561201157612010611fb7565b5b92915050565b5f6040820190508181035f83015261202f8185611be7565b905081810360208301526120438184611be7565b90509392505050565b5f81519050919050565b5f82825260208201905092915050565b5f6120708261204c565b61207a8185612056565b935061208a818560208601611725565b61209381611733565b840191505092915050565b5f60a0820190506120b15f830188611ed1565b6120be6020830187611ed1565b6120cb6040830186611605565b6120d86060830185611605565b81810360808301526120ea8184612066565b90509695505050505050565b5f8151905061210481611658565b92915050565b5f6020828403121561211f5761211e611532565b5b5f61212c848285016120f6565b91505092915050565b5f60a0820190506121485f830188611ed1565b6121556020830187611ed1565b81810360408301526121678186611be7565b9050818103606083015261217b8185611be7565b9050818103608083015261218f8184612066565b9050969550505050505056fea26469706673582212202a69b91a69b389dbb15d4dff022111e6f6f0c57c17df4fb393c7471d67621d4464736f6c634300081a0033