60806040525f60055f6101000a81548160ff0219169083151502179055505f600560016101000a81548160ff021916908315150217905550348015610042575f80fd5b50604051612a0f380380612a0f833981810160405281019061006491906106e6565b848481600390816100759190610999565b5080600490816100859190610999565b5050505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036100f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100ed90610ac2565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161015b90610ac2565b60405180910390fd5b8160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600560026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061025c3361023761026660201b60201c565b60ff16600a6102469190610c3c565b856102519190610c86565b61026e60201b60201c565b5050505050610d7f565b5f6012905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036102de575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016102d59190610cd6565b60405180910390fd5b6102ef5f83836102f360201b60201c565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610343578060025f8282546103379190610cef565b92505081905550610411565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156103cc578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016103c393929190610d31565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610458578060025f82825403925050819055506104a2565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516104ff9190610d66565b60405180910390a3505050565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61056b82610525565b810181811067ffffffffffffffff8211171561058a57610589610535565b5b80604052505050565b5f61059c61050c565b90506105a88282610562565b919050565b5f67ffffffffffffffff8211156105c7576105c6610535565b5b6105d082610525565b9050602081019050919050565b8281835e5f83830152505050565b5f6105fd6105f8846105ad565b610593565b90508281526020810184848401111561061957610618610521565b5b6106248482856105dd565b509392505050565b5f82601f8301126106405761063f61051d565b5b81516106508482602086016105eb565b91505092915050565b5f819050919050565b61066b81610659565b8114610675575f80fd5b50565b5f8151905061068681610662565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6106b58261068c565b9050919050565b6106c5816106ab565b81146106cf575f80fd5b50565b5f815190506106e0816106bc565b92915050565b5f805f805f60a086880312156106ff576106fe610515565b5b5f86015167ffffffffffffffff81111561071c5761071b610519565b5b6107288882890161062c565b955050602086015167ffffffffffffffff81111561074957610748610519565b5b6107558882890161062c565b945050604061076688828901610678565b9350506060610777888289016106d2565b9250506080610788888289016106d2565b9150509295509295909350565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806107e357607f821691505b6020821081036107f6576107f561079f565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026108587fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261081d565b610862868361081d565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61089d61089861089384610659565b61087a565b610659565b9050919050565b5f819050919050565b6108b683610883565b6108ca6108c2826108a4565b848454610829565b825550505050565b5f90565b6108de6108d2565b6108e98184846108ad565b505050565b5b8181101561090c576109015f826108d6565b6001810190506108ef565b5050565b601f82111561095157610922816107fc565b61092b8461080e565b8101602085101561093a578190505b61094e6109468561080e565b8301826108ee565b50505b505050565b5f82821c905092915050565b5f6109715f1984600802610956565b1980831691505092915050565b5f6109898383610962565b9150826002028217905092915050565b6109a282610795565b67ffffffffffffffff8111156109bb576109ba610535565b5b6109c582546107cc565b6109d0828285610910565b5f60209050601f831160018114610a01575f84156109ef578287015190505b6109f9858261097e565b865550610a60565b601f198416610a0f866107fc565b5f5b82811015610a3657848901518255600182019150602085019450602081019050610a11565b86831015610a535784890151610a4f601f891682610962565b8355505b6001600288020188555050505b505050505050565b5f82825260208201905092915050565b7f45313200000000000000000000000000000000000000000000000000000000005f82015250565b5f610aac600383610a68565b9150610ab782610a78565b602082019050919050565b5f6020820190508181035f830152610ad981610aa0565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b6001851115610b6257808604811115610b3e57610b3d610ae0565b5b6001851615610b4d5780820291505b8081029050610b5b85610b0d565b9450610b22565b94509492505050565b5f82610b7a5760019050610c35565b81610b87575f9050610c35565b8160018114610b9d5760028114610ba757610bd6565b6001915050610c35565b60ff841115610bb957610bb8610ae0565b5b8360020a915084821115610bd057610bcf610ae0565b5b50610c35565b5060208310610133831016604e8410600b8410161715610c0b5782820a905083811115610c0657610c05610ae0565b5b610c35565b610c188484846001610b19565b92509050818404811115610c2f57610c2e610ae0565b5b81810290505b9392505050565b5f610c4682610659565b9150610c5183610659565b9250610c7e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484610b6b565b905092915050565b5f610c9082610659565b9150610c9b83610659565b9250828202610ca981610659565b91508282048414831517610cc057610cbf610ae0565b5b5092915050565b610cd0816106ab565b82525050565b5f602082019050610ce95f830184610cc7565b92915050565b5f610cf982610659565b9150610d0483610659565b9250828201905080821115610d1c57610d1b610ae0565b5b92915050565b610d2b81610659565b82525050565b5f606082019050610d445f830186610cc7565b610d516020830185610d22565b610d5e6040830184610d22565b949350505050565b5f602082019050610d795f830184610d22565b92915050565b611c8380610d8c5f395ff3fe608060405234801561000f575f80fd5b506004361061014b575f3560e01c80636c1fff59116100c1578063b2bdfa7b1161007a578063b2bdfa7b14610377578063b826caa214610395578063cc58ed08146103b1578063dd62ed3e146103cf578063e2d6f634146103ff578063ffb0885d1461041b5761014b565b80636c1fff59146102a357806370a08231146102bf5780638d142816146102ef57806395d89b411461030b578063a9059cbb14610329578063aa4cee45146103595761014b565b80632263189e116101135780632263189e146101f557806323b872dd146102135780632c34962714610243578063313ce5671461024d5780633ea8998f1461026b578063582a2863146102875761014b565b806306fdde031461014f578063095ea7b31461016d5780630d1118ce1461019d57806318160ddd146101b95780631f4339d8146101d7575b5f80fd5b610157610437565b60405161016491906116be565b60405180910390f35b6101876004803603810190610182919061176f565b6104c7565b60405161019491906117c7565b60405180910390f35b6101b760048036038101906101b2919061176f565b6104e9565b005b6101c1610586565b6040516101ce91906117ef565b60405180910390f35b6101df61058f565b6040516101ec9190611820565b60405180910390f35b6101fd610595565b60405161020a9190611848565b60405180910390f35b61022d60048036038101906102289190611861565b6105ba565b60405161023a91906117c7565b60405180910390f35b61024b6105e8565b005b6102556106e3565b60405161026291906118cc565b60405180910390f35b610285600480360381019061028091906118e5565b6106eb565b005b6102a1600480360381019061029c919061193a565b6107be565b005b6102bd60048036038101906102b89190611965565b6108a7565b005b6102d960048036038101906102d491906118e5565b610944565b6040516102e691906117ef565b60405180910390f35b610309600480360381019061030491906119ba565b610989565b005b610313610a36565b60405161032091906116be565b60405180910390f35b610343600480360381019061033e919061176f565b610ac6565b60405161035091906117c7565b60405180910390f35b610361610ae8565b60405161036e9190611848565b60405180910390f35b61037f610b0d565b60405161038c9190611848565b60405180910390f35b6103af60048036038101906103aa91906118e5565b610b33565b005b6103b9610c06565b6040516103c691906117c7565b60405180910390f35b6103e960048036038101906103e491906119e5565b610c1b565b6040516103f691906117ef565b60405180910390f35b6104196004803603810190610414919061176f565b610c9d565b005b6104356004803603810190610430919061176f565b610d3b565b005b60606003805461044690611a50565b80601f016020809104026020016040519081016040528092919081815260200182805461047290611a50565b80156104bd5780601f10610494576101008083540402835291602001916104bd565b820191905f5260205f20905b8154815290600101906020018083116104a057829003601f168201915b5050505050905090565b5f806104d1610dfc565b90506104de818585610e03565b600191505092915050565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610578576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056f90611aca565b60405180910390fd5b6105828282610e15565b5050565b5f600254905090565b60085481565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f806105c4610dfc565b90506105d1858285610e94565b6105dc858585610f26565b60019150509392505050565b600560029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610678576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066f90611aca565b60405180910390fd5b60055f9054906101000a900460ff16156106c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106be90611b32565b60405180910390fd5b600160055f6101000a81548160ff021916908315150217905550565b5f6012905090565b600560029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461077b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077290611aca565b60405180910390fd5b8060075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60055f9054906101000a900460ff161561080d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080490611b9a565b60405180910390fd5b600560029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461089d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089490611aca565b60405180910390fd5b8060088190555050565b600560029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092e90611aca565b60405180910390fd5b61094133826110f7565b50565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b600560029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1090611aca565b60405180910390fd5b80600560016101000a81548160ff02191690831515021790555050565b606060048054610a4590611a50565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7190611a50565b8015610abc5780601f10610a9357610100808354040283529160200191610abc565b820191905f5260205f20905b815481529060010190602001808311610a9f57829003601f168201915b5050505050905090565b5f80610ad0610dfc565b9050610add818585610f26565b600191505092915050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bba90611aca565b60405180910390fd5b8060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f60055f9054906101000a900460ff16905090565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b600560029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2490611aca565b60405180910390fd5b610d378282610e15565b5050565b600560029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610dcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc290611aca565b60405180910390fd5b610df882600560029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683610f26565b5050565b5f33905090565b610e108383836001611176565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e85575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610e7c9190611848565b60405180910390fd5b610e90825f83611345565b5050565b5f610e9f8484610c1b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610f205781811015610f11578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401610f0893929190611bb8565b60405180910390fd5b610f1f84848484035f611176565b5b50505050565b60055f9054906101000a900460ff1615610f75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6c90611b9a565b60405180910390fd5b5f1515600560019054906101000a900460ff161515036110f257600560029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ff457610fef83838361155e565b6110f1565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036110585761105383838361155e565b6110f0565b600560029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110bd576110b883838361155e565b6110ef565b6040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b5b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611167575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161115e9190611848565b60405180910390fd5b6111725f8383611345565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036111e6575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016111dd9190611848565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611256575f6040517f94280d6200000000000000000000000000000000000000000000000000000000815260040161124d9190611848565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550801561133f578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161133691906117ef565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611395578060025f8282546113899190611c1a565b92505081905550611463565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508181101561141e578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161141593929190611bb8565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114aa578060025f82825403925050819055506114f4565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161155191906117ef565b60405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036115ce575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016115c59190611848565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361163e575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016116359190611848565b60405180910390fd5b611649838383611345565b505050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6116908261164e565b61169a8185611658565b93506116aa818560208601611668565b6116b381611676565b840191505092915050565b5f6020820190508181035f8301526116d68184611686565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61170b826116e2565b9050919050565b61171b81611701565b8114611725575f80fd5b50565b5f8135905061173681611712565b92915050565b5f819050919050565b61174e8161173c565b8114611758575f80fd5b50565b5f8135905061176981611745565b92915050565b5f8060408385031215611785576117846116de565b5b5f61179285828601611728565b92505060206117a38582860161175b565b9150509250929050565b5f8115159050919050565b6117c1816117ad565b82525050565b5f6020820190506117da5f8301846117b8565b92915050565b6117e98161173c565b82525050565b5f6020820190506118025f8301846117e0565b92915050565b5f819050919050565b61181a81611808565b82525050565b5f6020820190506118335f830184611811565b92915050565b61184281611701565b82525050565b5f60208201905061185b5f830184611839565b92915050565b5f805f60608486031215611878576118776116de565b5b5f61188586828701611728565b935050602061189686828701611728565b92505060406118a78682870161175b565b9150509250925092565b5f60ff82169050919050565b6118c6816118b1565b82525050565b5f6020820190506118df5f8301846118bd565b92915050565b5f602082840312156118fa576118f96116de565b5b5f61190784828501611728565b91505092915050565b61191981611808565b8114611923575f80fd5b50565b5f8135905061193481611910565b92915050565b5f6020828403121561194f5761194e6116de565b5b5f61195c84828501611926565b91505092915050565b5f6020828403121561197a576119796116de565b5b5f6119878482850161175b565b91505092915050565b611999816117ad565b81146119a3575f80fd5b50565b5f813590506119b481611990565b92915050565b5f602082840312156119cf576119ce6116de565b5b5f6119dc848285016119a6565b91505092915050565b5f80604083850312156119fb576119fa6116de565b5b5f611a0885828601611728565b9250506020611a1985828601611728565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611a6757607f821691505b602082108103611a7a57611a79611a23565b5b50919050565b7f45310000000000000000000000000000000000000000000000000000000000005f82015250565b5f611ab4600283611658565b9150611abf82611a80565b602082019050919050565b5f6020820190508181035f830152611ae181611aa8565b9050919050565b7f45313200000000000000000000000000000000000000000000000000000000005f82015250565b5f611b1c600383611658565b9150611b2782611ae8565b602082019050919050565b5f6020820190508181035f830152611b4981611b10565b9050919050565b7f45330000000000000000000000000000000000000000000000000000000000005f82015250565b5f611b84600283611658565b9150611b8f82611b50565b602082019050919050565b5f6020820190508181035f830152611bb181611b78565b9050919050565b5f606082019050611bcb5f830186611839565b611bd860208301856117e0565b611be560408301846117e0565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611c248261173c565b9150611c2f8361173c565b9250828201905080821115611c4757611c46611bed565b5b9291505056fea2646970667358221220ff83d4a12afba2d065dc7869cd3f9905331574e652164252ad1e6cfd7f7ffa5764736f6c6343000819003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000027100000000000000000000000004be64c826331b87e32f310729d7cea2ed533fd7c00000000000000000000000041c465d5d20209b4019bd2616424abe80aacea84000000000000000000000000000000000000000000000000000000000000000952c3b66e6573616e7300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003526e730000000000000000000000000000000000000000000000000000000000