commit 4952e097a7bfee77f1c97c597b35bec92311d381
parent 64223514a5cb9ea1c8c289852a6e0b3951c7ec5f
Author: lash <dev@holbrook.no>
Date: Sun, 26 Feb 2023 07:48:31 +0000
Merge tag 'v0.0.4' into lash/qr
Diffstat:
8 files changed, 184 insertions(+), 47 deletions(-)
diff --git a/js/contract/CraftNFT.bin b/js/contract/CraftNFT.bin
@@ -1 +1 @@
-60806040523480156200001157600080fd5b50604051620049a7380380620049a7833981810160405281019062000037919062000279565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b8190555082600890816200008f919062000564565b508160099081620000a1919062000564565b505050506200064b565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200011482620000c9565b810181811067ffffffffffffffff82111715620001365762000135620000da565b5b80604052505050565b60006200014b620000ab565b905062000159828262000109565b919050565b600067ffffffffffffffff8211156200017c576200017b620000da565b5b6200018782620000c9565b9050602081019050919050565b60005b83811015620001b457808201518184015260208101905062000197565b60008484015250505050565b6000620001d7620001d1846200015e565b6200013f565b905082815260208101848484011115620001f657620001f5620000c4565b5b6200020384828562000194565b509392505050565b600082601f830112620002235762000222620000bf565b5b815162000235848260208601620001c0565b91505092915050565b6000819050919050565b62000253816200023e565b81146200025f57600080fd5b50565b600081519050620002738162000248565b92915050565b600080600060608486031215620002955762000294620000b5565b5b600084015167ffffffffffffffff811115620002b657620002b5620000ba565b5b620002c4868287016200020b565b935050602084015167ffffffffffffffff811115620002e857620002e7620000ba565b5b620002f6868287016200020b565b9250506040620003098682870162000262565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200036657607f821691505b6020821081036200037c576200037b6200031e565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302620003e97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003a7565b620003f58683620003a7565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004426200043c62000436846200040d565b62000417565b6200040d565b9050919050565b6000819050919050565b6200045e8362000421565b620004766200046d8262000449565b848454620003b7565b825550505050565b600090565b6200048d6200047e565b6200049a81848462000453565b505050565b5b81811015620004c257620004b660008262000483565b600181019050620004a0565b5050565b601f8211156200051157620004db8162000382565b620004e68462000397565b81016020851015620004f6578190505b6200050e620005058562000397565b8301826200049f565b50505b505050565b60008160020a8304905092915050565b6000620005396000198460080262000516565b1980831691505092915050565b600062000554838362000526565b9150826002028217905092915050565b6200056f8262000313565b67ffffffffffffffff8111156200058b576200058a620000da565b5b6200059782546200034d565b620005a4828285620004c6565b600060209050601f831160018114620005dc5760008415620005c7578287015190505b620005d3858262000546565b86555062000643565b601f198416620005ec8662000382565b60005b828110156200061657848901518255600182019150602085019450602081019050620005ef565b8683101562000636578489015162000632601f89168262000526565b8355505b6001600288020188555050505b505050505050565b61434c806200065b6000396000f3fe608060405260043610610200576000357c01000000000000000000000000000000000000000000000000000000009004806369e85c711161011f578063b88d4fde116100b2578063da2824a811610081578063da2824a8146107a8578063e985e9c5146107d1578063f117e1731461080e578063f9613ab21461084b57610200565b8063b88d4fde146106d5578063c87b56dd146106f1578063c9796c391461072e578063d824ee4f1461076b57610200565b8063a22cb465116100ee578063a22cb46514610607578063adf288df14610630578063b1a6afd31461066d578063b242e5341461069857610200565b806369e85c711461053757806370a08231146105745780638da5cb5b146105b157806395d89b41146105dc57610200565b806340c84b0e116101975780634f64b2be116101665780634f64b2be14610455578063559f5dc9146104925780635ae06f7e146104d15780636352211e146104fa57610200565b806340c84b0e146103a857806342842e0e146103d357806349f2553a146103ef5780634d03546a1461041857610200565b806323b872dd116101d357806323b872dd146102d557806324e0febc146102f15780632b29ba231461032e5780633fd2f5931461036b57610200565b806301ffc9a71461020557806306fdde0314610242578063081812fc1461026d57806318160ddd146102aa575b600080fd5b34801561021157600080fd5b5061022c600480360381019061022791906133ce565b610888565b6040516102399190613416565b60405180910390f35b34801561024e57600080fd5b506102576109dc565b60405161026491906134c1565b60405180910390f35b34801561027957600080fd5b50610294600480360381019061028f9190613519565b610a6a565b6040516102a19190613587565b60405180910390f35b3480156102b657600080fd5b506102bf610aa7565b6040516102cc91906135b1565b60405180910390f35b6102ef60048036038101906102ea91906135f8565b610ab1565b005b3480156102fd57600080fd5b5061031860048036038101906103139190613681565b610b1c565b60405161032591906136bd565b60405180910390f35b34801561033a57600080fd5b50610355600480360381019061035091906136d8565b610b34565b6040516103629190613416565b60405180910390f35b34801561037757600080fd5b50610392600480360381019061038d9190613681565b610be0565b60405161039f919061375a565b60405180910390f35b3480156103b457600080fd5b506103bd610f3f565b6040516103ca919061375a565b60405180910390f35b6103ed60048036038101906103e891906135f8565b610fcd565b005b3480156103fb57600080fd5b50610416600480360381019061041191906138b1565b611038565b005b34801561042457600080fd5b5061043f600480360381019061043a9190613938565b611350565b60405161044c9190613416565b60405180910390f35b34801561046157600080fd5b5061047c60048036038101906104779190613519565b61162e565b60405161048991906136bd565b60405180910390f35b34801561049e57600080fd5b506104b960048036038101906104b49190613978565b611652565b6040516104c8939291906139c7565b60405180910390f35b3480156104dd57600080fd5b506104f860048036038101906104f391906136d8565b6116c6565b005b34801561050657600080fd5b50610521600480360381019061051c9190613519565b6117e5565b60405161052e9190613587565b60405180910390f35b34801561054357600080fd5b5061055e60048036038101906105599190613681565b611821565b60405161056b91906134c1565b60405180910390f35b34801561058057600080fd5b5061059b600480360381019061059691906136d8565b611a3a565b6040516105a891906135b1565b60405180910390f35b3480156105bd57600080fd5b506105c6611a83565b6040516105d39190613587565b60405180910390f35b3480156105e857600080fd5b506105f1611aa7565b6040516105fe91906134c1565b60405180910390f35b34801561061357600080fd5b5061062e60048036038101906106299190613a2a565b611b35565b005b34801561063c57600080fd5b5061065760048036038101906106529190613a6a565b611dd7565b60405161066491906136bd565b60405180910390f35b34801561067957600080fd5b50610682612049565b60405161068f91906136bd565b60405180910390f35b3480156106a457600080fd5b506106bf60048036038101906106ba9190613a2a565b61204f565b6040516106cc9190613416565b60405180910390f35b6106ef60048036038101906106ea9190613b4b565b612130565b005b3480156106fd57600080fd5b5061071860048036038101906107139190613519565b61220b565b60405161072591906134c1565b60405180910390f35b34801561073a57600080fd5b5061075560048036038101906107509190613681565b61227d565b60405161076291906134c1565b60405180910390f35b34801561077757600080fd5b50610792600480360381019061078d9190613c08565b612677565b60405161079f91906136bd565b60405180910390f35b3480156107b457600080fd5b506107cf60048036038101906107ca91906136d8565b6128ea565b005b3480156107dd57600080fd5b506107f860048036038101906107f39190613c5b565b6129d2565b6040516108059190613416565b60405180910390f35b34801561081a57600080fd5b5061083560048036038101906108309190613c9b565b612a6a565b60405161084291906136bd565b60405180910390f35b34801561085757600080fd5b50610872600480360381019061086d9190613681565b612bf9565b60405161087f91906136bd565b60405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036108dc57600190506109d7565b635b5e139f7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361092e57600190506109d7565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361098057600190506109d7565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109d257600190506109d7565b600090505b919050565b600880546109e990613d31565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1590613d31565b8015610a625780601f10610a3757610100808354040283529160200191610a62565b820191906000526020600020905b815481529060010190602001808311610a4557829003601f168201915b505050505081565b60006006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a54905090565b610abc838383612ca5565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60056020528060005260406000206000915090505481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680610bd9575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b606080600080604067ffffffffffffffff811115610c0157610c00613786565b5b6040519080825280601f01601f191660200182016040528015610c335781602001600182028036833780820191505090505b5092506000905060005b6020811015610f3357600460f0878360208110610c5d57610c5c613d62565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015610d3557603083610ccc9190613dcd565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110610d0157610d00613d62565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610da7565b605783610d429190613dcd565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110610d7757610d76613d62565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f868260208110610dbc57610dbb613d62565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff161015610e9357603083610e1e9190613dcd565b7f01000000000000000000000000000000000000000000000000000000000000000284600184610e4e9190613e02565b81518110610e5f57610e5e613d62565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610f11565b605783610ea09190613dcd565b7f01000000000000000000000000000000000000000000000000000000000000000284600184610ed09190613e02565b81518110610ee157610ee0613d62565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600282610f1e9190613e02565b91508080610f2b90613e36565b915050610c3d565b50829350505050919050565b600c8054610f4c90613d31565b80601f0160208091040260200160405190810160405280929190818152602001828054610f7890613d31565b8015610fc55780601f10610f9a57610100808354040283529160200191610fc5565b820191906000526020600020905b815481529060010190602001808311610fa857829003601f168201915b505050505081565b610fd8838383612ca5565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461109557600080fd5b82915081519050602f7f010000000000000000000000000000000000000000000000000000000000000002826001836110ce9190613e7e565b815181106110df576110de613d62565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461115f57808061115b90613e36565b9150505b8067ffffffffffffffff81111561117957611178613786565b5b6040519080825280601f01601f1916602001820160405280156111ab5781602001600182028036833780820191505090505b50600c90816111ba9190614064565b5060005b82518110156112ab578281815181106111da576111d9613d62565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002600c82815461123290613d31565b811061124157611240613d62565b5b8154600116156112605790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f01000000000000000000000000000000000000000000000000000000000000008404021790555080806112a390613e36565b9150506111be565b508151811461134b577f2f00000000000000000000000000000000000000000000000000000000000000600c835181546112e490613d31565b81106112f3576112f2613d62565b5b8154600116156113125790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055505b505050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806113f65750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6113ff57600080fd5b61140761332f565b6004600086815260200190815260200160002080549050915060008211156114845760006004600087815260200190815260200160002060008154811061145157611450613d62565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff161161148357600080fd5b5b83816000019065ffffffffffff16908165ffffffffffff168152505060046000868152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600c6101000a81548160ff0219169083151502179055505050600385908060018154018082558091505060019003906000526020600020016000909190919091505560008465ffffffffffff16036115a9576001600a600082825461159d9190613e02565b925050819055506115cb565b8365ffffffffffff16600a60008282546115c39190613e02565b925050819055505b8365ffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb85ba54b9f6f8241b7e1499e3cfc186ac0b1c8b7100f599bf6ca6844f896c3428760405161161a91906136bd565b60405180910390a360019250505092915050565b6003818154811061163e57600080fd5b906000526020600020016000915090505481565b6004602052816000526040600020818154811061166e57600080fd5b90600052602060002001600091509150508060000160009054906101000a900465ffffffffffff16908060000160069054906101000a900465ffffffffffff169080600001600c9054906101000a900460ff16905083565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061174b575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61178a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178190614182565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080600560008460010281526020019081526020016000205490506060819060020a026c010000000000000000000000009004915050919050565b6060806060600061183185610be0565b9150600c805461184090613d31565b905090508082516118519190613e02565b67ffffffffffffffff81111561186a57611869613786565b5b6040519080825280601f01601f19166020018201604052801561189c5781602001600182028036833780820191505090505b50925060005b8181101561196157600c8181546118b890613d31565b81106118c7576118c6613d62565b5b8154600116156118e65790600052602060002090602091828204019190065b9054901a7f01000000000000000000000000000000000000000000000000000000000000000284828151811061191f5761191e613d62565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061195990613e36565b9150506118a2565b5060005b8251811015611a2e5782818151811061198157611980613d62565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028483815181106119de576119dd613d62565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508180611a1890613e36565b9250508080611a2690613e36565b915050611965565b50829350505050919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60098054611ab490613d31565b80601f0160208091040260200160405190810160405280929190818152602001828054611ae090613d31565b8015611b2d5780601f10611b0257610100808354040283529160200191611b2d565b820191906000526020600020905b815481529060010190602001808311611b1057829003601f168201915b505050505081565b8015611c5657600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611bd357600080fd5b81600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611d6e565b600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611cee57600080fd5b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611dcb9190613416565b60405180910390a35050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611e7d5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611e8657600080fd5b6001600460008581526020019081526020016000208054905014611ea957600080fd5b600060046000858152602001908152602001600020600081548110611ed157611ed0613d62565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff1614611f0357600080fd5b6000600102600560008581526020019081526020016000205414611f2657600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1690507fc000000000000000000000000000000000000000000000000000000000000000811790508060010260056000858152602001908152602001600020819055506001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fcf9190613e02565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856001900460405161203791906135b1565b60405180910390a38291505092915050565b600b5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146120aa57600080fd5b600260009054906101000a900460ff16156120c457600080fd5b81156120e6576001600260006101000a81548160ff0219169083151502179055505b826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001905092915050565b61213b848484612ca5565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f75c9e114f073c346aac7d1d7e9a3c3c14edabcdd27de07d1d9e425f45d318c5e846121f0906141c7565b6040516121fd91906136bd565b60405180910390a450505050565b6060600082600102905060006004600083815260200190815260200160002080549050036122465761223c81612bf9565b9050806001900492505b600060046000838152602001908152602001600020805490501161226957600080fd5b61227583600102611821565b915050919050565b6060806060600061228d85610be0565b9150604767ffffffffffffffff8111156122aa576122a9613786565b5b6040519080825280601f01601f1916602001820160405280156122dc5781602001600182028036833780820191505090505b5092507f73000000000000000000000000000000000000000000000000000000000000008360008151811061231457612313613d62565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f68000000000000000000000000000000000000000000000000000000000000008360018151811061237857612377613d62565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f6100000000000000000000000000000000000000000000000000000000000000836002815181106123dc576123db613d62565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3200000000000000000000000000000000000000000000000000000000000000836003815181106124405761243f613d62565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3500000000000000000000000000000000000000000000000000000000000000836004815181106124a4576124a3613d62565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f36000000000000000000000000000000000000000000000000000000000000008360058151811061250857612507613d62565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3a000000000000000000000000000000000000000000000000000000000000008360068151811061256c5761256b613d62565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506007905060005b604081101561266b578281815181106125be576125bd613d62565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000284838151811061261b5761261a613d62565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350818061265590613e36565b925050808061266390613e36565b9150506125a2565b50829350505050919050565b600080600460008581526020019081526020016000208361ffff16815481106126a3576126a2613d62565b5b90600052602060002001905080600001600c9054906101000a900460ff1615612701576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f89061427a565b60405180910390fd5b60008361ffff16148015612733575060008160000160009054906101000a900465ffffffffffff1665ffffffffffff16145b156127925760018160000160068282829054906101000a900465ffffffffffff1661275e919061429a565b92506101000a81548165ffffffffffff021916908365ffffffffffff16021790555061278a8585611dd7565b9150506128e3565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806128355750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612874576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286b90614182565b60405180910390fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168160000160069054906101000a900465ffffffffffff1665ffffffffffff16106128bc57600080fd5b6128df8585858460000160069054906101000a900465ffffffffffff1685612fbc565b9150505b9392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296f90614182565b60405180910390fd5b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008173ffffffffffffffffffffffffffffffffffffffff16600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600080600460008681526020019081526020016000208461ffff1681548110612a9657612a95613d62565b5b90600052602060002001905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612b455750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612b84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7b90614182565b60405180910390fd5b60008160000160009054906101000a900465ffffffffffff1665ffffffffffff1611612baf57600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168365ffffffffffff1610612be157600080fd5b612bee8686868685612fbc565b915050949350505050565b60008060056000848152602001908152602001600020549050612c1b8161323a565b612c2457600080fd5b612c2d8161326c565b15612c3b5782915050612ca0565b7effffffffffffffff00000000000000000000000000000000000000000000006001028116905060b881908060020a820491505090507fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600102831681179050809150505b919050565b60003073ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612cfc91906135b1565b602060405180830381865afa158015612d19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d3d91906142e9565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612d7757600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612eab573373ffffffffffffffffffffffffffffffffffffffff166006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480612ea157503373ffffffffffffffffffffffffffffffffffffffff16600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b612eaa57600080fd5b5b60006006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612f08828461329e565b6001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f589190613e7e565b925050819055506001600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612faf9190613e02565b9250508190555050505050565b6000806000807fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008860019004169250603067ffffffffffffffff8861ffff161667ffffffffffffffff169060020a0267ffffffffffffffff16831792508565ffffffffffff1683179250826001029050600060010260056000838152602001908152602001600020541461304f57600080fd5b84600001600c9054906101000a900460ff166130b1578460000160069054906101000a900465ffffffffffff1665ffffffffffff168665ffffffffffff16146130b057600185600001600c6101000a81548160ff0219169083151502179055505b5b67ffffffffffffffff886001900416915060b8829060020a0291507f8000000000000000000000000000000000000000000000000000000000000000821791508873ffffffffffffffffffffffffffffffffffffffff168217915060018560000160068282829054906101000a900465ffffffffffff16613132919061429a565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055508160010260056000838152602001908152602001600020819055506001600d60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131bf9190613e02565b925050819055508873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560405161322391906135b1565b60405180910390a380935050505095945050505050565b6000807f8000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000807f4000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000808360010290506005600082815260200190815260200160002054600190049150600082036132ce57600080fd5b7fffffffffffffffffffffffff0000000000000000000000000000000000000000821691508273ffffffffffffffffffffffffffffffffffffffff168217915081600102600560008381526020019081526020016000208190555050505050565b6040518060600160405280600065ffffffffffff168152602001600065ffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6133ab81613376565b81146133b657600080fd5b50565b6000813590506133c8816133a2565b92915050565b6000602082840312156133e4576133e361336c565b5b60006133f2848285016133b9565b91505092915050565b60008115159050919050565b613410816133fb565b82525050565b600060208201905061342b6000830184613407565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561346b578082015181840152602081019050613450565b60008484015250505050565b6000601f19601f8301169050919050565b600061349382613431565b61349d818561343c565b93506134ad81856020860161344d565b6134b681613477565b840191505092915050565b600060208201905081810360008301526134db8184613488565b905092915050565b6000819050919050565b6134f6816134e3565b811461350157600080fd5b50565b600081359050613513816134ed565b92915050565b60006020828403121561352f5761352e61336c565b5b600061353d84828501613504565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061357182613546565b9050919050565b61358181613566565b82525050565b600060208201905061359c6000830184613578565b92915050565b6135ab816134e3565b82525050565b60006020820190506135c660008301846135a2565b92915050565b6135d581613566565b81146135e057600080fd5b50565b6000813590506135f2816135cc565b92915050565b6000806000606084860312156136115761361061336c565b5b600061361f868287016135e3565b9350506020613630868287016135e3565b925050604061364186828701613504565b9150509250925092565b6000819050919050565b61365e8161364b565b811461366957600080fd5b50565b60008135905061367b81613655565b92915050565b6000602082840312156136975761369661336c565b5b60006136a58482850161366c565b91505092915050565b6136b78161364b565b82525050565b60006020820190506136d260008301846136ae565b92915050565b6000602082840312156136ee576136ed61336c565b5b60006136fc848285016135e3565b91505092915050565b600081519050919050565b600082825260208201905092915050565b600061372c82613705565b6137368185613710565b935061374681856020860161344d565b61374f81613477565b840191505092915050565b600060208201905081810360008301526137748184613721565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6137be82613477565b810181811067ffffffffffffffff821117156137dd576137dc613786565b5b80604052505050565b60006137f0613362565b90506137fc82826137b5565b919050565b600067ffffffffffffffff82111561381c5761381b613786565b5b61382582613477565b9050602081019050919050565b82818337600083830152505050565b600061385461384f84613801565b6137e6565b9050828152602081018484840111156138705761386f613781565b5b61387b848285613832565b509392505050565b600082601f8301126138985761389761377c565b5b81356138a8848260208601613841565b91505092915050565b6000602082840312156138c7576138c661336c565b5b600082013567ffffffffffffffff8111156138e5576138e4613371565b5b6138f184828501613883565b91505092915050565b600065ffffffffffff82169050919050565b613915816138fa565b811461392057600080fd5b50565b6000813590506139328161390c565b92915050565b6000806040838503121561394f5761394e61336c565b5b600061395d8582860161366c565b925050602061396e85828601613923565b9150509250929050565b6000806040838503121561398f5761398e61336c565b5b600061399d8582860161366c565b92505060206139ae85828601613504565b9150509250929050565b6139c1816138fa565b82525050565b60006060820190506139dc60008301866139b8565b6139e960208301856139b8565b6139f66040830184613407565b949350505050565b613a07816133fb565b8114613a1257600080fd5b50565b600081359050613a24816139fe565b92915050565b60008060408385031215613a4157613a4061336c565b5b6000613a4f858286016135e3565b9250506020613a6085828601613a15565b9150509250929050565b60008060408385031215613a8157613a8061336c565b5b6000613a8f858286016135e3565b9250506020613aa08582860161366c565b9150509250929050565b600067ffffffffffffffff821115613ac557613ac4613786565b5b613ace82613477565b9050602081019050919050565b6000613aee613ae984613aaa565b6137e6565b905082815260208101848484011115613b0a57613b09613781565b5b613b15848285613832565b509392505050565b600082601f830112613b3257613b3161377c565b5b8135613b42848260208601613adb565b91505092915050565b60008060008060808587031215613b6557613b6461336c565b5b6000613b73878288016135e3565b9450506020613b84878288016135e3565b9350506040613b9587828801613504565b925050606085013567ffffffffffffffff811115613bb657613bb5613371565b5b613bc287828801613b1d565b91505092959194509250565b600061ffff82169050919050565b613be581613bce565b8114613bf057600080fd5b50565b600081359050613c0281613bdc565b92915050565b600080600060608486031215613c2157613c2061336c565b5b6000613c2f868287016135e3565b9350506020613c408682870161366c565b9250506040613c5186828701613bf3565b9150509250925092565b60008060408385031215613c7257613c7161336c565b5b6000613c80858286016135e3565b9250506020613c91858286016135e3565b9150509250929050565b60008060008060808587031215613cb557613cb461336c565b5b6000613cc3878288016135e3565b9450506020613cd48782880161366c565b9350506040613ce587828801613bf3565b9250506060613cf687828801613923565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613d4957607f821691505b602082108103613d5c57613d5b613d02565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff82169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613dd882613d91565b9150613de383613d91565b9250828201905060ff811115613dfc57613dfb613d9e565b5b92915050565b6000613e0d826134e3565b9150613e18836134e3565b9250828201905080821115613e3057613e2f613d9e565b5b92915050565b6000613e41826134e3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613e7357613e72613d9e565b5b600182019050919050565b6000613e89826134e3565b9150613e94836134e3565b9250828203905081811115613eac57613eab613d9e565b5b92915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302613f177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613ed7565b613f218683613ed7565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613f5e613f59613f54846134e3565b613f39565b6134e3565b9050919050565b6000819050919050565b613f7883613f43565b613f8c613f8482613f65565b848454613ee7565b825550505050565b600090565b613fa1613f94565b613fac818484613f6f565b505050565b5b81811015613fd057613fc5600082613f99565b600181019050613fb2565b5050565b601f82111561401557613fe681613eb2565b613fef84613ec7565b81016020851015613ffe578190505b61401261400a85613ec7565b830182613fb1565b50505b505050565b60008160020a8304905092915050565b600061403b6000198460080261401a565b1980831691505092915050565b6000614054838361402a565b9150826002028217905092915050565b61406d82613705565b67ffffffffffffffff81111561408657614085613786565b5b6140908254613d31565b61409b828285613fd4565b600060209050601f8311600181146140ce57600084156140bc578287015190505b6140c68582614048565b86555061412e565b601f1984166140dc86613eb2565b60005b82811015614104578489015182556001820191506020850194506020810190506140df565b86831015614121578489015161411d601f89168261402a565b8355505b6001600288020188555050505b505050505050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b600061416c600a8361343c565b915061417782614136565b602082019050919050565b6000602082019050818103600083015261419b8161415f565b9050919050565b6000819050602082019050919050565b60006141be825161364b565b80915050919050565b60006141d282613705565b826141dc846141a2565b90506141e7816141b2565b92506020821015614227576142227fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802613ed7565b831692505b5050919050565b7f4552525f53504152534500000000000000000000000000000000000000000000600082015250565b6000614264600a8361343c565b915061426f8261422e565b602082019050919050565b6000602082019050818103600083015261429381614257565b9050919050565b60006142a5826138fa565b91506142b0836138fa565b9250828201905065ffffffffffff8111156142ce576142cd613d9e565b5b92915050565b6000815190506142e3816135cc565b92915050565b6000602082840312156142ff576142fe61336c565b5b600061430d848285016142d4565b9150509291505056fea26469706673582212204235583eebf0cfd99f05220e5354f31f29b8b9ae20e7b65bba13503dfb020bbb64736f6c63430008120033
-\ No newline at end of file
+60806040523480156200001157600080fd5b506040516200692838038062006928833981810160405281019062000037919062000b3f565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b8190555082600890816200008f919062000e2a565b508160099081620000a1919062000e2a565b50620000f5602060126040518060400160405280600681526020017f73686132353600000000000000000000000000000000000000000000000000008152506200017c640100000000026401000000009004565b62000110601262000453640100000000026401000000009004565b602067ffffffffffffffff8111156200012e576200012d620009a0565b5b6040519080825280601f01601f191660200182016040528015620001615781602001600182028036833780820191505090505b506010908162000172919062000f81565b5050505062001403565b6060819050601081511115620001c9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001c090620010c9565b60405180910390fd5b620001d36200090b565b6000600790505b60008160ff161062000237576000600882620001f7919062001127565b60ff1660ff9060020a029050600086821667ffffffffffffffff16111562000220575062000237565b81806200022d906200116d565b92505050620001da565b6001816200024691906200119b565b826020019060ff16908160ff16815250506008816007620002689190620011d7565b62000274919062001127565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff168152505082620003029062001266565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081600e60008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b6000600e6000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff16116200048c57600080fd5b81600f819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115620004c457620004c3620009a0565b5b6040519080825280601f01601f191660200182016040528015620004f75781602001600182028036833780820191505090505b506010908162000508919062000f81565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c620005436200055e640100000000026401000000009004565b60405162000552919062001328565b60405180910390a15050565b60606200060c60108054620005739062000c13565b80601f0160208091040260200160405190810160405280929190818152602001828054620005a19062000c13565b8015620005f25780601f10620005c657610100808354040283529160200191620005f2565b820191906000526020600020905b815481529060010190602001808311620005d457829003601f168201915b505050505062000611640100000000026401000000009004565b905090565b606060006060600e6000600f54815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff1685516200066691906200134c565b6200067291906200134c565b67ffffffffffffffff8111156200068e576200068d620009a0565b5b6040519080825280601f01601f191660200182016040528015620006c15781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff16811015620007a1578260000160139054906101000a9004780100000000000000000000000000000000000000000000000002816008811062000723576200072262001387565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000028282815181106200075c576200075b62001387565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806200079890620013b6565b915050620006c7565b8260000160009054906101000a900460ff167f010000000000000000000000000000000000000000000000000000000000000002828281518110620007eb57620007ea62001387565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806200082790620013b6565b91505060005b8551811015620008ff578581815181106200084d576200084c62001387565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002838284620008a691906200134c565b81518110620008ba57620008b962001387565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080620008f690620013b6565b9150506200082d565b50819350505050919050565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620009da826200098f565b810181811067ffffffffffffffff82111715620009fc57620009fb620009a0565b5b80604052505050565b600062000a1162000971565b905062000a1f8282620009cf565b919050565b600067ffffffffffffffff82111562000a425762000a41620009a0565b5b62000a4d826200098f565b9050602081019050919050565b60005b8381101562000a7a57808201518184015260208101905062000a5d565b60008484015250505050565b600062000a9d62000a978462000a24565b62000a05565b90508281526020810184848401111562000abc5762000abb6200098a565b5b62000ac984828562000a5a565b509392505050565b600082601f83011262000ae95762000ae862000985565b5b815162000afb84826020860162000a86565b91505092915050565b6000819050919050565b62000b198162000b04565b811462000b2557600080fd5b50565b60008151905062000b398162000b0e565b92915050565b60008060006060848603121562000b5b5762000b5a6200097b565b5b600084015167ffffffffffffffff81111562000b7c5762000b7b62000980565b5b62000b8a8682870162000ad1565b935050602084015167ffffffffffffffff81111562000bae5762000bad62000980565b5b62000bbc8682870162000ad1565b925050604062000bcf8682870162000b28565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000c2c57607f821691505b60208210810362000c425762000c4162000be4565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000caf7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000c6d565b62000cbb868362000c6d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000d0862000d0262000cfc8462000cd3565b62000cdd565b62000cd3565b9050919050565b6000819050919050565b62000d248362000ce7565b62000d3c62000d338262000d0f565b84845462000c7d565b825550505050565b600090565b62000d5362000d44565b62000d6081848462000d19565b505050565b5b8181101562000d885762000d7c60008262000d49565b60018101905062000d66565b5050565b601f82111562000dd75762000da18162000c48565b62000dac8462000c5d565b8101602085101562000dbc578190505b62000dd462000dcb8562000c5d565b83018262000d65565b50505b505050565b60008160020a8304905092915050565b600062000dff6000198460080262000ddc565b1980831691505092915050565b600062000e1a838362000dec565b9150826002028217905092915050565b62000e358262000bd9565b67ffffffffffffffff81111562000e515762000e50620009a0565b5b62000e5d825462000c13565b62000e6a82828562000d8c565b600060209050601f83116001811462000ea2576000841562000e8d578287015190505b62000e99858262000e0c565b86555062000f09565b601f19841662000eb28662000c48565b60005b8281101562000edc5784890151825560018201915060208501945060208101905062000eb5565b8683101562000efc578489015162000ef8601f89168262000dec565b8355505b6001600288020188555050505b505050505050565b600081519050919050565b60008190508160005260206000209050919050565b601f82111562000f7c5762000f468162000f1c565b62000f518462000c5d565b8101602085101562000f61578190505b62000f7962000f708562000c5d565b83018262000d65565b50505b505050565b62000f8c8262000f11565b67ffffffffffffffff81111562000fa85762000fa7620009a0565b5b62000fb4825462000c13565b62000fc182828562000f31565b600060209050601f83116001811462000ff9576000841562000fe4578287015190505b62000ff0858262000e0c565b86555062001060565b601f198416620010098662000f1c565b60005b8281101562001033578489015182556001820191506020850194506020810190506200100c565b868310156200105357848901516200104f601f89168262000dec565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b6000620010b160138362001068565b9150620010be8262001079565b602082019050919050565b60006020820190508181036000830152620010e481620010a2565b9050919050565b600060ff82169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200113482620010eb565b91506200114183620010eb565b92508282026200115181620010eb565b9150808214620011665762001165620010f8565b5b5092915050565b60006200117a82620010eb565b91506000820362001190576200118f620010f8565b5b600182039050919050565b6000620011a882620010eb565b9150620011b583620010eb565b9250828201905060ff811115620011d157620011d0620010f8565b5b92915050565b6000620011e482620010eb565b9150620011f183620010eb565b9250828203905060ff8111156200120d576200120c620010f8565b5b92915050565b6000819050602082019050919050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b60006200125d825162001223565b80915050919050565b6000620012738262000f11565b826200127f8462001213565b90506200128c816200124f565b92506010821015620012cf57620012ca7fffffffffffffffffffffffffffffffff000000000000000000000000000000008360100360080262000c6d565b831692505b5050919050565b600082825260208201905092915050565b6000620012f48262000f11565b620013008185620012d6565b93506200131281856020860162000a5a565b6200131d816200098f565b840191505092915050565b60006020820190508181036000830152620013448184620012e7565b905092915050565b6000620013598262000cd3565b9150620013668362000cd3565b9250828201905080821115620013815762001380620010f8565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000620013c38262000cd3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620013f857620013f7620010f8565b5b600182019050919050565b61551580620014136000396000f3fe60806040526004361061024d576000357c0100000000000000000000000000000000000000000000000000000000900480638da5cb5b1161014b578063b88d4fde116100c8578063da2824a81161008c578063da2824a814610919578063e8a7f4c514610942578063e985e9c51461097f578063f117e173146109bc578063f9613ab2146109f95761024d565b8063b88d4fde1461081d578063c5bec6fc14610839578063c87b56dd14610876578063ccc094c2146108b3578063d824ee4f146108dc5761024d565b8063adf288df1161010f578063adf288df1461070c578063b1a6afd314610749578063b238d60314610774578063b242e534146107b5578063b5fdeb23146107f25761024d565b80638da5cb5b1461062757806395d89b41146106525780639a7c5e9f1461067d578063a22cb465146106a6578063ad0dec2f146106cf5761024d565b806349f2553a116101d95780635ae06f7e1161019d5780635ae06f7e1461050a5780636352211e146105335780636b9cb86a1461057057806370a08231146105ad57806386e90b59146105ea5761024d565b806349f2553a146103ff5780634d03546a146104285780634f64b2be146104655780635344299a146104a2578063559f5dc9146104cb5761024d565b806323b872dd1161022057806323b872dd1461032257806324e0febc1461033e5780632b29ba231461037b57806340c84b0e146103b857806342842e0e146103e35761024d565b806301ffc9a71461025257806306fdde031461028f578063081812fc146102ba57806318160ddd146102f7575b600080fd5b34801561025e57600080fd5b50610279600480360381019061027491906141d6565b610a36565b604051610286919061421e565b60405180910390f35b34801561029b57600080fd5b506102a4610b8a565b6040516102b191906142c9565b60405180910390f35b3480156102c657600080fd5b506102e160048036038101906102dc9190614321565b610c18565b6040516102ee919061438f565b60405180910390f35b34801561030357600080fd5b5061030c610c55565b60405161031991906143b9565b60405180910390f35b61033c60048036038101906103379190614400565b610c5f565b005b34801561034a57600080fd5b5061036560048036038101906103609190614489565b610cca565b60405161037291906144c5565b60405180910390f35b34801561038757600080fd5b506103a2600480360381019061039d91906144e0565b610ce2565b6040516103af919061421e565b60405180910390f35b3480156103c457600080fd5b506103cd610d8e565b6040516103da9190614562565b60405180910390f35b6103fd60048036038101906103f89190614400565b610e1c565b005b34801561040b57600080fd5b50610426600480360381019061042191906146b9565b610e87565b005b34801561043457600080fd5b5061044f600480360381019061044a9190614740565b61119f565b60405161045c919061421e565b60405180910390f35b34801561047157600080fd5b5061048c60048036038101906104879190614321565b61147d565b60405161049991906144c5565b60405180910390f35b3480156104ae57600080fd5b506104c960048036038101906104c49190614821565b6114a1565b005b3480156104d757600080fd5b506104f260048036038101906104ed919061486a565b61152d565b604051610501939291906148b9565b60405180910390f35b34801561051657600080fd5b50610531600480360381019061052c91906144e0565b6115a1565b005b34801561053f57600080fd5b5061055a60048036038101906105559190614321565b6116c0565b604051610567919061438f565b60405180910390f35b34801561057c57600080fd5b5061059760048036038101906105929190614821565b6116fc565b6040516105a491906142c9565b60405180910390f35b3480156105b957600080fd5b506105d460048036038101906105cf91906144e0565b611915565b6040516105e191906143b9565b60405180910390f35b3480156105f657600080fd5b50610611600480360381019061060c9190614821565b61195e565b60405161061e91906142c9565b60405180910390f35b34801561063357600080fd5b5061063c611c09565b604051610649919061438f565b60405180910390f35b34801561065e57600080fd5b50610667611c2d565b60405161067491906142c9565b60405180910390f35b34801561068957600080fd5b506106a4600480360381019061069f9190614321565b611cbb565b005b3480156106b257600080fd5b506106cd60048036038101906106c8919061491c565b611dac565b005b3480156106db57600080fd5b506106f660048036038101906106f19190614821565b61204e565b6040516107039190614562565b60405180910390f35b34801561071857600080fd5b50610733600480360381019061072e919061495c565b612325565b60405161074091906144c5565b60405180910390f35b34801561075557600080fd5b5061075e612597565b60405161076b91906144c5565b60405180910390f35b34801561078057600080fd5b5061079b60048036038101906107969190614321565b61259d565b6040516107ac959493929190614a2e565b60405180910390f35b3480156107c157600080fd5b506107dc60048036038101906107d7919061491c565b61263c565b6040516107e9919061421e565b60405180910390f35b3480156107fe57600080fd5b5061080761271d565b6040516108149190614562565b60405180910390f35b61083760048036038101906108329190614a81565b6127b7565b005b34801561084557600080fd5b50610860600480360381019061085b9190614821565b612892565b60405161086d9190614562565b60405180910390f35b34801561088257600080fd5b5061089d60048036038101906108989190614321565b612c4b565b6040516108aa91906142c9565b60405180910390f35b3480156108bf57600080fd5b506108da60048036038101906108d59190614b70565b612d9e565b005b3480156108e857600080fd5b5061090360048036038101906108fe9190614c19565b613060565b60405161091091906144c5565b60405180910390f35b34801561092557600080fd5b50610940600480360381019061093b91906144e0565b6132d3565b005b34801561094e57600080fd5b5061096960048036038101906109649190614821565b6133bb565b6040516109769190614562565b60405180910390f35b34801561098b57600080fd5b506109a660048036038101906109a19190614c6c565b613774565b6040516109b3919061421e565b60405180910390f35b3480156109c857600080fd5b506109e360048036038101906109de9190614cac565b61380c565b6040516109f091906144c5565b60405180910390f35b348015610a0557600080fd5b50610a206004803603810190610a1b9190614489565b61399b565b604051610a2d91906144c5565b60405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a8a5760019050610b85565b635b5e139f7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610adc5760019050610b85565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b2e5760019050610b85565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b805760019050610b85565b600090505b919050565b60088054610b9790614d42565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc390614d42565b8015610c105780601f10610be557610100808354040283529160200191610c10565b820191906000526020600020905b815481529060010190602001808311610bf357829003601f168201915b505050505081565b60006006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a54905090565b610c6a838383613a47565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60056020528060005260406000206000915090505481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680610d87575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b600c8054610d9b90614d42565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc790614d42565b8015610e145780601f10610de957610100808354040283529160200191610e14565b820191906000526020600020905b815481529060010190602001808311610df757829003601f168201915b505050505081565b610e27838383613a47565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ee457600080fd5b82915081519050602f7f01000000000000000000000000000000000000000000000000000000000000000282600183610f1d9190614da2565b81518110610f2e57610f2d614dd6565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610fae578080610faa90614e05565b9150505b8067ffffffffffffffff811115610fc857610fc761458e565b5b6040519080825280601f01601f191660200182016040528015610ffa5781602001600182028036833780820191505090505b50600c90816110099190614fff565b5060005b82518110156110fa5782818151811061102957611028614dd6565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002600c82815461108190614d42565b81106110905761108f614dd6565b5b8154600116156110af5790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f01000000000000000000000000000000000000000000000000000000000000008404021790555080806110f290614e05565b91505061100d565b508151811461119a577f2f00000000000000000000000000000000000000000000000000000000000000600c8351815461113390614d42565b811061114257611141614dd6565b5b8154600116156111615790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055505b505050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806112455750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61124e57600080fd5b6112566140d1565b6004600086815260200190815260200160002080549050915060008211156112d3576000600460008781526020019081526020016000206000815481106112a05761129f614dd6565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff16116112d257600080fd5b5b83816000019065ffffffffffff16908165ffffffffffff168152505060046000868152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600c6101000a81548160ff0219169083151502179055505050600385908060018154018082558091505060019003906000526020600020016000909190919091505560008465ffffffffffff16036113f8576001600a60008282546113ec91906150d1565b9250508190555061141a565b8365ffffffffffff16600a600082825461141291906150d1565b925050819055505b8365ffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb85ba54b9f6f8241b7e1499e3cfc186ac0b1c8b7100f599bf6ca6844f896c3428760405161146991906144c5565b60405180910390a360019250505092915050565b6003818154811061148d57600080fd5b906000526020600020016000915090505481565b6000600e6000600f54815260200190815260200160002090508060000160009054906101000a900460ff1660ff168251146114db57600080fd5b81601090816114ea9190614fff565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c61151461271d565b6040516115219190614562565b60405180910390a15050565b6004602052816000526040600020818154811061154957600080fd5b90600052602060002001600091509150508060000160009054906101000a900465ffffffffffff16908060000160069054906101000a900465ffffffffffff169080600001600c9054906101000a900460ff16905083565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611626575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165c90615151565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080600560008460010281526020019081526020016000205490506060819060020a026c010000000000000000000000009004915050919050565b6060806060600061170c856133bb565b9150600c805461171b90614d42565b9050905080825161172c91906150d1565b67ffffffffffffffff8111156117455761174461458e565b5b6040519080825280601f01601f1916602001820160405280156117775781602001600182028036833780820191505090505b50925060005b8181101561183c57600c81815461179390614d42565b81106117a2576117a1614dd6565b5b8154600116156117c15790600052602060002090602091828204019190065b9054901a7f0100000000000000000000000000000000000000000000000000000000000000028482815181106117fa576117f9614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061183490614e05565b91505061177d565b5060005b82518110156119095782818151811061185c5761185b614dd6565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028483815181106118b9576118b8614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081806118f390614e05565b925050808061190190614e05565b915050611840565b50829350505050919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60606000606080600061197086612892565b9150600e6000600f54815260200190815260200160002093508360000160029054906101000a900460ff1660ff16905060018251826119af91906150d1565b6119b991906150d1565b67ffffffffffffffff8111156119d2576119d161458e565b5b6040519080825280601f01601f191660200182016040528015611a045781602001600182028036833780820191505090505b50925060005b81811015611abe578460000160039054906101000a9004700100000000000000000000000000000000028160108110611a4657611a45614dd6565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002848281518110611a7c57611a7b614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611ab690614e05565b915050611a0a565b50603a7f010000000000000000000000000000000000000000000000000000000000000002838281518110611af657611af5614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611b3090614e05565b91505060005b8251811015611bfc57828181518110611b5257611b51614dd6565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002848284611ba991906150d1565b81518110611bba57611bb9614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611bf490614e05565b915050611b36565b5082945050505050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60098054611c3a90614d42565b80601f0160208091040260200160405190810160405280929190818152602001828054611c6690614d42565b8015611cb35780601f10611c8857610100808354040283529160200191611cb3565b820191906000526020600020905b815481529060010190602001808311611c9657829003601f168201915b505050505081565b6000600e6000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff1611611cf357600080fd5b81600f819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115611d2857611d2761458e565b5b6040519080825280601f01601f191660200182016040528015611d5a5781602001600182028036833780820191505090505b5060109081611d699190614fff565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c611d9361271d565b604051611da09190614562565b60405180910390a15050565b8015611ecd57600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e4a57600080fd5b81600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611fe5565b600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611f6557600080fd5b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612042919061421e565b60405180910390a35050565b606060006060600e6000600f54815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff1685516120a191906150d1565b6120ab91906150d1565b67ffffffffffffffff8111156120c4576120c361458e565b5b6040519080825280601f01601f1916602001820160405280156120f65781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff168110156121cc578260000160139054906101000a9004780100000000000000000000000000000000000000000000000002816008811061215457612153614dd6565b5b1a7f01000000000000000000000000000000000000000000000000000000000000000282828151811061218a57612189614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806121c490614e05565b9150506120fc565b8260000160009054906101000a900460ff167f01000000000000000000000000000000000000000000000000000000000000000282828151811061221357612212614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061224d90614e05565b91505060005b85518110156123195785818151811061226f5761226e614dd6565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028382846122c691906150d1565b815181106122d7576122d6614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061231190614e05565b915050612253565b50819350505050919050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806123cb5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6123d457600080fd5b60016004600085815260200190815260200160002080549050146123f757600080fd5b60006004600085815260200190815260200160002060008154811061241f5761241e614dd6565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff161461245157600080fd5b600060010260056000858152602001908152602001600020541461247457600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1690507fc000000000000000000000000000000000000000000000000000000000000000811790508060010260056000858152602001908152602001600020819055506001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461251d91906150d1565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856001900460405161258591906143b9565b60405180910390a38291505092915050565b600b5481565b600e6020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900460ff16908060000160029054906101000a900460ff16908060000160039054906101000a900470010000000000000000000000000000000002908060000160139054906101000a9004780100000000000000000000000000000000000000000000000002905085565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461269757600080fd5b600260009054906101000a900460ff16156126b157600080fd5b81156126d3576001600260006101000a81548160ff0219169083151502179055505b826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001905092915050565b60606127b26010805461272f90614d42565b80601f016020809104026020016040519081016040528092919081815260200182805461275b90614d42565b80156127a85780601f1061277d576101008083540402835291602001916127a8565b820191906000526020600020905b81548152906001019060200180831161278b57829003601f168201915b505050505061204e565b905090565b6127c2848484613a47565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f75c9e114f073c346aac7d1d7e9a3c3c14edabcdd27de07d1d9e425f45d318c5e8461287790615196565b60405161288491906144c5565b60405180910390a450505050565b606080600080600285516128a691906151fd565b67ffffffffffffffff8111156128bf576128be61458e565b5b6040519080825280601f01601f1916602001820160405280156128f15781602001600182028036833780820191505090505b5092506000905060005b6020811015612c3f57600460f087838151811061291b5761291a614dd6565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015612a1a576030836129b1919061523f565b7f0100000000000000000000000000000000000000000000000000000000000000028483815181106129e6576129e5614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612a8c565b605783612a27919061523f565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110612a5c57612a5b614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f868281518110612aa157612aa0614dd6565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff161015612b9f57603083612b2a919061523f565b7f01000000000000000000000000000000000000000000000000000000000000000284600184612b5a91906150d1565b81518110612b6b57612b6a614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612c1d565b605783612bac919061523f565b7f01000000000000000000000000000000000000000000000000000000000000000284600184612bdc91906150d1565b81518110612bed57612bec614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600282612c2a91906150d1565b91508080612c3790614e05565b9150506128fb565b50829350505050919050565b6060600060608360010291506000600460008481526020019081526020016000208054905003612c8157612c7e8261399b565b91505b6000600460008481526020019081526020016000208054905011612ca457600080fd5b602067ffffffffffffffff811115612cbf57612cbe61458e565b5b6040519080825280601f01601f191660200182016040528015612cf15781602001600182028036833780820191505090505b50905060005b6020811015612d8b57828160208110612d1357612d12614dd6565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002828281518110612d4957612d48614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080612d8390614e05565b915050612cf7565b50612d95816116fc565b92505050919050565b6060819050601081511115612de8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ddf906152c0565b60405180910390fd5b612df0614104565b6000600790505b60008160ff1610612e4c576000600882612e1191906152e0565b60ff1660ff9060020a029050600086821667ffffffffffffffff161115612e385750612e4c565b8180612e439061531d565b92505050612df7565b600181612e59919061523f565b826020019060ff16908160ff16815250506008816007612e799190615346565b612e8391906152e0565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff168152505082612f0f90615390565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081600e60008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b600080600460008581526020019081526020016000208361ffff168154811061308c5761308b614dd6565b5b90600052602060002001905080600001600c9054906101000a900460ff16156130ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e190615443565b60405180910390fd5b60008361ffff1614801561311c575060008160000160009054906101000a900465ffffffffffff1665ffffffffffff16145b1561317b5760018160000160068282829054906101000a900465ffffffffffff166131479190615463565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055506131738585612325565b9150506132cc565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061321e5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61325d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325490615151565b60405180910390fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168160000160069054906101000a900465ffffffffffff1665ffffffffffff16106132a557600080fd5b6132c88585858460000160069054906101000a900465ffffffffffff1685613d5e565b9150505b9392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613361576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335890615151565b60405180910390fd5b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b606080600080600285516133cf91906151fd565b67ffffffffffffffff8111156133e8576133e761458e565b5b6040519080825280601f01601f19166020018201604052801561341a5781602001600182028036833780820191505090505b5092506000905060005b602081101561376857600460f087838151811061344457613443614dd6565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015613543576030836134da919061523f565b7f01000000000000000000000000000000000000000000000000000000000000000284838151811061350f5761350e614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506135b5565b605783613550919061523f565b7f01000000000000000000000000000000000000000000000000000000000000000284838151811061358557613584614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f8682815181106135ca576135c9614dd6565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff1610156136c857603083613653919061523f565b7f0100000000000000000000000000000000000000000000000000000000000000028460018461368391906150d1565b8151811061369457613693614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613746565b6057836136d5919061523f565b7f0100000000000000000000000000000000000000000000000000000000000000028460018461370591906150d1565b8151811061371657613715614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b60028261375391906150d1565b9150808061376090614e05565b915050613424565b50829350505050919050565b60008173ffffffffffffffffffffffffffffffffffffffff16600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600080600460008681526020019081526020016000208461ffff168154811061383857613837614dd6565b5b90600052602060002001905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806138e75750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b613926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161391d90615151565b60405180910390fd5b60008160000160009054906101000a900465ffffffffffff1665ffffffffffff161161395157600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168365ffffffffffff161061398357600080fd5b6139908686868685613d5e565b915050949350505050565b600080600560008481526020019081526020016000205490506139bd81613fdc565b6139c657600080fd5b6139cf8161400e565b156139dd5782915050613a42565b7effffffffffffffff00000000000000000000000000000000000000000000006001028116905060b881908060020a820491505090507fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600102831681179050809150505b919050565b60003073ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401613a9e91906143b9565b602060405180830381865afa158015613abb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613adf91906154b2565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613b1957600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614613c4d573373ffffffffffffffffffffffffffffffffffffffff166006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480613c4357503373ffffffffffffffffffffffffffffffffffffffff16600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b613c4c57600080fd5b5b60006006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613caa8284614040565b6001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613cfa9190614da2565b925050819055506001600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613d5191906150d1565b9250508190555050505050565b6000806000807fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008860019004169250603067ffffffffffffffff8861ffff161667ffffffffffffffff169060020a0267ffffffffffffffff16831792508565ffffffffffff16831792508260010290506000600102600560008381526020019081526020016000205414613df157600080fd5b84600001600c9054906101000a900460ff16613e53578460000160069054906101000a900465ffffffffffff1665ffffffffffff168665ffffffffffff1614613e5257600185600001600c6101000a81548160ff0219169083151502179055505b5b67ffffffffffffffff886001900416915060b8829060020a0291507f8000000000000000000000000000000000000000000000000000000000000000821791508873ffffffffffffffffffffffffffffffffffffffff168217915060018560000160068282829054906101000a900465ffffffffffff16613ed49190615463565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055508160010260056000838152602001908152602001600020819055506001600d60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613f6191906150d1565b925050819055508873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051613fc591906143b9565b60405180910390a380935050505095945050505050565b6000807f8000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000807f4000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b60008083600102905060056000828152602001908152602001600020546001900491506000820361407057600080fd5b7fffffffffffffffffffffffff0000000000000000000000000000000000000000821691508273ffffffffffffffffffffffffffffffffffffffff168217915081600102600560008381526020019081526020016000208190555050505050565b6040518060600160405280600065ffffffffffff168152602001600065ffffffffffff1681526020016000151581525090565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6141b38161417e565b81146141be57600080fd5b50565b6000813590506141d0816141aa565b92915050565b6000602082840312156141ec576141eb614174565b5b60006141fa848285016141c1565b91505092915050565b60008115159050919050565b61421881614203565b82525050565b6000602082019050614233600083018461420f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614273578082015181840152602081019050614258565b60008484015250505050565b6000601f19601f8301169050919050565b600061429b82614239565b6142a58185614244565b93506142b5818560208601614255565b6142be8161427f565b840191505092915050565b600060208201905081810360008301526142e38184614290565b905092915050565b6000819050919050565b6142fe816142eb565b811461430957600080fd5b50565b60008135905061431b816142f5565b92915050565b60006020828403121561433757614336614174565b5b60006143458482850161430c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006143798261434e565b9050919050565b6143898161436e565b82525050565b60006020820190506143a46000830184614380565b92915050565b6143b3816142eb565b82525050565b60006020820190506143ce60008301846143aa565b92915050565b6143dd8161436e565b81146143e857600080fd5b50565b6000813590506143fa816143d4565b92915050565b60008060006060848603121561441957614418614174565b5b6000614427868287016143eb565b9350506020614438868287016143eb565b92505060406144498682870161430c565b9150509250925092565b6000819050919050565b61446681614453565b811461447157600080fd5b50565b6000813590506144838161445d565b92915050565b60006020828403121561449f5761449e614174565b5b60006144ad84828501614474565b91505092915050565b6144bf81614453565b82525050565b60006020820190506144da60008301846144b6565b92915050565b6000602082840312156144f6576144f5614174565b5b6000614504848285016143eb565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60006145348261450d565b61453e8185614518565b935061454e818560208601614255565b6145578161427f565b840191505092915050565b6000602082019050818103600083015261457c8184614529565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6145c68261427f565b810181811067ffffffffffffffff821117156145e5576145e461458e565b5b80604052505050565b60006145f861416a565b905061460482826145bd565b919050565b600067ffffffffffffffff8211156146245761462361458e565b5b61462d8261427f565b9050602081019050919050565b82818337600083830152505050565b600061465c61465784614609565b6145ee565b90508281526020810184848401111561467857614677614589565b5b61468384828561463a565b509392505050565b600082601f8301126146a05761469f614584565b5b81356146b0848260208601614649565b91505092915050565b6000602082840312156146cf576146ce614174565b5b600082013567ffffffffffffffff8111156146ed576146ec614179565b5b6146f98482850161468b565b91505092915050565b600065ffffffffffff82169050919050565b61471d81614702565b811461472857600080fd5b50565b60008135905061473a81614714565b92915050565b6000806040838503121561475757614756614174565b5b600061476585828601614474565b92505060206147768582860161472b565b9150509250929050565b600067ffffffffffffffff82111561479b5761479a61458e565b5b6147a48261427f565b9050602081019050919050565b60006147c46147bf84614780565b6145ee565b9050828152602081018484840111156147e0576147df614589565b5b6147eb84828561463a565b509392505050565b600082601f83011261480857614807614584565b5b81356148188482602086016147b1565b91505092915050565b60006020828403121561483757614836614174565b5b600082013567ffffffffffffffff81111561485557614854614179565b5b614861848285016147f3565b91505092915050565b6000806040838503121561488157614880614174565b5b600061488f85828601614474565b92505060206148a08582860161430c565b9150509250929050565b6148b381614702565b82525050565b60006060820190506148ce60008301866148aa565b6148db60208301856148aa565b6148e8604083018461420f565b949350505050565b6148f981614203565b811461490457600080fd5b50565b600081359050614916816148f0565b92915050565b6000806040838503121561493357614932614174565b5b6000614941858286016143eb565b925050602061495285828601614907565b9150509250929050565b6000806040838503121561497357614972614174565b5b6000614981858286016143eb565b925050602061499285828601614474565b9150509250929050565b600060ff82169050919050565b6149b28161499c565b82525050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b6149ed816149b8565b82525050565b60007fffffffffffffffff00000000000000000000000000000000000000000000000082169050919050565b614a28816149f3565b82525050565b600060a082019050614a4360008301886149a9565b614a5060208301876149a9565b614a5d60408301866149a9565b614a6a60608301856149e4565b614a776080830184614a1f565b9695505050505050565b60008060008060808587031215614a9b57614a9a614174565b5b6000614aa9878288016143eb565b9450506020614aba878288016143eb565b9350506040614acb8782880161430c565b925050606085013567ffffffffffffffff811115614aec57614aeb614179565b5b614af8878288016147f3565b91505092959194509250565b614b0d8161499c565b8114614b1857600080fd5b50565b600081359050614b2a81614b04565b92915050565b600067ffffffffffffffff82169050919050565b614b4d81614b30565b8114614b5857600080fd5b50565b600081359050614b6a81614b44565b92915050565b600080600060608486031215614b8957614b88614174565b5b6000614b9786828701614b1b565b9350506020614ba886828701614b5b565b925050604084013567ffffffffffffffff811115614bc957614bc8614179565b5b614bd58682870161468b565b9150509250925092565b600061ffff82169050919050565b614bf681614bdf565b8114614c0157600080fd5b50565b600081359050614c1381614bed565b92915050565b600080600060608486031215614c3257614c31614174565b5b6000614c40868287016143eb565b9350506020614c5186828701614474565b9250506040614c6286828701614c04565b9150509250925092565b60008060408385031215614c8357614c82614174565b5b6000614c91858286016143eb565b9250506020614ca2858286016143eb565b9150509250929050565b60008060008060808587031215614cc657614cc5614174565b5b6000614cd4878288016143eb565b9450506020614ce587828801614474565b9350506040614cf687828801614c04565b9250506060614d078782880161472b565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614d5a57607f821691505b602082108103614d6d57614d6c614d13565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614dad826142eb565b9150614db8836142eb565b9250828203905081811115614dd057614dcf614d73565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614e10826142eb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e4257614e41614d73565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302614eb27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614e72565b614ebc8683614e72565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614ef9614ef4614eef846142eb565b614ed4565b6142eb565b9050919050565b6000819050919050565b614f1383614ede565b614f27614f1f82614f00565b848454614e82565b825550505050565b600090565b614f3c614f2f565b614f47818484614f0a565b505050565b5b81811015614f6b57614f60600082614f34565b600181019050614f4d565b5050565b601f821115614fb057614f8181614e4d565b614f8a84614e62565b81016020851015614f99578190505b614fad614fa585614e62565b830182614f4c565b50505b505050565b60008160020a8304905092915050565b6000614fd660001984600802614fb5565b1980831691505092915050565b6000614fef8383614fc5565b9150826002028217905092915050565b6150088261450d565b67ffffffffffffffff8111156150215761502061458e565b5b61502b8254614d42565b615036828285614f6f565b600060209050601f8311600181146150695760008415615057578287015190505b6150618582614fe3565b8655506150c9565b601f19841661507786614e4d565b60005b8281101561509f5784890151825560018201915060208501945060208101905061507a565b868310156150bc57848901516150b8601f891682614fc5565b8355505b6001600288020188555050505b505050505050565b60006150dc826142eb565b91506150e7836142eb565b92508282019050808211156150ff576150fe614d73565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b600061513b600a83614244565b915061514682615105565b602082019050919050565b6000602082019050818103600083015261516a8161512e565b9050919050565b6000819050602082019050919050565b600061518d8251614453565b80915050919050565b60006151a18261450d565b826151ab84615171565b90506151b681615181565b925060208210156151f6576151f17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802614e72565b831692505b5050919050565b6000615208826142eb565b9150615213836142eb565b9250828202615221816142eb565b9150828204841483151761523857615237614d73565b5b5092915050565b600061524a8261499c565b91506152558361499c565b9250828201905060ff81111561526e5761526d614d73565b5b92915050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b60006152aa601383614244565b91506152b582615274565b602082019050919050565b600060208201905081810360008301526152d98161529d565b9050919050565b60006152eb8261499c565b91506152f68361499c565b92508282026153048161499c565b915080821461531657615315614d73565b5b5092915050565b60006153288261499c565b91506000820361533b5761533a614d73565b5b600182039050919050565b60006153518261499c565b915061535c8361499c565b9250828203905060ff81111561537557615374614d73565b5b92915050565b600061538782516149b8565b80915050919050565b600061539b8261450d565b826153a584615171565b90506153b08161537b565b925060108210156153f0576153eb7fffffffffffffffffffffffffffffffff0000000000000000000000000000000083601003600802614e72565b831692505b5050919050565b7f4552525f53504152534500000000000000000000000000000000000000000000600082015250565b600061542d600a83614244565b9150615438826153f7565b602082019050919050565b6000602082019050818103600083015261545c81615420565b9050919050565b600061546e82614702565b915061547983614702565b9250828201905065ffffffffffff81111561549757615496614d73565b5b92915050565b6000815190506154ac816143d4565b92915050565b6000602082840312156154c8576154c7614174565b5b60006154d68482850161549d565b9150509291505056fea2646970667358221220c3873cf8dbcdaf2c4c71dd752eebbfaf4511d4e68cba9a81596340f24d00942c64736f6c63430008120033
+\ No newline at end of file
diff --git a/js/contract/CraftNFT.json b/js/contract/CraftNFT.json
@@ -1 +1 @@
-[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"bytes32","name":"_declaration","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"uint48","name":"_count","type":"uint48"},{"indexed":false,"internalType":"bytes32","name":"_tokenId","type":"bytes32"}],"name":"Allocate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"TransferWithData","type":"event"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"addWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"content","type":"bytes32"},{"internalType":"uint48","name":"count","type":"uint48"}],"name":"allocate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURL","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"declaration","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"deleteWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_truncatedId","type":"bytes32"}],"name":"getDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"getDigestHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"isWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"},{"internalType":"uint48","name":"_index","type":"uint48"}],"name":"mintExactFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"}],"name":"mintFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"}],"name":"mintTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"mintedToken","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseString","type":"string"}],"name":"setBaseURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"toURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"toURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"token","outputs":[{"internalType":"uint48","name":"count","type":"uint48"},{"internalType":"uint48","name":"cursor","type":"uint48"},{"internalType":"bool","name":"sparse","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"},{"internalType":"bool","name":"_final","type":"bool"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
+[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"bytes32","name":"_declaration","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"uint48","name":"_count","type":"uint48"},{"indexed":false,"internalType":"bytes32","name":"_tokenId","type":"bytes32"}],"name":"Allocate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"_multiHash","type":"bytes"}],"name":"Msg","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"TransferWithData","type":"event"},{"inputs":[{"internalType":"uint8","name":"_length","type":"uint8"},{"internalType":"uint64","name":"_codecId","type":"uint64"},{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"addCodec","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"addWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"content","type":"bytes32"},{"internalType":"uint48","name":"count","type":"uint48"}],"name":"allocate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURL","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"declaration","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"deleteWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_truncatedId","type":"bytes32"}],"name":"getDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"getDigestHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getMsg","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"isWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"},{"internalType":"uint48","name":"_index","type":"uint48"}],"name":"mintExactFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"}],"name":"mintFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"}],"name":"mintTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"mintedToken","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"multiCodecs","outputs":[{"internalType":"uint8","name":"l","type":"uint8"},{"internalType":"uint8","name":"codecRLength","type":"uint8"},{"internalType":"uint8","name":"prefixRLength","type":"uint8"},{"internalType":"bytes16","name":"prefix","type":"bytes16"},{"internalType":"bytes8","name":"codec","type":"bytes8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseString","type":"string"}],"name":"setBaseURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"setMsg","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_codec","type":"uint256"}],"name":"setMsgCodec","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"toHash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"toHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"toURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"toURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"token","outputs":[{"internalType":"uint48","name":"count","type":"uint48"},{"internalType":"uint48","name":"cursor","type":"uint48"},{"internalType":"bool","name":"sparse","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"},{"internalType":"bool","name":"_final","type":"bool"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
diff --git a/python/CHANGELOG b/python/CHANGELOG
@@ -1,3 +1,7 @@
+- 0.0.4
+ * Remove obsolete CREATE argflag in publish script
+ * Implement multihash for contract content
+ * Add in-contract message capability
- 0.0.3
* Implement chainlib-gen
* Apply fully qualified URL for tokenUri, with mutable base url
diff --git a/python/craft_nft/data/CraftNFT.bin b/python/craft_nft/data/CraftNFT.bin
@@ -1 +1 @@
-60806040523480156200001157600080fd5b50604051620049a7380380620049a7833981810160405281019062000037919062000279565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b8190555082600890816200008f919062000564565b508160099081620000a1919062000564565b505050506200064b565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200011482620000c9565b810181811067ffffffffffffffff82111715620001365762000135620000da565b5b80604052505050565b60006200014b620000ab565b905062000159828262000109565b919050565b600067ffffffffffffffff8211156200017c576200017b620000da565b5b6200018782620000c9565b9050602081019050919050565b60005b83811015620001b457808201518184015260208101905062000197565b60008484015250505050565b6000620001d7620001d1846200015e565b6200013f565b905082815260208101848484011115620001f657620001f5620000c4565b5b6200020384828562000194565b509392505050565b600082601f830112620002235762000222620000bf565b5b815162000235848260208601620001c0565b91505092915050565b6000819050919050565b62000253816200023e565b81146200025f57600080fd5b50565b600081519050620002738162000248565b92915050565b600080600060608486031215620002955762000294620000b5565b5b600084015167ffffffffffffffff811115620002b657620002b5620000ba565b5b620002c4868287016200020b565b935050602084015167ffffffffffffffff811115620002e857620002e7620000ba565b5b620002f6868287016200020b565b9250506040620003098682870162000262565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200036657607f821691505b6020821081036200037c576200037b6200031e565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302620003e97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003a7565b620003f58683620003a7565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004426200043c62000436846200040d565b62000417565b6200040d565b9050919050565b6000819050919050565b6200045e8362000421565b620004766200046d8262000449565b848454620003b7565b825550505050565b600090565b6200048d6200047e565b6200049a81848462000453565b505050565b5b81811015620004c257620004b660008262000483565b600181019050620004a0565b5050565b601f8211156200051157620004db8162000382565b620004e68462000397565b81016020851015620004f6578190505b6200050e620005058562000397565b8301826200049f565b50505b505050565b60008160020a8304905092915050565b6000620005396000198460080262000516565b1980831691505092915050565b600062000554838362000526565b9150826002028217905092915050565b6200056f8262000313565b67ffffffffffffffff8111156200058b576200058a620000da565b5b6200059782546200034d565b620005a4828285620004c6565b600060209050601f831160018114620005dc5760008415620005c7578287015190505b620005d3858262000546565b86555062000643565b601f198416620005ec8662000382565b60005b828110156200061657848901518255600182019150602085019450602081019050620005ef565b8683101562000636578489015162000632601f89168262000526565b8355505b6001600288020188555050505b505050505050565b61434c806200065b6000396000f3fe608060405260043610610200576000357c01000000000000000000000000000000000000000000000000000000009004806369e85c711161011f578063b88d4fde116100b2578063da2824a811610081578063da2824a8146107a8578063e985e9c5146107d1578063f117e1731461080e578063f9613ab21461084b57610200565b8063b88d4fde146106d5578063c87b56dd146106f1578063c9796c391461072e578063d824ee4f1461076b57610200565b8063a22cb465116100ee578063a22cb46514610607578063adf288df14610630578063b1a6afd31461066d578063b242e5341461069857610200565b806369e85c711461053757806370a08231146105745780638da5cb5b146105b157806395d89b41146105dc57610200565b806340c84b0e116101975780634f64b2be116101665780634f64b2be14610455578063559f5dc9146104925780635ae06f7e146104d15780636352211e146104fa57610200565b806340c84b0e146103a857806342842e0e146103d357806349f2553a146103ef5780634d03546a1461041857610200565b806323b872dd116101d357806323b872dd146102d557806324e0febc146102f15780632b29ba231461032e5780633fd2f5931461036b57610200565b806301ffc9a71461020557806306fdde0314610242578063081812fc1461026d57806318160ddd146102aa575b600080fd5b34801561021157600080fd5b5061022c600480360381019061022791906133ce565b610888565b6040516102399190613416565b60405180910390f35b34801561024e57600080fd5b506102576109dc565b60405161026491906134c1565b60405180910390f35b34801561027957600080fd5b50610294600480360381019061028f9190613519565b610a6a565b6040516102a19190613587565b60405180910390f35b3480156102b657600080fd5b506102bf610aa7565b6040516102cc91906135b1565b60405180910390f35b6102ef60048036038101906102ea91906135f8565b610ab1565b005b3480156102fd57600080fd5b5061031860048036038101906103139190613681565b610b1c565b60405161032591906136bd565b60405180910390f35b34801561033a57600080fd5b50610355600480360381019061035091906136d8565b610b34565b6040516103629190613416565b60405180910390f35b34801561037757600080fd5b50610392600480360381019061038d9190613681565b610be0565b60405161039f919061375a565b60405180910390f35b3480156103b457600080fd5b506103bd610f3f565b6040516103ca919061375a565b60405180910390f35b6103ed60048036038101906103e891906135f8565b610fcd565b005b3480156103fb57600080fd5b50610416600480360381019061041191906138b1565b611038565b005b34801561042457600080fd5b5061043f600480360381019061043a9190613938565b611350565b60405161044c9190613416565b60405180910390f35b34801561046157600080fd5b5061047c60048036038101906104779190613519565b61162e565b60405161048991906136bd565b60405180910390f35b34801561049e57600080fd5b506104b960048036038101906104b49190613978565b611652565b6040516104c8939291906139c7565b60405180910390f35b3480156104dd57600080fd5b506104f860048036038101906104f391906136d8565b6116c6565b005b34801561050657600080fd5b50610521600480360381019061051c9190613519565b6117e5565b60405161052e9190613587565b60405180910390f35b34801561054357600080fd5b5061055e60048036038101906105599190613681565b611821565b60405161056b91906134c1565b60405180910390f35b34801561058057600080fd5b5061059b600480360381019061059691906136d8565b611a3a565b6040516105a891906135b1565b60405180910390f35b3480156105bd57600080fd5b506105c6611a83565b6040516105d39190613587565b60405180910390f35b3480156105e857600080fd5b506105f1611aa7565b6040516105fe91906134c1565b60405180910390f35b34801561061357600080fd5b5061062e60048036038101906106299190613a2a565b611b35565b005b34801561063c57600080fd5b5061065760048036038101906106529190613a6a565b611dd7565b60405161066491906136bd565b60405180910390f35b34801561067957600080fd5b50610682612049565b60405161068f91906136bd565b60405180910390f35b3480156106a457600080fd5b506106bf60048036038101906106ba9190613a2a565b61204f565b6040516106cc9190613416565b60405180910390f35b6106ef60048036038101906106ea9190613b4b565b612130565b005b3480156106fd57600080fd5b5061071860048036038101906107139190613519565b61220b565b60405161072591906134c1565b60405180910390f35b34801561073a57600080fd5b5061075560048036038101906107509190613681565b61227d565b60405161076291906134c1565b60405180910390f35b34801561077757600080fd5b50610792600480360381019061078d9190613c08565b612677565b60405161079f91906136bd565b60405180910390f35b3480156107b457600080fd5b506107cf60048036038101906107ca91906136d8565b6128ea565b005b3480156107dd57600080fd5b506107f860048036038101906107f39190613c5b565b6129d2565b6040516108059190613416565b60405180910390f35b34801561081a57600080fd5b5061083560048036038101906108309190613c9b565b612a6a565b60405161084291906136bd565b60405180910390f35b34801561085757600080fd5b50610872600480360381019061086d9190613681565b612bf9565b60405161087f91906136bd565b60405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036108dc57600190506109d7565b635b5e139f7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361092e57600190506109d7565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361098057600190506109d7565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109d257600190506109d7565b600090505b919050565b600880546109e990613d31565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1590613d31565b8015610a625780601f10610a3757610100808354040283529160200191610a62565b820191906000526020600020905b815481529060010190602001808311610a4557829003601f168201915b505050505081565b60006006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a54905090565b610abc838383612ca5565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60056020528060005260406000206000915090505481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680610bd9575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b606080600080604067ffffffffffffffff811115610c0157610c00613786565b5b6040519080825280601f01601f191660200182016040528015610c335781602001600182028036833780820191505090505b5092506000905060005b6020811015610f3357600460f0878360208110610c5d57610c5c613d62565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015610d3557603083610ccc9190613dcd565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110610d0157610d00613d62565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610da7565b605783610d429190613dcd565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110610d7757610d76613d62565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f868260208110610dbc57610dbb613d62565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff161015610e9357603083610e1e9190613dcd565b7f01000000000000000000000000000000000000000000000000000000000000000284600184610e4e9190613e02565b81518110610e5f57610e5e613d62565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610f11565b605783610ea09190613dcd565b7f01000000000000000000000000000000000000000000000000000000000000000284600184610ed09190613e02565b81518110610ee157610ee0613d62565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600282610f1e9190613e02565b91508080610f2b90613e36565b915050610c3d565b50829350505050919050565b600c8054610f4c90613d31565b80601f0160208091040260200160405190810160405280929190818152602001828054610f7890613d31565b8015610fc55780601f10610f9a57610100808354040283529160200191610fc5565b820191906000526020600020905b815481529060010190602001808311610fa857829003601f168201915b505050505081565b610fd8838383612ca5565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461109557600080fd5b82915081519050602f7f010000000000000000000000000000000000000000000000000000000000000002826001836110ce9190613e7e565b815181106110df576110de613d62565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461115f57808061115b90613e36565b9150505b8067ffffffffffffffff81111561117957611178613786565b5b6040519080825280601f01601f1916602001820160405280156111ab5781602001600182028036833780820191505090505b50600c90816111ba9190614064565b5060005b82518110156112ab578281815181106111da576111d9613d62565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002600c82815461123290613d31565b811061124157611240613d62565b5b8154600116156112605790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f01000000000000000000000000000000000000000000000000000000000000008404021790555080806112a390613e36565b9150506111be565b508151811461134b577f2f00000000000000000000000000000000000000000000000000000000000000600c835181546112e490613d31565b81106112f3576112f2613d62565b5b8154600116156113125790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055505b505050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806113f65750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6113ff57600080fd5b61140761332f565b6004600086815260200190815260200160002080549050915060008211156114845760006004600087815260200190815260200160002060008154811061145157611450613d62565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff161161148357600080fd5b5b83816000019065ffffffffffff16908165ffffffffffff168152505060046000868152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600c6101000a81548160ff0219169083151502179055505050600385908060018154018082558091505060019003906000526020600020016000909190919091505560008465ffffffffffff16036115a9576001600a600082825461159d9190613e02565b925050819055506115cb565b8365ffffffffffff16600a60008282546115c39190613e02565b925050819055505b8365ffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb85ba54b9f6f8241b7e1499e3cfc186ac0b1c8b7100f599bf6ca6844f896c3428760405161161a91906136bd565b60405180910390a360019250505092915050565b6003818154811061163e57600080fd5b906000526020600020016000915090505481565b6004602052816000526040600020818154811061166e57600080fd5b90600052602060002001600091509150508060000160009054906101000a900465ffffffffffff16908060000160069054906101000a900465ffffffffffff169080600001600c9054906101000a900460ff16905083565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061174b575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61178a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178190614182565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080600560008460010281526020019081526020016000205490506060819060020a026c010000000000000000000000009004915050919050565b6060806060600061183185610be0565b9150600c805461184090613d31565b905090508082516118519190613e02565b67ffffffffffffffff81111561186a57611869613786565b5b6040519080825280601f01601f19166020018201604052801561189c5781602001600182028036833780820191505090505b50925060005b8181101561196157600c8181546118b890613d31565b81106118c7576118c6613d62565b5b8154600116156118e65790600052602060002090602091828204019190065b9054901a7f01000000000000000000000000000000000000000000000000000000000000000284828151811061191f5761191e613d62565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061195990613e36565b9150506118a2565b5060005b8251811015611a2e5782818151811061198157611980613d62565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028483815181106119de576119dd613d62565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508180611a1890613e36565b9250508080611a2690613e36565b915050611965565b50829350505050919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60098054611ab490613d31565b80601f0160208091040260200160405190810160405280929190818152602001828054611ae090613d31565b8015611b2d5780601f10611b0257610100808354040283529160200191611b2d565b820191906000526020600020905b815481529060010190602001808311611b1057829003601f168201915b505050505081565b8015611c5657600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611bd357600080fd5b81600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611d6e565b600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611cee57600080fd5b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611dcb9190613416565b60405180910390a35050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611e7d5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611e8657600080fd5b6001600460008581526020019081526020016000208054905014611ea957600080fd5b600060046000858152602001908152602001600020600081548110611ed157611ed0613d62565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff1614611f0357600080fd5b6000600102600560008581526020019081526020016000205414611f2657600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1690507fc000000000000000000000000000000000000000000000000000000000000000811790508060010260056000858152602001908152602001600020819055506001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fcf9190613e02565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856001900460405161203791906135b1565b60405180910390a38291505092915050565b600b5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146120aa57600080fd5b600260009054906101000a900460ff16156120c457600080fd5b81156120e6576001600260006101000a81548160ff0219169083151502179055505b826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001905092915050565b61213b848484612ca5565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f75c9e114f073c346aac7d1d7e9a3c3c14edabcdd27de07d1d9e425f45d318c5e846121f0906141c7565b6040516121fd91906136bd565b60405180910390a450505050565b6060600082600102905060006004600083815260200190815260200160002080549050036122465761223c81612bf9565b9050806001900492505b600060046000838152602001908152602001600020805490501161226957600080fd5b61227583600102611821565b915050919050565b6060806060600061228d85610be0565b9150604767ffffffffffffffff8111156122aa576122a9613786565b5b6040519080825280601f01601f1916602001820160405280156122dc5781602001600182028036833780820191505090505b5092507f73000000000000000000000000000000000000000000000000000000000000008360008151811061231457612313613d62565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f68000000000000000000000000000000000000000000000000000000000000008360018151811061237857612377613d62565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f6100000000000000000000000000000000000000000000000000000000000000836002815181106123dc576123db613d62565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3200000000000000000000000000000000000000000000000000000000000000836003815181106124405761243f613d62565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3500000000000000000000000000000000000000000000000000000000000000836004815181106124a4576124a3613d62565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f36000000000000000000000000000000000000000000000000000000000000008360058151811061250857612507613d62565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3a000000000000000000000000000000000000000000000000000000000000008360068151811061256c5761256b613d62565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506007905060005b604081101561266b578281815181106125be576125bd613d62565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000284838151811061261b5761261a613d62565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350818061265590613e36565b925050808061266390613e36565b9150506125a2565b50829350505050919050565b600080600460008581526020019081526020016000208361ffff16815481106126a3576126a2613d62565b5b90600052602060002001905080600001600c9054906101000a900460ff1615612701576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f89061427a565b60405180910390fd5b60008361ffff16148015612733575060008160000160009054906101000a900465ffffffffffff1665ffffffffffff16145b156127925760018160000160068282829054906101000a900465ffffffffffff1661275e919061429a565b92506101000a81548165ffffffffffff021916908365ffffffffffff16021790555061278a8585611dd7565b9150506128e3565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806128355750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612874576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286b90614182565b60405180910390fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168160000160069054906101000a900465ffffffffffff1665ffffffffffff16106128bc57600080fd5b6128df8585858460000160069054906101000a900465ffffffffffff1685612fbc565b9150505b9392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296f90614182565b60405180910390fd5b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008173ffffffffffffffffffffffffffffffffffffffff16600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600080600460008681526020019081526020016000208461ffff1681548110612a9657612a95613d62565b5b90600052602060002001905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612b455750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612b84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7b90614182565b60405180910390fd5b60008160000160009054906101000a900465ffffffffffff1665ffffffffffff1611612baf57600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168365ffffffffffff1610612be157600080fd5b612bee8686868685612fbc565b915050949350505050565b60008060056000848152602001908152602001600020549050612c1b8161323a565b612c2457600080fd5b612c2d8161326c565b15612c3b5782915050612ca0565b7effffffffffffffff00000000000000000000000000000000000000000000006001028116905060b881908060020a820491505090507fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600102831681179050809150505b919050565b60003073ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612cfc91906135b1565b602060405180830381865afa158015612d19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d3d91906142e9565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612d7757600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612eab573373ffffffffffffffffffffffffffffffffffffffff166006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480612ea157503373ffffffffffffffffffffffffffffffffffffffff16600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b612eaa57600080fd5b5b60006006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612f08828461329e565b6001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f589190613e7e565b925050819055506001600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612faf9190613e02565b9250508190555050505050565b6000806000807fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008860019004169250603067ffffffffffffffff8861ffff161667ffffffffffffffff169060020a0267ffffffffffffffff16831792508565ffffffffffff1683179250826001029050600060010260056000838152602001908152602001600020541461304f57600080fd5b84600001600c9054906101000a900460ff166130b1578460000160069054906101000a900465ffffffffffff1665ffffffffffff168665ffffffffffff16146130b057600185600001600c6101000a81548160ff0219169083151502179055505b5b67ffffffffffffffff886001900416915060b8829060020a0291507f8000000000000000000000000000000000000000000000000000000000000000821791508873ffffffffffffffffffffffffffffffffffffffff168217915060018560000160068282829054906101000a900465ffffffffffff16613132919061429a565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055508160010260056000838152602001908152602001600020819055506001600d60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131bf9190613e02565b925050819055508873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560405161322391906135b1565b60405180910390a380935050505095945050505050565b6000807f8000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000807f4000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000808360010290506005600082815260200190815260200160002054600190049150600082036132ce57600080fd5b7fffffffffffffffffffffffff0000000000000000000000000000000000000000821691508273ffffffffffffffffffffffffffffffffffffffff168217915081600102600560008381526020019081526020016000208190555050505050565b6040518060600160405280600065ffffffffffff168152602001600065ffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6133ab81613376565b81146133b657600080fd5b50565b6000813590506133c8816133a2565b92915050565b6000602082840312156133e4576133e361336c565b5b60006133f2848285016133b9565b91505092915050565b60008115159050919050565b613410816133fb565b82525050565b600060208201905061342b6000830184613407565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561346b578082015181840152602081019050613450565b60008484015250505050565b6000601f19601f8301169050919050565b600061349382613431565b61349d818561343c565b93506134ad81856020860161344d565b6134b681613477565b840191505092915050565b600060208201905081810360008301526134db8184613488565b905092915050565b6000819050919050565b6134f6816134e3565b811461350157600080fd5b50565b600081359050613513816134ed565b92915050565b60006020828403121561352f5761352e61336c565b5b600061353d84828501613504565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061357182613546565b9050919050565b61358181613566565b82525050565b600060208201905061359c6000830184613578565b92915050565b6135ab816134e3565b82525050565b60006020820190506135c660008301846135a2565b92915050565b6135d581613566565b81146135e057600080fd5b50565b6000813590506135f2816135cc565b92915050565b6000806000606084860312156136115761361061336c565b5b600061361f868287016135e3565b9350506020613630868287016135e3565b925050604061364186828701613504565b9150509250925092565b6000819050919050565b61365e8161364b565b811461366957600080fd5b50565b60008135905061367b81613655565b92915050565b6000602082840312156136975761369661336c565b5b60006136a58482850161366c565b91505092915050565b6136b78161364b565b82525050565b60006020820190506136d260008301846136ae565b92915050565b6000602082840312156136ee576136ed61336c565b5b60006136fc848285016135e3565b91505092915050565b600081519050919050565b600082825260208201905092915050565b600061372c82613705565b6137368185613710565b935061374681856020860161344d565b61374f81613477565b840191505092915050565b600060208201905081810360008301526137748184613721565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6137be82613477565b810181811067ffffffffffffffff821117156137dd576137dc613786565b5b80604052505050565b60006137f0613362565b90506137fc82826137b5565b919050565b600067ffffffffffffffff82111561381c5761381b613786565b5b61382582613477565b9050602081019050919050565b82818337600083830152505050565b600061385461384f84613801565b6137e6565b9050828152602081018484840111156138705761386f613781565b5b61387b848285613832565b509392505050565b600082601f8301126138985761389761377c565b5b81356138a8848260208601613841565b91505092915050565b6000602082840312156138c7576138c661336c565b5b600082013567ffffffffffffffff8111156138e5576138e4613371565b5b6138f184828501613883565b91505092915050565b600065ffffffffffff82169050919050565b613915816138fa565b811461392057600080fd5b50565b6000813590506139328161390c565b92915050565b6000806040838503121561394f5761394e61336c565b5b600061395d8582860161366c565b925050602061396e85828601613923565b9150509250929050565b6000806040838503121561398f5761398e61336c565b5b600061399d8582860161366c565b92505060206139ae85828601613504565b9150509250929050565b6139c1816138fa565b82525050565b60006060820190506139dc60008301866139b8565b6139e960208301856139b8565b6139f66040830184613407565b949350505050565b613a07816133fb565b8114613a1257600080fd5b50565b600081359050613a24816139fe565b92915050565b60008060408385031215613a4157613a4061336c565b5b6000613a4f858286016135e3565b9250506020613a6085828601613a15565b9150509250929050565b60008060408385031215613a8157613a8061336c565b5b6000613a8f858286016135e3565b9250506020613aa08582860161366c565b9150509250929050565b600067ffffffffffffffff821115613ac557613ac4613786565b5b613ace82613477565b9050602081019050919050565b6000613aee613ae984613aaa565b6137e6565b905082815260208101848484011115613b0a57613b09613781565b5b613b15848285613832565b509392505050565b600082601f830112613b3257613b3161377c565b5b8135613b42848260208601613adb565b91505092915050565b60008060008060808587031215613b6557613b6461336c565b5b6000613b73878288016135e3565b9450506020613b84878288016135e3565b9350506040613b9587828801613504565b925050606085013567ffffffffffffffff811115613bb657613bb5613371565b5b613bc287828801613b1d565b91505092959194509250565b600061ffff82169050919050565b613be581613bce565b8114613bf057600080fd5b50565b600081359050613c0281613bdc565b92915050565b600080600060608486031215613c2157613c2061336c565b5b6000613c2f868287016135e3565b9350506020613c408682870161366c565b9250506040613c5186828701613bf3565b9150509250925092565b60008060408385031215613c7257613c7161336c565b5b6000613c80858286016135e3565b9250506020613c91858286016135e3565b9150509250929050565b60008060008060808587031215613cb557613cb461336c565b5b6000613cc3878288016135e3565b9450506020613cd48782880161366c565b9350506040613ce587828801613bf3565b9250506060613cf687828801613923565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613d4957607f821691505b602082108103613d5c57613d5b613d02565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff82169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613dd882613d91565b9150613de383613d91565b9250828201905060ff811115613dfc57613dfb613d9e565b5b92915050565b6000613e0d826134e3565b9150613e18836134e3565b9250828201905080821115613e3057613e2f613d9e565b5b92915050565b6000613e41826134e3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613e7357613e72613d9e565b5b600182019050919050565b6000613e89826134e3565b9150613e94836134e3565b9250828203905081811115613eac57613eab613d9e565b5b92915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302613f177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613ed7565b613f218683613ed7565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613f5e613f59613f54846134e3565b613f39565b6134e3565b9050919050565b6000819050919050565b613f7883613f43565b613f8c613f8482613f65565b848454613ee7565b825550505050565b600090565b613fa1613f94565b613fac818484613f6f565b505050565b5b81811015613fd057613fc5600082613f99565b600181019050613fb2565b5050565b601f82111561401557613fe681613eb2565b613fef84613ec7565b81016020851015613ffe578190505b61401261400a85613ec7565b830182613fb1565b50505b505050565b60008160020a8304905092915050565b600061403b6000198460080261401a565b1980831691505092915050565b6000614054838361402a565b9150826002028217905092915050565b61406d82613705565b67ffffffffffffffff81111561408657614085613786565b5b6140908254613d31565b61409b828285613fd4565b600060209050601f8311600181146140ce57600084156140bc578287015190505b6140c68582614048565b86555061412e565b601f1984166140dc86613eb2565b60005b82811015614104578489015182556001820191506020850194506020810190506140df565b86831015614121578489015161411d601f89168261402a565b8355505b6001600288020188555050505b505050505050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b600061416c600a8361343c565b915061417782614136565b602082019050919050565b6000602082019050818103600083015261419b8161415f565b9050919050565b6000819050602082019050919050565b60006141be825161364b565b80915050919050565b60006141d282613705565b826141dc846141a2565b90506141e7816141b2565b92506020821015614227576142227fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802613ed7565b831692505b5050919050565b7f4552525f53504152534500000000000000000000000000000000000000000000600082015250565b6000614264600a8361343c565b915061426f8261422e565b602082019050919050565b6000602082019050818103600083015261429381614257565b9050919050565b60006142a5826138fa565b91506142b0836138fa565b9250828201905065ffffffffffff8111156142ce576142cd613d9e565b5b92915050565b6000815190506142e3816135cc565b92915050565b6000602082840312156142ff576142fe61336c565b5b600061430d848285016142d4565b9150509291505056fea26469706673582212204235583eebf0cfd99f05220e5354f31f29b8b9ae20e7b65bba13503dfb020bbb64736f6c63430008120033
-\ No newline at end of file
+60806040523480156200001157600080fd5b506040516200692838038062006928833981810160405281019062000037919062000b3f565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b8190555082600890816200008f919062000e2a565b508160099081620000a1919062000e2a565b50620000f5602060126040518060400160405280600681526020017f73686132353600000000000000000000000000000000000000000000000000008152506200017c640100000000026401000000009004565b62000110601262000453640100000000026401000000009004565b602067ffffffffffffffff8111156200012e576200012d620009a0565b5b6040519080825280601f01601f191660200182016040528015620001615781602001600182028036833780820191505090505b506010908162000172919062000f81565b5050505062001403565b6060819050601081511115620001c9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001c090620010c9565b60405180910390fd5b620001d36200090b565b6000600790505b60008160ff161062000237576000600882620001f7919062001127565b60ff1660ff9060020a029050600086821667ffffffffffffffff16111562000220575062000237565b81806200022d906200116d565b92505050620001da565b6001816200024691906200119b565b826020019060ff16908160ff16815250506008816007620002689190620011d7565b62000274919062001127565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff168152505082620003029062001266565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081600e60008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b6000600e6000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff16116200048c57600080fd5b81600f819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115620004c457620004c3620009a0565b5b6040519080825280601f01601f191660200182016040528015620004f75781602001600182028036833780820191505090505b506010908162000508919062000f81565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c620005436200055e640100000000026401000000009004565b60405162000552919062001328565b60405180910390a15050565b60606200060c60108054620005739062000c13565b80601f0160208091040260200160405190810160405280929190818152602001828054620005a19062000c13565b8015620005f25780601f10620005c657610100808354040283529160200191620005f2565b820191906000526020600020905b815481529060010190602001808311620005d457829003601f168201915b505050505062000611640100000000026401000000009004565b905090565b606060006060600e6000600f54815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff1685516200066691906200134c565b6200067291906200134c565b67ffffffffffffffff8111156200068e576200068d620009a0565b5b6040519080825280601f01601f191660200182016040528015620006c15781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff16811015620007a1578260000160139054906101000a9004780100000000000000000000000000000000000000000000000002816008811062000723576200072262001387565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000028282815181106200075c576200075b62001387565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806200079890620013b6565b915050620006c7565b8260000160009054906101000a900460ff167f010000000000000000000000000000000000000000000000000000000000000002828281518110620007eb57620007ea62001387565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806200082790620013b6565b91505060005b8551811015620008ff578581815181106200084d576200084c62001387565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002838284620008a691906200134c565b81518110620008ba57620008b962001387565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080620008f690620013b6565b9150506200082d565b50819350505050919050565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620009da826200098f565b810181811067ffffffffffffffff82111715620009fc57620009fb620009a0565b5b80604052505050565b600062000a1162000971565b905062000a1f8282620009cf565b919050565b600067ffffffffffffffff82111562000a425762000a41620009a0565b5b62000a4d826200098f565b9050602081019050919050565b60005b8381101562000a7a57808201518184015260208101905062000a5d565b60008484015250505050565b600062000a9d62000a978462000a24565b62000a05565b90508281526020810184848401111562000abc5762000abb6200098a565b5b62000ac984828562000a5a565b509392505050565b600082601f83011262000ae95762000ae862000985565b5b815162000afb84826020860162000a86565b91505092915050565b6000819050919050565b62000b198162000b04565b811462000b2557600080fd5b50565b60008151905062000b398162000b0e565b92915050565b60008060006060848603121562000b5b5762000b5a6200097b565b5b600084015167ffffffffffffffff81111562000b7c5762000b7b62000980565b5b62000b8a8682870162000ad1565b935050602084015167ffffffffffffffff81111562000bae5762000bad62000980565b5b62000bbc8682870162000ad1565b925050604062000bcf8682870162000b28565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000c2c57607f821691505b60208210810362000c425762000c4162000be4565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000caf7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000c6d565b62000cbb868362000c6d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000d0862000d0262000cfc8462000cd3565b62000cdd565b62000cd3565b9050919050565b6000819050919050565b62000d248362000ce7565b62000d3c62000d338262000d0f565b84845462000c7d565b825550505050565b600090565b62000d5362000d44565b62000d6081848462000d19565b505050565b5b8181101562000d885762000d7c60008262000d49565b60018101905062000d66565b5050565b601f82111562000dd75762000da18162000c48565b62000dac8462000c5d565b8101602085101562000dbc578190505b62000dd462000dcb8562000c5d565b83018262000d65565b50505b505050565b60008160020a8304905092915050565b600062000dff6000198460080262000ddc565b1980831691505092915050565b600062000e1a838362000dec565b9150826002028217905092915050565b62000e358262000bd9565b67ffffffffffffffff81111562000e515762000e50620009a0565b5b62000e5d825462000c13565b62000e6a82828562000d8c565b600060209050601f83116001811462000ea2576000841562000e8d578287015190505b62000e99858262000e0c565b86555062000f09565b601f19841662000eb28662000c48565b60005b8281101562000edc5784890151825560018201915060208501945060208101905062000eb5565b8683101562000efc578489015162000ef8601f89168262000dec565b8355505b6001600288020188555050505b505050505050565b600081519050919050565b60008190508160005260206000209050919050565b601f82111562000f7c5762000f468162000f1c565b62000f518462000c5d565b8101602085101562000f61578190505b62000f7962000f708562000c5d565b83018262000d65565b50505b505050565b62000f8c8262000f11565b67ffffffffffffffff81111562000fa85762000fa7620009a0565b5b62000fb4825462000c13565b62000fc182828562000f31565b600060209050601f83116001811462000ff9576000841562000fe4578287015190505b62000ff0858262000e0c565b86555062001060565b601f198416620010098662000f1c565b60005b8281101562001033578489015182556001820191506020850194506020810190506200100c565b868310156200105357848901516200104f601f89168262000dec565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b6000620010b160138362001068565b9150620010be8262001079565b602082019050919050565b60006020820190508181036000830152620010e481620010a2565b9050919050565b600060ff82169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200113482620010eb565b91506200114183620010eb565b92508282026200115181620010eb565b9150808214620011665762001165620010f8565b5b5092915050565b60006200117a82620010eb565b91506000820362001190576200118f620010f8565b5b600182039050919050565b6000620011a882620010eb565b9150620011b583620010eb565b9250828201905060ff811115620011d157620011d0620010f8565b5b92915050565b6000620011e482620010eb565b9150620011f183620010eb565b9250828203905060ff8111156200120d576200120c620010f8565b5b92915050565b6000819050602082019050919050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b60006200125d825162001223565b80915050919050565b6000620012738262000f11565b826200127f8462001213565b90506200128c816200124f565b92506010821015620012cf57620012ca7fffffffffffffffffffffffffffffffff000000000000000000000000000000008360100360080262000c6d565b831692505b5050919050565b600082825260208201905092915050565b6000620012f48262000f11565b620013008185620012d6565b93506200131281856020860162000a5a565b6200131d816200098f565b840191505092915050565b60006020820190508181036000830152620013448184620012e7565b905092915050565b6000620013598262000cd3565b9150620013668362000cd3565b9250828201905080821115620013815762001380620010f8565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000620013c38262000cd3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620013f857620013f7620010f8565b5b600182019050919050565b61551580620014136000396000f3fe60806040526004361061024d576000357c0100000000000000000000000000000000000000000000000000000000900480638da5cb5b1161014b578063b88d4fde116100c8578063da2824a81161008c578063da2824a814610919578063e8a7f4c514610942578063e985e9c51461097f578063f117e173146109bc578063f9613ab2146109f95761024d565b8063b88d4fde1461081d578063c5bec6fc14610839578063c87b56dd14610876578063ccc094c2146108b3578063d824ee4f146108dc5761024d565b8063adf288df1161010f578063adf288df1461070c578063b1a6afd314610749578063b238d60314610774578063b242e534146107b5578063b5fdeb23146107f25761024d565b80638da5cb5b1461062757806395d89b41146106525780639a7c5e9f1461067d578063a22cb465146106a6578063ad0dec2f146106cf5761024d565b806349f2553a116101d95780635ae06f7e1161019d5780635ae06f7e1461050a5780636352211e146105335780636b9cb86a1461057057806370a08231146105ad57806386e90b59146105ea5761024d565b806349f2553a146103ff5780634d03546a146104285780634f64b2be146104655780635344299a146104a2578063559f5dc9146104cb5761024d565b806323b872dd1161022057806323b872dd1461032257806324e0febc1461033e5780632b29ba231461037b57806340c84b0e146103b857806342842e0e146103e35761024d565b806301ffc9a71461025257806306fdde031461028f578063081812fc146102ba57806318160ddd146102f7575b600080fd5b34801561025e57600080fd5b50610279600480360381019061027491906141d6565b610a36565b604051610286919061421e565b60405180910390f35b34801561029b57600080fd5b506102a4610b8a565b6040516102b191906142c9565b60405180910390f35b3480156102c657600080fd5b506102e160048036038101906102dc9190614321565b610c18565b6040516102ee919061438f565b60405180910390f35b34801561030357600080fd5b5061030c610c55565b60405161031991906143b9565b60405180910390f35b61033c60048036038101906103379190614400565b610c5f565b005b34801561034a57600080fd5b5061036560048036038101906103609190614489565b610cca565b60405161037291906144c5565b60405180910390f35b34801561038757600080fd5b506103a2600480360381019061039d91906144e0565b610ce2565b6040516103af919061421e565b60405180910390f35b3480156103c457600080fd5b506103cd610d8e565b6040516103da9190614562565b60405180910390f35b6103fd60048036038101906103f89190614400565b610e1c565b005b34801561040b57600080fd5b50610426600480360381019061042191906146b9565b610e87565b005b34801561043457600080fd5b5061044f600480360381019061044a9190614740565b61119f565b60405161045c919061421e565b60405180910390f35b34801561047157600080fd5b5061048c60048036038101906104879190614321565b61147d565b60405161049991906144c5565b60405180910390f35b3480156104ae57600080fd5b506104c960048036038101906104c49190614821565b6114a1565b005b3480156104d757600080fd5b506104f260048036038101906104ed919061486a565b61152d565b604051610501939291906148b9565b60405180910390f35b34801561051657600080fd5b50610531600480360381019061052c91906144e0565b6115a1565b005b34801561053f57600080fd5b5061055a60048036038101906105559190614321565b6116c0565b604051610567919061438f565b60405180910390f35b34801561057c57600080fd5b5061059760048036038101906105929190614821565b6116fc565b6040516105a491906142c9565b60405180910390f35b3480156105b957600080fd5b506105d460048036038101906105cf91906144e0565b611915565b6040516105e191906143b9565b60405180910390f35b3480156105f657600080fd5b50610611600480360381019061060c9190614821565b61195e565b60405161061e91906142c9565b60405180910390f35b34801561063357600080fd5b5061063c611c09565b604051610649919061438f565b60405180910390f35b34801561065e57600080fd5b50610667611c2d565b60405161067491906142c9565b60405180910390f35b34801561068957600080fd5b506106a4600480360381019061069f9190614321565b611cbb565b005b3480156106b257600080fd5b506106cd60048036038101906106c8919061491c565b611dac565b005b3480156106db57600080fd5b506106f660048036038101906106f19190614821565b61204e565b6040516107039190614562565b60405180910390f35b34801561071857600080fd5b50610733600480360381019061072e919061495c565b612325565b60405161074091906144c5565b60405180910390f35b34801561075557600080fd5b5061075e612597565b60405161076b91906144c5565b60405180910390f35b34801561078057600080fd5b5061079b60048036038101906107969190614321565b61259d565b6040516107ac959493929190614a2e565b60405180910390f35b3480156107c157600080fd5b506107dc60048036038101906107d7919061491c565b61263c565b6040516107e9919061421e565b60405180910390f35b3480156107fe57600080fd5b5061080761271d565b6040516108149190614562565b60405180910390f35b61083760048036038101906108329190614a81565b6127b7565b005b34801561084557600080fd5b50610860600480360381019061085b9190614821565b612892565b60405161086d9190614562565b60405180910390f35b34801561088257600080fd5b5061089d60048036038101906108989190614321565b612c4b565b6040516108aa91906142c9565b60405180910390f35b3480156108bf57600080fd5b506108da60048036038101906108d59190614b70565b612d9e565b005b3480156108e857600080fd5b5061090360048036038101906108fe9190614c19565b613060565b60405161091091906144c5565b60405180910390f35b34801561092557600080fd5b50610940600480360381019061093b91906144e0565b6132d3565b005b34801561094e57600080fd5b5061096960048036038101906109649190614821565b6133bb565b6040516109769190614562565b60405180910390f35b34801561098b57600080fd5b506109a660048036038101906109a19190614c6c565b613774565b6040516109b3919061421e565b60405180910390f35b3480156109c857600080fd5b506109e360048036038101906109de9190614cac565b61380c565b6040516109f091906144c5565b60405180910390f35b348015610a0557600080fd5b50610a206004803603810190610a1b9190614489565b61399b565b604051610a2d91906144c5565b60405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a8a5760019050610b85565b635b5e139f7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610adc5760019050610b85565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b2e5760019050610b85565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b805760019050610b85565b600090505b919050565b60088054610b9790614d42565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc390614d42565b8015610c105780601f10610be557610100808354040283529160200191610c10565b820191906000526020600020905b815481529060010190602001808311610bf357829003601f168201915b505050505081565b60006006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a54905090565b610c6a838383613a47565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60056020528060005260406000206000915090505481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680610d87575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b600c8054610d9b90614d42565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc790614d42565b8015610e145780601f10610de957610100808354040283529160200191610e14565b820191906000526020600020905b815481529060010190602001808311610df757829003601f168201915b505050505081565b610e27838383613a47565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ee457600080fd5b82915081519050602f7f01000000000000000000000000000000000000000000000000000000000000000282600183610f1d9190614da2565b81518110610f2e57610f2d614dd6565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610fae578080610faa90614e05565b9150505b8067ffffffffffffffff811115610fc857610fc761458e565b5b6040519080825280601f01601f191660200182016040528015610ffa5781602001600182028036833780820191505090505b50600c90816110099190614fff565b5060005b82518110156110fa5782818151811061102957611028614dd6565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002600c82815461108190614d42565b81106110905761108f614dd6565b5b8154600116156110af5790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f01000000000000000000000000000000000000000000000000000000000000008404021790555080806110f290614e05565b91505061100d565b508151811461119a577f2f00000000000000000000000000000000000000000000000000000000000000600c8351815461113390614d42565b811061114257611141614dd6565b5b8154600116156111615790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055505b505050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806112455750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61124e57600080fd5b6112566140d1565b6004600086815260200190815260200160002080549050915060008211156112d3576000600460008781526020019081526020016000206000815481106112a05761129f614dd6565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff16116112d257600080fd5b5b83816000019065ffffffffffff16908165ffffffffffff168152505060046000868152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600c6101000a81548160ff0219169083151502179055505050600385908060018154018082558091505060019003906000526020600020016000909190919091505560008465ffffffffffff16036113f8576001600a60008282546113ec91906150d1565b9250508190555061141a565b8365ffffffffffff16600a600082825461141291906150d1565b925050819055505b8365ffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb85ba54b9f6f8241b7e1499e3cfc186ac0b1c8b7100f599bf6ca6844f896c3428760405161146991906144c5565b60405180910390a360019250505092915050565b6003818154811061148d57600080fd5b906000526020600020016000915090505481565b6000600e6000600f54815260200190815260200160002090508060000160009054906101000a900460ff1660ff168251146114db57600080fd5b81601090816114ea9190614fff565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c61151461271d565b6040516115219190614562565b60405180910390a15050565b6004602052816000526040600020818154811061154957600080fd5b90600052602060002001600091509150508060000160009054906101000a900465ffffffffffff16908060000160069054906101000a900465ffffffffffff169080600001600c9054906101000a900460ff16905083565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611626575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165c90615151565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080600560008460010281526020019081526020016000205490506060819060020a026c010000000000000000000000009004915050919050565b6060806060600061170c856133bb565b9150600c805461171b90614d42565b9050905080825161172c91906150d1565b67ffffffffffffffff8111156117455761174461458e565b5b6040519080825280601f01601f1916602001820160405280156117775781602001600182028036833780820191505090505b50925060005b8181101561183c57600c81815461179390614d42565b81106117a2576117a1614dd6565b5b8154600116156117c15790600052602060002090602091828204019190065b9054901a7f0100000000000000000000000000000000000000000000000000000000000000028482815181106117fa576117f9614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061183490614e05565b91505061177d565b5060005b82518110156119095782818151811061185c5761185b614dd6565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028483815181106118b9576118b8614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081806118f390614e05565b925050808061190190614e05565b915050611840565b50829350505050919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60606000606080600061197086612892565b9150600e6000600f54815260200190815260200160002093508360000160029054906101000a900460ff1660ff16905060018251826119af91906150d1565b6119b991906150d1565b67ffffffffffffffff8111156119d2576119d161458e565b5b6040519080825280601f01601f191660200182016040528015611a045781602001600182028036833780820191505090505b50925060005b81811015611abe578460000160039054906101000a9004700100000000000000000000000000000000028160108110611a4657611a45614dd6565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002848281518110611a7c57611a7b614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611ab690614e05565b915050611a0a565b50603a7f010000000000000000000000000000000000000000000000000000000000000002838281518110611af657611af5614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611b3090614e05565b91505060005b8251811015611bfc57828181518110611b5257611b51614dd6565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002848284611ba991906150d1565b81518110611bba57611bb9614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611bf490614e05565b915050611b36565b5082945050505050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60098054611c3a90614d42565b80601f0160208091040260200160405190810160405280929190818152602001828054611c6690614d42565b8015611cb35780601f10611c8857610100808354040283529160200191611cb3565b820191906000526020600020905b815481529060010190602001808311611c9657829003601f168201915b505050505081565b6000600e6000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff1611611cf357600080fd5b81600f819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115611d2857611d2761458e565b5b6040519080825280601f01601f191660200182016040528015611d5a5781602001600182028036833780820191505090505b5060109081611d699190614fff565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c611d9361271d565b604051611da09190614562565b60405180910390a15050565b8015611ecd57600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e4a57600080fd5b81600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611fe5565b600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611f6557600080fd5b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612042919061421e565b60405180910390a35050565b606060006060600e6000600f54815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff1685516120a191906150d1565b6120ab91906150d1565b67ffffffffffffffff8111156120c4576120c361458e565b5b6040519080825280601f01601f1916602001820160405280156120f65781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff168110156121cc578260000160139054906101000a9004780100000000000000000000000000000000000000000000000002816008811061215457612153614dd6565b5b1a7f01000000000000000000000000000000000000000000000000000000000000000282828151811061218a57612189614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806121c490614e05565b9150506120fc565b8260000160009054906101000a900460ff167f01000000000000000000000000000000000000000000000000000000000000000282828151811061221357612212614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061224d90614e05565b91505060005b85518110156123195785818151811061226f5761226e614dd6565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028382846122c691906150d1565b815181106122d7576122d6614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061231190614e05565b915050612253565b50819350505050919050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806123cb5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6123d457600080fd5b60016004600085815260200190815260200160002080549050146123f757600080fd5b60006004600085815260200190815260200160002060008154811061241f5761241e614dd6565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff161461245157600080fd5b600060010260056000858152602001908152602001600020541461247457600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1690507fc000000000000000000000000000000000000000000000000000000000000000811790508060010260056000858152602001908152602001600020819055506001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461251d91906150d1565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856001900460405161258591906143b9565b60405180910390a38291505092915050565b600b5481565b600e6020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900460ff16908060000160029054906101000a900460ff16908060000160039054906101000a900470010000000000000000000000000000000002908060000160139054906101000a9004780100000000000000000000000000000000000000000000000002905085565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461269757600080fd5b600260009054906101000a900460ff16156126b157600080fd5b81156126d3576001600260006101000a81548160ff0219169083151502179055505b826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001905092915050565b60606127b26010805461272f90614d42565b80601f016020809104026020016040519081016040528092919081815260200182805461275b90614d42565b80156127a85780601f1061277d576101008083540402835291602001916127a8565b820191906000526020600020905b81548152906001019060200180831161278b57829003601f168201915b505050505061204e565b905090565b6127c2848484613a47565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f75c9e114f073c346aac7d1d7e9a3c3c14edabcdd27de07d1d9e425f45d318c5e8461287790615196565b60405161288491906144c5565b60405180910390a450505050565b606080600080600285516128a691906151fd565b67ffffffffffffffff8111156128bf576128be61458e565b5b6040519080825280601f01601f1916602001820160405280156128f15781602001600182028036833780820191505090505b5092506000905060005b6020811015612c3f57600460f087838151811061291b5761291a614dd6565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015612a1a576030836129b1919061523f565b7f0100000000000000000000000000000000000000000000000000000000000000028483815181106129e6576129e5614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612a8c565b605783612a27919061523f565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110612a5c57612a5b614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f868281518110612aa157612aa0614dd6565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff161015612b9f57603083612b2a919061523f565b7f01000000000000000000000000000000000000000000000000000000000000000284600184612b5a91906150d1565b81518110612b6b57612b6a614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612c1d565b605783612bac919061523f565b7f01000000000000000000000000000000000000000000000000000000000000000284600184612bdc91906150d1565b81518110612bed57612bec614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600282612c2a91906150d1565b91508080612c3790614e05565b9150506128fb565b50829350505050919050565b6060600060608360010291506000600460008481526020019081526020016000208054905003612c8157612c7e8261399b565b91505b6000600460008481526020019081526020016000208054905011612ca457600080fd5b602067ffffffffffffffff811115612cbf57612cbe61458e565b5b6040519080825280601f01601f191660200182016040528015612cf15781602001600182028036833780820191505090505b50905060005b6020811015612d8b57828160208110612d1357612d12614dd6565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002828281518110612d4957612d48614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080612d8390614e05565b915050612cf7565b50612d95816116fc565b92505050919050565b6060819050601081511115612de8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ddf906152c0565b60405180910390fd5b612df0614104565b6000600790505b60008160ff1610612e4c576000600882612e1191906152e0565b60ff1660ff9060020a029050600086821667ffffffffffffffff161115612e385750612e4c565b8180612e439061531d565b92505050612df7565b600181612e59919061523f565b826020019060ff16908160ff16815250506008816007612e799190615346565b612e8391906152e0565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff168152505082612f0f90615390565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081600e60008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b600080600460008581526020019081526020016000208361ffff168154811061308c5761308b614dd6565b5b90600052602060002001905080600001600c9054906101000a900460ff16156130ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e190615443565b60405180910390fd5b60008361ffff1614801561311c575060008160000160009054906101000a900465ffffffffffff1665ffffffffffff16145b1561317b5760018160000160068282829054906101000a900465ffffffffffff166131479190615463565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055506131738585612325565b9150506132cc565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061321e5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61325d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325490615151565b60405180910390fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168160000160069054906101000a900465ffffffffffff1665ffffffffffff16106132a557600080fd5b6132c88585858460000160069054906101000a900465ffffffffffff1685613d5e565b9150505b9392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613361576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335890615151565b60405180910390fd5b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b606080600080600285516133cf91906151fd565b67ffffffffffffffff8111156133e8576133e761458e565b5b6040519080825280601f01601f19166020018201604052801561341a5781602001600182028036833780820191505090505b5092506000905060005b602081101561376857600460f087838151811061344457613443614dd6565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015613543576030836134da919061523f565b7f01000000000000000000000000000000000000000000000000000000000000000284838151811061350f5761350e614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506135b5565b605783613550919061523f565b7f01000000000000000000000000000000000000000000000000000000000000000284838151811061358557613584614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f8682815181106135ca576135c9614dd6565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff1610156136c857603083613653919061523f565b7f0100000000000000000000000000000000000000000000000000000000000000028460018461368391906150d1565b8151811061369457613693614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613746565b6057836136d5919061523f565b7f0100000000000000000000000000000000000000000000000000000000000000028460018461370591906150d1565b8151811061371657613715614dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b60028261375391906150d1565b9150808061376090614e05565b915050613424565b50829350505050919050565b60008173ffffffffffffffffffffffffffffffffffffffff16600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600080600460008681526020019081526020016000208461ffff168154811061383857613837614dd6565b5b90600052602060002001905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806138e75750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b613926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161391d90615151565b60405180910390fd5b60008160000160009054906101000a900465ffffffffffff1665ffffffffffff161161395157600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168365ffffffffffff161061398357600080fd5b6139908686868685613d5e565b915050949350505050565b600080600560008481526020019081526020016000205490506139bd81613fdc565b6139c657600080fd5b6139cf8161400e565b156139dd5782915050613a42565b7effffffffffffffff00000000000000000000000000000000000000000000006001028116905060b881908060020a820491505090507fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600102831681179050809150505b919050565b60003073ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401613a9e91906143b9565b602060405180830381865afa158015613abb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613adf91906154b2565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613b1957600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614613c4d573373ffffffffffffffffffffffffffffffffffffffff166006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480613c4357503373ffffffffffffffffffffffffffffffffffffffff16600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b613c4c57600080fd5b5b60006006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613caa8284614040565b6001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613cfa9190614da2565b925050819055506001600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613d5191906150d1565b9250508190555050505050565b6000806000807fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008860019004169250603067ffffffffffffffff8861ffff161667ffffffffffffffff169060020a0267ffffffffffffffff16831792508565ffffffffffff16831792508260010290506000600102600560008381526020019081526020016000205414613df157600080fd5b84600001600c9054906101000a900460ff16613e53578460000160069054906101000a900465ffffffffffff1665ffffffffffff168665ffffffffffff1614613e5257600185600001600c6101000a81548160ff0219169083151502179055505b5b67ffffffffffffffff886001900416915060b8829060020a0291507f8000000000000000000000000000000000000000000000000000000000000000821791508873ffffffffffffffffffffffffffffffffffffffff168217915060018560000160068282829054906101000a900465ffffffffffff16613ed49190615463565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055508160010260056000838152602001908152602001600020819055506001600d60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613f6191906150d1565b925050819055508873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051613fc591906143b9565b60405180910390a380935050505095945050505050565b6000807f8000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000807f4000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b60008083600102905060056000828152602001908152602001600020546001900491506000820361407057600080fd5b7fffffffffffffffffffffffff0000000000000000000000000000000000000000821691508273ffffffffffffffffffffffffffffffffffffffff168217915081600102600560008381526020019081526020016000208190555050505050565b6040518060600160405280600065ffffffffffff168152602001600065ffffffffffff1681526020016000151581525090565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6141b38161417e565b81146141be57600080fd5b50565b6000813590506141d0816141aa565b92915050565b6000602082840312156141ec576141eb614174565b5b60006141fa848285016141c1565b91505092915050565b60008115159050919050565b61421881614203565b82525050565b6000602082019050614233600083018461420f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614273578082015181840152602081019050614258565b60008484015250505050565b6000601f19601f8301169050919050565b600061429b82614239565b6142a58185614244565b93506142b5818560208601614255565b6142be8161427f565b840191505092915050565b600060208201905081810360008301526142e38184614290565b905092915050565b6000819050919050565b6142fe816142eb565b811461430957600080fd5b50565b60008135905061431b816142f5565b92915050565b60006020828403121561433757614336614174565b5b60006143458482850161430c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006143798261434e565b9050919050565b6143898161436e565b82525050565b60006020820190506143a46000830184614380565b92915050565b6143b3816142eb565b82525050565b60006020820190506143ce60008301846143aa565b92915050565b6143dd8161436e565b81146143e857600080fd5b50565b6000813590506143fa816143d4565b92915050565b60008060006060848603121561441957614418614174565b5b6000614427868287016143eb565b9350506020614438868287016143eb565b92505060406144498682870161430c565b9150509250925092565b6000819050919050565b61446681614453565b811461447157600080fd5b50565b6000813590506144838161445d565b92915050565b60006020828403121561449f5761449e614174565b5b60006144ad84828501614474565b91505092915050565b6144bf81614453565b82525050565b60006020820190506144da60008301846144b6565b92915050565b6000602082840312156144f6576144f5614174565b5b6000614504848285016143eb565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60006145348261450d565b61453e8185614518565b935061454e818560208601614255565b6145578161427f565b840191505092915050565b6000602082019050818103600083015261457c8184614529565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6145c68261427f565b810181811067ffffffffffffffff821117156145e5576145e461458e565b5b80604052505050565b60006145f861416a565b905061460482826145bd565b919050565b600067ffffffffffffffff8211156146245761462361458e565b5b61462d8261427f565b9050602081019050919050565b82818337600083830152505050565b600061465c61465784614609565b6145ee565b90508281526020810184848401111561467857614677614589565b5b61468384828561463a565b509392505050565b600082601f8301126146a05761469f614584565b5b81356146b0848260208601614649565b91505092915050565b6000602082840312156146cf576146ce614174565b5b600082013567ffffffffffffffff8111156146ed576146ec614179565b5b6146f98482850161468b565b91505092915050565b600065ffffffffffff82169050919050565b61471d81614702565b811461472857600080fd5b50565b60008135905061473a81614714565b92915050565b6000806040838503121561475757614756614174565b5b600061476585828601614474565b92505060206147768582860161472b565b9150509250929050565b600067ffffffffffffffff82111561479b5761479a61458e565b5b6147a48261427f565b9050602081019050919050565b60006147c46147bf84614780565b6145ee565b9050828152602081018484840111156147e0576147df614589565b5b6147eb84828561463a565b509392505050565b600082601f83011261480857614807614584565b5b81356148188482602086016147b1565b91505092915050565b60006020828403121561483757614836614174565b5b600082013567ffffffffffffffff81111561485557614854614179565b5b614861848285016147f3565b91505092915050565b6000806040838503121561488157614880614174565b5b600061488f85828601614474565b92505060206148a08582860161430c565b9150509250929050565b6148b381614702565b82525050565b60006060820190506148ce60008301866148aa565b6148db60208301856148aa565b6148e8604083018461420f565b949350505050565b6148f981614203565b811461490457600080fd5b50565b600081359050614916816148f0565b92915050565b6000806040838503121561493357614932614174565b5b6000614941858286016143eb565b925050602061495285828601614907565b9150509250929050565b6000806040838503121561497357614972614174565b5b6000614981858286016143eb565b925050602061499285828601614474565b9150509250929050565b600060ff82169050919050565b6149b28161499c565b82525050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b6149ed816149b8565b82525050565b60007fffffffffffffffff00000000000000000000000000000000000000000000000082169050919050565b614a28816149f3565b82525050565b600060a082019050614a4360008301886149a9565b614a5060208301876149a9565b614a5d60408301866149a9565b614a6a60608301856149e4565b614a776080830184614a1f565b9695505050505050565b60008060008060808587031215614a9b57614a9a614174565b5b6000614aa9878288016143eb565b9450506020614aba878288016143eb565b9350506040614acb8782880161430c565b925050606085013567ffffffffffffffff811115614aec57614aeb614179565b5b614af8878288016147f3565b91505092959194509250565b614b0d8161499c565b8114614b1857600080fd5b50565b600081359050614b2a81614b04565b92915050565b600067ffffffffffffffff82169050919050565b614b4d81614b30565b8114614b5857600080fd5b50565b600081359050614b6a81614b44565b92915050565b600080600060608486031215614b8957614b88614174565b5b6000614b9786828701614b1b565b9350506020614ba886828701614b5b565b925050604084013567ffffffffffffffff811115614bc957614bc8614179565b5b614bd58682870161468b565b9150509250925092565b600061ffff82169050919050565b614bf681614bdf565b8114614c0157600080fd5b50565b600081359050614c1381614bed565b92915050565b600080600060608486031215614c3257614c31614174565b5b6000614c40868287016143eb565b9350506020614c5186828701614474565b9250506040614c6286828701614c04565b9150509250925092565b60008060408385031215614c8357614c82614174565b5b6000614c91858286016143eb565b9250506020614ca2858286016143eb565b9150509250929050565b60008060008060808587031215614cc657614cc5614174565b5b6000614cd4878288016143eb565b9450506020614ce587828801614474565b9350506040614cf687828801614c04565b9250506060614d078782880161472b565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614d5a57607f821691505b602082108103614d6d57614d6c614d13565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614dad826142eb565b9150614db8836142eb565b9250828203905081811115614dd057614dcf614d73565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614e10826142eb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e4257614e41614d73565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302614eb27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614e72565b614ebc8683614e72565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614ef9614ef4614eef846142eb565b614ed4565b6142eb565b9050919050565b6000819050919050565b614f1383614ede565b614f27614f1f82614f00565b848454614e82565b825550505050565b600090565b614f3c614f2f565b614f47818484614f0a565b505050565b5b81811015614f6b57614f60600082614f34565b600181019050614f4d565b5050565b601f821115614fb057614f8181614e4d565b614f8a84614e62565b81016020851015614f99578190505b614fad614fa585614e62565b830182614f4c565b50505b505050565b60008160020a8304905092915050565b6000614fd660001984600802614fb5565b1980831691505092915050565b6000614fef8383614fc5565b9150826002028217905092915050565b6150088261450d565b67ffffffffffffffff8111156150215761502061458e565b5b61502b8254614d42565b615036828285614f6f565b600060209050601f8311600181146150695760008415615057578287015190505b6150618582614fe3565b8655506150c9565b601f19841661507786614e4d565b60005b8281101561509f5784890151825560018201915060208501945060208101905061507a565b868310156150bc57848901516150b8601f891682614fc5565b8355505b6001600288020188555050505b505050505050565b60006150dc826142eb565b91506150e7836142eb565b92508282019050808211156150ff576150fe614d73565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b600061513b600a83614244565b915061514682615105565b602082019050919050565b6000602082019050818103600083015261516a8161512e565b9050919050565b6000819050602082019050919050565b600061518d8251614453565b80915050919050565b60006151a18261450d565b826151ab84615171565b90506151b681615181565b925060208210156151f6576151f17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802614e72565b831692505b5050919050565b6000615208826142eb565b9150615213836142eb565b9250828202615221816142eb565b9150828204841483151761523857615237614d73565b5b5092915050565b600061524a8261499c565b91506152558361499c565b9250828201905060ff81111561526e5761526d614d73565b5b92915050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b60006152aa601383614244565b91506152b582615274565b602082019050919050565b600060208201905081810360008301526152d98161529d565b9050919050565b60006152eb8261499c565b91506152f68361499c565b92508282026153048161499c565b915080821461531657615315614d73565b5b5092915050565b60006153288261499c565b91506000820361533b5761533a614d73565b5b600182039050919050565b60006153518261499c565b915061535c8361499c565b9250828203905060ff81111561537557615374614d73565b5b92915050565b600061538782516149b8565b80915050919050565b600061539b8261450d565b826153a584615171565b90506153b08161537b565b925060108210156153f0576153eb7fffffffffffffffffffffffffffffffff0000000000000000000000000000000083601003600802614e72565b831692505b5050919050565b7f4552525f53504152534500000000000000000000000000000000000000000000600082015250565b600061542d600a83614244565b9150615438826153f7565b602082019050919050565b6000602082019050818103600083015261545c81615420565b9050919050565b600061546e82614702565b915061547983614702565b9250828201905065ffffffffffff81111561549757615496614d73565b5b92915050565b6000815190506154ac816143d4565b92915050565b6000602082840312156154c8576154c7614174565b5b60006154d68482850161549d565b9150509291505056fea2646970667358221220c3873cf8dbcdaf2c4c71dd752eebbfaf4511d4e68cba9a81596340f24d00942c64736f6c63430008120033
+\ No newline at end of file
diff --git a/python/craft_nft/data/CraftNFT.json b/python/craft_nft/data/CraftNFT.json
@@ -1 +1 @@
-[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"bytes32","name":"_declaration","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"uint48","name":"_count","type":"uint48"},{"indexed":false,"internalType":"bytes32","name":"_tokenId","type":"bytes32"}],"name":"Allocate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"TransferWithData","type":"event"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"addWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"content","type":"bytes32"},{"internalType":"uint48","name":"count","type":"uint48"}],"name":"allocate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURL","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"declaration","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"deleteWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_truncatedId","type":"bytes32"}],"name":"getDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"getDigestHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"isWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"},{"internalType":"uint48","name":"_index","type":"uint48"}],"name":"mintExactFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"}],"name":"mintFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"}],"name":"mintTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"mintedToken","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseString","type":"string"}],"name":"setBaseURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"toURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"toURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"token","outputs":[{"internalType":"uint48","name":"count","type":"uint48"},{"internalType":"uint48","name":"cursor","type":"uint48"},{"internalType":"bool","name":"sparse","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"},{"internalType":"bool","name":"_final","type":"bool"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
+[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"bytes32","name":"_declaration","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"uint48","name":"_count","type":"uint48"},{"indexed":false,"internalType":"bytes32","name":"_tokenId","type":"bytes32"}],"name":"Allocate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"_multiHash","type":"bytes"}],"name":"Msg","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"TransferWithData","type":"event"},{"inputs":[{"internalType":"uint8","name":"_length","type":"uint8"},{"internalType":"uint64","name":"_codecId","type":"uint64"},{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"addCodec","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"addWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"content","type":"bytes32"},{"internalType":"uint48","name":"count","type":"uint48"}],"name":"allocate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURL","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"declaration","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"deleteWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_truncatedId","type":"bytes32"}],"name":"getDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"getDigestHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getMsg","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"isWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"},{"internalType":"uint48","name":"_index","type":"uint48"}],"name":"mintExactFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"}],"name":"mintFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"}],"name":"mintTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"mintedToken","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"multiCodecs","outputs":[{"internalType":"uint8","name":"l","type":"uint8"},{"internalType":"uint8","name":"codecRLength","type":"uint8"},{"internalType":"uint8","name":"prefixRLength","type":"uint8"},{"internalType":"bytes16","name":"prefix","type":"bytes16"},{"internalType":"bytes8","name":"codec","type":"bytes8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseString","type":"string"}],"name":"setBaseURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"setMsg","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_codec","type":"uint256"}],"name":"setMsgCodec","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"toHash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"toHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"toURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"toURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"token","outputs":[{"internalType":"uint48","name":"count","type":"uint48"},{"internalType":"uint48","name":"cursor","type":"uint48"},{"internalType":"bool","name":"sparse","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"},{"internalType":"bool","name":"_final","type":"bool"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
diff --git a/python/craft_nft/nft.py b/python/craft_nft/nft.py
@@ -246,8 +246,9 @@ class CraftNFT(ERC721):
o['method'] = 'eth_call'
enc = ABIContractEncoder()
enc.method('toURI')
- enc.typ(ABIContractType.BYTES32)
- enc.bytes32(token_id)
+ #enc.typ(ABIContractType.BYTES32)
+ enc.typ(ABIContractType.BYTES)
+ enc.bytes(token_id)
data = add_0x(enc.get())
tx = self.template(sender_address, contract_address)
tx = self.set_code(tx, data)
@@ -263,8 +264,8 @@ class CraftNFT(ERC721):
o['method'] = 'eth_call'
enc = ABIContractEncoder()
enc.method('toURL')
- enc.typ(ABIContractType.BYTES32)
- enc.bytes32(token_id)
+ enc.typ(ABIContractType.BYTES)
+ enc.bytes(token_id)
data = add_0x(enc.get())
tx = self.template(sender_address, contract_address)
tx = self.set_code(tx, data)
diff --git a/python/setup.cfg b/python/setup.cfg
@@ -1,6 +1,6 @@
[metadata]
name = craft-nft
-version = 0.0.3
+version = 0.0.4
description = A standalone NFT implementation for real-world arts and crafts assets
author = Louis Holbrook
author_email = dev@holbrook.no
diff --git a/solidity/CraftNFT.sol b/solidity/CraftNFT.sol
@@ -74,13 +74,34 @@ contract CraftNFT {
// Minter
event Mint(address indexed _minter, address indexed _beneficiary, uint256 _value);
+ // Batcher
event Allocate(address indexed _minter, uint48 indexed _count, bytes32 _tokenId);
+ // Content hashes
+ // Represents a multicodec item
+ struct MultiHash {
+ uint8 l;
+ uint8 codecRLength;
+ uint8 prefixRLength;
+ bytes16 prefix;
+ bytes8 codec;
+ }
+ // All registered multicodecs
+ mapping (uint256 => MultiHash) public multiCodecs;
+ uint256 msgCodec;
+ bytes currentMsg;
+
+
+ event Msg(bytes _multiHash);
+
constructor(string memory _name, string memory _symbol, bytes32 _declaration) {
owner = msg.sender;
declaration =_declaration;
name = _name;
symbol = _symbol;
+ addCodec(32, 0x12, "sha256");
+ setMsgCodec(0x12);
+ currentMsg = new bytes(32);
}
// Transfer ownership of token contract to new owner.
@@ -376,33 +397,7 @@ contract CraftNFT {
}
}
- // create sha256 scheme URI from tokenId
- function toURI(bytes32 _data) public pure returns(string memory) {
- bytes memory out;
- bytes memory _hexDigest;
- uint256 c;
-
- _hexDigest = getDigestHex(_data);
-
- out = new bytes(64 + 7);
- out[0] = "s";
- out[1] = "h";
- out[2] = "a";
- out[3] = "2";
- out[4] = "5";
- out[5] = "6";
- out[6] = ":";
-
- c = 7;
- for (uint256 i = 0; i < 64; i++) {
- out[c] = _hexDigest[i];
- c++;
- }
-
- return string(out);
- }
-
- function toURL(bytes32 _data) public view returns(string memory) {
+ function toURL(bytes memory _data) public view returns(string memory) {
bytes memory out;
bytes memory _hexDigest;
uint256 c;
@@ -422,12 +417,12 @@ contract CraftNFT {
return string(out);
}
- function getDigestHex(bytes32 _data) public pure returns(bytes memory) {
+ function getDigestHex(bytes memory _data) public pure returns(bytes memory) {
bytes memory out;
uint8 t;
uint256 c;
- out = new bytes(64);
+ out = new bytes(_data.length * 2);
c = 0;
for (uint256 i = 0; i < 32; i++) {
t = (uint8(_data[i]) & 0xf0) >> 4;
@@ -449,16 +444,24 @@ contract CraftNFT {
// ERC-721 (Metadata - optional)
function tokenURI(uint256 _tokenId) public view returns (string memory) {
- bytes32 _tokenIdBytes;
+ bytes32 _tokenIdBytesFixed;
+ bytes memory _tokenIdBytes;
- _tokenIdBytes = bytes32(_tokenId);
+ _tokenIdBytesFixed = bytes32(_tokenId);
+
+ // If not direct match, check if it is a batch.
+ // Fail if still not found (length 0).
+ if (token[_tokenIdBytesFixed].length == 0) {
+ _tokenIdBytesFixed = getDigest(_tokenIdBytesFixed);
+ }
+ require(token[_tokenIdBytesFixed].length > 0);
- if (token[_tokenIdBytes].length == 0) {
- _tokenIdBytes = getDigest(_tokenIdBytes);
- _tokenId = uint256(_tokenIdBytes);
+ _tokenIdBytes = new bytes(32);
+ for (uint256 i = 0; i < 32; i++) {
+ _tokenIdBytes[i] = _tokenIdBytesFixed[i];
}
- require(token[_tokenIdBytes].length > 0);
- return toURL(bytes32(_tokenId));
+
+ return toURL(_tokenIdBytes);
}
// EIP-165
@@ -485,4 +488,133 @@ contract CraftNFT {
function totalSupply() public view returns(uint256) {
return supply;
}
+
+ // Add a multicodec that can later be set as current codec
+ function addCodec(uint8 _length, uint64 _codecId, string memory _uriPrefix) public {
+ bytes memory prefixBytes;
+
+ prefixBytes = bytes(_uriPrefix);
+ require(prefixBytes.length <= 16, 'ERR_PREFIX_TOO_LONG');
+ MultiHash memory _hsh;
+ uint8 c;
+
+ c = 7;
+ while (c >= 0) {
+ uint64 mask = uint64(0xff << (c * 8));
+ if ((mask & _codecId) > 0) {
+ break;
+ }
+ c--;
+ }
+ _hsh.codecRLength = c + 1;
+ _hsh.codec = bytes8(_codecId << ((7 - c) * 8));
+ _hsh.prefixRLength = uint8(prefixBytes.length);
+ _hsh.prefix = bytes16(prefixBytes);
+ _hsh.l = _length;
+
+ multiCodecs[uint256(_codecId)] = _hsh;
+ }
+
+ // Generate a multihash from the given digest and current selected multicodec
+ function toHash(bytes memory _digest) public view returns(bytes memory) {
+ MultiHash storage m;
+ bytes memory r;
+
+ m = multiCodecs[msgCodec];
+ r = new bytes(_digest.length + m.l + m.codecRLength);
+
+ uint256 i = 0;
+ for (i; i < m.codecRLength; i++) {
+ r[i] = m.codec[i];
+ }
+ r[i] = bytes1(m.l);
+ i++;
+ for (uint256 j = 0; j < _digest.length; j++) {
+ r[i+j] = _digest[j];
+ }
+
+ return r;
+ }
+
+ // Generate a URI representing the digest and the string prefix representation
+ // of the currently selected multicodec
+ function toURI(bytes memory _digest) public view returns(string memory) {
+ MultiHash storage m;
+
+ bytes memory codecString;
+ bytes memory digestHex;
+ uint256 l;
+
+ digestHex = toHex(_digest);
+ m = multiCodecs[msgCodec];
+ l = m.prefixRLength;
+ codecString = new bytes(l + digestHex.length + 1);
+ for (uint256 i = 0; i < l; i++) {
+ codecString[i] = m.prefix[i];
+ }
+ codecString[l] = 0x3a;
+ l++;
+
+ for (uint256 i = 0; i < digestHex.length; i++) {
+ codecString[l+i] = digestHex[i];
+ }
+ return string(codecString);
+
+ }
+
+ // TODO: move to internal library method
+ // bytes to hex conversion
+ function toHex(bytes memory _data) public pure returns(bytes memory) {
+ bytes memory out;
+ uint8 t;
+ uint256 c;
+
+ out = new bytes(_data.length * 2);
+ c = 0;
+ for (uint256 i = 0; i < 32; i++) {
+ t = (uint8(_data[i]) & 0xf0) >> 4;
+ if (t < 10) {
+ out[c] = bytes1(t + 0x30);
+ } else {
+ out[c] = bytes1(t + 0x57);
+ }
+ t = uint8(_data[i]) & 0x0f;
+ if (t < 10) {
+ out[c+1] = bytes1(t + 0x30);
+ } else {
+ out[c+1] = bytes1(t + 0x57);
+ }
+ c += 2;
+ }
+ return out;
+ }
+
+ // Set the current multicodec to use for multihash generation
+ function setMsgCodec(uint256 _codec) public {
+ MultiHash storage _hsh;
+
+ _hsh = multiCodecs[_codec];
+ require(_hsh.l > 0);
+
+ msgCodec = _codec;
+ currentMsg = new bytes(_hsh.l);
+
+ emit Msg(getMsg());
+ }
+
+ // Set the latest pesistent message on contract
+ function setMsg(bytes memory _digest) public {
+ MultiHash storage _hsh;
+
+ _hsh = multiCodecs[msgCodec];
+ require(_digest.length == _hsh.l);
+
+ currentMsg = _digest;
+ emit Msg(getMsg());
+ }
+
+ // Return a multihash of the latest persistent message
+ function getMsg() public view returns(bytes memory) {
+ return toHash(currentMsg);
+ }
}