60806040526000805464ffffffffff19166422b8010f2c17905534801561002557600080fd5b50610fc2806100356000396000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c806370a08231116100b2578063a9059cbb11610081578063dd62ed3e11610066578063dd62ed3e146103b2578063e086e5ec146103db578063f4f3b200146103e357600080fd5b8063a9059cbb1461038c578063d505accf1461039f57600080fd5b806370a08231146103005780637ecebe00146103265780638da5cb5b1461034c57806395d89b411461013b57600080fd5b8063313ce5671161010957806344c66be7116100ee57806344c66be7146102a05780635a2bcc18146102c85780636a627842146102eb57600080fd5b8063313ce567146101d35780633644e515146101e257600080fd5b806306fdde031461013b578063095ea7b31461018357806318160ddd146101a657806323b872dd146101c0575b600080fd5b604080518082018252600381527f4c464700000000000000000000000000000000000000000000000000000000006020820152905161017a9190610bba565b60405180910390f35b610196610191366004610c4f565b6103f6565b604051901515815260200161017a565b6805345cdf77eb68f44c545b60405190815260200161017a565b6101966101ce366004610c79565b61044a565b6040516012815260200161017a565b604080518082018252600381527f4c4647000000000000000000000000000000000000000000000000000000000060209182015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f9036ec1b899d16cdf2845a54555129303d133d19d7ad5d790f0aaed1b6d48913918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc69181019190915246606082015230608082015260a090206101b2565b6000546102b5906301000000900461ffff1681565b60405161ffff909116815260200161017a565b6000546102d79062ffffff1681565b60405162ffffff909116815260200161017a565b6102fe6102f9366004610cb5565b610508565b005b6101b261030e366004610cb5565b6387a211a2600c908152600091909152602090205490565b6101b2610334366004610cb5565b6338377508600c908152600091909152602090205490565b6103677358b36156a268ec1e28ac781554c556e5152f745081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161017a565b61019661039a366004610c4f565b61075f565b6102fe6103ad366004610cd7565b6107da565b6101b26103c0366004610d4a565b602052637f5e9f20600c908152600091909152603490205490565b6102fe6109b7565b6102fe6103f1366004610cb5565b6109f7565b600082602052637f5e9f20600c5233600052816034600c205581600052602c5160601c337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560206000a35060015b92915050565b60008360601b33602052637f5e9f208117600c526034600c208054600181011561048a5780851115610484576313be252b6000526004601cfd5b84810382555b50506387a211a28117600c526020600c208054808511156104b35763f4d678b86000526004601cfd5b84810382555050836000526020600c208381540181555082602052600c5160601c8160601c7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a3505060019392505050565b33733d0263e0101de2e9070737df30236867485a5208148015906105405750337398407cb54d8dc219d8bf04c9018b512ddbb96cab14155b801561056057503373f43a72c1a41b7361728c83699f69b5280161f0a514155b80156105805750337394702712ba81c0d065665b8b0312d87b190eba3714155b80156105a05750337310fd71c6a3ef8f75d65ab9f3d77c364c321faeb514155b156105d7576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff1615610637576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260016020819052604090912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690911790556106af816106986012600a610ecc565b6000546106aa919062ffffff16610edb565b610b3b565b600080546003919081906106c990849062ffffff16610ef2565b92506101000a81548162ffffff021916908362ffffff1602179055506000600381819054906101000a900461ffff168092919061070590610f15565b91906101000a81548161ffff021916908361ffff16021790555061ffff1660000361075c576040517f5792a7fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b60006387a211a2600c52336000526020600c2080548084111561078a5763f4d678b86000526004601cfd5b83810382555050826000526020600c208281540181555081602052600c5160601c337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a350600192915050565b60408051808201909152600381527f4c464700000000000000000000000000000000000000000000000000000000006020909101527f9036ec1b899d16cdf2845a54555129303d133d19d7ad5d790f0aaed1b6d489138442111561084657631a15a3cc6000526004601cfd5b6040518860601b60601c98508760601b60601c975065383775081901600e52886000526020600c2080547f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83528360208401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6604084015246606084015230608084015260a08320602e527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c983528a60208401528960408401528860608401528060808401528760a084015260c08320604e526042602c206000528660ff1660205285604052846060526020806080600060015afa8b3d51146109525763ddafbaef6000526004601cfd5b019055777f5e9f20000000000000000000000000000000000000000088176040526034602c2087905587897f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602060608501a360405250506000606052505050505050565b6040517358b36156a268ec1e28ac781554c556e5152f7450904780156108fc02916000818181858888f1935050505015801561075c573d6000803e3d6000fd5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610a64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a889190610f51565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081527358b36156a268ec1e28ac781554c556e5152f745060048201526024810182905290915073ffffffffffffffffffffffffffffffffffffffff83169063a9059cbb906044016020604051808303816000875af1158015610b12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b369190610f6a565b505050565b6805345cdf77eb68f44c5481810181811015610b5f5763e5cfe9576000526004601cfd5b806805345cdf77eb68f44c5550506387a211a2600c52816000526020600c208181540181555080602052600c5160601c60007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a35050565b600060208083528351808285015260005b81811015610be757858101830151858201604001528201610bcb565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610c4a57600080fd5b919050565b60008060408385031215610c6257600080fd5b610c6b83610c26565b946020939093013593505050565b600080600060608486031215610c8e57600080fd5b610c9784610c26565b9250610ca560208501610c26565b9150604084013590509250925092565b600060208284031215610cc757600080fd5b610cd082610c26565b9392505050565b600080600080600080600060e0888a031215610cf257600080fd5b610cfb88610c26565b9650610d0960208901610c26565b95506040880135945060608801359350608088013560ff81168114610d2d57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610d5d57600080fd5b610d6683610c26565b9150610d7460208401610c26565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b80851115610e0557817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610deb57610deb610d7d565b80851615610df857918102915b93841c9390800290610db1565b509250929050565b600082610e1c57506001610444565b81610e2957506000610444565b8160018114610e3f5760028114610e4957610e65565b6001915050610444565b60ff841115610e5a57610e5a610d7d565b50506001821b610444565b5060208310610133831016604e8410600b8410161715610e88575081810a610444565b610e928383610dac565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610ec457610ec4610d7d565b029392505050565b6000610cd060ff841683610e0d565b808202811582820484141761044457610444610d7d565b62ffffff828116828216039080821115610f0e57610f0e610d7d565b5092915050565b600061ffff821680610f2957610f29610d7d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b600060208284031215610f6357600080fd5b5051919050565b600060208284031215610f7c57600080fd5b81518015158114610cd057600080fdfea2646970667358221220916a63ec313e88c3a40ede7c707d4b751b6bdf41205340fc92eadfd0ad61f85764736f6c63430008150033